'use client'; import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react'; interface SearchCtx { open: boolean; setOpen: (v: boolean) => void; } const Ctx = createContext({ open: false, setOpen: () => undefined }); export function SearchProvider({ children }: { children: ReactNode }) { const [open, setOpen] = useState(false); useEffect(() => { const onKey = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') { e.preventDefault(); setOpen((v) => !v); } if (e.key === '/' && !['INPUT', 'TEXTAREA'].includes((e.target as HTMLElement)?.tagName ?? '')) { e.preventDefault(); setOpen(true); } }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, []); const value = useMemo(() => ({ open, setOpen }), [open]); return {children}; } export function useSearch(): SearchCtx { return useContext(Ctx); } export function useOpenSearch(): () => void { const { setOpen } = useContext(Ctx); return useCallback(() => setOpen(true), [setOpen]); }