import { UploadFile, createDropzone, createFileUploader } from '@solid-primitives/upload' import { clsx } from 'clsx' import { Show, createSignal } from 'solid-js' import { useLocalize } from '../../../context/localize' import { UploadedFile } from '../../../pages/types' import { hideModal } from '../../../stores/ui' import { handleImageUpload } from '../../../utils/handleImageUpload' import { verifyImg } from '../../../utils/verifyImg' import { Button } from '../../_shared/Button' import { Icon } from '../../_shared/Icon' import { Loading } from '../../_shared/Loading' import { InlineForm } from '../InlineForm' import styles from './UploadModalContent.module.scss' type Props = { onClose: (image?: UploadedFile) => void } export const UploadModalContent = (props: Props) => { const { t } = useLocalize() const [isUploading, setIsUploading] = createSignal(false) const [uploadError, setUploadError] = createSignal() const [dragActive, setDragActive] = createSignal(false) const [dragError, setDragError] = createSignal() const { selectFiles } = createFileUploader({ multiple: false, accept: 'image/*' }) const runUpload = async (file: UploadFile) => { try { setIsUploading(true) const result = await handleImageUpload(file) props.onClose(result) setIsUploading(false) } catch (error) { setIsUploading(false) setUploadError(t('Error')) console.error('[runUpload]', error) } } const handleImageFormSubmit = async (value: string) => { try { const data = await fetch(value) const blob = await data.blob() const file = new File([blob], 'convertedFromUrl', { type: data.headers.get('Content-Type') }) const fileToUpload: UploadFile = { source: blob.toString(), name: file.name, size: file.size, file: file, } await runUpload(fileToUpload) } catch (error) { console.error('[handleImageFormSubmit]', error) } } const handleUpload = () => { selectFiles(async ([uploadFile]) => { await runUpload(uploadFile) }) } const { setRef: dropzoneRef, files: droppedFiles } = createDropzone({ onDrop: async () => { setDragActive(false) if (droppedFiles().length > 1) { setDragError(t('Many files, choose only one')) } else if (droppedFiles()[0].file.type.startsWith('image/')) { await runUpload(droppedFiles()[0]) } else { setDragError(t('Image format not supported')) } }, }) const handleDrag = (event: MouseEvent) => { if (event.type === 'dragenter' || event.type === 'dragover') { setDragActive(true) } else if (event.type === 'dragleave') { setDragActive(false) } } const handleValidate = async (value: string) => { const validationResult = await verifyImg(value) if (!validationResult) { return t('Invalid image URL') } return '' } return (
}> <>
{dragError() ?? t('Drag the image to this area')}
) }