"use client"; import Image from "next/image"; import PackageCamera from "./lib/camera/component/pakageCamera"; import BarcodeScanner from "./lib/camera/component/scannerBarcode"; import SjCamera from "./lib/camera/component/sjCamera"; import DispatchCamera from "./lib/camera/component/dispatchCamera"; import useCameraStore from "./lib/camera/hooks/useCameraStore"; import Header from "./lib/camera/component/hedear"; import { Button, FormControl, InputLabel, MenuItem, Select, FormHelperText, } from "@mui/material"; import { SaveAsOutlined } from "@mui/icons-material"; import axios from "axios"; import odooApi from "./lib/api/odooApi"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { getAuth } from "./lib/api/auth"; import { getCookie } from "cookies-next"; import { clearOdooSession } from "./lib/api/clearOdooSession"; type Role = "driver" | "dispatch"; type ShipMethod = "" | "self_pickup" | "indoteknik_delivery" | "ekspedisi"; export default function Home() { const [isLogin, setIsLogin] = useState(false); // start false biar nggak nge-flash const [isDriver, setIsDriver] = useState(false); const [isDispatch, setIsDispatch] = useState(false); const [shippingMethod, setShippingMethod] = useState(""); const [shipTouched, setShipTouched] = useState(false); const { barcode, imageSj, imagePackage, imageDispatch, setBarcode, setImageSj, setImagePackage, setImageDispatch, } = useCameraStore(); const [isLoading, setIsLoading] = useState(false); const router = useRouter(); // Single effect: auth gate + set role useEffect(() => { const auth = getAuth(); if (!auth) { void clearOdooSession(process.env.NEXT_PUBLIC_ODOO_API_HOST ?? ""); router.replace("/login"); return; } const roleCookie = ( getCookie("web_role") as string | undefined )?.toLowerCase() as Role | undefined; setIsDriver(roleCookie === "driver"); setIsDispatch(roleCookie === "dispatch"); setIsLogin(true); }, [router]); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); setIsLoading(true); if (!barcode) { alert("Barcode harus diisi."); setIsLoading(false); return; } // Dispatch: shipping method wajib if (isDispatch) setShipTouched(true); if (isDispatch && !shippingMethod) { alert("Shipping Method wajib dipilih."); setIsLoading(false); return; } // Validasi foto sesuai role & shipping method if (isDispatch) { if (!imageDispatch) { alert("Foto Dispatch Wajib Diisi"); setIsLoading(false); return; } // SJ opsional untuk self_pickup & ekspedisi } else { // Driver: SJ & Penerima wajib if (!imageSj || !imagePackage) { alert("Barcode, Foto SJ, dan Foto Penerima harus tersedia."); setIsLoading(false); return; } } try { const newSjImage = imageSj ? imageSj.replace(/^.*?,/, "") : undefined; const newPackageImage = imagePackage ? imagePackage.replace(/^.*?,/, "") : undefined; const newDispatchImage = imageDispatch && imageDispatch.startsWith("data:") ? imageDispatch.replace(/^.*?,/, "") : imageDispatch || undefined; // Kirim hanya yang ada const submittedSj = !!newSjImage; const submittedPackage = !!newPackageImage; const submittedDispatch = !!newDispatchImage && !isDriver; const data: Record = {}; if (submittedSj) data.sj_document = newSjImage!; if (submittedPackage) data.paket_document = newPackageImage!; if (submittedDispatch) data.dispatch_document = newDispatchImage!; if (isDispatch && shippingMethod) data.shipping_method = shippingMethod; if (shippingMethod === "self_pickup") { data.self_pu = "true"; } const response = (await odooApi( "PUT", `/api/v1/stock-picking/${barcode}/documentation`, data )) as { status?: { code?: number } }; if (response?.status?.code === 200) { alert("Berhasil Submit Data"); setBarcode(""); // Bersihkan HANYA yang dikirim if (submittedSj) setImageSj(""); if (submittedPackage) setImagePackage(""); if (submittedDispatch) setImageDispatch(""); } else if (response?.status?.code === 404) { alert("Gagal Submit Data, Picking Code Tidak Ditemukan"); } else { alert("Gagal Submit Data, Silahkan Coba Lagi"); } } catch (error) { if (axios.isAxiosError(error)) { console.error("Error:", error.response?.data); } else if (error instanceof Error) { console.error("Error mengirim data:", error.message); } else { console.error("Unknown error:", error); } } finally { setIsLoading(false); } }; // === UI helpers === // dispatch: SJ hanya utk self_pickup & ekspedisi const showSjForDispatch = isDispatch && (shippingMethod === "self_pickup" || shippingMethod === "ekspedisi"); // dispatch: kamera dispatch tampil utk semua method (asal sudah dipilih) const showDispatchForDispatch = isDispatch && shippingMethod !== ""; // preview SJ: sembunyikan kalau dispatch belum pilih method const showSjPreview = !!imageSj && (!isDispatch || showSjForDispatch); // preview Dispatch: sembunyikan kalau dispatch belum pilih method const showDispatchPreview = !!imageDispatch && (!isDispatch || showDispatchForDispatch); return (
{isLogin ? (
{/* Shipping Method (khusus dispatch) */} {isDispatch && (
Shipping Method {shipTouched && !shippingMethod && ( Wajib pilih shipping method. )}
)}
{isDispatch ? ( <> {showSjForDispatch && } {showDispatchForDispatch && } ) : ( <> {/* driver / non-dispatch */} )}
{/* Preview SJ */} {showSjPreview && ( <>
Captured
)} {/* Preview Penerima (hanya non-dispatch) */} {!isDispatch && imagePackage && ( <>
Captured
)} {/* Preview Dispatch */} {showDispatchPreview && ( <>
Captured
)}
) : (

Loading...

)}
); }