"use client"; import { useRouter } from "next/navigation"; import { useEffect, useMemo, useState, useRef } from "react"; import { ArrowUpIcon, ArrowDownIcon, CommandIcon, FileTextIcon, SearchIcon, CornerDownLeftIcon } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Dialog, DialogContent, DialogHeader, DialogFooter, DialogTrigger, DialogClose, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import Anchor from "./anchor"; import { advanceSearch, cn } from "@/lib/utils"; import { ScrollArea } from "@/components/ui/scroll-area"; export default function Search() { const router = useRouter(); const [searchedInput, setSearchedInput] = useState(""); const [isOpen, setIsOpen] = useState(false); const [selectedIndex, setSelectedIndex] = useState(0); const itemRefs = useRef<(HTMLDivElement | null)[]>([]); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if ((event.ctrlKey || event.metaKey) && event.key === "k") { event.preventDefault(); setIsOpen(true); } }; window.addEventListener("keydown", handleKeyDown); return () => { window.removeEventListener("keydown", handleKeyDown); }; }, []); const filteredResults = useMemo( () => advanceSearch(searchedInput.trim()), [searchedInput] ); useEffect(() => { setSelectedIndex(0); }, [filteredResults]); useEffect(() => { const handleNavigation = (event: KeyboardEvent) => { if (!isOpen || filteredResults.length === 0) return; if (event.key === "ArrowDown") { event.preventDefault(); setSelectedIndex((prev) => (prev + 1) % filteredResults.length); } if (event.key === "ArrowUp") { event.preventDefault(); setSelectedIndex((prev) => (prev - 1 + filteredResults.length) % filteredResults.length); } if (event.key === "Enter") { event.preventDefault(); const selectedItem = filteredResults[selectedIndex]; if (selectedItem) { router.push(`/docs${selectedItem.href}`); setIsOpen(false); } } }; window.addEventListener("keydown", handleNavigation); return () => { window.removeEventListener("keydown", handleNavigation); }; }, [isOpen, filteredResults, selectedIndex, router]); useEffect(() => { if (itemRefs.current[selectedIndex]) { itemRefs.current[selectedIndex]?.scrollIntoView({ behavior: "smooth", block: "nearest", }); } }, [selectedIndex]); return (