amélioration recherche utilisateurs avec bouton de validation

- Ajout d'un système de recherche avec bouton "Rechercher"
- Support de la validation par touche Entrée
- Recherche côté serveur avec filtres MongoDB sur nom et email
- Réinitialisation automatique de la page lors d'une nouvelle recherche
- Suppression du debounce automatique pour un contrôle utilisateur total

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Biqoz
2025-11-05 15:20:19 +01:00
parent 1c7bca8e35
commit dde1c8ba93
3 changed files with 99 additions and 76 deletions

View File

@@ -1,11 +1,12 @@
"use client";
import { useState, useEffect, useCallback, useMemo } from 'react';
import { useState, useEffect, useCallback, useMemo } from "react";
interface UseCollectionOptions {
page?: number;
limit?: number;
filter?: Record<string, unknown>;
search?: string;
}
interface CollectionResponse<T> {
@@ -17,7 +18,7 @@ interface CollectionResponse<T> {
}
export function useCollection<T = Record<string, unknown>>(
collectionName: string,
collectionName: string,
options: UseCollectionOptions = {}
) {
const [data, setData] = useState<T[]>([]);
@@ -26,7 +27,7 @@ export function useCollection<T = Record<string, unknown>>(
const [total, setTotal] = useState(0);
const [totalPages, setTotalPages] = useState(0);
const { page = 1, limit = 20, filter = {} } = options;
const { page = 1, limit = 20, filter = {}, search } = options;
// Mémoriser la chaîne JSON du filtre pour éviter les re-renders inutiles
const filterString = useMemo(() => JSON.stringify(filter), [filter]);
@@ -37,22 +38,28 @@ export function useCollection<T = Record<string, unknown>>(
const params = new URLSearchParams({
page: page.toString(),
limit: limit.toString(),
filter: filterString
filter: filterString,
});
const response = await fetch(`/api/collections/${collectionName}?${params}`);
if (!response.ok) throw new Error(`Erreur lors du chargement de ${collectionName}`);
if (search) {
params.append("search", search);
}
const response = await fetch(
`/api/collections/${collectionName}?${params}`
);
if (!response.ok)
throw new Error(`Erreur lors du chargement de ${collectionName}`);
const result: CollectionResponse<T> = await response.json();
setData(result.data);
setTotal(result.total);
setTotalPages(result.totalPages);
} catch (err) {
setError(err instanceof Error ? err.message : 'Erreur inconnue');
setError(err instanceof Error ? err.message : "Erreur inconnue");
} finally {
setLoading(false);
}
}, [collectionName, page, limit, filterString]);
}, [collectionName, page, limit, filterString, search]);
useEffect(() => {
fetchData();