'use client' import { useDebounce } from '@thedaviddias/hooks/use-debounce' import { Search } from 'lucide-react' import { usePathname, useRouter, useSearchParams } from 'next/navigation' import { useCallback, useEffect, useState, useTransition } from 'react' /** * Search component for filtering and navigating members * @returns Member search component with filters */ export function MembersSearch() { const router = useRouter() const pathname = usePathname() const searchParams = useSearchParams() const [isPending, startTransition] = useTransition() const [searchQuery, setSearchQuery] = useState(searchParams.get('search') || '') // Debounce the search query const debouncedSearch = useDebounce(searchQuery, 300) // Update URL when debounced search changes useEffect(() => { const params = new URLSearchParams(searchParams) if (debouncedSearch) { params.set('search', debouncedSearch) } else { params.delete('search') } // Reset page when search changes params.delete('page') startTransition(() => { router.push(`${pathname}?${params.toString()}`) }) }, [debouncedSearch, pathname, router, searchParams]) const handleSearchChange = useCallback((value: string) => { setSearchQuery(value) }, []) const handleClearSearch = useCallback(() => { setSearchQuery('') }, []) return (
{/* Search Input */}
handleSearchChange(e.target.value)} className="h-10 w-full rounded-md border border-input bg-background px-10 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50" /> {searchQuery && ( )} {isPending && (
)}
) }