import backgroundImage from "@Assets/images/background_refonte.svg"; import { EDocumentNotaryStatus } from "le-coffre-resources/dist/Notary/DocumentNotary"; import Button, { EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button"; import DragAndDrop from "@Front/Components/DesignSystem/DragAndDrop"; import Form from "@Front/Components/DesignSystem/Form"; import AutocompleteMultiSelectField from "@Front/Components/DesignSystem/Form/AutocompleteMultiSelectField"; import RadioBox from "@Front/Components/DesignSystem/RadioBox"; import { ToasterService } from "@Front/Components/DesignSystem/Toaster"; import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; import BackArrow from "@Front/Components/Elements/BackArrow"; import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage"; import Module from "@Front/Config/Module"; import { PaperAirplaneIcon } from "@heroicons/react/24/outline"; import { ValidationError } from "class-validator"; import { OfficeFolder } from "le-coffre-resources/dist/Notary"; import { useRouter } from "next/router"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import classes from "./classes.module.scss"; import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import FileService from "src/common/Api/LeCoffreApi/sdk/FileService"; import CustomerService from "src/common/Api/LeCoffreApi/sdk/CustomerService"; enum EClientSelection { ALL_CLIENTS = "all_clients", SELECTED_CLIENTS = "selected_clients", } export default function SendDocuments() { const router = useRouter(); let { folderUid } = router.query; const [folder, setFolder] = useState(null); const [clientSelection, setClientSelection] = useState(null); const [selectedClients, setSelectedClients] = useState([]); const [files, setFiles] = useState([]); const [isSending, setIsSending] = useState(false); const [validationError, setValidationError] = useState(null); const onFormSubmit = useCallback( async ( _e: React.FormEvent | null, _values: { [key: string]: any; }, ) => { if (!files.length) { console.error("No files to send"); return; } try { setIsSending(true); if (selectedClients.length === 0) { setValidationError({ property: "clients", constraints: { isEmpty: "Veuillez sélectionner au moins un client", }, }); throw new Error("No clients selected"); } LoaderService.getInstance().show(); for (const selectedClient of selectedClients) { const customer: any = await new Promise((resolve: (customer: any) => void) => { CustomerService.getCustomerByUid(selectedClient as string).then((process: any) => { if (process) { const customer: any = process.processData; resolve(customer); } }); }); for (const file of files) { await new Promise((resolve: () => void) => { const reader = new FileReader(); reader.onload = (event) => { if (event.target?.result) { const date: Date = new Date(); const strDate: string = `${date.getDate().toString().padStart(2, '0')}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}`; const fileName: string = `${customer.contact.last_name}-${strDate}.${file.name.split('.').pop()}`; const arrayBuffer: ArrayBuffer = event.target.result as ArrayBuffer; const uint8Array: Uint8Array = new Uint8Array(arrayBuffer); const fileBlob: any = { type: file.type, data: uint8Array }; const fileData: any = { file_blob: fileBlob, file_name: fileName }; const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; FileService.createFile(fileData, validatorId).then((processCreated: any) => { const fileUid: string = processCreated.processData.uid; const documentData: any = { folder: { uid: folderUid as string }, customer: { uid: selectedClient as string }, files: [ { uid: fileUid } ], document_status: EDocumentNotaryStatus.SENT }; DocumentService.createDocument(documentData, validatorId).then(() => resolve()); }); } }; reader.readAsArrayBuffer(file); }); } } LoaderService.getInstance().hide(); router.push( Module.getInstance() .get() .modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", folderUid as string), ); setIsSending(false); ToasterService.getInstance().success({ title: "Succès !", description: "Votre document a été envoyée avec succès." }); /* await Promise.all( selectedClients.map(async (customer) => { const promises = files.map(async (file) => { const formData = new FormData(); formData.append("customerUid", customer as string); formData.append("folderUid", folderUid as string); formData.append("name", file.name); formData.append("file", file); // Envoi de chaque fichier pour chaque client return DocumentsNotary.getInstance().post(formData); }); // Attendre que tous les fichiers pour un client soient envoyés await Promise.all(promises); }), ); router.push( Module.getInstance() .get() .modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", folderUid as string), ); setIsSending(false); ToasterService.getInstance().success({ title: "Succès !", description: "Votre document a été envoyée avec succès." }); */ } catch (error) { setIsSending(false); console.warn("Error while sending files: ", error); } }, [files, folderUid, router, selectedClients], ); const fetchFolder = useCallback(async () => { LoaderService.getInstance().show(); FolderService.getFolderByUid(folderUid as string).then((process: any) => { if (process) { const folder: any = process.processData; setFolder(folder); LoaderService.getInstance().hide(); } }); }, [folderUid]); const onClientSelectionChange = useCallback( (e: React.ChangeEvent) => { const selection = e.target.value as EClientSelection; setClientSelection(selection); if (selection === EClientSelection.ALL_CLIENTS && folder?.customers) { const allClientIds = folder.customers.map((customer) => customer.uid ?? ""); setSelectedClients(allClientIds); } else { setSelectedClients([]); } }, [folder], ); const handleClientSelectionChange = useCallback((selectedOptions: any) => { setSelectedClients(selectedOptions.map((option: any) => option.id)); }, []); useEffect(() => { fetchFolder(); }, [fetchFolder]); const backUrl = useMemo( () => Module.getInstance() .get() .modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", folderUid as string), [folderUid], ); const handleFileChange = useCallback((files: File[]) => { setFiles(files); }, []); const clientsOptions = useMemo(() => { if (!folder?.customers) return []; return folder.customers.map((customer) => ({ id: customer.uid ?? "", label: `${customer.contact?.first_name} ${customer.contact?.last_name}`, })); }, [folder]); return (
Envoyer des documents, sélectionnez les destinataires : Voulez-vous envoyer ce document à tous les clients du dossier ou sélectionner certains clients ?{" "}
{clientSelection === EClientSelection.SELECTED_CLIENTS && ( )} {clientSelection && ( <>
)}
); }