'use client'; import { useEffect, useMemo } from 'react'; import { type Post } from 'contentlayer/generated'; import { ChevronUp } from 'lucide-react'; import { shallow } from 'zustand/shallow'; import { useSearchStore } from '@/stores/search-store'; import { SearchInput } from '@/components/search-input'; import { SearchResults } from '@/components/search-results'; import { SearchTags } from '@/components/search-tags'; import { searchPosts } from '@/lib/search'; import { cn } from '@/lib/utils'; type SearchProps = { posts: Post[]; }; export function Search({ posts }: SearchProps) { const { query, isSearching, toggleSearch } = useSearchStore( (state) => ({ query: state.query, isSearching: state.isSearching, toggleSearch: state.toggleSearch, }), shallow, ); const results = useMemo(() => searchPosts(query, posts), [query, posts]); useEffect(() => { // toggle search on cmd+k or ctrl+k const handleKeyDown = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key === 'k') { e.preventDefault(); toggleSearch(); } }; document.addEventListener('keydown', handleKeyDown); return () => document.removeEventListener('keydown', handleKeyDown); }, [toggleSearch]); if (!isSearching) return null; return (
0} />
{results.length > 0 && (
)} 0 ? 'max-xs:hidden sm:text-base' : 'sm:text-lg', )} />
Toggle with ⌘+K or Ctrl+K
); }