spb/satelliteindex
Public
TypeScript 66.5%
Python 30.9%
JavaScript 1.4%
CSS 0.7%
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