import { Box, ButtonBase, IconButton, Typography, useTheme } from "@mui/material"; import { useState, useRef } from "react"; import CloseIcon from "@mui/icons-material/Close"; import { useTranslation } from "react-i18next"; import { useQuizStore } from "@/stores/useQuizStore"; import { useQuizViewStore } from "@/stores/quizView"; import { useSnackbar } from "notistack"; import { Skeleton } from "@mui/material"; import UploadIcon from "@/assets/icons/UploadIcon"; import { sendFile } from "@/api/quizRelase"; import { ACCEPT_SEND_FILE_TYPES_MAP, MAX_FILE_SIZE } from "../../tools/fileUpload"; type OwnImageProps = { imageUrl?: string; questionId: string; variantId: string; onValidationError: (error: "size" | "type") => void; }; export const OwnImage = ({ imageUrl, questionId, variantId, onValidationError }: OwnImageProps) => { const theme = useTheme(); const { t } = useTranslation(); const { quizId, preview } = useQuizStore(); const { answers, updateAnswer, ownVariants, updateOwnVariant } = useQuizViewStore((state) => state); const { enqueueSnackbar } = useSnackbar(); const [selectedFile, setSelectedFile] = useState(null); const [isUploading, setIsUploading] = useState(false); const fileInputRef = useRef(null); const ownVariantData = ownVariants.find((v) => v.id === variantId); const uploadImage = async (file: File) => { if (isUploading) return; if (!file) return; if (file.size > MAX_FILE_SIZE) { onValidationError("size"); return; } const isFileTypeAccepted = ACCEPT_SEND_FILE_TYPES_MAP.picture.some((fileType) => file.name.toLowerCase().endsWith(fileType) ); if (!isFileTypeAccepted) { onValidationError("type"); return; } setIsUploading(true); try { const data = await sendFile({ questionId, body: { file: file, name: file.name, preview, }, qid: quizId, }); const fileId = data!.data.fileIDMap[questionId]; // Сохраняем fileId в originalImageUrl updateOwnVariant(variantId, "", "", fileId); // Для UI — локальный preview const localImageUrl = URL.createObjectURL(file); updateAnswer(questionId, `${file.name}|${localImageUrl}`, 0); setSelectedFile(file); } catch (error) { console.error("Error uploading image:", error); enqueueSnackbar(t("The answer was not counted")); } finally { setIsUploading(false); } }; const handleFileChange = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (file) { uploadImage(file); } }; const handleClick = (e: React.MouseEvent) => { e.stopPropagation(); if (fileInputRef.current) { fileInputRef.current.value = ""; } fileInputRef.current?.click(); }; const handleRemoveImage = (e: React.MouseEvent) => { e.stopPropagation(); setSelectedFile(null); updateAnswer(questionId, "", 0); updateOwnVariant(variantId, "", "", ""); }; const imageToDisplay = selectedFile ? URL.createObjectURL(selectedFile) : ownVariantData?.variant.originalImageUrl || imageUrl; if (isUploading) { return ( ); } return ( {imageToDisplay ? ( <> Preview {(selectedFile || ownVariantData?.variant.originalImageUrl) && ( )} ) : ( добавьте свою картинку )} ); };