"use client"; import { useState, useEffect } from "react"; import Image from "next/image"; import { Button } from "@/components/ui/button"; import { Card } from "../ui/card"; import Link from "next/link"; import { useRouter, useParams } from "next/navigation"; import { listData, listArticles } from "@/service/landing/landing"; import { toggleBookmark, getBookmarkSummaryForUser } from "@/service/content"; import { getCookiesDecrypt } from "@/lib/utils"; import { Swiper, SwiperSlide } from "swiper/react"; import "swiper/css"; import "swiper/css/navigation"; import { Navigation } from "swiper/modules"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { ThumbsUp, ThumbsDown } from "lucide-react"; // 🔹 Fungsi format tanggal ke WIB function formatTanggal(dateString: string) { if (!dateString) return ""; return ( new Date(dateString) .toLocaleString("id-ID", { day: "2-digit", month: "short", year: "numeric", hour: "2-digit", minute: "2-digit", hour12: false, timeZone: "Asia/Jakarta", }) .replace(/\./g, ":") + " WIB" ); } export default function MediaUpdate() { const [tab, setTab] = useState<"latest" | "popular">("latest"); const [contentType, setContentType] = useState< "audiovisual" | "audio" | "foto" | "text" | "all" >("foto"); const [dataToRender, setDataToRender] = useState([]); const [filteredData, setFilteredData] = useState([]); const [bookmarkedIds, setBookmarkedIds] = useState>(new Set()); const [loading, setLoading] = useState(true); const [currentTypeId, setCurrentTypeId] = useState("1"); const router = useRouter(); const params = useParams(); const MySwal = withReactContent(Swal); // Get slug from URL params const slug = params?.slug as string; useEffect(() => { fetchData(tab); }, [tab, slug]); useEffect(() => { // if (contentType !== "all") { // fetchData(tab); // } else { // filterDataByContentType(); // } fetchData(tab); }, [contentType]); useEffect(() => { filterDataByContentType(); }, [dataToRender]); // Function to get typeId based on content type function getTypeIdByContentType(contentType: string): string { switch (contentType) { case "audiovisual": return "2"; // Video case "foto": return "1"; // Image case "audio": return "4"; // Audio case "text": return "3"; // Text default: return "1"; // Default to Image } } // Function to get link based on typeId (same as header.tsx) function getLink(item: any) { switch (item?.typeId) { case 1: return `/content/image/detail/${item?.id}`; case 2: return `/content/video/detail/${item?.id}`; case 3: return `/content/text/detail/${item?.id}`; case 4: return `/content/audio/detail/${item?.id}`; default: return "#"; } } // Function to get content type link for "Lihat lebih banyak" button function getContentTypeLink() { switch (contentType) { case "audio": return "/tenant/" + slug + "/content/audio"; case "foto": return "/tenant/" + slug + "/content/image"; case "audiovisual": return "/tenant/" + slug + "/content/video"; case "text": return "/tenant/" + slug + "/content/text"; default: return "/tenant/" + slug + "/content/image"; // Default to image page } } // Function to filter data by content type function filterDataByContentType() { // if (contentType === "all") { // setFilteredData(dataToRender); // return; // } const filtered = dataToRender.filter((item) => { // Determine content type based on item properties const hasVideo = item.videoUrl || item.videoPath; const hasAudio = item.audioUrl || item.audioPath; const hasImage = item.smallThumbnailLink || item.thumbnailUrl || item.imageUrl; const hasText = item.content || item.description; switch (contentType) { case "audiovisual": return hasVideo && (hasAudio || hasImage); case "audio": return hasAudio && !hasVideo; case "foto": return hasImage && !hasVideo && !hasAudio; case "text": return hasText && !hasVideo && !hasAudio && !hasImage; default: return true; } }); setFilteredData(filtered); } async function fetchData(section: "latest" | "popular") { try { setLoading(true); // Tentukan typeId dari contentType const typeId = parseInt(getTypeIdByContentType(contentType)); setCurrentTypeId(typeId.toString()); // 🔹 Ambil data artikel dari API const response = await listArticles( 1, 10, typeId, undefined, undefined, section === "latest" ? "createdAt" : "viewCount", slug ); let hasil: any[] = []; if (response?.error) { console.error("Articles API failed, fallback ke old API"); const fallbackRes = await listData( typeId.toString(), "", "", 20, 0, "", "", "" ); hasil = fallbackRes?.data?.data?.content || []; } else { // ✅ Perhatikan: API kamu mengembalikan `data.data` sebagai array hasil = response?.data?.data || []; } // 🔹 Normalisasi struktur data const transformedData = hasil.map((article: any) => ({ id: article.id, title: article.title, category: article.categoryName || (article.categories && article.categories[0]?.title) || "Tanpa Kategori", createdAt: article.createdAt, smallThumbnailLink: article.thumbnailUrl, label: article.categoryName, clientName: article.clientName, typeId: article.typeId, ...article, })); // ✅ INI WAJIB: simpan hasil mapping ke state setDataToRender(transformedData); // 🔹 Sinkronisasi data bookmark const roleId = Number(getCookiesDecrypt("urie")); if (roleId && !isNaN(roleId)) { const simpananLocal = localStorage.getItem("bookmarkedIds"); let localSet = new Set(); if (simpananLocal) { localSet = new Set(JSON.parse(simpananLocal)); setBookmarkedIds(localSet); } const res = await getBookmarkSummaryForUser(); const bookmarks = res?.data?.data?.recentBookmarks || res?.data?.data?.bookmarks || res?.data?.data || []; const ids = new Set( (Array.isArray(bookmarks) ? bookmarks : []) .map((b: any) => Number(b.articleId ?? b.id ?? b.article?.id)) .filter((x) => !isNaN(x)) ); const gabungan = new Set([...localSet, ...ids]); setBookmarkedIds(gabungan); localStorage.setItem( "bookmarkedIds", JSON.stringify(Array.from(gabungan)) ); } } catch (err) { console.error("Gagal memuat data:", err); } finally { setLoading(false); } } // 🔹 Simpan bookmark const handleSave = async (id: number) => { const roleId = Number(getCookiesDecrypt("urie")); if (!roleId || isNaN(roleId)) { MySwal.fire({ icon: "warning", title: "Login diperlukan", text: "Silakan login terlebih dahulu untuk menyimpan artikel.", confirmButtonText: "Login Sekarang", confirmButtonColor: "#d33", }); return; } try { const res = await toggleBookmark(id); if (res?.error) { MySwal.fire({ icon: "error", title: "Gagal", text: "Tidak dapat menyimpan artikel.", confirmButtonColor: "#d33", }); } else { const updated = new Set(bookmarkedIds); updated.add(Number(id)); setBookmarkedIds(updated); localStorage.setItem( "bookmarkedIds", JSON.stringify(Array.from(updated)) ); MySwal.fire({ icon: "success", title: "Berhasil", text: "Artikel berhasil disimpan ke bookmark.", timer: 1500, showConfirmButton: false, }); } } catch (err) { console.error("Error menyimpan bookmark:", err); MySwal.fire({ icon: "error", title: "Kesalahan", text: "Terjadi kesalahan saat menyimpan artikel.", }); } }; return (

Media Update

{/* Main Tab */}
{/* Content Type Filter */}
{/* */}
{/* Slider */} {loading ? (

Memuat konten...

) : ( {filteredData.map((item) => (
{item.title
{item.clientName || "Tanpa Kategori"} {/* {tipeKonten} */}

{formatTanggal(item.createdAt)}

{item.title}

))}
)} {/* Lihat lebih banyak - hanya muncul jika ada data */} {filteredData.length > 0 && (
)}
); }