Untitled
unknown
plain_text
5 months ago
18 kB
2
Indexable
"use client"; import MainLayout from "@/components/HOC/layout/MainLayout"; import React, { useEffect, useState } from "react"; import { useRouter, useParams } from "next/navigation"; import Image from "next/image"; import axios from "axios"; import { apiEndpoint } from "@/app/api/config"; import Cookies from "js-cookie"; import CheckboxItem from "@/components/Button/CheckBox"; export default function CCTVCertificatePage() { const [selectedFile, setSelectedFile] = useState<any | null>(null); const [company, setCompany] = useState<any>(null); const [businessUnits, setBusinessUnits] = useState<any[]>([]); const [loading, setLoading] = useState(true); const [error, setError] = useState<string | null>(null); const [uploading, setUploading] = useState(false); const [uploadError, setUploadError] = useState<string | null>(null); const [uploadSuccess, setUploadSuccess] = useState<any | null>(null); const [uploadedData, setUploadedData] = useState<any>(null); const [companyDocuments, setCompanyDocuments] = useState<any[]>([]); const [documentsLicense, setDocumentsLicense] = useState<any[]>([]); const [business, setBusiness] = useState<any>(null); const [companies, setCompanies] = useState<any[]>([]); const [userName, setUserName] = useState<string | null>(null); const [documentsLicenseNumber, setDocumentsLicenseNumber] = useState<any>(); const [mostRecentLicense, setMostRecentLicense] = useState<any>(null); const [sampleMonitoringFile, setSampleMonitoringFile] = useState<File | null>(null); const handleView = (idDoc: any) => { router.push(`/business/cctv-certificate/${id}/detail/${idDoc}`); }; const router = useRouter(); const { id } = useParams(); const [todo, setTodo] = useState<{ device_installed: boolean; license_acquired: boolean; sample_recording: boolean; register_to_police_station: boolean; }>({ device_installed: false, license_acquired: false, sample_recording: false, register_to_police_station: false }); useEffect(() => { const fetchBusinessDetails = async () => { try { const userId = Cookies.get("authUserId"); const storedUserName = Cookies.get("authUserName"); if (!userId || !storedUserName) { router.push("/login"); return; } setUserName(storedUserName); const companiesResponse = await axios.get( `${apiEndpoint}/api/companies?owner_id=${userId}` ); const fetchedCompanies = companiesResponse.data.data; setCompanies(fetchedCompanies); const businessResponse = await axios.get( `${apiEndpoint}/api/business_units/${id}` ); const fetchedBusinesses = businessResponse.data.data; setBusiness(fetchedBusinesses); const documentsResponseChamber = await axios.get( `${apiEndpoint}/api/business_units/${id}/documents?type=cctv_certificate` ); const fetchedDocumentsChamber = documentsResponseChamber.data.data; const transformedDocuments = fetchedDocumentsChamber.map( (doc: any) => ({ ...doc, data: typeof doc.data === "string" ? JSON.parse(doc.data) : doc.data, remind_at: null, expired_at: null, created_at: "2024-08-26T01:47:09.129Z", updated_at: "2024-09-02T06:51:21.111Z", }) ); setDocumentsLicense(transformedDocuments); if (transformedDocuments.length > 0) { setMostRecentLicense(transformedDocuments[0]); // Mengatur todo berdasarkan data yang diterima if (transformedDocuments[0].data && transformedDocuments[0].data.todo) { setTodo(transformedDocuments[0].data.todo); } } } catch (error) { setError("Failed to fetch business details."); console.error("Error fetching business details:", error); } finally { setLoading(false); } }; if (id) { fetchBusinessDetails(); } }, [id]); const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => { const file = event.target.files?.[0]; if (file) { setSelectedFile(file); } }; const handleTodoChange = (key: keyof typeof todo) => { setTodo(prevTodo => ({ ...prevTodo, [key]: !prevTodo[key] })); }; const handleSampleMonitoringFileChange = (event: React.ChangeEvent<HTMLInputElement>) => { const file = event.target.files?.[0]; if (file) { setSampleMonitoringFile(file); } }; const [sampleMonitoringDocuments, setSampleMonitoringDocuments] = useState<any[]>([]); const handleSampleMonitoringUpload = async () => { if (!sampleMonitoringFile) return; setUploading(true); setUploadError(null); const formData = new FormData(); formData.append('file', sampleMonitoringFile); try { const response = await axios.post( `${apiEndpoint}/api/business_units/${id}/documents/${}/attach`, formData, { headers: { 'Content-Type': 'multipart/form-data', }, params: { type: 'sample_monitoring', }, } ); setUploadSuccess(true); setSampleMonitoringFile(null); // Update the sample monitoring documents list setSampleMonitoringDocuments(prevDocs => [response.data.data, ...prevDocs]); } catch (error) { setUploadError('Failed to upload sample monitoring file.'); console.error('Error uploading sample monitoring file:', error); } finally { setUploading(false); } }; const handleViewDetail = () => { router.push(`/business/cctv-certificate/${id}/detail/${documentsLicenseNumber.id}`); }; const handleUpload = async () => { router.push(`/business/cctv-certificate/upload/${id}`); }; const handleRemove = () => { const fileInput = document.getElementById( "dropzone-file" ) as HTMLInputElement; if (fileInput) { fileInput.value = ""; // Reset the input file value } setSelectedFile(null); setUploadSuccess(false); setUploadError(null); }; if (loading) { return ( <MainLayout> <div className="flex justify-center items-center min-h-screen"> <p className="text-blue-500">Loading...</p> </div> </MainLayout> ); } if (error) { return ( <MainLayout> <div className="flex justify-center items-center min-h-screen"> <p className="text-red-500">{error}</p> </div> </MainLayout> ); } return ( <MainLayout> <div className="border-solid bg-white p-8 rounded-xl border-2 relative"> <h3 className="text-base text-gray-400 mb-2">Latest update</h3> <div className="flex"> <Image className="h-20 w-20 rounded-xl bg-white border-solid border-2" src="/images/Police.png" alt="Company Profile" width={200} height={200} /> <div className="ml-6 mt-4"> {mostRecentLicense ? ( <ul className="space-y-4"> <div className="flex justify-between space-x-8"> <li> <h2 className="text-gray-400 text-sm">License Number</h2> <h2 className="text-gray-700 font-bold text-lg"> {mostRecentLicense.data.license_number || "-"} </h2> </li> </div> </ul> ) : ( <li className="mb-5"> <h2>-</h2> </li> )} </div> </div> <h1 className="text-black text-2xl font-bold py-4"> CCTV Certificate </h1> <div onClick={handleViewDetail} className="absolute cursor-pointer right-4 top-4 mb-4 flex justify-center items-center w-20 h-8 border-2 border-solid border-gray-400 bg-white rounded-full "> <h2 className="text-gray-400 text-xs">Detail</h2> </div> <div className="flex flex-col items-center w-full "> <div className="flex flex-col items-center justify-center w-full h-20 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50" onClick={handleUpload} > <div className="flex space-x-2 text-center items-center justify-center pt-5 pb-6"> {selectedFile ? ( selectedFile ? ( <p className="text-lg font-semibold mt-2 text-gray-500"> {selectedFile.name} </p> ) : ( <p className="text-lg font-semibold mt-2 text-gray-500"> Unsupported file type </p> ) ) : ( <> <Image className=" min-w-fit" src="/images/add.png" alt="Upload" width={30} height={30} /> <p className="text-xs whitespace-nowrap tracking-wider font-semibold mt-2 text-gray-500"> Add Document </p> </> )} </div> <input id="dropzone-file" type="file" className="hidden" onChange={handleFileChange} /> </div> {selectedFile && !uploadSuccess && ( <> <div className="flex justify-center p-2 w-full items-center border border-solid border-gray-200 bg-gray-200 mt-6 rounded-xl"> <Image className=" h-8 w-8 " src="/images/trash.png" alt="Add Document" width={30} height={30} /> <button onClick={handleRemove} className="p-2 bg-gray-200 text-xs text-gray-500 -" disabled={uploading} > Remove Document </button> </div> <button onClick={handleUpload} className="mt-4 px-4 py-4 w-full bg-blue-500 text-white rounded-xl" disabled={uploading} > {uploading ? "Uploading..." : "Upload File"} </button> </> )} {uploadSuccess && !selectedFile && <div></div>} {uploadError && <p className="text-red-500 mt-2">{uploadError}</p>} {/* Display the uploaded file data */} </div> </div> <div className="mt-5"> <ol className="relative border-gray-500"> {documentsLicense.length > 0 ? ( documentsLicense.map((doc, index) => ( <li key={index} className="mb-5"> <div onClick={() => handleView(doc.id)} className="border-2 w-full border-solid cursor-pointer bg-white rounded-xl p-2 flex items-center" > <Image className="h-12 w-12 rounded-xl border-2 border-gray-200 border-solid m-2" src="/images/PdfImage.png" alt="File Icon" width={100} height={100} /> <div className="flex-grow"> <h3 className="font-semibold ">CCTV Certificate</h3> <h3 className="text-xs text-gray-400"> Upload: {doc.data.startDate || "Not available"} </h3> </div> <div className="ml-auto"> <Image className="h-6 w-6" src="/images/IconDetail.png" alt="Detail Icon" width={24} height={24} /> </div> </div> </li> )) ) : ( <li className="mb-5"> <p className="text-gray-500"> No CCTV Certificate documents available. </p> </li> )} </ol> </div> {mostRecentLicense && ( <div className="mt-4"> <h3 className="text-lg font-bold mb-2">To Do List:</h3> <ul> <CheckboxItem label="Device Installed" checked={todo.device_installed} onChange={() => handleTodoChange('device_installed')} id="device_installed" /> <CheckboxItem label="License Acquired" checked={todo.license_acquired} onChange={() => handleTodoChange('license_acquired')} id="license_acquired" /> <CheckboxItem label="Sample Recording" checked={todo.sample_recording} onChange={() => handleTodoChange('sample_recording')} id="sample_recording" /> <CheckboxItem label="Register to Police Station" checked={todo.register_to_police_station} onChange={() => handleTodoChange('register_to_police_station')} id="register_to_police_station" /> </ul> </div> )} <div className="mt-4"> <h3 className="text-lg font-bold mb-2">Sample Monitoring</h3> <div className="flex flex-col items-center w-full"> <div className="flex flex-col items-center justify-center w-full h-20 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50" onClick={() => document.getElementById('sample-monitoring-file')?.click()} > <div className="flex space-x-2 text-center items-center justify-center pt-5 pb-6"> {sampleMonitoringFile ? ( <p className="text-lg font-semibold mt-2 text-gray-500"> {sampleMonitoringFile.name} </p> ) : ( <> <Image className="min-w-fit" src="/images/add.png" alt="Upload" width={30} height={30} /> <p className="text-xs whitespace-nowrap tracking-wider font-semibold mt-2 text-gray-500"> Add Document </p> </> )} </div> <input id="sample-monitoring-file" type="file" className="hidden" onChange={handleSampleMonitoringFileChange} /> </div> {sampleMonitoringFile && ( <> <div className="flex justify-center p-2 w-full items-center border border-solid border-gray-200 bg-gray-200 mt-6 rounded-xl"> <Image className="h-8 w-8" src="/images/trash.png" alt="Remove Document" width={30} height={30} /> <button onClick={() => setSampleMonitoringFile(null)} className="p-2 bg-gray-200 text-xs text-gray-500" disabled={uploading} > Remove Document </button> </div> <button onClick={handleSampleMonitoringUpload} className="mt-4 px-4 py-4 w-full bg-blue-500 text-white rounded-xl" disabled={uploading} > {uploading ? "Uploading..." : "Upload File"} </button> </> )} {uploadSuccess && !sampleMonitoringFile && ( <p className="text-green-500 mt-2">File uploaded successfully!</p> )} {uploadError && <p className="text-red-500 mt-2">{uploadError}</p>} </div> </div> <div className="mt-5"> <ol className="relative border-gray-500"> {sampleMonitoringDocuments.length > 0 ? ( sampleMonitoringDocuments.map((doc, index) => ( <li key={index} className="mb-5"> <div onClick={() => handleView(doc.id)} className="border-2 w-full border-solid cursor-pointer bg-white rounded-xl p-2 flex items-center" > <Image className="h-12 w-12 rounded-xl border-2 border-gray-200 border-solid m-2" src="/images/PdfImage.png" alt="File Icon" width={100} height={100} /> <div className="flex-grow"> <h3 className="font-semibold">Sample Monitoring</h3> <h3 className="text-xs text-gray-400"> Upload: {doc.data.startDate || "Not available"} </h3> </div> <div className="ml-auto"> <Image className="h-6 w-6" src="/images/IconDetail.png" alt="Detail Icon" width={24} height={24} /> </div> </div> </li> )) ) : ( <li className="mb-5"> <p className="text-gray-500"> No Sample Monitoring documents available. </p> </li> )} </ol> </div> </MainLayout> ); }
Editor is loading...
Leave a Comment