Skip to content

Ajouter la recherche géographique avec proxy de géocodage (E-02) #30

Closed

Description

@IlanAMG

Contexte

Epic : #10
Prérequis : #125, thème NativeWind généré depuis tokens.json et composants de base
Maquette : E-02 et E-03 planches 1 et 2 · validées le 2026-09-23
Filtres-et-Recherche · Ecrans · API · E-02 · D-001

Comportement attendu

  • API : GET /v1/geocode?q= proxy Mapbox Geocoding (pays FR, langue fr), types limités aux zones et aux stations : quartier, arrondissement, ville, station (D-010). Ni adresse ni point d'intérêt : Widoo cherche des parcours dans une zone. Cache mémoire ou Postgres 24 h, limitation de débit 30/min par IP.
  • Chaque zone renvoyée porte son nombre de parcours (comptage sur l'enveloppe de la zone), affiché dans la suggestion.
  • Pilule de recherche de l'accueil (Ecrans › E-01) : point d'entrée vers cet écran. Texte visible « Qu'est-ce qu'on fait aujourd'hui ? », raccourci en « Qu'est-ce qu'on fait ? » à 150 % ; libellé VoiceOver « Rechercher une zone ou un parcours, champ de recherche ». Aucun autre ticket ne porte cette pilule.
  • Mobile : écran de recherche avec suggestions au fil de la saisie (debounce), section « Autour de moi », dix recherches récentes stockées sur le téléphone (MMKV), résultats de parcours par titre en second (/routes/search?q= à ajouter côté API avec ILIKE).
  • Sélection d'une zone : recentrage de la carte sur la zone (environ 3 km), recherche dans la zone, nom de la zone affiché dans la pilule de recherche, et entrée dans les recherches récentes.
  • Événement search_text.
  • Mouvement (D-030, Direction-Artistique › Mouvement, mappings.motion) : M-04, la sheet de recherche passe au cran plein avec le clavier.

Critères d'acceptation

  • « Montmartre », « 75011 » et « République » donnent des zones pertinentes, avec leur nombre de parcours, et recentrent la carte
  • Une adresse ou un point d'intérêt ne remonte aucune suggestion de zone
  • Le jeton Mapbox utilisé pour le géocodage n'est jamais dans l'app
  • Tests API sur le proxy (cache, limite)
  • États conformes à Ecrans › E-02 : hors connexion, chargement, erreur partielle et erreur totale
  • Erreur partielle : l'échec d'un groupe (zones ou parcours) laisse l'autre affiché, et Réessayer ne relance que le groupe en échec
  • Zones (/geocode) et parcours sont demandés en deux requêtes parallèles, chacune avec un délai de 5 s avant erreur
  • L'historique local retient dix zones, et seulement des zones
  • Libellé du champ « Rechercher une zone ou un parcours », texte indicatif court « Zone ou parcours », lisible sans troncature à 150 %
  • Chargements annoncés à VoiceOver (accessibilityLiveRegion sur Android, announceForAccessibility sur iOS)
  • Icônes d'interface lues par leur nom dans mappings.uiIcons de tokens.json, aucune icône choisie en dur (D-025)
  • Durées, courbes et vibrations lues dans mappings.motion de tokens.json, aucune valeur en dur ; « Réduire les animations » respecté (D-030)

Activity

  1. added this to the v0.2 milestone on Sep 21, 2026
  2. added
    type:featureNouvelle fonctionnalité
    status:readySpec complète, prêt à coder
    needs-designQuestion ou maquette à produire en mode DESIGN
    and removed
    status:readySpec complète, prêt à coder
    on Sep 21, 2026
  3. added
    status:readySpec complète, prêt à coder
    and removed
    needs-designQuestion ou maquette à produire en mode DESIGN
    on Sep 23, 2026
  4. PaulThiberville commented on Oct 6, 2026

    @PaulThiberville
    Collaborator

    🔨 Démarrage — plan :

    Branche issue/30-geographic-search, une seule PR Fixes #30, en plusieurs commits autonomes.

    1. shared : schémas GeocodeQuery / GeocodeZone / GeocodeResult, règle de la zone cherchée (enveloppe de la zone, jamais moins de 3 km), q facultatif de la recherche de parcours.
    2. API : GET /v1/geocode?q= : proxy Mapbox côté serveur (Geocoding v6 pour quartiers, arrondissements, villes et codes postaux ; Search Box filtrée sur les stations), pays FR, langue fr, biais sur Paris, sans adresse ni point d'intérêt. Nombre de parcours de chaque zone par la logique de /routes/search/count. Limite 30/min par IP, cache mémoire 24 h, clé lue dans la config de l'API (jamais renvoyée ni journalisée). Tests avec un faux client Mapbox.
    3. API : q sur /routes/search et /count (ILIKE sur le titre, échappé, sans clusters).
    4. api-client : geocode(), délai par requête (5 s).
    5. mobile : pilule de l'accueil cliquable (libellés de E-01), recherche dans la sheet au cran plein (M-04), saisie avec debounce 300 ms, deux requêtes parallèles indépendantes avec Réessayer par groupe, « Autour de moi », dix zones récentes en MMKV, états hors connexion, chargement, erreur partielle et totale, zone choisie (recadrage, recherche geocode, nom dans la pilule avec croix), search_text.

    Niveau de risque attendu : 2 (nouvel endpoint, appel sortant, quota).

  5. PaulThiberville commented on Oct 8, 2026

    @PaulThiberville
    Collaborator

    📋 MANAGER (2026-10-08) : vérifié sur appareil réel (Redmi Note 9, build preview cc1d6f4f, commit 2c59f22) : Montmartre, 75011, République (station en tête), adresse sans zone, recadrage au choix d'une zone, zones récentes, hors connexion. Attestation de Paul sur #303. « Autour de moi » et retour du réseau : reportés à #319.

  6. PaulThiberville commented on Oct 8, 2026

    @PaulThiberville
    Collaborator

    📋 MANAGER (2026-10-08) : le « Cache mémoire ou Postgres 24 h » du comportement attendu (et le test « cache » des critères) est obsolète. Décision D-081 (#306) : géocodage sans cache serveur au MVP, les résultats temporaires de Mapbox ne se conservent pas ; /geocode répond no-store. Le cache de 24 h reste derrière MAPBOX_GEOCODING_PERMANENT=true, désactivé, question rouverte plus tard avec le budget.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions