frontPanel/src/pages/startPage/dropZone.tsx

129 lines
4.0 KiB
TypeScript
Raw Normal View History

2023-11-23 18:52:15 +00:00
import UploadIcon from "@icons/UploadIcon";
2023-11-01 13:31:15 +00:00
import {
2023-11-14 13:13:10 +00:00
Box,
ButtonBase,
SxProps,
Theme,
2023-11-23 18:52:15 +00:00
Typography,
useTheme,
2023-11-01 13:31:15 +00:00
} from "@mui/material";
2023-11-27 23:07:24 +00:00
import { updateQuiz } from "@root/quizes/actions";
2023-11-14 13:13:10 +00:00
import { useCurrentQuiz } from "@root/quizes/hooks";
2023-11-23 18:52:15 +00:00
import { enqueueSnackbar } from "notistack";
import { useState } from "react";
2023-11-14 13:13:10 +00:00
2023-11-01 13:31:15 +00:00
interface Props {
2023-11-14 13:13:10 +00:00
text?: string;
sx?: SxProps<Theme>;
heightImg: string;
widthImg?: string;
}
//Научи функцию принимать данные для валидации
2023-11-01 13:31:15 +00:00
export const DropZone = ({ text, sx, heightImg, widthImg }: Props) => {
2023-11-14 13:13:10 +00:00
const theme = useTheme();
2023-11-27 23:07:24 +00:00
const quiz = useCurrentQuiz();
2023-11-14 13:13:10 +00:00
const [ready, setReady] = useState(false);
if (!quiz) return null; // TODO throw and catch with error boundary
2023-11-14 13:13:10 +00:00
const imgHC = (imgInp: HTMLInputElement) => {
const file = imgInp.files?.[0];
if (file) {
if (file.size < 5242880) {
2023-11-27 23:07:24 +00:00
updateQuiz(quiz.id, quiz => {
2023-11-14 13:13:10 +00:00
quiz.config.startpage.background.desktop = URL.createObjectURL(file);
});
} else {
enqueueSnackbar("Размер картинки слишком велик");
}
}
};
2023-11-14 13:13:10 +00:00
const dragenterHC = () => {
setReady(true);
};
2023-11-14 13:13:10 +00:00
const dragexitHC = () => {
setReady(false);
};
2023-11-14 13:13:10 +00:00
const dropHC = (event: React.DragEvent<HTMLDivElement>) => {
event.preventDefault();
setReady(false);
2023-11-14 13:13:10 +00:00
const file = event.dataTransfer.files[0];
if (file.size < 5242880) {
2023-11-27 23:07:24 +00:00
updateQuiz(quiz.id, quiz => {
2023-11-14 13:13:10 +00:00
quiz.config.startpage.background.desktop = URL.createObjectURL(file);
});
} else {
enqueueSnackbar("Размер картинки слишком велик");
}
};
2023-11-14 13:13:10 +00:00
const dragOverHC = (event: React.DragEvent<HTMLDivElement>) => {
event.preventDefault();
};
2023-11-14 13:13:10 +00:00
return (
<ButtonBase component="label" sx={{ justifyContent: "flex-start" }}>
<input
onChange={(event) => imgHC(event.target)}
hidden
accept="image/*"
multiple
type="file"
/>
<Box
onDragEnter={dragenterHC}
onDragExit={dragexitHC}
onDrop={dropHC}
onDragOver={dragOverHC}
sx={{
width: "100%",
height: "120px",
position: "relative",
display: "flex",
justifyContent: "center",
alignItems: "center",
backgroundColor: theme.palette.background.default,
border: `1px solid ${ready ? "red" : theme.palette.grey2.main}`,
borderRadius: "8px",
opacity: quiz.config.startpage.background.desktop ? "0.5" : 1,
...sx,
}}
>
<UploadIcon />
<Typography
sx={{
position: "absolute",
right: "10px",
bottom: "10px",
color: theme.palette.orange.main,
fontSize: "16px",
lineHeight: "19px",
textDecoration: "underline",
}}
>
{text}
</Typography>
{quiz.config.startpage.background.desktop && (
<img
height={heightImg}
width={widthImg}
src={quiz.config.startpage.background.desktop}
style={{
position: "absolute",
zIndex: "-1",
objectFit: "revert-layer",
}}
alt="img"
/>
)}
</Box>
</ButtonBase>
);
};