"use client" import { useState, useEffect, useMemo } from "react" import Link from "next/link" import { useSearchParams } from "next/navigation" import { TOP_LEAGUES, fetchLeagues } from "@/lib/store/betting-api" import { useBettingStore } from "@/lib/store/betting-store" import type { ApiLeague } from "@/lib/store/betting-types" import { SportEnum, type QuickFilterKey } from "@/lib/store/betting-types" import { getCountryName } from "@/lib/countries" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { ChevronsLeft, ChevronDown, ChevronUp, Plus } from "lucide-react" /** Sidebar sports: slug for URL, sport_id for /leagues?sport_id= (order and list from design) */ const SIDEBAR_SPORTS = [ { id: "football", sport_id: SportEnum.SOCCER, name: "Football", icon: "⚽" }, { id: "basketball", sport_id: SportEnum.BASKETBALL, name: "Basketball", icon: "πŸ€" }, { id: "american-football", sport_id: SportEnum.AMERICAN_FOOTBALL, name: "American Football", icon: "🏈" }, { id: "baseball", sport_id: SportEnum.BASEBALL, name: "Baseball", icon: "⚾" }, { id: "cricket", sport_id: SportEnum.CRICKET, name: "Cricket", icon: "🏏" }, { id: "futsal", sport_id: SportEnum.FUTSAL, name: "Futsal", icon: "⚽" }, { id: "darts", sport_id: SportEnum.DARTS, name: "Darts", icon: "🎯" }, { id: "ice-hockey", sport_id: SportEnum.ICE_HOCKEY, name: "Ice Hockey", icon: "πŸ’" }, { id: "rugby-union", sport_id: SportEnum.RUGBY_UNION, name: "Rugby", icon: "πŸ‰" }, { id: "rugby-league", sport_id: SportEnum.RUGBY_LEAGUE, name: "Rugby League", icon: "πŸ‰" }, { id: "volleyball", sport_id: SportEnum.VOLLEYBALL, name: "Volleyball", icon: "🏐" }, ] function SoccerBallIcon({ className }: { className?: string }) { return ( ) } const QUICK_FILTER_OPTIONS: { label: string; key: QuickFilterKey }[] = [ { label: "All", key: "all" }, { label: "Today", key: "today" }, { label: "3h", key: "3h" }, { label: "6h", key: "6h" }, { label: "9h", key: "9h" }, { label: "12h", key: "12h" }, ] function QuickFilterSection() { const quickFilter = useBettingStore((s) => s.quickFilter) const setQuickFilter = useBettingStore((s) => s.setQuickFilter) return (
Quick Filter
{QUICK_FILTER_OPTIONS.map(({ label, key }) => ( ))}
) } export function SportsSidebar() { const searchParams = useSearchParams() const sportFromUrl = searchParams.get("sport") ?? "football" const leagueFromUrl = searchParams.get("league") const [expandedSport, setExpandedSport] = useState(sportFromUrl) const [expandedCountries, setExpandedCountries] = useState>(new Set()) const [leaguesBySportId, setLeaguesBySportId] = useState>({}) const [loadingSportId, setLoadingSportId] = useState(null) useEffect(() => { setExpandedSport((prev) => (prev ?? sportFromUrl) || sportFromUrl) }, [sportFromUrl]) const currentSport = SIDEBAR_SPORTS.find((s) => s.id === sportFromUrl) const sportId = currentSport?.sport_id ?? SportEnum.SOCCER useEffect(() => { if (!expandedSport) return const sport = SIDEBAR_SPORTS.find((s) => s.id === expandedSport) if (!sport || sport.sport_id in leaguesBySportId) return let cancelled = false setLoadingSportId(sport.sport_id) fetchLeagues(sport.sport_id) .then((res) => { if (!cancelled) setLeaguesBySportId((prev) => ({ ...prev, [sport.sport_id]: res.data ?? [] })) }) .catch(() => { if (!cancelled) setLeaguesBySportId((prev) => ({ ...prev, [sport.sport_id]: [] })) }) .finally(() => { if (!cancelled) setLoadingSportId(null) }) return () => { cancelled = true } }, [expandedSport, leaguesBySportId]) const toggleCountry = (cc: string) => { setExpandedCountries((prev) => { const next = new Set(prev) if (next.has(cc)) next.delete(cc) else next.add(cc) return next }) } const getCountriesForSport = (sportIdNum: number) => { const leagues = leaguesBySportId[sportIdNum] ?? [] const ccSet = new Set() leagues.forEach((l) => ccSet.add((l.cc || "").trim().toLowerCase() || "__intl__")) return Array.from(ccSet) .map((cc) => ({ cc: cc === "__intl__" ? "" : cc, name: cc === "__intl__" ? "International" : getCountryName(cc), })) .sort((a, b) => a.name.localeCompare(b.name)) } const getLeaguesForCountry = (sportIdNum: number, countryCc: string) => { const leagues = leaguesBySportId[sportIdNum] ?? [] const cc = countryCc.toLowerCase() return leagues .filter((l) => ((l.cc || "").trim().toLowerCase() || "") === cc) .sort((a, b) => a.name.localeCompare(b.name)) } return ( ) }