"use client"; import { useState, useRef, useEffect, useCallback } from "react"; import { Box, Flex, Input, Text, VStack, HStack, Image, Spinner, } from "@chakra-ui/react"; import { useColorModeValue } from "@/components/ui/color-mode"; import { useSearchTeams } from "@/lib/api/leagues/use-hooks"; import { useRouter } from "@/i18n/navigation"; import { LuSearch, LuX } from "react-icons/lu"; import type { TeamDto } from "@/lib/api/leagues/types"; export default function GlobalSearch() { const [query, setQuery] = useState(""); const [isOpen, setIsOpen] = useState(false); const [debouncedQuery, setDebouncedQuery] = useState(""); const inputRef = useRef(null); const containerRef = useRef(null); const router = useRouter(); const isApplePlatform = typeof navigator !== "undefined" && /Mac|iPhone|iPad|iPod/i.test(navigator.platform); const shortcutLabel = isApplePlatform ? "Cmd+K" : "Ctrl+K"; const shortcutCapsule = isApplePlatform ? "⌘K" : "Ctrl+K"; const bg = useColorModeValue("white", "gray.900"); const borderColor = useColorModeValue("gray.200", "gray.700"); const hoverBg = useColorModeValue("gray.50", "gray.800"); const inputBg = useColorModeValue("gray.50", "gray.800"); useEffect(() => { const timer = setTimeout(() => setDebouncedQuery(query), 300); return () => clearTimeout(timer); }, [query]); const { data: searchData, isLoading } = useSearchTeams({ q: debouncedQuery, }); const teams: TeamDto[] = searchData?.data ?? []; useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if ( containerRef.current && !containerRef.current.contains(e.target as Node) ) { setIsOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === "k") { e.preventDefault(); inputRef.current?.focus(); setIsOpen(true); } if (e.key === "Escape") { setIsOpen(false); inputRef.current?.blur(); } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, []); const handleTeamClick = useCallback( (team: TeamDto) => { setIsOpen(false); setQuery(""); router.push(`/teams/${team.id}`); }, [router], ); return ( { setQuery(e.target.value); setIsOpen(true); }} onFocus={() => query.length >= 2 && setIsOpen(true)} placeholder={`Takim ara... (${shortcutLabel})`} variant="flushed" size="sm" px={2} fontSize="sm" /> {query && ( { setQuery(""); setIsOpen(false); }} cursor="pointer" opacity={0.5} _hover={{ opacity: 1 }} flexShrink={0} > )} {shortcutCapsule} {isOpen && debouncedQuery.length >= 2 && ( {isLoading ? ( ) : teams.length === 0 ? ( Sonuc bulunamadi ) : ( {teams.map((team: TeamDto) => ( handleTeamClick(team)} gap={3} > {team.logo ? ( {team.name} ) : ( {team.name?.charAt(0) || "T"} )} {team.name} {team.country && ( {team.country} )} ))} )} )} ); }