"use client"; import { useEffect, useRef, useState } from "react"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { useTranslations } from "next-intl"; import { BsCalendar2Date } from "react-icons/bs"; import { FaExternalLinkAlt, FaTrophy } from "react-icons/fa"; import { Tooltip } from "react-tooltip"; import { twMerge } from "tailwind-merge"; import DatePicker from "@/app/[locale]/(main)/tournaments/DatePicker"; import { datePickerIsOpenAtom, dateRangeAtom, debouncedHoveredListIdAtom, debouncedHoveredMapIdAtom, filteredTournamentsListAtom, hoveredMapIdAtom, normsOnlyAtom, regionFilterAtom, } from "@/atoms"; import { RegionSelect } from "@/components/RegionSelect"; import SearchBar from "@/components/SearchBar"; import { Select } from "@/components/form/Select"; import { useBreakpoint } from "@/hooks/tailwind"; import useDatePickerWidth from "@/hooks/useDatePickerWidth"; import { DatePickerDirection } from "@/types"; import TimeControlFilters from "./TimeControlFilters"; const TournamentTable = () => { const t = useTranslations("Tournaments"); const at = useTranslations("App"); const isLg = useBreakpoint("lg"); const datePickerRef = useRef(null); const filteredTournaments = useAtomValue(filteredTournamentsListAtom); const [normsOnly, setNormsOnly] = useAtom(normsOnlyAtom); const hoveredMapId = useAtomValue(hoveredMapIdAtom); const debouncedHoveredMapId = useAtomValue(debouncedHoveredMapIdAtom); const setHoveredListId = useSetAtom(debouncedHoveredListIdAtom); const setDateRange = useSetAtom(dateRangeAtom); const [datePickerIsOpen, setDatePickerIsOpen] = useAtom(datePickerIsOpenAtom); const [dateDirectionState, setDateDirectionState] = useState("horizontal"); const datePickerColour = datePickerIsOpen ? "text-primary-600" : "text-gray-500"; useDatePickerWidth({ datePickerRef, setDateDirectionState }); useEffect(() => { if (!isLg || debouncedHoveredMapId === null) return; const tournamentRow = document.querySelector( `[data-group-id="${debouncedHoveredMapId}"]`, ); tournamentRow?.scrollIntoView({ behavior: "smooth" }); }, [debouncedHoveredMapId, isLg]); const handleDatePickerClick = () => { // reset date range today -> max date setDateRange([ { startDate: new Date(), endDate: undefined, key: "selection", }, ]); setDatePickerIsOpen(!datePickerIsOpen); }; return (
{datePickerIsOpen && ( )}
{filteredTournaments.length === 0 ? ( ) : ( filteredTournaments.map((tournament) => ( setHoveredListId(tournament.id)} onMouseLeave={() => setHoveredListId(null)} className={twMerge( "scroll-m-20 bg-white text-gray-900 hover:bg-gray-200 dark:bg-gray-800 dark:text-white dark:hover:bg-gray-900", hoveredMapId === tournament.groupId && "bg-gray-200 dark:bg-gray-900", )} > )) )}
{t("date")} {t("town")} {t("tournament")} {t("timeControl")} {t("ffe")}
{t("noneFound")}
{tournament.date} {tournament.town} {tournament.norm && ( )} {tournament.tournament} {at("timeControlEnum", { tc: tournament.timeControl })}
{t("norm")}
); }; export default TournamentTable;