diff --git a/src/pages/explore.tsx b/src/pages/explore.tsx index 484866e..f30c93c 100644 --- a/src/pages/explore.tsx +++ b/src/pages/explore.tsx @@ -22,7 +22,8 @@ export function Explore({ tab }: { tab: Tab }) { const { state } = useApp(); const navigate = useNavigate(); const [params, setParams] = useSearchParams(); - const [q, setQ] = useState(params.get('q') ?? ''); + const urlQuery = params.get('q') ?? ''; + const [q, setQ] = useState(urlQuery); const [level, setLevel] = useState('Any'); const [lang, setLang] = useState('Any'); const [sort, setSort] = useState<(typeof SORTS)[number]>('Newest'); @@ -38,6 +39,18 @@ export function Explore({ tab }: { tab: Tab }) { } }, [params, setParams]); + useEffect(() => { + setQ(urlQuery); + }, [urlQuery]); + + const updateQuery = (value: string) => { + setQ(value); + const next = new URLSearchParams(params); + if (value) next.set('q', value); + else next.delete('q'); + setParams(next, { replace: true }); + }; + const accepted = useMemo(() => state.repos.filter(r => r.status === 'Verified'), [state.repos]); const languages = useMemo( () => ['Any', ...new Set(accepted.flatMap(r => r.languages))], @@ -100,10 +113,10 @@ export function Explore({ tab }: { tab: Tab }) { aria-label="Search" placeholder={tab === 'orgs' ? 'Search organizations…' : tab === 'repos' ? 'Search repositories…' : 'Search issues…'} value={q} - onChange={e => setQ(e.target.value)} + onChange={e => updateQuery(e.target.value)} /> {q && ( - )}