"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, IconButton, Tooltip, } from "@mui/material"; import { SaveAsOutlined, Close as CloseIcon } 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); 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, removeSjImage, } = useCameraStore(); const [isLoading, setIsLoading] = useState(false); const router = useRouter(); // Auth gate + role dari cookie 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; } if (isDispatch) setShipTouched(true); if (isDispatch && !shippingMethod) { alert("Shipping Method wajib dipilih."); setIsLoading(false); return; } const sjArr: string[] = Array.isArray(imageSj) ? imageSj : imageSj ? [imageSj as unknown as string] : []; if (isDispatch) { if (!imageDispatch) { alert("Foto Dispatch Wajib Diisi"); setIsLoading(false); return; } } else { if (sjArr.length < 1 || !imagePackage) { alert("Barcode, Foto SJ, dan Foto Penerima harus tersedia."); setIsLoading(false); return; } } try { const latestSj = sjArr.at(-1) || null; const newSjImage = latestSj ? latestSj.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_documentations = newSjImage; // plural sesuai API 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(""); if (submittedSj) { const next = sjArr.slice(0, -1); setImageSj(next); } 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 === const sjArr: string[] = Array.isArray(imageSj) ? imageSj : imageSj ? [imageSj as unknown as string] : []; // dispatch: SJ hanya utk self_pickup & ekspedisi const showSjForDispatch = isDispatch && (shippingMethod === "self_pickup" || shippingMethod === "ekspedisi"); const showDispatchForDispatch = isDispatch && shippingMethod !== ""; const showSjPreview = sjArr.length > 0 && (!isDispatch || showSjForDispatch); 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 (multi) + Remove per item */} {showSjPreview && ( <>
{sjArr.map((src, i) => (
{`SJ
removeSjImage(i)} sx={{ bgcolor: "rgba(255,255,255,0.85)", "&:hover": { bgcolor: "rgba(255,255,255,1)" }, }} >
))}
)} {/* Preview Penerima (hanya non-dispatch) */} {!isDispatch && imagePackage && ( <>
Captured
)} {/* Preview Dispatch */} {showDispatchPreview && ( <>
Captured
)}
) : (

Loading...

)}
); }