"use client"; import Image from "next/image"; import Link from "next/link"; import { ThumbsUp, ThumbsDown } from "lucide-react"; import { useEffect, useState } from "react"; import { useParams, useRouter } from "next/navigation"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { listData, listArticles } from "@/service/landing/landing"; import { getCookiesDecrypt } from "@/lib/utils"; import { toggleBookmark, getBookmarkSummaryForUser } from "@/service/content"; import { Swiper, SwiperSlide } from "swiper/react"; import { Navigation, Pagination } from "swiper/modules"; import "swiper/css"; import "swiper/css/navigation"; import "swiper/css/pagination"; import ImageBlurry from "../ui/image-blurry"; import { useTranslations } from "next-intl"; const images = ["/PPS.png", "/PPS2.jpeg", "/PPS3.jpg", "/PPS4.png"]; export default function Header() { const t = useTranslations("MediaUpdate"); const [data, setData] = useState([]); const [bookmarkedIds, setBookmarkedIds] = useState>(new Set()); const router = useRouter(); const params = useParams(); const MySwal = withReactContent(Swal); const slug = params?.slug as string; useEffect(() => { const fetchData = async () => { try { const response = await listArticles( 1, 5, 1, undefined, undefined, "createdAt", slug ); let articlesData: any[] = []; if (response?.error) { const fallbackResponse = await listData( "", "", "", 5, 0, "createdAt", "", "", "" ); articlesData = (fallbackResponse?.data?.data?.content || []).filter( (item: any) => item.typeId === 1 ); } else { articlesData = (response?.data?.data || []).filter( (item: any) => item.typeId === 1 ); } const transformed = articlesData.map((article: any) => ({ id: article.id, title: article.title, categoryName: article.categoryName || (article.categories && article.categories[0]?.title) || "", createdAt: article.createdAt, smallThumbnailLink: article.thumbnailUrl, fileTypeId: article.typeId, clientName: article.clientName, categories: article.categories, label: "Image", })); setData(transformed); const roleId = Number(getCookiesDecrypt("urie")); if (roleId && !isNaN(roleId)) { const userId = getCookiesDecrypt("uie"); const localKey = `bookmarkedIds_${userId || "guest"}`; const saved = localStorage.getItem(localKey); let localSet = new Set(); if (saved) { localSet = new Set(JSON.parse(saved)); 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 merged = new Set([...localSet, ...ids]); setBookmarkedIds(merged); localStorage.setItem( "bookmarkedIds", JSON.stringify(Array.from(merged)) ); } } catch (error) { console.error("Gagal memuat data:", error); } }; fetchData(); }, []); useEffect(() => { if (bookmarkedIds.size > 0) { localStorage.setItem( "bookmarkedIds", JSON.stringify(Array.from(bookmarkedIds)) ); } }, [bookmarkedIds]); return (
{data.length > 0 && ( setBookmarkedIds((prev) => new Set([...prev, Number(id)])) } /> )}
{data.slice(1, 5).map((item) => ( setBookmarkedIds((prev) => new Set([...prev, Number(id)])) } /> ))}
{images.map((img, index) => (
{/* {`slide-${index}`} */}
))}
); } function Card({ item, isBig = false, isInitiallyBookmarked = false, onSaved, }: { item: any; isBig?: boolean; isInitiallyBookmarked?: boolean; onSaved?: (id: number) => void; }) { const router = useRouter(); const t = useTranslations("MediaUpdate"); const MySwal = withReactContent(Swal); const [isSaving, setIsSaving] = useState(false); const [isBookmarked, setIsBookmarked] = useState(isInitiallyBookmarked); useEffect(() => { setIsBookmarked(isInitiallyBookmarked); }, [isInitiallyBookmarked]); const getLink = () => `/content/image/detail/${item?.id}`; const handleSave = async () => { 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", }).then(() => router.push("/auth")); return; } try { setIsSaving(true); const res = await toggleBookmark(item.id); if (res?.error) { MySwal.fire({ icon: "error", title: "Gagal", text: "Gagal menyimpan artikel.", confirmButtonColor: "#d33", }); } else { setIsBookmarked(true); onSaved?.(item.id); const saved = localStorage.getItem("bookmarkedIds"); const newSet = new Set(saved ? JSON.parse(saved) : []); newSet.add(Number(item.id)); localStorage.setItem( "bookmarkedIds", JSON.stringify(Array.from(newSet)) ); MySwal.fire({ icon: "success", title: "Berhasil", text: "Artikel berhasil disimpan ke bookmark.", confirmButtonColor: "#3085d6", timer: 1500, showConfirmButton: false, }); } } catch (err) { console.error("Toggle bookmark error:", err); MySwal.fire({ icon: "error", title: "Kesalahan", text: "Terjadi kesalahan saat menyimpan artikel.", confirmButtonColor: "#d33", }); } finally { setIsSaving(false); } }; return (
{item.title}
{item.clientName} {item.categories?.map((cat: any) => cat.title).join(", ")}
{new Date(item.createdAt) .toLocaleString("id-ID", { day: "2-digit", month: "short", year: "numeric", hour: "2-digit", minute: "2-digit", hour12: false, timeZone: "Asia/Jakarta", }) .replace(".", ":")}{" "} WIB

{item.title}

); } // "use client"; // import Image from "next/image"; // import Link from "next/link"; // import { ThumbsUp, ThumbsDown } from "lucide-react"; // import { useEffect, useState } from "react"; // import { useParams, useRouter } from "next/navigation"; // import Swal from "sweetalert2"; // import withReactContent from "sweetalert2-react-content"; // import { listData, listArticles } from "@/service/landing/landing"; // import { getCookiesDecrypt } from "@/lib/utils"; // import { toggleBookmark, getBookmarkSummaryForUser } from "@/service/content"; // export default function Header() { // const [data, setData] = useState([]); // const [bookmarkedIds, setBookmarkedIds] = useState>(new Set()); // const router = useRouter(); // const params = useParams(); // const MySwal = withReactContent(Swal); // const slug = params?.slug as string; // // ✅ Ambil data artikel (khusus typeId = 1 -> Image) // useEffect(() => { // const fetchData = async () => { // try { // const response = await listArticles( // 1, // 5, // 1, // hanya typeId = 1 (image) // undefined, // undefined, // "createdAt", // slug // ); // let articlesData: any[] = []; // if (response?.error) { // const fallback = await listData( // "", // "", // "", // 5, // 0, // "createdAt", // "", // "", // "1" // ); // articlesData = fallback?.data?.data?.content || []; // } else { // articlesData = response?.data?.data || []; // } // const transformed = articlesData.map((article: any) => // itemTransform(article) // ); // setData(transformed); // } catch (error) { // console.error("Gagal memuat data:", error); // } // }; // fetchData(); // }, [slug]); // // ✅ Sinkronisasi bookmark: dari localStorage + backend user login // useEffect(() => { // const syncBookmarks = async () => { // try { // const roleId = Number(getCookiesDecrypt("urie")); // let localSet = new Set(); // const simpananLocal = localStorage.getItem("bookmarkedIds"); // if (simpananLocal) { // localSet = new Set(JSON.parse(simpananLocal)); // } // // Jika user login, gabungkan dengan data dari backend // if (roleId && !isNaN(roleId)) { // 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)) // ); // } else { // // Jika belum login, pakai local saja // setBookmarkedIds(localSet); // } // } catch (err) { // console.error("Gagal sinkronisasi bookmark:", err); // } // }; // syncBookmarks(); // }, []); // return ( //
//
// {data.length > 0 && ( // // )} //
// {data.slice(1, 5).map((item) => ( // // ))} //
//
//
// {"pps"} //
//
// ); // } // // 🔹 Helper function // function itemTransform(article: any) { // return { // id: article.id, // title: article.title, // categoryName: // article.categoryName || // (article.categories && article.categories[0]?.title) || // "", // createdAt: article.createdAt, // smallThumbnailLink: article.thumbnailUrl, // fileTypeId: article.typeId, // clientName: article.clientName, // categories: article.categories, // label: // article.typeId === 1 // ? "Image" // : article.typeId === 2 // ? "Video" // : article.typeId === 3 // ? "Text" // : article.typeId === 4 // ? "Audio" // : "", // }; // } // // 🔹 Komponen Card // function Card({ // item, // isBig = false, // bookmarkedIds, // setBookmarkedIds, // }: { // item: any; // isBig?: boolean; // bookmarkedIds: Set; // setBookmarkedIds: React.Dispatch>>; // }) { // const router = useRouter(); // const MySwal = withReactContent(Swal); // const [isSaving, setIsSaving] = useState(false); // const isBookmarked = bookmarkedIds.has(Number(item.id)); // const getLink = () => `/content/image/detail/${item?.id}`; // const handleToggleBookmark = async () => { // 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", // }).then(() => router.push("/auth")); // return; // } // try { // setIsSaving(true); // const res = await toggleBookmark(item.id); // if (res?.error) { // MySwal.fire({ // icon: "error", // title: "Gagal", // text: "Gagal memperbarui bookmark.", // confirmButtonColor: "#d33", // }); // } else { // const updated = new Set(bookmarkedIds); // let pesan = ""; // if (isBookmarked) { // updated.delete(Number(item.id)); // pesan = "Dihapus dari bookmark."; // } else { // updated.add(Number(item.id)); // pesan = "Artikel disimpan ke bookmark."; // } // setBookmarkedIds(updated); // localStorage.setItem( // "bookmarkedIds", // JSON.stringify(Array.from(updated)) // ); // MySwal.fire({ // icon: "success", // title: isBookmarked ? "Dihapus!" : "Disimpan!", // text: pesan, // timer: 1500, // showConfirmButton: false, // }); // } // } catch (err) { // console.error("Toggle bookmark error:", err); // MySwal.fire({ // icon: "error", // title: "Kesalahan", // text: "Terjadi kesalahan saat menyimpan artikel.", // confirmButtonColor: "#d33", // }); // } finally { // setIsSaving(false); // } // }; // return ( //
//
// // {item.title} // //
//
//
//
// // {item.clientName} // // // {item.categories?.map((cat: any) => cat.title).join(", ")} // //
//
// {new Date(item.createdAt) // .toLocaleString("id-ID", { // day: "2-digit", // month: "short", // year: "numeric", // hour: "2-digit", // minute: "2-digit", // hour12: false, // timeZone: "Asia/Jakarta", // }) // .replace(".", ":")}{" "} // WIB //
// //

// {item.title} //

// //
//
//
// // //
// //
//
//
// ); // }