"use client"; import { useCallback, useEffect, useState } from "react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Card, CardContent } from "@/components/ui/card"; import { Filter, Loader2 } from "lucide-react"; import { approveCmsContentSubmission, listCmsContentSubmissions, rejectCmsContentSubmission, } from "@/service/cms-content-submissions"; import { apiPayload } from "@/service/cms-landing"; import { formatDate } from "@/utils/global"; import Swal from "sweetalert2"; const DOMAIN_LABEL: Record = { hero: "Hero", about: "About Us", product: "Product", service: "Service", partner: "Partner", popup: "Pop Up", }; type Row = { id: string; domain: string; title: string; status: string; submitter_name: string; submitted_by_id: number; payload: string; created_at: string; }; export default function ApproverContentWebsite() { const [rows, setRows] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(""); const [actingId, setActingId] = useState(null); const load = useCallback(async () => { setLoading(true); try { const res = await listCmsContentSubmissions({ status: "pending", page: 1, limit: 100, }); const raw = apiPayload(res); setRows(Array.isArray(raw) ? raw : []); } finally { setLoading(false); } }, []); useEffect(() => { load(); }, [load]); const filtered = rows.filter((r) => { const q = search.trim().toLowerCase(); if (!q) return true; return ( r.title.toLowerCase().includes(q) || (r.submitter_name ?? "").toLowerCase().includes(q) || (DOMAIN_LABEL[r.domain] ?? r.domain).toLowerCase().includes(q) ); }); async function onApprove(id: string) { const ok = await Swal.fire({ icon: "question", title: "Terapkan perubahan ke website?", showCancelButton: true, }); if (!ok.isConfirmed) return; setActingId(id); try { const res = await approveCmsContentSubmission(id); if ((res as { error?: boolean })?.error) { await Swal.fire({ icon: "error", title: "Gagal", text: String((res as { message?: unknown })?.message ?? ""), }); return; } await Swal.fire({ icon: "success", title: "Disetujui", timer: 1600, showConfirmButton: false, }); await load(); } finally { setActingId(null); } } async function onReject(id: string) { const note = await Swal.fire({ icon: "warning", title: "Tolak pengajuan?", input: "textarea", inputPlaceholder: "Catatan (opsional)", showCancelButton: true, }); if (!note.isConfirmed) return; setActingId(id); try { const res = await rejectCmsContentSubmission( id, typeof note.value === "string" ? note.value : "", ); if ((res as { error?: boolean })?.error) { await Swal.fire({ icon: "error", title: "Gagal", text: String((res as { message?: unknown })?.message ?? ""), }); return; } await Swal.fire({ icon: "success", title: "Ditolak", timer: 1400, showConfirmButton: false, }); await load(); } finally { setActingId(null); } } return (

Content Website

Tinjau pengajuan perubahan dari kontributor dan terapkan ke konten live.

setSearch(e.target.value)} className="max-w-md" />
{loading ? (
) : ( Judul Bagian Pengaju Tanggal Aksi {filtered.length === 0 ? ( Tidak ada pengajuan tertunda. ) : ( filtered.map((item) => ( {item.title} {DOMAIN_LABEL[item.domain] ?? item.domain} {item.submitter_name || `User #${item.submitted_by_id}`} {formatDate(item.created_at)} )) )}
)}
); }