Search Rendering & Filters Overview
Ce document résume les fichiers concernés par le rendu SSR/CSR de la recherche et la gestion des filtres.
Fichiers côté serveur
-
apps/odalys-v4/lib/search/buildSearchRequest.ts- Parse
searchParams, reconstruit lesFacetLikeissus de l'URL et prépare la matrice de filtres attendue parFetchHitsEstablishments. - Retourne également les facettes (
searchRequest.facets) pour que l’UI puisse afficher les tags sélectionnés.
- Parse
-
apps/odalys-v4/lib/search/remapFacetLabels.ts- Construit un mapping
facetName:valueId → facetName:libelléà partir deholidayHits.filters. remapSearchFiltersMatrixconvertit la matrice envoyée au client ([["services.fr:77"], …]) en version déjà labelisée ([["services.fr:Wifi"], …]).remapFacetLikeArrayapplique le même mapping sur lesFacetLike(utilisé pour les tags/facettes côté UI).
- Construit un mapping
-
apps/odalys-v4/lib/search/searchFilters.tsbuildFiltersFromUrlconvertit les paramètres d’URL enFacetLike(promotion, services, range, etc.).buildFacetFiltersMatrixconvertit ces facettes en matrice de filtres Algolia ([["facet:value"], …]).syncFiltersToSearchParamsréécrit l’URL lors des interactions.
Fichiers côté client / hydratation
-
apps/odalys-v4/atoms/search/searchFiltersAtom.tsx- Stocke les filtres sélectionnés dans l’application (Jotai) et gère les redirections spécifiques (vacation types, promotions…).
HydrateSearchFiltersFromUrlAtomremappe les valeurs URL avec lesvalueIdsexistants pour éviter les divergences SSR/CSR.
-
apps/odalys-v4/components/Search/SearchFiltersInitialiser.tsx- Pré-charge l’atom Jotai avec les facettes remappées livrées par le SSR, puis indique que l’état est hydraté (
searchFiltersHydratedFromSSRAtom).
- Pré-charge l’atom Jotai avec les facettes remappées livrées par le SSR, puis indique que l’état est hydraté (
-
apps/odalys-v4/components/Search/SearchPlace.tsx- Vue client pour les pages lieu (région/pays/station). Réutilise
initialResultset ne relanceFetchHitsEstablishmentsque lorsque les filtres changent réellement.
- Vue client pour les pages lieu (région/pays/station). Réutilise
-
apps/odalys-v4/app/[locale]/search/SearchPageClient.tsx- Équivalent pour la page
/search: même logique client, sans filtres « fixes » supplémentaires.
- Équivalent pour la page
-
apps/odalys-v4/app/[locale]/thematicPage/[slug]/SearchThematicClient.tsx- Variante thématique. Ajoute systématiquement les filtres métier (
roomIds) aux facettes utilisateur avant de comparer/exécuter la requête Apollo.
- Variante thématique. Ajoute systématiquement les filtres métier (
-
apps/odalys-v4/components/SearchBar/SearchBar.tsx- Déclenche la recherche Algolia (auto-suggestions, dates). Sa logique est désormais neutre vis-à-vis du SSR grâce au remapping et aux garde-fous.
Workflow (exemple : /location-montagne/haute-savoie?search=Haute+Savoie&datedebut=2025-10-11&duree=7&nbpax=2&services=77,83&range=611)
-
SSR
buildSearchRequestparse l’URL et génère la matrice de filtres.FetchHitsEstablishmentsrécupère les hits, filtrés parfilterEstablishmentsWithStock.remapSearchFiltersMatrixremplace77,83,611par leurs libellés (Wifi, PMR, Prestige).- Le HTML initial contient déjà la liste et les tags sélectionnés.
-
Hydratation
SearchFiltersInitialiserinjecte ces facettes dans Jotai.HydrateSearchFiltersFromUrlAtomrecalcule l’état depuis l’URL, remappe les valeurs et constate qu’il n’y a rien de nouveau : aucun refetch.
-
Interactions
- Lorsqu’un filtre change (ex: bouton “Réinitialiser”), Jotai met à jour l’état.
- Les composants clients (lieu/général/thématique) comparent une clé normalisée et ne relancent Apollo que lorsqu’il y a une divergence effective.
Ainsi, à l’arrivée (avec ou sans filtres dans l’URL), il n’y a qu’une requête SSR. Les requêtes supplémentaires n’apparaissent qu’en réponse aux actions utilisateur (ajout/suppression de filtres, changement de dates, etc.).