SPB Git forge
3commits 1branches 0releases
417.0 KBsize
maindefault branch
10 days agolast push
TypeScript 66.5% Python 30.9% JavaScript 1.4% CSS 0.7%
1.2 KB · 37 lines tsx
Raw Blame History
1'use client';2import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react';34interface SearchCtx {5  open: boolean;6  setOpen: (v: boolean) => void;7}8const Ctx = createContext<SearchCtx>({ open: false, setOpen: () => undefined });910export function SearchProvider({ children }: { children: ReactNode }) {11  const [open, setOpen] = useState(false);12  useEffect(() => {13    const onKey = (e: KeyboardEvent) => {14      if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {15        e.preventDefault();16        setOpen((v) => !v);17      }18      if (e.key === '/' && !['INPUT', 'TEXTAREA'].includes((e.target as HTMLElement)?.tagName ?? '')) {19        e.preventDefault();20        setOpen(true);21      }22    };23    window.addEventListener('keydown', onKey);24    return () => window.removeEventListener('keydown', onKey);25  }, []);26  const value = useMemo(() => ({ open, setOpen }), [open]);27  return <Ctx.Provider value={value}>{children}</Ctx.Provider>;28}2930export function useSearch(): SearchCtx {31  return useContext(Ctx);32}33export function useOpenSearch(): () => void {34  const { setOpen } = useContext(Ctx);35  return useCallback(() => setOpen(true), [setOpen]);36}37