"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { format } from "date-fns"; import { id as localeId } from "date-fns/locale"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { Loader2, Plus, Trash2, Pencil, CalendarDays, Search, ChevronLeft, ChevronRight, } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { CalendarIcon } from "lucide-react"; import { cn } from "@/lib/utils"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { deleteSchedule, getAllSchedules } from "@/service/landing/landing"; const MySwal = withReactContent(Swal); function safeFormatDate(dateString?: string, formatString = "dd MMM yyyy HH:mm") { if (!dateString) return "-"; const date = new Date(dateString); if (isNaN(date.getTime())) return "-"; return format(date, formatString, { locale: localeId }); } export default function ScheduleListPage() { const router = useRouter(); const [schedules, setSchedules] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(""); const [isLive, setIsLive] = useState("semua"); const [page, setPage] = useState(1); const [limit] = useState(6); const [startDate, setStartDate] = useState(); const [endDate, setEndDate] = useState(); const [totalPage, setTotalPage] = useState(1); const fetchSchedules = async () => { setLoading(true); try { const params: any = { page, limit, sortBy: "startDate", sort: "asc", title: search, }; if (isLive !== "semua") { params.isLiveStreaming = isLive === "true"; } if (startDate) params.startDate = startDate.toISOString(); if (endDate) params.endDate = endDate.toISOString(); const res = await getAllSchedules(params); if (!res.error) { setSchedules(res.data?.data || res.data?.items || []); setTotalPage(res.data?.meta?.totalPage || 1); } } catch (error) { console.error("Error fetching schedules:", error); } finally { setLoading(false); } }; useEffect(() => { fetchSchedules(); }, [page, isLive]); const handleSearch = () => { setPage(1); fetchSchedules(); }; const handleDelete = async (id: number) => { MySwal.fire({ title: "Hapus Jadwal?", text: "Tindakan ini tidak dapat dibatalkan.", icon: "warning", showCancelButton: true, confirmButtonText: "Ya, hapus", cancelButtonText: "Batal", confirmButtonColor: "#d33", }).then(async (result) => { if (result.isConfirmed) { const res = await deleteSchedule(id); if (!res?.error) { MySwal.fire({ icon: "success", title: "Dihapus!", text: "Jadwal berhasil dihapus.", timer: 1500, showConfirmButton: false, }); fetchSchedules(); } else { MySwal.fire({ icon: "error", title: "Gagal!", text: res.message || "Gagal menghapus jadwal.", }); } } }); }; return (
{/* Header */}

Daftar Jadwal

{/* Filter Bar */}
setSearch(e.target.value)} />
{/* Content */} {loading ? (
Memuat data...
) : schedules.length === 0 ? (

Tidak ada jadwal ditemukan.

) : ( <>
{schedules.map((item) => ( {item.title} {item.isLiveStreaming ? "Live" : "Offline"}
{safeFormatDate(item.startDate, "dd MMM yyyy")} {safeFormatDate(item.startDate, "HH:mm")} -{" "} {safeFormatDate(item.endDate, "HH:mm")}

{item.description || "-"}

Lokasi: {item.location || "-"}

))}
{/* Pagination */}
Halaman {page} dari {totalPage}
)}
); }