better error handling for fileinput

Signed-off-by: Benny Samir Hierl <bennysamir@posteo.de>
This commit is contained in:
Benny Samir Hierl 2022-02-16 00:24:34 +01:00
parent 77d9916517
commit a0d6cc685f
3 changed files with 29 additions and 7 deletions

View file

@ -77,15 +77,29 @@ const props = defineProps({
}, },
}) })
const { value, errorMessage } = useField(props.name, undefined, {}) const { value, errorMessage, setErrors } = useField(props.name, undefined, {})
const convertBase64 = (file: File): Promise<string> => { const convertBase64 = (file: File): Promise<string | null> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const fileReader = new FileReader() const fileReader = new FileReader()
fileReader.readAsDataURL(file) fileReader.readAsDataURL(file)
let image = new Image()
fileReader.onload = () => { fileReader.onload = () => {
resolve(fileReader.result as string) image.src = fileReader.result as string
image.onload = function () {
var height = image.height
var width = image.width
if (height > 200 || width > 200) {
setErrors([
t(
'components.wishlist-header.main.form.image-file.error-image-size'
),
])
return resolve('')
}
resolve(fileReader.result as string)
}
} }
fileReader.onerror = (error) => { fileReader.onerror = (error) => {
@ -94,13 +108,19 @@ const convertBase64 = (file: File): Promise<string> => {
}) })
} }
const handleFile = async (file: File) => {
const base64String = await convertBase64(file)
if (base64String) value.value = base64String
}
const handleChange = async (event: any) => { const handleChange = async (event: any) => {
const file = (event.target as FileEventTarget).files[0] const file = (event.target as FileEventTarget).files[0]
value.value = await convertBase64(file) handleFile(file)
} }
const handleDrop = async (event: any) => { const handleDrop = async (event: any) => {
showDropzone.value = false
let droppedFiles = event.dataTransfer.files let droppedFiles = event.dataTransfer.files
if (!droppedFiles) return if (!droppedFiles) return
value.value = await convertBase64(droppedFiles[0]) handleFile(droppedFiles[0])
} }
</script> </script>

View file

@ -104,7 +104,8 @@
"label": "Bild-Datei", "label": "Bild-Datei",
"text-dropzone-link": "hier", "text-dropzone-link": "hier",
"text-dropzone": "Ziehen Sie ein beliebiges Bild hierher oder klicken Sie {0}, um den Dialog zu öffnen.", "text-dropzone": "Ziehen Sie ein beliebiges Bild hierher oder klicken Sie {0}, um den Dialog zu öffnen.",
"error-requried": "Bild-Datei wird benötigt" "error-requried": "Bild-Datei wird benötigt",
"error-image-size": "Höhe und Breite dürfen 200px nicht überschreiten."
}, },
"submit": { "submit": {
"text": "Speichern" "text": "Speichern"

View file

@ -102,7 +102,8 @@
"label": "Image-File", "label": "Image-File",
"text-dropzone-link": "click here", "text-dropzone-link": "click here",
"text-dropzone": "drag and drop any image here or {0} to open dialog.", "text-dropzone": "drag and drop any image here or {0} to open dialog.",
"error-requried": "Image-File is required" "error-requried": "Image-File is required",
"error-image-size": "Height and Width must not exceed 200px."
}, },
"submit": { "submit": {
"text": "Save" "text": "Save"