diff --git a/src/app/(admin)/admin/customers/page.tsx b/src/app/(admin)/admin/customers/page.tsx index d570b25..e49650a 100644 --- a/src/app/(admin)/admin/customers/page.tsx +++ b/src/app/(admin)/admin/customers/page.tsx @@ -40,10 +40,13 @@ export default function AdminCustomers() { const [pageSize, setPageSize] = useState(initialPageSize); // Search filters state - const [nameFilter, setNameFilter] = useState(''); - const [emailFilter, setEmailFilter] = useState(''); - const [urlFilter, setUrlFilter] = useState(''); - const [hasEmailFilter, setHasEmailFilter] = useState(false); + const [filters, setFilters] = useState({ + name: '', + email: '', + url: '', + hasEmail: false + }); + const [debouncedFilters, setDebouncedFilters] = useState(filters); // State for data const [customers, setCustomers] = useState([]); @@ -68,10 +71,10 @@ export default function AdminCustomers() { params.append('page', initialPage.toString()); params.append('pageSize', initialPageSize.toString()); - if (nameFilter) params.append('name', nameFilter); - if (emailFilter) params.append('email', emailFilter); - if (urlFilter) params.append('url', urlFilter); - if (hasEmailFilter) params.append('hasEmail', 'true'); + if (debouncedFilters.name) params.append('name', debouncedFilters.name); + if (debouncedFilters.email) params.append('email', debouncedFilters.email); + if (debouncedFilters.url) params.append('url', debouncedFilters.url); + if (debouncedFilters.hasEmail) params.append('hasEmail', 'true'); const response = await fetch(`/api/customers?${params.toString()}`); @@ -91,7 +94,31 @@ export default function AdminCustomers() { }; fetchCustomers(); - }, [initialPage, initialPageSize, nameFilter, emailFilter, urlFilter, hasEmailFilter]); + }, [initialPage, initialPageSize, debouncedFilters]); + + // Debounce filter changes + useEffect(() => { + const timer = setTimeout(() => { + setDebouncedFilters(filters); + }, 300); + + return () => clearTimeout(timer); + }, [filters]); + + // Handle filter changes + const handleFilterChange = (key: keyof typeof filters, value: string | boolean) => { + setFilters(prev => ({ ...prev, [key]: value })); + }; + + // Clear all filters + const handleClearFilters = () => { + setFilters({ + name: '', + email: '', + url: '', + hasEmail: false + }); + }; // Handle page change const handlePageChange = (newPage: number) => { @@ -125,63 +152,120 @@ export default function AdminCustomers() { {/* Search Filters */} -
-
- - setNameFilter(e.target.value)} - className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 dark:bg-gray-700 dark:border-gray-600 dark:text-white sm:text-sm" - placeholder="Enter name..." - /> +
+
+

Filters

+
-
- - setEmailFilter(e.target.value)} - className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 dark:bg-gray-700 dark:border-gray-600 dark:text-white sm:text-sm" - placeholder="Enter email..." - /> -
-
- - setUrlFilter(e.target.value)} - className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 dark:bg-gray-700 dark:border-gray-600 dark:text-white sm:text-sm" - placeholder="Enter URL..." - /> -
-
- -
- setHasEmailFilter(e.target.checked)} - className="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500 dark:bg-gray-700 dark:border-gray-600" - /> -
{/* Error Message */}