import ArrowUpTrayIcon from '@heroicons/react/24/outline/ArrowUpTrayIcon' import TrashIcon from '@heroicons/react/24/solid/TrashIcon' import imageCompression from 'browser-image-compression' import { useState } from 'react' import { useDropzone } from 'react-dropzone' import { useAppState } from '#components/AppShell/hooks/useAppState' import DialogModal from '#components/Templates/DialogModal' import type { FormState } from '#types/FormState' interface Props { state: FormState setState: React.Dispatch> } const compressionOptions = { maxSizeMB: 1, maxWidthOrHeight: 1920, useWebWorker: true, } export const GalleryForm = ({ state, setState }: Props) => { const appState = useAppState() const [uploadingImages, setUploadingImages] = useState([]) const [deleteModalImage, setDeleteModalImage] = useState(null) const closeModal = () => setDeleteModalImage(null) const upload = async (acceptedFiles: File[]) => { setUploadingImages((files) => [...files, ...acceptedFiles]) const uploads = acceptedFiles.map(async (file) => { const compressedFile = await imageCompression(file, compressionOptions) return { asset: await appState.assetsApi.upload(compressedFile, 'gallery'), name: file.name, } }) for await (const upload of uploads) { setState((prevState) => ({ ...prevState, gallery: [ ...prevState.gallery, { directus_files_id: { id: upload.asset.id, width: 0, height: 0, }, }, ], })) setUploadingImages((files) => files.filter((f) => f.name !== upload.name)) } } const { getRootProps, getInputProps } = useDropzone({ // eslint-disable-next-line @typescript-eslint/no-misused-promises onDrop: upload, accept: { 'image/jpeg': [], }, }) const images = state.gallery .map((image) => ({ src: appState.assetsApi.url + `${image.directus_files_id.id}.jpg`, state: 'uploaded', })) .concat( uploadingImages.map((file) => ({ src: URL.createObjectURL(file), state: 'uploading', })), ) const removeImage = (index: number) => { setState((prevState) => ({ ...prevState, gallery: prevState.gallery.filter((_, i) => i !== index), })) } return ( <>
{images.map((image, index) => (
{`Gallery {image.state === 'uploading' && ( )} {image.state === 'uploaded' && ( )}
))}
e.stopPropagation()}> Do you want to delete this image?
) }