import { useEffect, useMemo, useState } from "react"; import { useLocation, useNavigate, useParams } from "react-router-dom"; import Icon from "../components/Icon"; import { CafeEvent, mockCafeEvents } from "../data/mockCafeEvents"; import { EventReservation, fetchEventReservations } from "../services/campaignApi"; import { getCafeUuid } from "../utils/cafe"; import HostBanner from "../assets/images/banners/Host-banner.jpg"; import { formatPersianNumber } from "../utils/formatNumber"; function toEnglishDigits(value: string) { const persianDigits = "۰۱۲۳۴۵۶۷۸۹"; return value.replace(/[۰-۹]/g, (digit) => String(persianDigits.indexOf(digit)), ); } function reservationMatches(reservation: EventReservation, query: string) { if (!query) return true; const haystack = toEnglishDigits( `${reservation.full_name} ${reservation.phone_number} ${reservation.people_count} ${formatPersianNumber(reservation.people_count)} ${reservation.reserve_code}`, ).toLowerCase(); return haystack.includes(toEnglishDigits(query).toLowerCase()); } function downloadReservationsCsv(reservations: EventReservation[]) { const header = ["کد رزرو", "تعداد", "نام", "شماره تماس"]; const rows = reservations.map((r) => [ r.reserve_code, String(r.people_count), r.full_name, toEnglishDigits(r.phone_number), ]); const csvContent = [header, ...rows] .map((row) => row.map((cell) => `"${cell.replace(/"/g, '""')}"`).join(",")) .join("\n"); const blob = new Blob(["" + csvContent], { type: "text/csv;charset=utf-8;", }); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = "reservations.csv"; link.click(); URL.revokeObjectURL(url); } function ReservationCard({ reservation, selected, onToggle, }: { reservation: EventReservation; selected: boolean; onToggle: () => void; }) { return (
{reservation.reserve_code} {formatPersianNumber(reservation.people_count)} نفر

{reservation.full_name}

{reservation.phone_number}

); } export default function EventReservations() { const { id } = useParams(); const location = useLocation(); const navigate = useNavigate(); const [query, setQuery] = useState(""); const [selectedIds, setSelectedIds] = useState([]); const [reservations, setReservations] = useState([]); const event: CafeEvent | undefined = (location.state as { event?: CafeEvent } | null)?.event ?? mockCafeEvents.find((e) => e.id === Number(id)); useEffect(() => { const cafeUuid = getCafeUuid(); if (!cafeUuid || !id) return; fetchEventReservations(cafeUuid, id) .then(setReservations) .catch(() => {}); }, [id]); const filteredReservations = useMemo( () => reservations.filter((reservation) => reservationMatches(reservation, query), ), [reservations, query], ); const toggleSelected = (reservationId: string) => { setSelectedIds((prev) => prev.includes(reservationId) ? prev.filter((id) => id !== reservationId) : [...prev, reservationId], ); }; const handleDownload = () => { downloadReservationsCsv(reservations); }; return (
setQuery(e.target.value)} placeholder="جستجو" className="w-full rounded-2xl shadow-[0px_4px_12px_0px_#0000001F] bg-white py-3 pr-6 pl-4 text-right placeholder:font-light placeholder:text-[#999999]" />
{filteredReservations.map((reservation) => ( toggleSelected(reservation.uuid)} /> ))}
); }