Interface Utilisateur

Frontend

Dashboard React 19 temps reel pour BMW E90 325D. Visualisation telemetrique, agent IA Jarvis et controle fibre optique SUNKENET.

01 Stack Frontend

Technologies et librairies cibles.

TechnologieRoleJustification
React 19Framework SPAComposants reactifs, Suspense, ecouteurs temps reel
Vite 8Build toolHMR ultra-rapide, bundling optimise, configuration minimale
RechartsGraphiquesCourbes RPM, temperature, pression turbo, common rail — rendu SVG performant
Mercure (EventSource)Temps reelReception push SSE sans polling — economie de batterie
TailwindCSSDesign systemDark mode natif, responsive, rapidite de prototypage
React RouterNavigationSPA multi-vues (Dashboard, Trajets, Jarvis, Parametres)
AxiosHTTP ClientRequetes API REST vers Symfony 8

02 Pages du Dashboard

Vue d'ensemble des ecrans principaux.

Dashboard Principal

Jauges temps reel : RPM, vitesse, temperature liquide refroidissement, temperature huile (M57 UDS), pression turbo, tension batterie. Indicateur couleur fibre SUNKENET. Carte GPS du trajet en cours.

Temps reel

Historique Trajets

Liste des trajets enregistres avec trace GPS sur carte (PostGIS). Filtrage par date, duree, distance. Statistiques de conduite agregees.

PostGIS

Jarvis — Agent IA

Interface conversationnelle avec l'agent Claude. Jarvis connait l'etat du vehicule, vos emails, votre calendrier. Il peut agir : changer la fibre, trouver une station essence, envoyer un SMS.

Claude Agent

Parametres

Configuration des seuils d'alerte (RPM, temperatures, pression DPF), couleurs du kit fibre SUNKENET, gestion du token device, profil utilisateur.

Config

03 Integration Mercure (Temps Reel)

Le serveur pousse les donnees — le client ne poll jamais.

Principe : Symfony 8 publie sur un topic Mercure a chaque nouvelle telemetrie. React 19 souscrit via EventSource. La donnee arrive uniquement quand elle change — zero gaspillage de batterie cote client. Mercure est deploye sur AWS aux cotes de l'API.

Flux de donnees

1

Symfony recoit la telemetrie

L'API /api/telemetry persiste en PostgreSQL et publie sur le topic /telemetry/{device_id}. En phase scale, l'ingestion passe par une queue SQS avant persistance.

2

Mercure Hub distribue

Le hub Mercure envoie un evenement SSE a tous les clients abonnes au topic du device.

3

React met a jour le state

Le hook useTelemetry() parse le JSON et met a jour les jauges, graphiques Recharts et la carte GPS en temps reel.

04 Composants Cles

Architecture des composants React 19.

ComposantPropsDescription
<GaugeRPM />value, max, thresholdJauge circulaire animee, rouge au-dela du seuil (M57 : redline 5000 RPM)
<TelemetryChart />data[], dataKey, colorCourbe Recharts avec historique glissant (60s) — RPM, boost, temperatures
<LiveMap />coordinates[]Carte du trajet en cours (Leaflet ou Mapbox, donnees PostGIS)
<FiberPreview />color, modeApercu visuel de la couleur fibre optique SUNKENET actuelle
<JarvisChat />deviceIdInterface de chat avec l'agent IA Jarvis (Claude). Affiche les actions executees.
<BatteryIndicator />voltageIndicateur tension batterie avec seuils d'alerte (warning 12.2V, critique 11.8V)
<TurboGauge />pressure, maxJauge de pression turbo en temps reel (specifique M57)
<DPFStatus />sootLevel, regenActiveIndicateur etat filtre a particules et regeneration en cours

05 Design System

Dark mode obligatoire — lisibilite en conduite nocturne.

Palette de couleurs

