From ae03db15be86862c50f9f9748d1bd8f002196331 Mon Sep 17 00:00:00 2001 From: Anang Yusman Date: Mon, 26 Jan 2026 15:42:55 +0800 Subject: [PATCH] fix:comment --- components/dialog/galery-detail-dialog.tsx | 37 +++++++++++++- components/dialog/promo-dialog.tsx | 36 +++++++++++++- components/form/agent/detail-agent-form.tsx | 36 +++++++++++++- components/form/login.tsx | 9 +++- .../form/product/detail-product-form.tsx | 48 +++++++++++++++++-- components/table/article-table.tsx | 4 +- service/agent.ts | 11 +++++ service/galery.ts | 11 +++++ service/product.ts | 11 +++++ service/promotion.ts | 11 +++++ 10 files changed, 203 insertions(+), 11 deletions(-) diff --git a/components/dialog/galery-detail-dialog.tsx b/components/dialog/galery-detail-dialog.tsx index 4d94e4f..6069cc5 100644 --- a/components/dialog/galery-detail-dialog.tsx +++ b/components/dialog/galery-detail-dialog.tsx @@ -12,6 +12,7 @@ import { Check, CheckCheck, CheckCircle, Clock, X } from "lucide-react"; import { useEffect, useState } from "react"; import { approveGalery, + commentGalery, getGaleryFileData, rejectGalery, } from "@/service/galery"; @@ -29,6 +30,7 @@ export function DialogDetailGaleri({ open, onClose, data }: any) { const [userRoleId, setUserRoleId] = useState(null); const [openViewDialog, setOpenViewDialog] = useState(false); const router = useRouter(); + const MySwal = withReactContent(Swal); // 🔹 Ambil userlevelId dari cookies useEffect(() => { @@ -90,6 +92,39 @@ export function DialogDetailGaleri({ open, onClose, data }: any) { fetchImages(); // refresh table }; + const handleCommentGalery = async (id: number) => { + const { value: message } = await MySwal.fire({ + title: "Komen Galeri", + input: "textarea", + inputLabel: "Komentar (opsional)", + inputPlaceholder: "Masukkan komentar...", + inputAttributes: { + "aria-label": "Masukkan komentar", + }, + showCancelButton: true, + confirmButtonText: "Komentar", + cancelButtonText: "Batal", + confirmButtonColor: "#dc2626", + }); + + if (message === undefined) { + return; // User cancelled + } + + loading(); + const res = await commentGalery(id, message || undefined); + + if (res?.error) { + error(res.message || "Gagal komentar promotion"); + close(); + return; + } + + close(); + success("Galeri berhasil dikomentar"); + // fetchData(); // refresh table + }; + const handleRejectGalery = async (id: number) => { const MySwal = withReactContent(Swal); const { value: message } = await MySwal.fire({ @@ -292,7 +327,7 @@ export function DialogDetailGaleri({ open, onClose, data }: any) { className="bg-blue-200 hover:bg-blue-400" onClick={(e) => { e.stopPropagation(); - setOpenCommentModal(true); + handleCommentGalery(data.id); }} > Beri Tanggapan diff --git a/components/dialog/promo-dialog.tsx b/components/dialog/promo-dialog.tsx index 58027e2..20f8c23 100644 --- a/components/dialog/promo-dialog.tsx +++ b/components/dialog/promo-dialog.tsx @@ -17,6 +17,7 @@ import { } from "lucide-react"; import { approvePromotion, + commentPromotion, getPromotionById, rejectPromotion, } from "@/service/promotion"; @@ -71,6 +72,39 @@ export default function PromoDetailDialog({ setOpenApproverHistory(true); }; + const handleCommentPromotion = async (id: number) => { + const { value: message } = await MySwal.fire({ + title: "Komen Promotion", + input: "textarea", + inputLabel: "Komentar (opsional)", + inputPlaceholder: "Masukkan komentar...", + inputAttributes: { + "aria-label": "Masukkan komentar", + }, + showCancelButton: true, + confirmButtonText: "Komentar", + cancelButtonText: "Batal", + confirmButtonColor: "#dc2626", + }); + + if (message === undefined) { + return; // User cancelled + } + + loading(); + const res = await commentPromotion(id, message || undefined); + + if (res?.error) { + error(res.message || "Gagal komentar promotion"); + close(); + return; + } + + close(); + success("Promotion berhasil dikomentar"); + // fetchData(); // refresh table + }; + const handleRejectPromotion = async (id: number) => { const MySwal = withReactContent(Swal); const { value: message } = await MySwal.fire({ @@ -338,7 +372,7 @@ export default function PromoDetailDialog({ className="bg-blue-200 hover:bg-blue-400" onClick={(e) => { e.stopPropagation(); - setOpenCommentModal(true); + handleCommentPromotion(promo.id); }} > Beri Tanggapan diff --git a/components/form/agent/detail-agent-form.tsx b/components/form/agent/detail-agent-form.tsx index 319d3e6..5e99e32 100644 --- a/components/form/agent/detail-agent-form.tsx +++ b/components/form/agent/detail-agent-form.tsx @@ -33,6 +33,7 @@ import Cookies from "js-cookie"; import { getProductDataById } from "@/service/product"; import { approveAgent, + commentAgent, getAgentById, rejectAgent, updateAgent, @@ -141,6 +142,39 @@ export default function DetailAgentForm(props: { isDetail: boolean }) { setOpenApproverHistory(true); }; + const handleCommentAgent = async (id: number) => { + const { value: message } = await MySwal.fire({ + title: "Komen Agent", + input: "textarea", + inputLabel: "Komentar (opsional)", + inputPlaceholder: "Masukkan komentar...", + inputAttributes: { + "aria-label": "Masukkan komentar", + }, + showCancelButton: true, + confirmButtonText: "Komentar", + cancelButtonText: "Batal", + confirmButtonColor: "#dc2626", + }); + + if (message === undefined) { + return; // User cancelled + } + + loading(); + const res = await commentAgent(id, message || undefined); + + if (res?.error) { + error(res.message || "Gagal komentar agent"); + close(); + return; + } + + close(); + success("Agent berhasil dikomentar"); + fetchData(); // refresh table + }; + const handleRejectAgent = async (id: number) => { const MySwal = withReactContent(Swal); const { value: message } = await MySwal.fire({ @@ -326,7 +360,7 @@ export default function DetailAgentForm(props: { isDetail: boolean }) { diff --git a/components/form/login.tsx b/components/form/login.tsx index 3790576..853c79f 100644 --- a/components/form/login.tsx +++ b/components/form/login.tsx @@ -188,7 +188,14 @@ export default function Login() { return (
{/* Left Side - Logo Section */} -
+
diff --git a/components/form/product/detail-product-form.tsx b/components/form/product/detail-product-form.tsx index 65d8bea..997b681 100644 --- a/components/form/product/detail-product-form.tsx +++ b/components/form/product/detail-product-form.tsx @@ -32,6 +32,7 @@ import { useParams, useRouter } from "next/navigation"; import Cookies from "js-cookie"; import { approveProduct, + commentProduct, getProductDataById, rejectProduct, updateProduct, @@ -119,10 +120,14 @@ export default function DetailProductForm(props: { isDetail: boolean }) { const router = useRouter(); + // 🔹 Ambil userlevelId dari cookies + const [userRoleId, setUserRoleId] = useState(null); + const MySwal = withReactContent(Swal); + // 🔹 Ambil userlevelId dari cookies useEffect(() => { - const ulne = Cookies.get("ulne"); // contoh: "3" - setUserLevelId(ulne ?? null); + const urie = Cookies.get("urie"); // contoh: "3" + setUserRoleId(urie ?? null); }, []); const { getRootProps, getInputProps } = useDropzone({ @@ -304,6 +309,39 @@ export default function DetailProductForm(props: { isDetail: boolean }) { } } + const handleCommentProduct = async (id: number) => { + const { value: message } = await MySwal.fire({ + title: "Komen Produk", + input: "textarea", + inputLabel: "Komentar (opsional)", + inputPlaceholder: "Masukkan komentar...", + inputAttributes: { + "aria-label": "Masukkan komentar", + }, + showCancelButton: true, + confirmButtonText: "Komentar", + cancelButtonText: "Batal", + confirmButtonColor: "#dc2626", + }); + + if (message === undefined) { + return; // User cancelled + } + + loading(); + const res = await commentProduct(id, message || undefined); + + if (res?.error) { + error(res.message || "Gagal komentar produk"); + close(); + return; + } + + close(); + success("Produk berhasil dikomentar"); + initState(); // refresh table + }; + const handleRejectProduct = async (id: number) => { const MySwal = withReactContent(Swal); const { value: message } = await MySwal.fire({ @@ -597,14 +635,14 @@ export default function DetailProductForm(props: { isDetail: boolean }) {

Jaecoo - Approver | 10/11/2026

- {userLevelId !== "2" && detailData && ( + {userRoleId !== "2" && detailData && (
{detailData.status_id === 1 ? ( <> @@ -617,7 +655,7 @@ export default function DetailProductForm(props: { isDetail: boolean }) { Reject - {userLevelId === "1" && ( + {userRoleId === "1" && (