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.
5.6 KiB
Navigation & Architecture Mobile
Architecture de navigation
L'application mobile utilise une navigation par onglets (Bottom Navigation Bar) avec 4 sections principales.
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.
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).
// 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écifiqueroadwave://map?lat={lat}&lon={lon}: Ouvrir la carte à une positionroadwave://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 pour les détails.
Permissions système
La navigation gère les demandes de permissions de manière contextuelle :
- Géolocalisation : Demandée au premier lancement, avant d'afficher l'accueil
- Notifications : Demandée après 3 sessions utilisateur (opt-in soft)
- Stockage : Demandée lors du premier téléchargement offline
Voir 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)
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.