You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.0 KiB
67 lines
2.0 KiB
import SearchBar, { TSearchBarRef } from '@/components/SearchBar' |
|
import SearchResult from '@/components/SearchResult' |
|
import { Button } from '@/components/ui/button' |
|
import SecondaryPageLayout from '@/layouts/SecondaryPageLayout' |
|
import { toSearch } from '@/lib/link' |
|
import { useSecondaryPage } from '@/PageManager' |
|
import { TSearchParams } from '@/types' |
|
import { ChevronLeft } from 'lucide-react' |
|
import { forwardRef, useEffect, useMemo, useRef, useState } from 'react' |
|
|
|
const SearchPage = forwardRef(({ index }: { index?: number }, ref) => { |
|
const { push, pop } = useSecondaryPage() |
|
const [input, setInput] = useState('') |
|
const searchBarRef = useRef<TSearchBarRef>(null) |
|
const searchParams = useMemo(() => { |
|
const params = new URLSearchParams(window.location.search) |
|
const type = params.get('t') |
|
if ( |
|
type !== 'profile' && |
|
type !== 'profiles' && |
|
type !== 'notes' && |
|
type !== 'hashtag' && |
|
type !== 'relay' |
|
) { |
|
return null |
|
} |
|
const search = params.get('q') |
|
if (!search) { |
|
return null |
|
} |
|
const input = params.get('i') ?? '' |
|
setInput(input || search) |
|
return { type, search, input } as TSearchParams |
|
}, []) |
|
|
|
useEffect(() => { |
|
if (!window.location.search) { |
|
searchBarRef.current?.focus() |
|
} |
|
}, []) |
|
|
|
const onSearch = (params: TSearchParams | null) => { |
|
if (params) { |
|
push(toSearch(params)) |
|
} |
|
} |
|
|
|
return ( |
|
<SecondaryPageLayout |
|
ref={ref} |
|
index={index} |
|
titlebar={ |
|
<div className="flex items-center gap-1 h-full"> |
|
<Button variant="ghost" size="titlebar-icon" onClick={() => pop()}> |
|
<ChevronLeft /> |
|
</Button> |
|
<SearchBar ref={searchBarRef} input={input} setInput={setInput} onSearch={onSearch} /> |
|
</div> |
|
} |
|
displayScrollToTopButton |
|
> |
|
<SearchResult searchParams={searchParams} /> |
|
</SecondaryPageLayout> |
|
) |
|
}) |
|
SearchPage.displayName = 'SearchPage' |
|
export default SearchPage
|
|
|