7.8 KiB
TODO — Parité visitapp-web vs mymuseum-visitapp
Suivi des features Flutter (
mymuseum-visitapp) à porter sur la version web (visitapp-web). Légende : ❌ Non implémenté · ⚠️ Partiel · ✅ Fait · 🚫 Hors scope web (natif uniquement)
Référence Flutter : c:\Users\ThomasFransolet\Documents\Documents\Perso\GITEA\mymuseum-visitapp\lib\
Sections
| Section | Flutter | Web | Statut |
|---|---|---|---|
| Article | Sections/Article/article_page.dart |
ArticleSection.tsx |
✅ |
| Agenda | Sections/Agenda/agenda_page.dart |
AgendaSection.tsx |
⚠️ Partiel — popup à enrichir |
| Menu | Sections/Menu/menu_page.dart |
MenuSection.tsx |
✅ |
| Slider | Sections/Slider/ |
SliderSection.tsx |
✅ |
| Video | Sections/Video/ |
VideoSection.tsx |
✅ |
| Map (+ parcours) | Sections/Map/ |
MapSection.tsx |
✅ |
Sections/PDF/ |
PdfSection.tsx |
✅ | |
| Weather | Sections/Weather/ |
WeatherSection.tsx |
✅ |
| Quiz | Sections/Quiz/ |
QuizSection.tsx |
✅ |
| Web | Sections/Web/ |
WebSection.tsx |
✅ |
| Game (Puzzle / Sliding / Escape) | Sections/Game/ |
GameSection.tsx + EscapeProgression.tsx |
✅ |
| GuidedPath (intégré Map / Game Escape) | Sections/GuidedPath/ |
MapSection.tsx + EscapeProgression.tsx |
✅ |
| Event | Sections/Event/event_page.dart, event_map_full_page.dart |
EventSection.tsx + event/EventMap.tsx |
✅ |
✅ Section Event — fait
Page dédiée pour les sections de type Event (EventSection.tsx + event/EventMap.tsx).
Implémenté :
- Layout vertical scrollable (pas de TabBar — aligné avec le Flutter)
- Hero : image + gradient + titre + badge dates
startDate…endDate+ back button - Section Programme : timeline verticale des
ProgrammeBlock(triés parstartTime), bloc actif (heure courante dansstartTime…endTime) mis en évidence (badge "EN COURS", bordure primaire, dot avec halo), tap → bottom sheet détail + liste des annotations spatiales du bloc - Section Carte : mini-carte Leaflet (220px) avec annotations globales en couleur primaire + annotations du bloc actif en orange superposées. Bouton "Plein écran" overlay
- Section Parcours : chips horizontaux (parcours guidés liés à l'event), tap → navigation vers la section Map associée (
baseSectionMapId) qui héberge la progression existante - Section À propos : description HTML
- Bottom sheet block detail : titre + horaire + description + liste annotations (badge orange + label)
- Pré-fetch server-side des
guidedPathsvia le même endpoint polymorphe/api/SectionMap/{eventId}/GuidedPath
Types ajoutés : EventDTO, ProgrammeBlock, MapAnnotationDTO dans types.ts
Reste à faire (nice-to-have) :
- Mise en avant home : si
applicationInstanceDTO.sectionEventId != null, afficher un bloc "à la une" en haut de la grille de configurations. Nécessite d'étendreApplicationInstanceDTO(champsectionEventDTO?) et de lui dédier un widget sur[slug]/page.tsx.
✅ Agenda — popup événement enrichi
Bug fix bonus : le type web EventAgendaDTO était désynchronisé du backend (title/startDate au lieu de label/dateFrom). Type aligné dans types.ts.
Implémenté dans AgendaSection.tsx + agenda/EventMiniMap.tsx :
- Mini-carte Leaflet centrée sur
address.geometry.coordinates - Vidéo embarquée : iframe YouTube (
idVideoYoutubeouvideoLinkYouTube), lecteur HTML5 natif (videoLinkdirect ouvideoResource.url) - Liens cliquables : email (
mailto:), téléphone (tel:), site web (target="_blank") - Adresse postale formatée → lien Google Maps
✅ Statistiques — tracking visiteur
Endpoint backend : POST /api/Stats/event (anonyme, accepte appType: "Web").
Implémenté :
- src/lib/stats.ts :
trackEvent()+ sessionId persistant (sessionStorage) - src/hooks/useSectionTracking.ts : hook auto qui émet
SectionViewau mount +SectionLeaveau unmount avec durée - src/components/TrackedSection.tsx : wrapper appliqué au dispatcher → toutes les sections trackées sans toucher leur code
instanceIdpropagé viaVisitorContext(depuis le layout[slug])- Events spécifiques branchés :
MapPoiTap,QuizComplete,GameComplete,AgendaEventTap,QrScan
Tous les events Flutter sont branchés : SectionView, SectionLeave, MapPoiTap, QuizComplete, GameComplete, AgendaEventTap, QrScan, ArticleRead (déclenché au scroll ≥80%), MenuItemTap.
✅ Event "à la une" sur la home
Implémenté :
ApplicationInstanceDTO.sectionEventDTOajouté aux types- src/components/FeaturedEvent.tsx : carte hero (220px) avec image, badge "À LA UNE", badge dates, titre HTML
- Branché dans src/app/[slug]/page.tsx : si
instance.sectionEventDTOest rempli côté backend, le bloc s'affiche au-dessus de la grille de configurations
✅ Scanner QR code
Implémenté :
- Lib :
qr-scanner(MIT, ~13kb gzip, cross-browser viagetUserMedia) - src/components/QRScannerButton.tsx :
- Bouton flottant en bas-droite sur la home
/[slug] - Modal fullscreen avec aperçu caméra + animation de scan
- Parser regex qui extrait un path
/{slug}/{configId}/sections/{sectionId}depuis le payload (URL absolue ou relative) - Sur match →
router.push()vers le path - Émet l'event
QrScan(avec payload + path parsé) - Gère les erreurs de permission caméra avec message visuel
- Bouton flottant en bas-droite sur la home
- Nécessite HTTPS en production (sauf localhost)
Le bouton scanner est exposé sur la home (/[slug]) et dans la page configuration (/[slug]/[configId]).
🚫 Hors scope (décision produit ou natif uniquement)
Ces features ne sont pas portées sur le web :
- Assistant IA / Chat — décision produit : feature premium réservée à l'app mobile native, pas portée côté web
- Mode offline / cache local — décision produit : pas dans le scope web pour le moment, l'app web suppose une connexion
- Push notifications Firebase FCM — réservées à l'app native (mobile installée)
- Beacons BLE — Web Bluetooth pas supporté sur iOS Safari, et l'usage réel suppose un device mobile dédié
- Lecteur audio avancé (just_audio Flutter) — l'audio HTML5 natif suffit, pas besoin d'aller plus loin
- Téléchargement caméra natif pour QR — remplaçable par
getUserMediasi on en a besoin (voir section QR ci-dessus)
Suivi
| Feature | Priorité | Statut |
|---|---|---|
| Event Section | Haute (gap fonctionnel) | ✅ Fait |
| Agenda popup enrichi | Moyenne | ✅ Fait |
| Stats tracking | Moyenne (besoin métier) | ✅ Fait (tous les events) |
| Event "à la une" sur la home | Basse (UX) | ✅ Fait |
| QR Scanner | Basse | ✅ Fait |
Référence — fichiers Flutter clés à consulter
- Home + scanner :
lib/Screens/Home/home.dart,lib/Components/ScannerDialog.dart - Event :
lib/Screens/Sections/Event/event_page.dart,event_map_full_page.dart - Agenda popup :
lib/Screens/Sections/Agenda/event_popup.dart - Services :
lib/Services/statisticsService.dart,assistantService.dart - Cache local :
lib/Helpers/DatabaseHelper.dart,lib/Services/downloadConfiguration.dart - Composants chat :
lib/Components/AssistantChatSheet.dart