import TrashIcon from '@heroicons/react/24/solid/TrashIcon' import imageCompression from 'browser-image-compression' import { useState } from 'react' import { useDropzone } from 'react-dropzone' import { BiSolidImage } from 'react-icons/bi' import { useAppState } from '#components/AppShell/hooks/useAppState' import DialogModal from '#components/Templates/DialogModal' import { getImageDimensions } from '#utils/getImageDimensions' 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 [imageSelectedToDelete, setImageSelectedToDelete] = useState(null) const closeModal = () => setImageSelectedToDelete(null) const upload = async (acceptedFiles: File[]) => { setState((prevState) => ({ ...prevState, uploadingImages: [...prevState.uploadingImages, ...acceptedFiles], })) const uploads = acceptedFiles.map(async (file) => { const compressedFile = await imageCompression(file, compressionOptions) const { width, height } = await getImageDimensions(compressedFile) return { width, height, asset: await appState.assetsApi.upload(compressedFile, file.name), name: file.name, } }) for await (const upload of uploads) { setState((prevState) => ({ ...prevState, uploadingImages: prevState.uploadingImages.filter((f) => f.name !== upload.name), gallery: [ ...prevState.gallery, { directus_files_id: { id: upload.asset.id, width: upload.width, height: upload.height, }, }, ], })) } } 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( state.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' && ( )}
))}
Upload Image
e.stopPropagation()}> Do you want to delete this image?
) }