import { Box, ButtonBase, Typography, useTheme } from "@mui/material"; import { useMemo, useState } from "react"; import { useRootContainerSize } from "@contexts/RootContainerWidthContext"; import { useTranslation } from "react-i18next"; import { enqueueSnackbar } from "notistack"; import { ACCEPT_SEND_FILE_TYPES_MAP } from "@/components/ViewPublicationPage/tools/fileUpload"; import UploadIcon from "@icons/UploadIcon"; import { uploadFile } from "@/utils/fileUpload"; import { useQuizStore } from "@/stores/useQuizStore"; interface ImageCardProps { questionId: string; imageUrl: string; isOwn?: boolean; onImageUpload?: (fileUrl: string) => void; } const useFileUpload = (questionId: string, onImageUpload?: (fileUrl: string) => void) => { const { t } = useTranslation(); const [isSending, setIsSending] = useState(false); const [currentImageUrl, setCurrentImageUrl] = useState(null); const { quizId, preview } = useQuizStore(); const handleFileUpload = async (file: File | undefined) => { if (isSending || !file) return; const result = await uploadFile({ file, questionId, quizId, fileType: "picture", preview, onSuccess: (fileUrl) => { setCurrentImageUrl(URL.createObjectURL(file)); onImageUpload?.(fileUrl); }, onError: (error) => { console.error(error); enqueueSnackbar(t(error.message)); }, onProgress: () => { setIsSending(true); }, }); setIsSending(false); }; return { isSending, currentImageUrl, handleFileUpload, }; }; export const ImageCard = ({ questionId, imageUrl, isOwn, onImageUpload }: ImageCardProps) => { const theme = useTheme(); const { t } = useTranslation(); const isMobile = useRootContainerSize() < 450; const isTablet = useRootContainerSize() < 850; const [isDropzoneHighlighted, setIsDropzoneHighlighted] = useState(false); const { currentImageUrl, handleFileUpload } = useFileUpload(questionId, onImageUpload); const onDrop = (event: React.DragEvent) => { event.preventDefault(); setIsDropzoneHighlighted(false); const file = event.dataTransfer.files[0]; handleFileUpload(file); }; return ( {isOwn && ( setIsDropzoneHighlighted(true)} onDragLeave={() => setIsDropzoneHighlighted(false)} onDragOver={(event) => event.preventDefault()} onDrop={onDrop} > handleFileUpload(target.files?.[0])} hidden accept={ACCEPT_SEND_FILE_TYPES_MAP.picture.join(",")} type="file" /> )} ); };