summaryrefslogtreecommitdiff
path: root/app/page.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'app/page.tsx')
-rw-r--r--app/page.tsx112
1 files changed, 102 insertions, 10 deletions
diff --git a/app/page.tsx b/app/page.tsx
index f12f746..07a89f1 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -3,6 +3,7 @@ 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 } from "@mui/material";
@@ -13,27 +14,83 @@ import { useEffect, useState } from "react";
import { useRouter } from "next/navigation";
import { getAuth } from "./lib/api/auth";
+// ====== ROLE EMAIL LISTS ======
+const DRIVER_EMAILS = new Set(
+ ["driverindoteknik@gmail.com", "sulistianaridwan8@gmail.com"]
+ .map(e => e.toLowerCase())
+);
+
+const DISPATCH_EMAILS = new Set(
+ ["rahmat.afiudin@gmail.com", "it@fixcomart.co.id"]
+ .map(e => e.toLowerCase())
+);
+
+function extractEmailFromAuth(auth: unknown): string | null {
+ if (auth && typeof auth === "object" && "email" in (auth as any)) {
+ const email = (auth as any).email;
+ if (typeof email === "string") return email;
+ }
+ if (auth && typeof auth === "object" && "token" in (auth as any)) {
+ const t = (auth as any).token;
+ if (typeof t === "string") {
+ const parts = t.split(".");
+ if (parts.length === 3) {
+ try {
+ const payload = JSON.parse(atob(parts[1]));
+ return payload?.email ?? payload?.preferred_username ?? payload?.sub ?? null;
+ } catch {}
+ }
+ }
+ }
+ if (typeof auth === "string") {
+ const parts = auth.split(".");
+ if (parts.length === 3) {
+ try {
+ const payload = JSON.parse(atob(parts[1]));
+ return payload?.email ?? payload?.preferred_username ?? payload?.sub ?? null;
+ } catch {}
+ }
+ }
+ return null;
+}
+
export default function Home() {
const [isLogin, setIsLogin] = useState<boolean>(true);
+ const [isDriver, setIsDriver] = useState<boolean>(false);
+ const [isDispatch, setIsDispatch] = useState<boolean>(false);
+
const {
barcode,
imageSj,
imagePackage,
+ imageDispatch,
setBarcode,
setImageSj,
setImagePackage,
+ setImageDispatch,
} = useCameraStore();
- const [isLoading, setIsLoading] = useState<boolean>(false);
+ const [isLoading, setIsLoading] = useState<boolean>(false);
const router = useRouter();
useEffect(() => {
const token = getAuth();
+ console.log("FE auth (akan dipakai untuk header Token):", token);
if (!token) {
router.push("/login");
} else {
setIsLogin(true);
+
+ const email = extractEmailFromAuth(token);
+ const lower = (email ?? "").toLowerCase();
+
+ // PRIORITAS: dispatch > driver
+ const dispatchFlag = DISPATCH_EMAILS.has(lower);
+ const driverFlag = DRIVER_EMAILS.has(lower) && !dispatchFlag;
+
+ setIsDispatch(dispatchFlag);
+ setIsDriver(driverFlag);
}
}, [router]);
@@ -41,8 +98,15 @@ export default function Home() {
event.preventDefault();
setIsLoading(true);
- if (!barcode || !imageSj || !imagePackage) {
- alert("Barcode dan gambar harus tersedia.");
+ // Hanya role dispatch yang wajib foto Dispatch
+ const needDispatch = isDispatch;
+
+ if (!barcode || !imageSj || !imagePackage || (needDispatch && !imageDispatch)) {
+ alert(
+ needDispatch
+ ? "Barcode, Foto SJ, Foto Penerima, dan Foto Dispatch harus tersedia."
+ : "Barcode, Foto SJ, dan Foto Penerima harus tersedia."
+ );
setIsLoading(false);
return;
}
@@ -50,28 +114,34 @@ export default function Home() {
try {
const newSjImage = imageSj.replace(/^.*?,/, "");
const newPackageImage = imagePackage.replace(/^.*?,/, "");
+ const newDispatchImage = imageDispatch ? imageDispatch.replace(/^.*?,/, "") : undefined;
- const data = {
- sj_document: newSjImage, // Kirim base64 lengkap dengan prefix
- paket_document: newPackageImage, // Kirim base64 lengkap dengan prefix
+ const data: any = {
+ sj_document: newSjImage,
+ paket_document: newPackageImage,
};
+ if (!isDriver && newDispatchImage) {
+ data.dispatch_document = newDispatchImage;
+ }
const response = await odooApi(
"PUT",
`/api/v1/stock-picking/${barcode}/documentation`,
data
);
+
if (response.status.code == 200) {
alert("Berhasil Submit Data");
setBarcode("");
setImageSj("");
setImagePackage("");
+ setImageDispatch("");
setIsLoading(false);
- }else if(response.status.code == 404){
- alert("Gagal Submit Data, Picking Code Tidak Ditemukan " );
+ } else if (response.status.code == 404) {
+ alert("Gagal Submit Data, Picking Code Tidak Ditemukan ");
setIsLoading(false);
- }else{
- alert("Gagal Submit Data, Silahkan Coba Lagi" );
+ } else {
+ alert("Gagal Submit Data, Silahkan Coba Lagi");
setIsLoading(false);
}
return response.data;
@@ -101,6 +171,7 @@ export default function Home() {
<div className="flex justify-between">
<SjCamera />
<PackageCamera />
+ {!isDriver && <DispatchCamera />} {/* disembunyikan untuk driver */}
</div>
<div className="h-2"></div>
@@ -141,6 +212,27 @@ export default function Home() {
</div>
</>
)}
+
+ <div className="h-2"></div>
+
+ {!isDriver && imageDispatch && (
+ <>
+ <label className="block mt-2 text-sm font-medium text-gray-700 text-center">
+ Gambar Foto Dispatch
+ </label>
+ <div className="relative w-full h-[300px] border-2 border-gray-200 p-2 rounded-sm">
+ <Image
+ src={imageDispatch}
+ alt="Captured"
+ layout="fill"
+ objectFit="cover"
+ unoptimized
+ className="p-2"
+ />
+ </div>
+ </>
+ )}
+
<div>
<div className="h-4"></div>
<Button