"use client"; import React, { FC, Dispatch, SetStateAction, useState, useEffect, } from "react"; import { useParams } from "next/navigation"; import { useTranslation } from "@/i18n/client"; import { useToast } from "@/hooks/use-toast"; import { toast as toastMessage } from "sonner"; import { Download, Trash2 } from "lucide-react"; import { saveAs } from "file-saver"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Label } from "@/components/ui/label"; import { FileList, FileListAction, FileListHeader, FileListIcon, FileListInfo, FileListItem, FileListName, } from "@/components/ui/file-list"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; import { getReportTempList, deleteReportTempFile } from "@/lib/forms/services"; import { VendorDataReportTemps } from "@/db/schema/vendorData"; interface FormDataReportTempUploadedListTabProps { packageId: number; formId: number; } export const FormDataReportTempUploadedListTab: FC< FormDataReportTempUploadedListTabProps > = ({ packageId, formId }) => { const params = useParams(); const lng = (params?.lng as string) || "ko"; const { t } = useTranslation(lng, "engineering"); const [prevReportTemp, setPrevReportTemp] = useState( [] ); const [isLoading, setIsLoading] = useState(true); useEffect(() => { const getTempFiles = async () => { await updateReportTempList(packageId, formId, setPrevReportTemp); setIsLoading(false); }; getTempFiles(); }, [packageId, formId]); return (
updateReportTempList(packageId, formId, setPrevReportTemp) } isLoading={isLoading} t={t} />
); }; type UpdateReportTempList = ( packageId: number, formId: number, setPrevReportTemp: Dispatch> ) => Promise; const updateReportTempList: UpdateReportTempList = async ( packageId, formId, setPrevReportTemp ) => { const tempList = await getReportTempList(packageId, formId); setPrevReportTemp(tempList); }; interface UploadedTempFiles { prevReportTemp: VendorDataReportTemps[]; updateReportTempList: () => void; isLoading: boolean; t: (key: string, options?: any) => string; } const UploadedTempFiles: FC = ({ prevReportTemp, updateReportTempList, isLoading, t, }) => { const { toast } = useToast(); const downloadTempFile = async (fileName: string, filePath: string) => { try { const getTempFile = await fetch(filePath); if (getTempFile.ok) { const blob = await getTempFile.blob(); saveAs(blob, fileName); toastMessage.success(t("templateUploadedList.downloadComplete")); } else { const err = await getTempFile.json(); console.error("에러:", err); throw new Error(err.message); } } catch (err) { console.error(err); toast({ title: t("templateUploadedList.error"), description: t("templateUploadedList.downloadError"), variant: "destructive", }); } }; const deleteTempFile = async (id: number) => { try { const { result, error } = await deleteReportTempFile(id); if (result) { updateReportTempList(); toastMessage.success(t("templateUploadedList.deleteComplete")); } else { throw new Error(error); } } catch (err) { toast({ title: t("templateUploadedList.error"), description: t("templateUploadedList.deleteError"), variant: "destructive", }); } }; if (isLoading) { return (
); } return ( {prevReportTemp.map((c) => { const { fileName, filePath, id } = c; return ( {fileName} { downloadTempFile(fileName, filePath); }} > {t("templateUploadedList.download")} {t("templateUploadedList.delete")} {t("templateUploadedList.deleteConfirmTitle", { fileName })} {t("templateUploadedList.cancel")} { deleteTempFile(id); }} > {t("templateUploadedList.delete")} ); })} ); };