import { FocusContext, useFocusable } from "@noriginmedia/norigin-spatial-navigation"; import { useEffect, useRef, useState } from "react"; import { GamePadButtonCode, useShortcuts } from "../scripts/shortcuts"; import { oneShot } from "../scripts/audio/audio"; import { Search } from "lucide-react"; import { RoundButton } from "./RoundButton"; import { useEventListener } from "usehooks-ts"; import { twMerge } from "tailwind-merge"; function SearchInput (data: { id: string; autoSearch?: boolean; search: string | undefined; compact: boolean | undefined; onInputFocus: () => void; setShowInput: (show: boolean) => void; className?: string; onSubmit: (search: string | undefined) => void; } & FocusParams) { const { ref, focusKey } = useFocusable({ onBlur: () => inputRef.current?.blur(), onFocus: (l, p, d) => { data.onFocus?.(focusKey, ref.current, { ...d, inputRef }); if (data.autoSearch) inputRef.current?.focus(); }, focusKey: data.id, onEnterPress: () => { if (document.activeElement === inputRef.current) { if (inputRef.current) data.onSubmit?.(inputRef.current.value); } else { inputRef.current?.focus(); } } }); const inputRef = useRef(null); const [localSearch, setLocalSearch] = useState(data.search); useEffect(() => { setLocalSearch(data.search ?? ""); }, [data.search]); useShortcuts(focusKey, () => document.activeElement === inputRef.current ? [{ label: "Cancel", button: GamePadButtonCode.B, action (e) { inputRef.current?.blur(); oneShot('returnGeneric'); }, }] : [], [inputRef.current, document.activeElement]); useEventListener('search' as any, e => { data.onSubmit?.(undefined); }, inputRef as any); return ; } export default function HeaderSearchField (data: { id: string; autoSearch?: boolean; search: string | undefined, onSubmit: (search: string | undefined) => void; className?: string; compact?: boolean; } & FocusParams) { const [showInput, setShowInput] = useState(false); const { ref, focusKey, focusSelf } = useFocusable({ focusKey: data.id, focusBoundaryDirections: ['left', "right"], isFocusBoundary: data.compact && showInput }); return
{(!data.compact || showInput) && } {data.compact && !showInput && setShowInput(true)} className="header-icon sm:size-10 md:size-14" id={`${data.id}-field`} >}
; }