Files
roadwave/docs/interfaces/mobile/navigation.md
jpgiannetti 5e5fcf4714 refactor(docs): réorganiser la documentation selon principes DDD
Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend.

**Structure cible:**
```
docs/domains/
├── README.md (Context Map)
├── _shared/ (Core Domain)
├── recommendation/ (Supporting Subdomain)
├── content/ (Supporting Subdomain)
├── moderation/ (Supporting Subdomain)
├── advertising/ (Generic Subdomain)
├── premium/ (Generic Subdomain)
└── monetization/ (Generic Subdomain)
```

**Changements effectués:**

Phase 1: Création de l'arborescence des 7 bounded contexts
Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/
Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/
Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/
Phase 5: Création des README.md pour chaque domaine
Phase 6: Déplacement des features Gherkin vers domains/*/features/
Phase 7: Création du Context Map (domains/README.md)
Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation
Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh)
Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/)

**Configuration des tests:**
- Makefile: godog run docs/domains/*/features/
- scripts/generate-bdd-docs.py: features_dir → docs/domains

**Avantages:**
 Cohésion forte: toute la doc d'un domaine au même endroit
 Couplage faible: domaines indépendants, dépendances explicites
 Navigabilité améliorée: README par domaine = entrée claire
 Alignement code/docs: miroir de backend/internal/
 Onboarding facilité: exploration domaine par domaine
 Tests BDD intégrés: features au plus près des règles métier

Voir docs/REFACTOR-DDD.md pour le plan complet.
2026-02-07 17:15:02 +01:00

209 lines
5.6 KiB
Markdown

