"use client" import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent, } from "react" import { useRouter } from "next/navigation" import { Search, X } from "lucide-react" import { Button } from "@/components/ui/button" import { MAIL_SEARCH_SUGGESTIONS_DROPDOWN_CLASS } from "@/lib/mail-chrome-classes" import { DRIVE_SEARCH_INPUT_WRAP_CLASS } from "@/lib/drive/drive-chrome-classes" import { searchMailSettings } from "@/lib/mail-settings/search-settings" import type { MailSettingsSearchEntry } from "@/lib/mail-settings/settings-search-index" import { cn } from "@/lib/utils" export function MailSettingsSearchBar({ className }: { className?: string }) { const router = useRouter() const containerRef = useRef(null) const inputRef = useRef(null) const [query, setQuery] = useState("") const [focused, setFocused] = useState(false) const [open, setOpen] = useState(false) const [selectedIndex, setSelectedIndex] = useState(-1) const suggestions = useMemo( () => searchMailSettings(query), [query] ) const showDropdown = open && focused && query.trim().length > 0 && suggestions.length > 0 const navigateTo = useCallback( (entry: MailSettingsSearchEntry) => { router.push(entry.href) setOpen(false) setQuery("") setSelectedIndex(-1) inputRef.current?.blur() }, [router] ) const handleKeyDown = useCallback( (e: KeyboardEvent) => { if (!showDropdown && e.key !== "Escape") return switch (e.key) { case "ArrowDown": e.preventDefault() setSelectedIndex((i) => i < suggestions.length - 1 ? i + 1 : 0 ) break case "ArrowUp": e.preventDefault() setSelectedIndex((i) => i > 0 ? i - 1 : suggestions.length - 1 ) break case "Enter": e.preventDefault() if (selectedIndex >= 0 && suggestions[selectedIndex]) { navigateTo(suggestions[selectedIndex]) } else if (suggestions[0]) { navigateTo(suggestions[0]) } break case "Escape": e.preventDefault() setOpen(false) setSelectedIndex(-1) inputRef.current?.blur() break } }, [showDropdown, selectedIndex, suggestions, navigateTo] ) useEffect(() => { setSelectedIndex(suggestions.length > 0 ? 0 : -1) }, [query, suggestions.length]) useEffect(() => { function handleClickOutside(event: MouseEvent) { if (!containerRef.current?.contains(event.target as Node)) { setOpen(false) } } document.addEventListener("mousedown", handleClickOutside) return () => document.removeEventListener("mousedown", handleClickOutside) }, []) return (
{ setQuery(e.target.value) setOpen(true) }} onFocus={() => { setFocused(true) if (query.trim()) setOpen(true) }} onBlur={() => setFocused(false)} onKeyDown={handleKeyDown} placeholder="Rechercher dans les réglages" className={cn( "h-full w-full rounded-full border-0 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground", query ? "pl-11 pr-12" : "pl-11 pr-4" )} role="combobox" aria-expanded={showDropdown} aria-controls="mail-settings-search-listbox" aria-autocomplete="list" autoComplete="off" /> {query ? ( ) : null}
{showDropdown ? (
    {suggestions.map((entry, index) => { const selected = index === selectedIndex return (
  • ) })}
) : null}
) }