mirror of https://github.com/docusealco/docuseal
Compare commits
No commits in common. '9c700a3fb6fb4f16628da3d69e073ad57ca80e52' and '60082655d4365e38007a8cb710d727bf72fc0dd2' have entirely different histories.
9c700a3fb6
...
60082655d4
@ -1,73 +0,0 @@
|
|||||||
export function convertImage (sourceFile, targetType, quality) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const reader = new FileReader()
|
|
||||||
|
|
||||||
reader.onload = function (event) {
|
|
||||||
const img = new Image()
|
|
||||||
|
|
||||||
img.onload = function () {
|
|
||||||
const canvas = document.createElement('canvas')
|
|
||||||
const ctx = canvas.getContext('2d')
|
|
||||||
|
|
||||||
canvas.width = img.width
|
|
||||||
canvas.height = img.height
|
|
||||||
ctx.drawImage(img, 0, 0)
|
|
||||||
canvas.toBlob(function (blob) {
|
|
||||||
const ext = targetType === 'image/jpeg' ? '.jpg' : '.png'
|
|
||||||
const newFile = new File([blob], sourceFile.name.replace(/\.\w+$/, ext), { type: targetType })
|
|
||||||
resolve(newFile)
|
|
||||||
}, targetType, quality)
|
|
||||||
}
|
|
||||||
|
|
||||||
img.onerror = () => reject(new Error(`browser cannot decode ${sourceFile.type || sourceFile.name}`))
|
|
||||||
|
|
||||||
img.src = event.target.result
|
|
||||||
}
|
|
||||||
reader.onerror = reject
|
|
||||||
reader.readAsDataURL(sourceFile)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function convertImagesInInput (input) {
|
|
||||||
if (!input.files || input.files.length === 0) return
|
|
||||||
|
|
||||||
const dt = new DataTransfer()
|
|
||||||
let didConvert = false
|
|
||||||
|
|
||||||
for (const file of Array.from(input.files)) {
|
|
||||||
let converted = file
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (['image/bmp', 'image/vnd.microsoft.icon', 'image/svg+xml', 'image/gif'].includes(file.type)) {
|
|
||||||
converted = await convertImage(file, 'image/png')
|
|
||||||
didConvert = true
|
|
||||||
} else if (['image/heic', 'image/heif', 'image/heic-sequence', 'image/heif-sequence', 'image/avif', 'image/avif-sequence', 'image/webp'].includes(file.type)) {
|
|
||||||
converted = await convertImage(file, 'image/jpeg', 0.9)
|
|
||||||
didConvert = true
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
alert(e.message)
|
|
||||||
}
|
|
||||||
|
|
||||||
dt.items.add(converted)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (didConvert) {
|
|
||||||
input.files = dt.files
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class extends HTMLElement {
|
|
||||||
connectedCallback () {
|
|
||||||
const input = this.querySelector('input[type="file"]')
|
|
||||||
const form = input.form
|
|
||||||
|
|
||||||
input.addEventListener('change', async () => {
|
|
||||||
await convertImagesInInput(input)
|
|
||||||
|
|
||||||
form.querySelector('[type="submit"]')?.setAttribute('disabled', true)
|
|
||||||
|
|
||||||
form.requestSubmit()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,15 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
priority = %w[application/pdf image/jpeg image/png]
|
|
||||||
|
|
||||||
indexes = Marcel::MAGIC.each_with_index.with_object({}) do |((type, _), i), acc|
|
|
||||||
acc[type] = i if priority.include?(type)
|
|
||||||
|
|
||||||
break acc if acc.size == priority.size
|
|
||||||
end
|
|
||||||
|
|
||||||
pdf_index, jpg_index, png_index = indexes.values_at(*priority)
|
|
||||||
|
|
||||||
Marcel::MAGIC[0], Marcel::MAGIC[pdf_index] = Marcel::MAGIC[pdf_index], Marcel::MAGIC[0]
|
|
||||||
Marcel::MAGIC[1], Marcel::MAGIC[jpg_index] = Marcel::MAGIC[jpg_index], Marcel::MAGIC[1]
|
|
||||||
Marcel::MAGIC[2], Marcel::MAGIC[png_index] = Marcel::MAGIC[png_index], Marcel::MAGIC[2]
|
|
||||||
Loading…
Reference in new issue