# Navigation & Architecture Mobile
## Architecture de navigation
L'application mobile utilise une navigation par onglets (Bottom Navigation Bar) avec 4 sections principales.
```mermaid
graph TD
A[App Shell] --> B[🏠 Accueil]
A --> C[🗺️ Carte]
A --> D[🎵 Bibliothèque]
A --> E[👤 Profil]
B --> B1[Feed Recommandations]
B --> B2[Lecteur Audio]
C --> C1[Vue Carte]
C --> C2[Détail Point]
D --> D1[Mes Playlists]
D --> D2[Contenus Sauvegardés]
D --> D3[Historique]
E --> E1[Jauges Intérêt]
E --> E2[Paramètres]
E --> E3[Abonnements]
```
## Bottom Navigation Bar
### Onglet 1 : Accueil 🏠
Point d'entrée principal après le lancement de l'app.
**Fonctionnalités** :
- Feed de recommandations basé sur la géolocalisation + intérêts
- Rafraîchissement pull-to-refresh
- Lecture directe depuis le feed
**Navigation vers** :
- Détail d'un contenu (push)
- Lecteur plein écran (modal)
- Profil d'un créateur (push)
### Onglet 2 : Carte 🗺️
Exploration visuelle des contenus par géolocalisation.
**Fonctionnalités** :
- Carte interactive (MapLibre GL)
- Markers pour contenus à proximité
- Clusters pour zones denses
- Recherche par adresse
**Navigation vers** :
- Détail d'un point (bottom sheet)
- Lecteur audio (modal persistant)
### Onglet 3 : Bibliothèque 🎵
Accès aux contenus sauvegardés, historique, playlists.
**Fonctionnalités** :
- Playlists personnelles
- Contenus favoris
- Historique d'écoute
- Téléchargements offline
### Onglet 4 : Profil 👤
Gestion du compte, préférences, jauges d'intérêt.
**Fonctionnalités** :
- Visualisation/édition jauges d'intérêt
- Paramètres de l'app
- Gestion abonnement Premium
- Déconnexion
## Lecteur Audio (Modal persistant)
Le lecteur est un composant modal qui persiste lors de la navigation entre onglets.
```mermaid
stateDiagram-v2
[*] --> Collapsed: Lecture démarre
Collapsed --> Expanded: Tap sur mini-player
Expanded --> Collapsed: Swipe down
Collapsed --> [*]: Stop audio
Expanded --> Queue: Tap "À suivre"
Queue --> Expanded: Retour
```
=== "État Collapsed (Mini-player)"
- Hauteur : 60dp
- Position : Bottom (au-dessus de la Bottom Nav Bar)
- Affiche : Titre, artiste, play/pause, skip
- Interaction : Tap pour expand
=== "État Expanded (Lecteur plein écran)"
- Plein écran modal
- Cover art grande taille
- Contrôles avancés (repeat, shuffle, queue)
- Scrubber timeline
- Boutons : like, share, download, add to playlist
## Routing Flutter
### Configuration
Utilisation de **go_router** (voir [ADR-020](../../adr/020-librairies-flutter.md)).
```dart
// Exemple simplifié
GoRouter(
routes: [
ShellRoute(
builder: (context, state, child) => AppShell(child: child),
routes: [
GoRoute(path: '/home', builder: (context, state) => HomeScreen()),
GoRoute(path: '/map', builder: (context, state) => MapScreen()),
GoRoute(path: '/library', builder: (context, state) => LibraryScreen()),
GoRoute(path: '/profile', builder: (context, state) => ProfileScreen()),
],
),
GoRoute(
path: '/content/:id',
builder: (context, state) => ContentDetailScreen(
contentId: state.pathParameters['id']!,
),
),
],
);
```
### Deep Links
L'app supporte les deep links pour :
- `roadwave://content/{id}` : Ouvrir un contenu spécifique
- `roadwave://map?lat={lat}&lon={lon}` : Ouvrir la carte à une position
- `roadwave://profile` : Ouvrir le profil
## Gestion d'état
- **Provider** pour l'état global (user, player, location)
- **BLoC** pour les features complexes (recommendation, map)
- **Riverpod** pour l'injection de dépendances
Voir [ADR-020](../../adr/020-librairies-flutter.md) pour les détails.
## Permissions système
La navigation gère les demandes de permissions de manière contextuelle :
1. **Géolocalisation** : Demandée au premier lancement, avant d'afficher l'accueil
2. **Notifications** : Demandée après 3 sessions utilisateur (opt-in soft)
3. **Stockage** : Demandée lors du premier téléchargement offline
Voir [mobile/permissions-strategy.md](../../mobile/permissions-strategy.md) pour la stratégie complète.
## Transitions et animations
### Transitions entre onglets
- Aucune animation (changement instantané)
- Préservation du scroll state sur chaque onglet
### Navigation push/pop
- iOS : Slide transition (standard Cupertino)
- Android : Fade + Slide transition (Material Design)
### Mini-player expand/collapse
- Spring animation (bounce léger)
- Durée : 300ms
- Curve : `Curves.easeInOutCubic`
## Gestion du back button (Android)
```mermaid
graph TD
A[Back pressed] --> B{Lecteur expanded?}
B -->|Oui| C[Collapse lecteur]
B -->|Non| D{Sur onglet Accueil?}
D -->|Non| E[Retour à Accueil]
D -->|Oui| F{Audio en cours?}
F -->|Oui| G[Dialog: Quitter?]
F -->|Non| H[Quitter app]
G -->|Confirme| H
G -->|Annule| I[Rester]
```
## Accessibilité
- **Screen readers** : Labels sémantiques sur tous les boutons
- **Navigation clavier** : Support complet (pour tablettes avec clavier)
- **Contraste** : WCAG 2.1 AA minimum (4.5:1 pour texte)
- **Taille des touch targets** : 48dp minimum
## Mode sombre
Support obligatoire du mode sombre (conduite de nuit).
=== "Mode Clair"
- Fond : White / Light Gray (#F5F5F5)
- Texte : Dark Gray (#212121)
- Accent : Indigo (#3F51B5)
=== "Mode Sombre"
- Fond : Dark (#121212)
- Texte : White (#FFFFFF)
- Accent : Indigo clair (#7986CB)
Détection automatique via `MediaQuery.platformBrightness` ou choix manuel dans les paramètres.