Fond sombre (#0a0e17), accents bleu/cyan pour les donnees, rouge pour les alertes, vert pour les etats normaux. Contraste WCAG AA minimum. TailwindCSS dark mode natif.

Dark Mode

Typographie

Inter pour le texte, JetBrains Mono pour les valeurs numeriques et le code. Tailles responsives gerees par TailwindCSS.

Lisibilite

Responsive

Desktop (monitoring complet), tablette (dashboard principal), mobile (alertes et Jarvis). Breakpoints TailwindCSS a 768px et 1024px.

Multi-device

Storybook

Le catalogue de composants interactif est disponible via Storybook. Il permet de visualiser, tester et documenter chaque composant React de maniere isolee.

Acces : Storybook tourne sur http://localhost:6006. Lancer avec npm run storybook depuis le repertoire frontend/.

  • Composants documentes : Chaque composant a une story avec differentes variantes (etats normaux, warning, critique)
  • Props playground : Les knobs permettent de modifier les props en temps reel (valeur RPM, tension batterie, couleur fibre...)
  • Dark mode : Les stories sont configurees pour afficher le theme sombre par defaut
  • Addon a11y : Verification automatique de l'accessibilite de chaque composant

Architecture des Composants

Arborescence des composants React planifies et leurs responsabilites.

src/
├── components/
│   ├── gauges/
│   │   ├── GaugeRPM.tsx          # Jauge circulaire RPM (SVG anime)
│   │   ├── TurboGauge.tsx        # Jauge pression turbo M57
│   │   └── BatteryIndicator.tsx  # Indicateur tension batterie
│   ├── charts/
│   │   ├── TelemetryChart.tsx    # Courbe Recharts generique (temps reel)
│   │   └── TripChart.tsx         # Graphiques historique trajet
│   ├── maps/
│   │   └── LiveMap.tsx           # Carte Leaflet/Mapbox GPS temps reel
│   ├── fiber/
│   │   ├── FiberPreview.tsx      # Apercu couleur SUNKENET
│   │   └── FiberColorPicker.tsx  # Selecteur couleur pour fibre optique
│   ├── jarvis/
│   │   ├── JarvisChat.tsx        # Interface chat agent IA
│   │   ├── JarvisMessage.tsx     # Bulle message (user/assistant)
│   │   └── JarvisActionCard.tsx  # Carte action executee par Jarvis
│   ├── status/
│   │   ├── DPFStatus.tsx         # Indicateur DPF + regeneration
│   │   ├── ConnectionBadge.tsx   # Badge etat connexion 4G/BLE
│   │   └── EngineStatus.tsx      # Resume etat moteur M57
│   └── layout/
│       ├── Navbar.tsx            # Barre de navigation
│       ├── Sidebar.tsx           # Menu lateral
│       └── PageWrapper.tsx       # Layout commun avec padding
├── hooks/
│   ├── useTelemetry.ts           # Hook Mercure SSE — flux telemetrie
│   ├── useJarvis.ts              # Hook agent IA — envoi/reception messages
│   └── useDeviceStatus.ts       # Hook etat device (connecte, batterie, signal)
├── pages/
│   ├── DashboardPage.tsx         # Page principale — jauges + carte + charts
│   ├── TripsPage.tsx             # Historique des trajets
│   ├── JarvisPage.tsx            # Chat avec Jarvis
│   └── SettingsPage.tsx          # Parametres utilisateur et device
├── services/
│   ├── api.ts                    # Client Axios configure (baseURL, JWT)
│   └── mercure.ts                # Helper EventSource pour Mercure
└── App.tsx                       # React Router — routage principal

State Management

Architecture de gestion d'etat basee sur les hooks React natifs et Mercure SSE.

1

Mercure SSE → useTelemetry()

Le hook useTelemetry(deviceId) ouvre une connexion EventSource vers le Hub Mercure. A chaque evenement, le JSON est parse et stocke dans un useState local. Le hook retourne { latest, history, isConnected }.

2

Buffer circulaire (60s)

Les donnees de history sont maintenues dans un buffer circulaire de 60 secondes pour alimenter les graphiques Recharts sans consommer de memoire excessive.

3

Composants consommateurs

Chaque composant (GaugeRPM, TurboGauge, TelemetryChart...) recoit les valeurs en props depuis la page parente qui appelle le hook. Pas de state global — chaque page est autonome.

Pas de Redux/Zustand : La complexite du state est geree par des hooks custom. Le flux de donnees est unidirectionnel : Mercure → Hook → Page → Composants. Si la complexite augmente, migration vers Zustand prevue.

Strategie de Tests

Approche de testing avec Vitest pour les tests unitaires et composants.

TypeOutilCible
Unit testsVitestHooks custom (useTelemetry, useJarvis), fonctions utilitaires, parsing PID
Component testsVitest + Testing LibraryRendu des composants avec props mockees (jauges, charts, status)
Integration testsVitest + MSWFlux API (mock service worker) — login, telemetrie, commandes Jarvis
Visual regressionStorybook + ChromaticDetection de regressions visuelles sur les composants critiques

Priorite de couverture : En Phase 1 (MVP), focus sur les hooks custom et le parsing des donnees telemetriques. Les tests visuels Storybook/Chromatic seront ajoutes en Phase 2.

Commandes Dev

Commandes npm disponibles dans le repertoire frontend/.

CommandeDescription
npm run devDemarre le serveur de developpement Vite (HMR) sur localhost:5174
npm run buildBuild de production optimise (output dans dist/)
npm run previewPreview du build de production en local
npm run lintLint ESLint + Prettier sur tous les fichiers TypeScript/TSX
npm run testLance les tests Vitest en mode watch
npm run test:ciLance les tests Vitest une seule fois (CI/CD)
npm run storybookDemarre Storybook sur localhost:6006
npm run build-storybookBuild statique de Storybook pour deploiement