Get Junie to propogate the search query to the URL, so we can deeplink searches
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
||||||
import { Register, RegisterAccess, Note } from '@/utils/register_parser';
|
import { Register, RegisterAccess, Note } from '@/utils/register_parser';
|
||||||
import { Form, Container, Row, Table, OverlayTrigger, Tooltip } from 'react-bootstrap';
|
import { Form, Container, Row, Table, OverlayTrigger, Tooltip } from 'react-bootstrap';
|
||||||
import RegisterDetail from "@/app/registers/RegisterDetail";
|
import RegisterDetail from "@/app/registers/RegisterDetail";
|
||||||
@@ -73,6 +74,33 @@ export function renderAccess(access: RegisterAccess, extraNotes: Note[] = []) {
|
|||||||
*/
|
*/
|
||||||
export default function RegisterBrowser({ registers }: RegisterBrowserProps) {
|
export default function RegisterBrowser({ registers }: RegisterBrowserProps) {
|
||||||
const [searchTerm, setSearchTerm] = useState('');
|
const [searchTerm, setSearchTerm] = useState('');
|
||||||
|
const searchParams = useSearchParams();
|
||||||
|
const router = useRouter();
|
||||||
|
const pathname = usePathname();
|
||||||
|
|
||||||
|
// Initialize from query string and keep in sync when the URL changes
|
||||||
|
useEffect(() => {
|
||||||
|
const qp = (searchParams?.get('q') || '').trim();
|
||||||
|
// Only update state if different to avoid loops
|
||||||
|
if (qp !== searchTerm) {
|
||||||
|
setSearchTerm(qp);
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [searchParams]);
|
||||||
|
|
||||||
|
// Update the URL query string whenever the user types
|
||||||
|
const updateQueryString = (value: string) => {
|
||||||
|
const params = new URLSearchParams(searchParams?.toString());
|
||||||
|
const v = value.trim();
|
||||||
|
if (v) {
|
||||||
|
params.set('q', v);
|
||||||
|
} else {
|
||||||
|
params.delete('q');
|
||||||
|
}
|
||||||
|
const query = params.toString();
|
||||||
|
const url = query ? `${pathname}?${query}` : pathname;
|
||||||
|
router.replace(url, { scroll: false });
|
||||||
|
};
|
||||||
|
|
||||||
const filteredRegisters = registers.filter(register =>
|
const filteredRegisters = registers.filter(register =>
|
||||||
register.search.includes(searchTerm.toLowerCase())
|
register.search.includes(searchTerm.toLowerCase())
|
||||||
@@ -86,7 +114,11 @@ export default function RegisterBrowser({ registers }: RegisterBrowserProps) {
|
|||||||
type="text"
|
type="text"
|
||||||
placeholder="Search registers..."
|
placeholder="Search registers..."
|
||||||
value={searchTerm}
|
value={searchTerm}
|
||||||
onChange={e => setSearchTerm(e.target.value)}
|
onChange={e => {
|
||||||
|
const v = e.target.value;
|
||||||
|
setSearchTerm(v);
|
||||||
|
updateQueryString(v);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Row>
|
<Row>
|
||||||
|
|||||||
Reference in New Issue
Block a user