"use client"; import { useEffect, useState } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Check, CheckCheck, CheckCircle2, Clock, FileText, X, } from "lucide-react"; import { approvePromotion, getPromotionById, rejectPromotion, } from "@/service/promotion"; import { convertDateFormat } from "@/utils/global"; import { Button } from "../ui/button"; import { useRouter } from "next/navigation"; import Cookies from "js-cookie"; import { error, loading, success } from "@/config/swal"; import withReactContent from "sweetalert2-react-content"; import Swal from "sweetalert2"; import promo from "../landing-page/promo"; type PromoDetailDialogProps = { promoId: number | null; open: boolean; onOpenChange: (open: boolean) => void; }; export default function PromoDetailDialog({ promoId, open, onOpenChange, }: PromoDetailDialogProps) { const [loadingData, setLoadingData] = useState(false); const [promo, setPromo] = useState(null); const [openApproverHistory, setOpenApproverHistory] = useState(false); const [userLevelId, setUserLevelId] = useState(null); const router = useRouter(); // 🔹 Ambil userlevelId dari cookies useEffect(() => { const ulne = Cookies.get("ulne"); // contoh: "3" setUserLevelId(ulne ?? null); }, []); // FORMAT TANGGAL → DD-MM-YYYY const formatDate = (dateStr: string) => { const d = new Date(dateStr); const day = String(d.getDate()).padStart(2, "0"); const month = String(d.getMonth() + 1).padStart(2, "0"); const year = d.getFullYear(); return `${day}-${month}-${year}`; }; const handleOpenApproverHistory = () => { setOpenApproverHistory(true); }; const handleRejectPromotion = async (id: number) => { const MySwal = withReactContent(Swal); const { value: message } = await MySwal.fire({ title: "Tolak Promotion", input: "textarea", inputLabel: "Alasan penolakan (opsional)", inputPlaceholder: "Masukkan alasan penolakan...", inputAttributes: { "aria-label": "Masukkan alasan penolakan", }, showCancelButton: true, confirmButtonText: "Tolak", cancelButtonText: "Batal", confirmButtonColor: "#dc2626", }); if (message === undefined) { return; // User cancelled } loading(); const res = await rejectPromotion(id, message || undefined); if (res?.error) { error(res.message || "Gagal menolak promotion"); close(); return; } close(); success("Promotion berhasil ditolak"); // initState(); // refresh table }; const handleApprovePromotion = async (promoId: number) => { loading(); const res = await approvePromotion(promoId); if (res?.error) { error(res.message || "Gagal menyetujui promotion"); close(); return; } close(); success("Promotion berhasil disetujui"); // fetchData(); // refresh table }; useEffect(() => { if (!promoId || !open) return; async function fetchData() { try { setLoadingData(true); const res = await getPromotionById(promoId); // Mapping ke format dialog const mapped = { id: res?.data?.data?.id, title: res?.data?.data?.title, status_id: res?.data?.data?.status_id, created_at: res?.data?.data?.created_at, updated_at: res?.data?.data?.updated_at, fileSize: "Tidak diketahui", uploadDate: formatDate(res?.data?.data?.created_at), status: res?.data?.data?.is_active ? "Aktif" : "Nonaktif", timeline: [ { label: "Dibuat", date: formatDate(res?.data?.data?.created_at), time: new Date(res?.data?.data?.created_at).toLocaleTimeString( "id-ID", { hour: "2-digit", minute: "2-digit" }, ), }, { label: "Diupdate", date: formatDate(res?.data?.data?.updated_at), time: new Date(res?.data?.data?.updated_at).toLocaleTimeString( "id-ID", { hour: "2-digit", minute: "2-digit" }, ), }, ], }; setPromo(mapped); } catch (err) { console.error("ERROR FETCH PROMO:", err); } finally { setLoadingData(false); } } fetchData(); }, [promoId, open]); const [openCommentModal, setOpenCommentModal] = useState(false); const [commentValue, setCommentValue] = useState(""); const [openViewDialog, setOpenViewDialog] = useState(false); if (!open) return null; const handleSubmitComment = async () => { // await api.post("/banner/comment", { // bannerId: promo.id, // comment: commentValue, // }); setOpenCommentModal(false); }; return ( <> {/* HEADER */}
Detail Promoaa
{promo?.status_id === 1 ? "Menunggu" : promo?.status_id === 2 ? "Disetujui" : promo?.status_id === 3 ? "Ditolak" : "Tidak Diketahui"} Promo {/* {promo.position} */}
{/* BODY */}
{loadingData ? (

Memuat data...

) : promo ? ( <> {/*
*/}

{promo.title}

Ukuran File

{promo.fileSize}

Tanggal Upload

{promo.uploadDate}

{/* TIMELINE */}

Status Timeline

Diupload oleh Operator

{convertDateFormat(promo?.created_at)} WIB

{promo?.status_id === 1 ? ( ) : promo?.status_id === 2 ? ( ) : ( )}

{promo?.status_id === 1 ? "Menunggu disetujui oleh Approver" : promo?.status_id === 2 ? "Disetujui oleh Approver" : "Ditolak oleh Approver"}

{convertDateFormat(promo?.updated_at)} WIB

Comment :

Jaecoo - Approver | 10/11/2026

) : (

Data tidak ditemukan

)}
{userLevelId !== "2" && promo && (
{promo.status_id === 1 ? ( <> {userLevelId === "1" && ( )} ) : ( )}
)} {openApproverHistory && (
setOpenApproverHistory(false)} >
e.stopPropagation()} > {/* HEADER */}

Approver History

Menunggu Banner 1
{/* BODY */}
{/* LEFT TIMELINE */}
{/* Upload */}
Upload
{/* Diterima */}

Diterima

Direview oleh: approver-jaecoo1
{/* Pending */}

Pending

Direview oleh: approver-jaecoo1
{/* ARROW */}
> >
{/* RIGHT NOTES */}
Catatan:
Catatan:
{/* FOOTER */}
)} {/* FOOTER
*/}
{openApproverHistory && (
setOpenApproverHistory(false)} >
e.stopPropagation()} > {/* HEADER */}

Approver History

Menunggu Banner 1
{/* BODY */}
{/* LEFT TIMELINE */}
{/* Upload */}
Upload
{/* Diterima */}

Diterima

Direview oleh: approver-jaecoo1
{/* Pending */}

Pending

Direview oleh: approver-jaecoo1
{/* ARROW */}
> >
{/* RIGHT NOTES */}
Catatan:
Catatan:
{/* FOOTER */}
)} {openCommentModal && promo && (
setOpenCommentModal(false)} >
e.stopPropagation()} > {/* HEADER */}

Beri Tanggapan

{/* Badge */}
Menunggu Banner {promo.position}
{/* BODY */}