/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { createContext, useContext, useEffect, useState } from 'react' import { CommandMenu } from '@/components/command-menu' type SearchContextType = { open: boolean setOpen: React.Dispatch> } const SearchContext = createContext(null) type SearchProviderProps = { children: React.ReactNode } export function SearchProvider({ children }: SearchProviderProps) { const [open, setOpen] = useState(false) useEffect(() => { const down = (e: KeyboardEvent) => { if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { e.preventDefault() setOpen((open) => !open) } } document.addEventListener('keydown', down) return () => document.removeEventListener('keydown', down) }, []) return ( {children} ) } // eslint-disable-next-line react-refresh/only-export-components export const useSearch = () => { const searchContext = useContext(SearchContext) if (!searchContext) { throw new Error('useSearch has to be used within SearchProvider') } return searchContext }