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.
209 lines
5.6 KiB
Markdown
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.
|