"use client"; import { useEffect, useState } from "react"; import Image from "next/image"; import { Eye, Pencil, Trash2, Calendar, MapPin, CheckCheck, } from "lucide-react"; import { deleteGalery, getGaleryById, getGaleryData, getGaleryFileData, approveGalery, } from "@/service/galery"; import { DialogDetailGaleri } from "../dialog/galery-detail-dialog"; import { DialogUpdateGaleri } from "../dialog/galery-update-dialog"; import { error, success, loading, close } from "@/config/swal"; import withReactContent from "sweetalert2-react-content"; import Swal from "sweetalert2"; import Cookies from "js-cookie"; export default function Galery() { const MySwal = withReactContent(Swal); const [data, setData] = useState([]); const [userLevelId, setUserLevelId] = useState(null); const [page, setPage] = useState(1); const [showData, setShowData] = useState("10"); const [search, setSearch] = useState(""); const [showDetail, setShowDetail] = useState(false); const [detailData, setDetailData] = useState(null); const [showEdit, setShowEdit] = useState(false); const [editData, setEditData] = useState(null); const fetchData = async () => { try { const req = { limit: showData, page: page, search: search, }; const res = await getGaleryData(req); const list = res?.data?.data ?? []; // Ambil gambar yang sesuai gallery_id dan gabungkan ke data galeri const merged = await Promise.all( list.map(async (item: any) => { try { const filesRes = await getGaleryFileData(item.id); const images = filesRes?.data?.data ?? []; // Filter file dengan gallery_id sama dengan item.id const filteredImages = images?.filter( (img: any) => img.gallery_id === item.id, ); // Ambil gambar pertama sebagai thumbnail const coverImage = filteredImages.length > 0 ? filteredImages[0].image_url : null; return { ...item, image_url: coverImage, }; } catch (e) { return { ...item, image_url: null }; } }), ); setData(merged); } catch (error) { console.error("Error fetch galeri:", error); } }; // 🔹 Ambil userlevelId dari cookies useEffect(() => { const ulne = Cookies.get("ulne"); // contoh: "3" setUserLevelId(ulne ?? null); }, []); useEffect(() => { fetchData(); }, [page, showData, search]); const openDetail = async (id: number) => { try { const res = await getGaleryById(id); setDetailData(res?.data?.data); setShowDetail(true); } catch (err) { console.error("Error get detail:", err); } }; const openEdit = async (id: number) => { try { const res = await getGaleryById(id); setEditData(res?.data?.data); setShowEdit(true); } catch (error) { console.error("Error open edit:", error); } }; async function doDelete(id: any) { const resDelete = await deleteGalery(id); if (resDelete?.error) { error(resDelete.message); return false; } success("Berhasil Hapus"); fetchData(); } const handleDelete = (id: any) => { MySwal.fire({ title: "Hapus Data", icon: "warning", showCancelButton: true, cancelButtonColor: "#3085d6", confirmButtonColor: "#d33", confirmButtonText: "Hapus", }).then((result) => { if (result.isConfirmed) { doDelete(id); } }); }; const handleApproveGalery = async (id: number) => { loading(); const res = await approveGalery(id); if (res?.error) { error(res.message || "Gagal menyetujui galeri"); close(); return; } close(); success("Galeri berhasil disetujui"); fetchData(); // refresh table }; return (
{data?.map((item: any) => (
{/* Image */}
{item.image_url ? ( {item.title} ) : (
No Image
)} {/* Status Badge */} {item.status_id === 2 ? "Disetujui" : item.status_id === 1 ? "Menunggu" : "Tidak Diketahui"}
{/* Content */}

{item.title}

{item.description ?? "-"}

{" "} {new Date(item.created_at).toLocaleDateString("id-ID")}
{item.location ?? "-"}
{/* Footer Actions */}
{userLevelId !== "1" && ( )} {/* Tombol Approve - hanya untuk admin dan status pending */} {/* {userLevelId === "1" && item.status_id === 1 && ( )} */}
))}
{/* Pagination */}

Menampilkan {data.length} data

{showDetail && detailData && ( setShowDetail(false)} data={detailData} /> )} {showEdit && editData && ( setShowEdit(false)} data={editData} onUpdated={fetchData} /> )}
); }