import React, { useState, useEffect, useContext } from "react"; import * as Yup from "yup"; import { Formik, Form, Field, FieldArray } from "formik"; import { toast } from "react-toastify"; import { Box, Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, Divider, Grid, makeStyles, TextField } from "@material-ui/core"; import IconButton from "@material-ui/core/IconButton"; import Typography from "@material-ui/core/Typography"; import DeleteOutlineIcon from "@material-ui/icons/DeleteOutline"; import AttachFileIcon from "@material-ui/icons/AttachFile"; import { green } from "@material-ui/core/colors"; import { i18n } from "../../translate/i18n"; import api from "../../services/api"; import toastError from "../../errors/toastError"; import { AuthContext } from "../../context/Auth/AuthContext"; const useStyles = makeStyles(theme => ({ root: { display: "flex", flexWrap: "wrap", gap: 4 }, multFieldLine: { display: "flex", "& > *:not(:last-child)": { marginRight: theme.spacing(1), }, }, textField: { marginRight: theme.spacing(1), flex: 1, }, extraAttr: { display: "flex", justifyContent: "center", alignItems: "center", }, btnWrapper: { position: "relative", }, buttonProgress: { color: green[500], position: "absolute", top: "50%", left: "50%", marginTop: -12, marginLeft: -12, }, formControl: { margin: theme.spacing(1), minWidth: 2000, }, colorAdorment: { width: 20, height: 20, }, })); const FileListSchema = Yup.object().shape({ name: Yup.string() .min(3, i18n.t("fileModal.formErrors.name.short")) .required(i18n.t("fileModal.formErrors.name.required")), message: Yup.string() .required(i18n.t("fileModal.formErrors.message.required")) }); const FilesModal = ({ open, onClose, fileListId, reload }) => { const classes = useStyles(); const { user } = useContext(AuthContext); const [ files, setFiles ] = useState([]); const [selectedFileNames, setSelectedFileNames] = useState([]); const initialState = { name: "", message: "", options: [{ name: "", path:"", mediaType:"" }], }; const [fileList, setFileList] = useState(initialState); useEffect(() => { try { (async () => { if (!fileListId) return; const { data } = await api.get(`/files/${fileListId}`); setFileList(data); })() } catch (err) { toastError(err); } }, [fileListId, open]); const handleClose = () => { setFileList(initialState); setFiles([]); onClose(); }; const handleSaveFileList = async (values) => { const uploadFiles = async (options, filesOptions, id) => { const formData = new FormData(); formData.append("fileId", id); formData.append("typeArch", "fileList") filesOptions.forEach((fileOption, index) => { if (fileOption.file) { formData.append("files", fileOption.file); formData.append("mediaType", fileOption.file.type) formData.append("name", options[index].name); formData.append("id", options[index].id); } }); try { const { data } = await api.post(`/files/uploadList/${id}`, formData); setFiles([]); return data; } catch (err) { toastError(err); } return null; } const fileData = { ...values, userId: user.id }; try { if (fileListId) { const { data } = await api.put(`/files/${fileListId}`, fileData) if (data.options.length > 0) uploadFiles(data.options, values.options, fileListId) } else { const { data } = await api.post("/files", fileData); if (data.options.length > 0) uploadFiles(data.options, values.options, data.id) } toast.success(i18n.t("fileModal.success")); if (typeof reload == 'function') { reload(); } } catch (err) { toastError(err); } handleClose(); }; return (