"use client"; import { keyWibu, LayoutDrawer, LayoutNavbarNew, TEMA } from "@/module/_global"; import LayoutModal from "@/module/_global/layout/layout_modal"; import { useHookstate } from "@hookstate/core"; import { Box, Button, Flex, Group, Loader, rem, SimpleGrid, Stack, Text, } from "@mantine/core"; import { Dropzone } from "@mantine/dropzone"; import _ from "lodash"; import { useParams, useRouter } from "next/navigation"; import { useRef, useState } from "react"; import toast from "react-hot-toast"; import { FaTrash } from "react-icons/fa6"; import { IoIosArrowDropright } from "react-icons/io"; import { useWibuRealtime } from "wibu-realtime"; import { funAddFileTask, funCekNamFileUploadTask } from "../lib/api_task"; import { IListFileTask } from "../lib/type_task"; import ResultsFile from "./results_file"; export default function AddFileDetailTask() { const router = useRouter() const [openModal, setOpenModal] = useState(false) const [loadingModal, setLoadingModal] = useState(false) const [fileForm, setFileForm] = useState([]) const [listFile, setListFile] = useState([]) const param = useParams<{ id: string, detail: string }>() const [indexDelFile, setIndexDelFile] = useState(0) const [openDrawerFile, setOpenDrawerFile] = useState(false) const tema = useHookstate(TEMA) const openRef = useRef<() => void>(null) const [loadingUpload, setLoadingUpload] = useState(false) const [dataRealTime, setDataRealtime] = useWibuRealtime({ WIBU_REALTIME_TOKEN: keyWibu, project: "sdm" }) function deleteFile(index: number) { setListFile([...listFile.filter((val, i) => i !== index)]) setFileForm([...fileForm.filter((val, i) => i !== index)]) setOpenDrawerFile(false) } async function cekFileName(data: any) { try { setLoadingUpload(true) const fd = new FormData(); fd.append(`file`, data); const res = await funCekNamFileUploadTask(param.detail, fd) if (res.success) { setFileForm([...fileForm, data]) setListFile([...listFile, { name: data.name, extension: data.type.split("/")[1] }]) } else { toast.error(res.message) } } catch (error) { console.error(error) toast.error("Gagal menambahkan file, coba lagi nanti") } finally { setLoadingUpload(false) } } async function onSubmit() { try { setLoadingModal(true) const fd = new FormData(); for (let i = 0; i < fileForm.length; i++) { fd.append(`file${i}`, fileForm[i]); } const response = await funAddFileTask(param.detail, fd) if (response.success) { setDataRealtime([{ category: "tugas-detail-file", id: param.detail, }]) toast.success(response.message) setFileForm([]) setListFile([]) router.push(`/division/${param.id}/task/${param.detail}`) } else { toast.error(response.message) } } catch (error) { console.error(error) toast.error("Gagal menambahkan tugas divisi, coba lagi nanti"); } finally { setLoadingModal(false) setOpenModal(false) } } return ( { if (!files || _.isEmpty(files)) return toast.error('Tidak ada file yang dipilih') cekFileName(files[0]) }} activateOnClick={false} maxSize={3 * 1024 ** 2} accept={['image/png', 'image/jpeg', 'image/heic', 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']} onReject={(files) => { return toast.error('File yang diizinkan: .csv, .png, .jpg, .heic, .pdf, .doc, .docx, .xls, .xlsx dengan ukuran maksimal 3 MB') }} > openRef.current?.()} > Upload File { listFile.length > 0 && File { listFile.map((v, i) => { return ( { setIndexDelFile(i) setOpenDrawerFile(true) }}> ) }) } } { loadingUpload && } setOpenDrawerFile(false)} title={""} > deleteFile(indexDelFile)}> Hapus File setOpenModal(false)} description="Apakah Anda yakin ingin menambahkan file?" onYes={(val) => { if (val) { onSubmit() } else { setOpenModal(false) } }} /> ); }