# Étape 3 — Vue 1 : recherche par login > **Prérequis :** étape 2 OK — OAuth actif, token unique (`IntraAuthService`). ## Objectif sujet | Exigence | Cette étape | |----------|-------------| | Au moins 2 vues | **Vue 1** : recherche · **Vue 2** : profil (étape 4) | | Erreurs gérées | Login introuvable, réseau, non connecté | | Token unique | Réutiliser `IntraAuthService.instance` (ne pas refaire OAuth) | --- ## Parcours utilisateur (vue 1) 1. L’utilisateur est déjà connecté à l’API (étape 2) — ou bouton « Se connecter » si token absent. 2. **Champ texte** + bouton **Rechercher** (login 42, ex. `jdoe`). 3. Appel API avec `Authorization: Bearer `. 4. **Succès** → navigation vers **vue 2** (profil). 5. **Échec** → message clair, pas de crash. --- ## API 42 utile Doc : [api.intra.42.fr/apidoc](https://api.intra.42.fr/apidoc) | Action | Requête typique | |--------|-----------------| | Utilisateur par login | `GET /v2/users/{login}` ou `GET /v2/users?filter[login]=` | | Toi (déjà fait) | `GET /v2/me` | Vérifier dans l’apidoc la forme exacte supportée ; beaucoup de projets utilisent : ```http GET https://api.intra.42.fr/v2/users?filter[login]=jdoe Authorization: Bearer ``` Réponse : tableau JSON ; **vide** = login inconnu. --- ## Fichiers à ajouter (étape 3) ``` lib/ ├── services/ │ ├── intra_auth_service.dart # existant │ └── intra_user_service.dart # GET user(s) avec token ├── screens/ │ ├── search_screen.dart # VUE 1 │ └── profile_screen.dart # VUE 2 (squelette → étape 4) └── main.dart # home → SearchScreen si token OK ``` --- ## `IntraUserService` (idée) - Méthode `Future> fetchUserByLogin(String login)`. - Utilise `IntraAuthService.instance.authHeaders()`. - **404 / liste vide** → exception métier `UserNotFoundException`. - **Socket / timeout** → `NetworkException`. - **401** → token expiré → message « reconnecte-toi ». --- ## Gestion des erreurs (sujet) | Situation | Message utilisateur (exemple) | |-----------|-------------------------------| | Login inconnu | `Aucun utilisateur pour ce login` | | Pas de réseau | `Connexion impossible. Vérifie le réseau.` | | Non connecté OAuth | `Connecte-toi d’abord à l’API 42` | | Champ vide | `Saisis un login` | --- ## Navigation ```text SearchScreen --[login trouvé]--> ProfileScreen(login) ProfileScreen --[retour]--> SearchScreen ``` `Navigator.push` / `pop` ou `go_router` — rester simple (Navigator 1.0 suffit). --- ## Critères « étape 3 terminée » | # | Test | |---|------| | 1 | Login valide (ex. `fgras-ca`) → ouvre vue 2 | | 2 | Login `zzzzzzzz` → message erreur | | 3 | Mode avion → message réseau | | 4 | Retour depuis vue 2 → nouvelle recherche possible | | 5 | Un seul OAuth ; les recherches réutilisent le même token | --- ## Ensuite — étape 4 → [etape-04-vue-profil.md](etape-04-vue-profil.md) : photo, ≥ 4 champs, skills, projets (dont failed), layout adaptatif.