import { type FormEvent, useEffect, useRef, useState } from "react"; import { useNavigate } from "react-router"; import { t } from "@lingui/core/macro"; interface SearchBarProps { collapsible?: boolean; } export function SearchBar({ collapsible = false }: SearchBarProps) { const [value, setValue] = useState( () => new URLSearchParams(location.search).get("q") ?? "", ); const [expanded, setExpanded] = useState(!collapsible); const inputRef = useRef(null); const navigate = useNavigate(); useEffect(() => { if (collapsible && expanded) inputRef.current?.focus(); }, [expanded, collapsible]); function handleIconClick() { if (!collapsible) return; if (expanded) { setExpanded(false); setValue(""); } else { setExpanded(true); } } function handleSubmit(e: FormEvent) { e.preventDefault(); const q = value.trim(); if (!q) return; navigate(`/search?q=${encodeURIComponent(q)}&tab=dumps`); if (collapsible) { setExpanded(false); setValue(""); } } function handleKeyDown(e: React.KeyboardEvent) { if (e.key === "Escape" && collapsible) { setExpanded(false); setValue(""); } } return (
setValue(e.target.value)} onKeyDown={handleKeyDown} aria-label={t`Search`} tabIndex={expanded ? 0 : -1} />
); }