frontPanel/src/pages/startPage/dropfavicon.tsx
2023-11-23 21:52:15 +03:00

275 lines
6.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Box, ButtonBase, SxProps, Theme, Typography, useTheme } from "@mui/material";
import Resizer from "@ui_kit/reactImageFileResizer";
import saveAs from "file-saver";
import JSZip from "jszip";
import { enqueueSnackbar } from "notistack";
import { useEffect, useState } from "react";
import UploadIcon from "../../assets/icons/UploadIcon";
interface Props {
text?: string;
sx?: SxProps<Theme>;
heightImg: string;
widthImg?: string;
}
const imageFavicon = [
{
maxWidth: 16,
maxHeight: 16,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 32,
maxHeight: 32,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 48,
maxHeight: 48,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 76,
maxHeight: 76,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 96,
maxHeight: 96,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 120,
maxHeight: 120,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 128,
maxHeight: 128,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 144,
maxHeight: 144,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 152,
maxHeight: 152,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 167,
maxHeight: 167,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 180,
maxHeight: 180,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 192,
maxHeight: 192,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 196,
maxHeight: 196,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 228,
maxHeight: 288,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 256,
maxHeight: 256,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 300,
maxHeight: 300,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 384,
maxHeight: 384,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
{
maxWidth: 512,
maxHeight: 512,
compressFormat: "PNG",
quality: 100,
rotation: 0,
},
];
export default ({ text, sx, heightImg, widthImg }: Props) => {
const theme = useTheme();
const [favList, setFavList] = useState<string[]>([]);
useEffect(() => {
if (favList.length === 18) {
const zip = new JSZip(); //создание зип архива
favList.forEach((uri, i) => {
const idx = uri.indexOf("base64,") + "base64,".length; //обработка строки картинки
const content = uri.substring(idx); //обработка строки картинки
zip.file(`fav${i}.jpg`, content, { base64: true }); //сохранение картинки в архив с именем "fav.jpg"
});
zip.generateAsync({ type: "blob" }).then(function (content) {
// скачивание архива
saveAs(content, "fav.zip"); // скачивание архива
}); // скачивание архива
}
}, [favList]);
const callback = (uri: string) => {
setFavList((old) => [...old, uri]);
};
const imgHC = (imgInp: HTMLInputElement) => {
const file = imgInp.files?.[0];
if (file) {
setFavList([]);
if (file.size < 5242880) {
setData(URL.createObjectURL(file));
imageFavicon.forEach((obj) => {
try {
Resizer.imageFileResizer(
file,
obj.maxWidth,
obj.compressFormat,
obj.quality,
obj.rotation,
callback,
"string"
);
} catch (err) {
console.log(err);
}
});
} else {
enqueueSnackbar("Размер картинки слишком велик");
}
}
};
const [data, setData] = useState("");
const [ready, setReady] = useState(false);
const dragenterHC = () => {
setReady(true);
};
const dragexitHC = () => {
setReady(false);
};
const dropHC = (event: React.DragEvent<HTMLDivElement>) => {
event.preventDefault();
setReady(false);
const file = event.dataTransfer.files[0];
if (file.size < 5242880) {
setData(URL.createObjectURL(file));
} else {
enqueueSnackbar("Размер картинки слишком велик");
}
};
const dragOverHC = (event: React.DragEvent<HTMLDivElement>) => {
event.preventDefault();
};
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: data ? "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>
{data ? (
<img
height={heightImg}
width={widthImg}
src={data}
style={{
position: "absolute",
zIndex: "-1",
objectFit: "revert-layer",
}}
/>
) : null}
</Box>
</ButtonBase>
);
};