2025-06-20 19:22:18 +00:00
|
|
|
import React, { forwardRef, useState } from "react";
|
2025-06-20 19:14:39 +00:00
|
|
|
import { useQuizViewStore } from "@stores/quizView";
|
2025-06-20 19:22:18 +00:00
|
|
|
import { useQuizStore } from "@/stores/useQuizStore";
|
|
|
|
import { useSnackbar } from "notistack";
|
|
|
|
import { useTranslation } from "react-i18next";
|
|
|
|
import { sendFile } from "@/api/quizRelase";
|
|
|
|
import { ACCEPT_SEND_FILE_TYPES_MAP, MAX_FILE_SIZE } from "../../tools/fileUpload";
|
2025-06-20 18:52:36 +00:00
|
|
|
|
2025-06-20 19:14:39 +00:00
|
|
|
interface OwnVarimgImageProps {
|
2025-06-20 18:52:36 +00:00
|
|
|
questionId: string;
|
|
|
|
variantId: string;
|
2025-06-20 19:14:39 +00:00
|
|
|
}
|
2025-06-20 18:52:36 +00:00
|
|
|
|
2025-06-20 19:14:39 +00:00
|
|
|
export const OwnVarimgImage = forwardRef<HTMLInputElement, OwnVarimgImageProps>(({ questionId, variantId }, ref) => {
|
2025-06-20 19:22:18 +00:00
|
|
|
const { updateAnswer, updateOwnVariant } = useQuizViewStore((state) => state);
|
|
|
|
const { quizId, preview } = useQuizStore();
|
|
|
|
const { enqueueSnackbar } = useSnackbar();
|
|
|
|
const { t } = useTranslation();
|
|
|
|
|
|
|
|
const [isUploading, setIsUploading] = useState(false);
|
|
|
|
|
|
|
|
const uploadImage = async (file: File) => {
|
|
|
|
if (isUploading) return;
|
|
|
|
if (!file) return;
|
|
|
|
|
|
|
|
// Валидация размера файла
|
|
|
|
if (file.size > MAX_FILE_SIZE) {
|
|
|
|
enqueueSnackbar(t("file is too big"), { variant: "warning" });
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Валидация типа файла
|
|
|
|
const isFileTypeAccepted = ACCEPT_SEND_FILE_TYPES_MAP.picture.some((fileType) =>
|
|
|
|
file.name.toLowerCase().endsWith(fileType)
|
|
|
|
);
|
|
|
|
if (!isFileTypeAccepted) {
|
|
|
|
enqueueSnackbar(t("file type is not supported"), { variant: "warning" });
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
setIsUploading(true);
|
|
|
|
try {
|
|
|
|
const data = await sendFile({
|
|
|
|
questionId,
|
|
|
|
body: { file, name: file.name, preview },
|
|
|
|
qid: quizId,
|
|
|
|
});
|
|
|
|
|
|
|
|
const fileId = data?.data.fileIDMap[questionId];
|
|
|
|
const localImageUrl = URL.createObjectURL(file);
|
|
|
|
|
|
|
|
updateOwnVariant(variantId, "", "", fileId, localImageUrl);
|
|
|
|
// Автоматически выбираем "own" вариант при загрузке файла
|
|
|
|
updateAnswer(questionId, variantId, 0);
|
|
|
|
} catch (error) {
|
|
|
|
console.error("Error uploading image:", error);
|
|
|
|
enqueueSnackbar(t("The answer was not counted"));
|
|
|
|
} finally {
|
|
|
|
setIsUploading(false);
|
|
|
|
}
|
|
|
|
};
|
2025-06-20 18:52:36 +00:00
|
|
|
|
|
|
|
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
|
|
const file = event.target.files?.[0];
|
|
|
|
if (file) {
|
2025-06-20 19:22:18 +00:00
|
|
|
uploadImage(file);
|
2025-06-20 19:14:39 +00:00
|
|
|
event.target.value = "";
|
2025-06-20 18:52:36 +00:00
|
|
|
}
|
2025-06-20 19:14:39 +00:00
|
|
|
};
|
2025-06-20 18:52:36 +00:00
|
|
|
|
|
|
|
return (
|
2025-06-20 19:14:39 +00:00
|
|
|
<input
|
|
|
|
type="file"
|
|
|
|
ref={ref}
|
|
|
|
style={{ display: "none" }}
|
2025-06-20 19:22:18 +00:00
|
|
|
accept={ACCEPT_SEND_FILE_TYPES_MAP.picture.join(",")}
|
2025-06-20 19:14:39 +00:00
|
|
|
onChange={handleFileChange}
|
2025-06-20 19:22:18 +00:00
|
|
|
disabled={isUploading}
|
2025-06-20 19:14:39 +00:00
|
|
|
/>
|
2025-06-20 18:52:36 +00:00
|
|
|
);
|
2025-06-20 19:14:39 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
OwnVarimgImage.displayName = "OwnVarimgImage";
|