file_table_reader/src/pages/admin/upload/controller_admin_upload.jsx
2025-11-06 14:59:34 +07:00

129 lines
3.6 KiB
JavaScript

import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { setFile, setResult, setValidatedData, setPdfPageCount, setSelectedPages } from "../../../store/slices/uploadSlice";
import { uploadFile, uploadPdf, saveToDatabase } from "./service_admin_upload";
import { useNavigate } from "react-router-dom";
import * as pdfjsLib from "pdfjs-dist";
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
"pdfjs-dist/build/pdf.worker.mjs",
import.meta.url
).toString();
import * as XLSX from 'xlsx';
export function useUploadController() {
const dispatch = useDispatch();
const navigate = useNavigate();
const { file, result, pdfPageCount, selectedPages } = useSelector((state) => state.upload);
const [loading, setLoading] = useState(false);
const [selectedTable, setSelectedTable] = useState(null);
// const [selectedPages, setSelectedPages] = useState("");
const [tableTitle, setTableTitle] = useState("");
// const [pdfPageCount, setPdfPageCount] = useState(null);
const [selectedSheet, setSelectedSheet] = useState(null);
const [sheetCount, setSheetCount] = useState(null);
const [sheetNames, setSheetNames] = useState([]);
// 🔹 handle drop file
const handleFileSelect = async (f) => {
dispatch(setFile(f));
const ext = f.name.split(".").pop().toLowerCase();
if (ext === "pdf") {
try {
const reader = new FileReader();
reader.onload = async (e) => {
const typedArray = new Uint8Array(e.target.result);
const pdf = await pdfjsLib.getDocument({ data: typedArray }).promise;
// setPdfPageCount(pdf.numPages);
dispatch(setPdfPageCount(pdf.numPages));
console.log(`📄 PDF terdeteksi dengan ${pdf.numPages} halaman`);
};
reader.readAsArrayBuffer(f);
} catch (err) {
console.error("Gagal membaca PDF:", err);
}
}
else if (ext === "xlsx" || ext === "xls") {
const data = await f.arrayBuffer();
const workbook = XLSX.read(data, { type: 'array' });
const sheetNames = workbook.SheetNames;
setSheetCount(sheetNames.length);
setSheetNames(sheetNames);
}
else {
// setPdfPageCount(null);
dispatch(setPdfPageCount(null));
}
};
// 🔹 upload file
const handleUpload = async () => {
if (!file) return;
setLoading(true);
try {
const res = await uploadFile(file, selectedPages, selectedSheet);
dispatch(setResult(res));
if (res.file_type !== ".pdf" || (res.file_type === ".pdf" && !res.tables)) {
navigate("/admin/upload/validate");
}else{
setLoading(false);
}
} finally {
// setLoading(false);
}
};
const handleNextPdf = async () => {
if (!selectedTable) return;
setLoading(true);
try {
const res = await uploadPdf(selectedTable);
dispatch(setResult(res));
navigate("/admin/upload/validate");
} finally {
// setLoading(false);
}
};
const handleConfirmUpload = async () => {
setLoading(true);
try {
const data = {
title: tableTitle,
columns: result.columns,
rows: result.preview,
};
const res = await saveToDatabase(data);
dispatch(setValidatedData(res));
navigate("/admin/upload/success");
} finally {
// setLoading(false);
}
};
return {
loading,
file,
result,
tableTitle,
selectedTable,
selectedPages,
pdfPageCount,
sheetCount,
sheetNames,
selectedSheet,
setSelectedTable,
setSelectedPages,
setSelectedSheet,
setTableTitle,
handleFileSelect,
handleUpload,
handleNextPdf,
handleConfirmUpload,
};
}