import React, { useMemo, useState } from "react"; import { View, Text, Image, ScrollView, TouchableOpacity, ActivityIndicator, } from "react-native"; import ScreenWrapper from "~/components/ui/ScreenWrapper"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Icons } from "~/assets/icons"; import { ChevronRight } from "lucide-react-native"; import { router } from "expo-router"; import { ROUTES } from "~/lib/routes"; import { useTranslation } from "react-i18next"; import BackButton from "~/components/ui/backButton"; import { useTickets } from "~/lib/hooks/useTickets"; import BottomSheet from "~/components/ui/bottomSheet"; export default function MyTicketsScreen() { const { t } = useTranslation(); const { data: tickets, loading, error, refetch, } = useTickets({ status: "ACTIVE", limit: 50, immediate: true }); const [searchQuery, setSearchQuery] = useState(""); const [filterVisible, setFilterVisible] = useState(false); const [dateFilter, setDateFilter] = useState<"all" | "today" | "this_week">( "all" ); const normalizedQuery = searchQuery.trim().toLowerCase(); const filteredTickets = useMemo(() => { if (!tickets) return []; return tickets.filter((ticket) => { const anyTicket = ticket as any; const eventName = (anyTicket.event?.name ?? "").toLowerCase(); if (normalizedQuery && !eventName.includes(normalizedQuery)) { return false; } if (dateFilter !== "all") { const rawDate = anyTicket.event?.startDate || anyTicket.createdAt; if (!rawDate) { return true; } const date = new Date(rawDate); const now = new Date(); const ticketDay = new Date( date.getFullYear(), date.getMonth(), date.getDate() ); const today = new Date( now.getFullYear(), now.getMonth(), now.getDate() ); if (dateFilter === "today") { if (ticketDay.getTime() !== today.getTime()) return false; } else if (dateFilter === "this_week") { const endOfWeek = new Date(today); endOfWeek.setDate(today.getDate() + 7); if (ticketDay < today || ticketDay > endOfWeek) return false; } } return true; }); }, [tickets, normalizedQuery, dateFilter]); return ( {t("mytickets.title")} {t("mytickets.subtitle")} {t("mytickets.ticketsTitle")} {loading && ( {t("mytickets.loading")} )} {!loading && error && ( {t("mytickets.error")} )} {!loading && !error && tickets && tickets.length === 0 && ( No tickets found You don't have any tickets yet. )} {!loading && !error && tickets && filteredTickets.length === 0 && ( No tickets match your search. )} {!loading && !error && filteredTickets && filteredTickets.length > 0 && ( {filteredTickets.map((ticket) => { const anyTicket = ticket as any; const eventName = anyTicket.event?.name || "Ticket"; const ticketNo = anyTicket.ticketNo || anyTicket.id; const qr = anyTicket.qr || ticketNo; const qrImage = anyTicket.qrImage as string | undefined; const rawDate = anyTicket.event?.startDate || anyTicket.createdAt; const formattedDate = rawDate ? new Date(rawDate).toLocaleDateString() : ""; return ( router.push({ pathname: ROUTES.EVENT_QR, params: { code: qr, packageName: eventName, ...(qrImage ? { qrImage } : {}), }, }) } className="flex-row items-center justify-between bg-[#F3FFF7] rounded-[6px] px-4 py-3" > {eventName} {formattedDate} ); })} )} setFilterVisible(false)} maxHeightRatio={0.5} > Filter tickets Filter by date of event or purchase Date {[ { key: "all", label: "All dates" }, { key: "today", label: "Today" }, { key: "this_week", label: "This week" }, ].map((option) => ( setDateFilter(option.key as "all" | "today" | "this_week") } className={`px-3 py-1 rounded-full mr-2 border ${ dateFilter === option.key ? "bg-[#0F7B4A] border-[#0F7B4A]" : "bg-white border-gray-300" }`} > {option.label} ))} { setSearchQuery(""); setDateFilter("all"); }} > Clear ); }