import { useEffect, useRef, useState } from "react"; import { Box, ButtonBase, useTheme, Typography, SxProps, Theme } from "@mui/material"; import UploadIcon from "../../assets/icons/UploadIcon"; import { SnackbarProvider, enqueueSnackbar } from "notistack"; import Resizer from "@ui_kit/reactImageFileResizer"; import JSZip from "jszip"; import saveAs from "file-saver"; interface Props { text?: string; sx?: SxProps; 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([]); 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) => { 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) => { event.preventDefault(); }; return ( imgHC(event.target)} hidden accept="image/*" multiple type="file" /> {text} {data ? ( ) : null} ); };