'use client'; import stateGallery from '@/app/admin/(dashboard)/_state/desa/gallery'; import colors from '@/con/colors'; import { Box, Center, Pagination, Paper, SimpleGrid, Spoiler, Stack, Text, } from '@mantine/core'; import { useCallback, useEffect, useState } from 'react'; import { useSnapshot } from 'valtio'; export default function VideoContent() { // ✅ expanded state per index const [expandedMap, setExpandedMap] = useState>({}); const videoState = useSnapshot(stateGallery.video); const { data, page, totalPages, loading } = videoState.findMany; // Handle search and pagination changes const loadData = useCallback((pageNum: number, searchTerm: string) => { stateGallery.video.findMany.load(pageNum, 10, searchTerm.trim()); }, []); // Initial load and URL change handler useEffect(() => { const handleRouteChange = () => { const urlParams = new URLSearchParams(window.location.search); const urlSearch = urlParams.get('search') || ''; const urlPage = parseInt(urlParams.get('page') || '1'); loadData(urlPage, urlSearch); }; const handleSearchUpdate = (e: Event) => { const { search } = (e as CustomEvent).detail; loadData(1, search); }; handleRouteChange(); window.addEventListener('popstate', handleRouteChange); window.addEventListener('searchUpdate', handleSearchUpdate as EventListener); return () => { window.removeEventListener('popstate', handleRouteChange); window.removeEventListener('searchUpdate', handleSearchUpdate as EventListener); }; }, [loadData]); const handlePageChange = (newPage: number) => { const params = new URLSearchParams(window.location.search); const search = params.get('search') || ''; loadData(newPage, search); }; const toggleExpanded = (index: number, value: boolean) => { setExpandedMap((prev) => ({ ...prev, [index]: value, })); }; const dataVideo = data || []; if (loading && !data) { return ( Memuat Video... ); } return ( {dataVideo.map((v, k) => (
{new Date(v.createdAt).toLocaleDateString('id-ID', { day: 'numeric', month: 'long', year: 'numeric', })} {v.name} Show more } hideLabel={ Hide details } expanded={expandedMap[k] || false} onExpandedChange={(val) => toggleExpanded(k, val)} >
))}
); } // ✅ Fix: convert YouTube URL ke embed function convertToEmbedUrl(youtubeUrl: string): string { try { const url = new URL(youtubeUrl); const videoId = url.searchParams.get('v'); if (!videoId) return youtubeUrl; return `https://www.youtube.com/embed/${videoId}`; } catch (err) { console.error('Error converting YouTube URL to embed:', err); return youtubeUrl; } }