Skip to content

Commit fcb3897

Browse files
Add search functionality to UI component
1 parent d6dee47 commit fcb3897

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

app/ui/search.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
11
'use client';
22

33
import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
4+
import { useSearchParams, usePathname, useRouter } from 'next/navigation';
5+
import { useDebouncedCallback } from 'use-debounce';
46

57
export default function Search({ placeholder }: { placeholder: string }) {
8+
const searchParams = useSearchParams();
9+
const pathname = usePathname();
10+
const { replace } = useRouter();
11+
12+
const handleSearch = useDebouncedCallback((term: string) => {
13+
const params = new URLSearchParams(searchParams);
14+
params.set('page', '1');
15+
16+
if (term) {
17+
params.set('query', term);
18+
} else {
19+
params.delete('query');
20+
}
21+
replace(`${pathname}?${params.toString()}`)
22+
}, 300);
23+
624
return (
725
<div className="relative flex flex-1 flex-shrink-0">
826
<label htmlFor="search" className="sr-only">
@@ -11,6 +29,10 @@ export default function Search({ placeholder }: { placeholder: string }) {
1129
<input
1230
className="peer block w-full rounded-md border border-gray-200 py-[9px] pl-10 text-sm outline-2 placeholder:text-gray-500"
1331
placeholder={placeholder}
32+
onChange={(e) => {
33+
handleSearch(e.target.value)
34+
}}
35+
defaultValue={searchParams.get('query')?.toString()}
1436
/>
1537
<MagnifyingGlassIcon className="absolute left-3 top-1/2 h-[18px] w-[18px] -translate-y-1/2 text-gray-500 peer-focus:text-gray-900" />
1638
</div>

0 commit comments

Comments
 (0)