import LatestFromFollowsSection from '@/components/LatestFromFollowsSection' import { RefreshButton } from '@/components/RefreshButton' import SearchBar, { TSearchBarRef } from '@/components/SearchBar' import SearchResult from '@/components/SearchResult' import PrimaryPageLayout, { TPrimaryPageLayoutRef } from '@/layouts/PrimaryPageLayout' import { syncUserDeletionTombstones } from '@/lib/sync-user-deletions' import { usePrimaryPage } from '@/PageManager' import { useNostr } from '@/providers/NostrProvider' import { TPageRef, TSearchParams } from '@/types' import { BookOpen } from 'lucide-react' import { Button } from '@/components/ui/button' import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react' const SearchPage = forwardRef((_, ref) => { const { current, display } = usePrimaryPage() const { pubkey, relayList } = useNostr() const [input, setInput] = useState('') const [searchParams, setSearchParams] = useState(null) const [resultRefreshKey, setResultRefreshKey] = useState(0) const isActive = useMemo(() => current === 'search' && display, [current, display]) const searchBarRef = useRef(null) const layoutRef = useRef(null) const bumpResults = useCallback(() => { void (async () => { await syncUserDeletionTombstones(pubkey, relayList) setResultRefreshKey((k) => k + 1) })() }, [pubkey, relayList]) useImperativeHandle( ref, () => ({ scrollToTop: (behavior: ScrollBehavior = 'smooth') => layoutRef.current?.scrollToTop(behavior), refresh: bumpResults }), [bumpResults] ) useEffect(() => { if (isActive && !searchParams) { searchBarRef.current?.focus() } }, [isActive, searchParams]) const onSearch = (params: TSearchParams | null) => { setSearchParams(params) if (params?.input) { setInput(params.input) } layoutRef.current?.scrollToTop('instant') } return (
Search Nostr
{searchParams ? ( ) : (
)}
) }) SearchPage.displayName = 'SearchPage' export default SearchPage