Tacos Locos Delivery · Journal des modifications
Changelog v1.3
Flux de livraison Uber-style, notifications d'arrivée en temps réel, suivi GPS des trajets livreurs et intégration FCM côté client.
App Livreur driver_app
Flutter — refonte du flux de commande et nouvelles fonctionnalités terrain
Flux d'offre style Uber — compte à rebours 30 secondes
Nouveau
Refonte complète de
TipRequestView. Quand une commande arrive, l'écran s'affiche en plein écran avec une alarme sonore, un anneau de progression qui rougit à ≤ 10 s, et deux boutons animés pour accepter ou refuser.
- Compteur 30 s animé avec
AnimationController— expiration automatique = refus silencieux - Anneau CircularProgressIndicator blanc → rouge quand ≤ 10 s restantes
- Bouton ACCEPTER vert avec
ScaleTransitionpulsant (×1.07) - Bouton REFUSER — ne cancel pas la commande, enregistre juste le refus chauffeur
- Back = refus via
PopScope / onPopInvokedWithResult - Alarme d'urgence démarre à l'ouverture, s'arrête sur accepter / refuser / timeout
- Header dégradé violet avec chips restaurant → client, gains + distance
Bouton « JE SUIS LÀ » — notification d'arrivée client
Nouveau
À l'étape livraison client, le livreur dispose d'un bouton teal pour notifier le client de son arrivée sans avoir à l'appeler. Une seule pression possible, le bouton devient grisé après envoi.
- Visible uniquement à l'étape client (pas au restaurant)
- Appelle
DriverService.notifyClientArrival(orderId)→POST /order/driver-arrived - État
_notifySent— désactivé après le premier envoi pour éviter les doublons - Feedback immédiat : snackbar vert « Client notifié de votre arrivée »
Enregistrement automatique du trajet GPS
Nouveau
Chaque déplacement ≥ 10 m enregistre un point GPS horodaté dans la base de données. Les itinéraires complets sont consultables côté admin pour audits et replay.
_recordPosition(loc)appelé à chaque_onDriverMoved- Appel fire-and-forget (timeout 5 s) — ne bloque jamais l'UI
- Données envoyées :
order_id,driver_id,lat,lng,timestamp(ms) - Stockage : nouvelle table MySQL
driver_track_pointsauto-créée au démarrage
Clé API Google Maps configurée
Config
La clé API est présente dans
AndroidManifest.xml (Maps SDK for Android) et dans MapsConfig.googleMapsApiKey (Directions API). La carte embarquée et le calcul d'itinéraires sont pleinement opérationnels.
DriverService — 2 nouvelles méthodes
Amélioration
Ajout de deux méthodes statiques à
DriverService pour couvrir les nouvelles fonctionnalités terrain.
notifyClientArrival(orderId)→POST /order/driver-arrivedrecordTrackPoint(orderId, lat, lng)→POST /driver/track-point(fire-and-forget, timeout 5 s)
App Client food_delivery
Flutter — intégration Firebase Cloud Messaging pour les notifications push
Intégration FCM — notifications push côté client
Nouveau
L'app client reçoit désormais des notifications push via Firebase Cloud Messaging. Au premier plan comme en arrière-plan, les notifications sont affichées via
flutter_local_notifications.
- Canal
driver_arrived— importance MAX, full-screen intent, LED teal - Canal
default— notifications générales haute priorité - Token FCM enregistré au démarrage et mis à jour automatiquement lors des refreshs Firebase
- Handler d'arrière-plan
@pragma('vm:entry-point')enregistré - Notification « 🛵 Votre livreur est arrivé ! » avec full-screen intent
Dépendances Firebase ajoutées
Config
Trois dépendances Firebase ajoutées dans
pubspec.yaml. Le plugin Gradle google-services est configuré aux deux niveaux Android. Le fichier google-services.json a été ajouté par le client.
firebase_core ^4.7.0— initialisation Firebasefirebase_messaging ^16.2.0— FCM tokens + handlersflutter_local_notifications ^21.0.0— affichage localandroid/build.gradle→ classpathcom.google.gms:google-services:4.4.2android/app/build.gradle→ plugincom.google.gms.google-servicesAndroidManifest.xml→ permissionPOST_NOTIFICATIONS+ meta-data canal FCM
Nouvel endpoint
svRegisterFcmToken
API
Constante d'endpoint ajoutée dans
SVKey pour l'enregistrement du token FCM client auprès du backend user_node.
Backend Node.js
driver_node (port 3004) · user_node (port 3001) — MySQL fooooood_delivery
Flux complet — notification « JE SUIS LÀ »
1
App client démarre → token FCM enregistré
FoodFCMService.init() → POST /api/register_fcm_token → UPDATE usere_detail.push_token2
Livreur arrive → tape « JE SUIS LÀ »
_notifyArrival() → POST /order/driver-arrived sur driver_node3
driver_node récupère user_id + push_token
SELECT
order_detail.user_id → SELECT usere_detail.push_token4
Push FCM envoyé au client via FCM v1 API
sendFCMtoClient() → canal driver_arrived, full-screen intent, LED teal5
Notification persistante enregistrée en DB
INSERT
notification_detail → visible dans l'onglet notifications du client6
Mise à jour temps réel via Socket.IO
io.to('user_${userId}').emit('new_notification', {...}) — si l'app est ouvertePOST /order/driver-arrived — driver_node
Nouveau endpoint
Notifie le client par FCM push + notification DB + socket en temps réel quand le livreur arrive à sa porte.
- Body :
{ order_id, driver_id } - Lookup
order_detail → user_idpuisusere_detail → push_token - FCM via
sendFCMtoClient()(non-urgent, canaldriver_arrived) - INSERT
notification_detailtype 2 - Emit
new_notificationsocket sur roomuser_${userId}
POST /driver/track-point — driver_node
Nouveau endpoint
Enregistre chaque point GPS du trajet livreur en base. La table
driver_track_points est créée automatiquement au démarrage du serveur si elle est absente.
- Body :
{ order_id, driver_id, lat, lng, timestamp } - INSERT dans
driver_track_points - Réponse rapide
{ success: true }— pas de logique bloquante
POST /api/register_fcm_token — user_node
Nouveau endpoint
Reçoit le token FCM de l'app client et met à jour
usere_detail.push_token. Appelé au démarrage de l'app et à chaque refresh de token Firebase.
- Body :
{ user_id, fcm_token, platform } - UPDATE
usere_detail SET push_token = ? - Réponse :
{ status: '1', message: 'token registered successfully' }
sendFCMtoClient() — helper FCM non-urgent
Nouveau
Nouvelle fonction dans
driver_node/helpers/fcm_v1.js dédiée aux notifications vers l'app client. Contrairement à sendFCMtoToken qui utilise les flags d'urgence (son alarme, canal orders_emergency), cette version est calme et utilise le canal driver_arrived.
driver_track_points
— Nouvelle table · Auto-créée au démarrage driver_node
| Colonne | Type | Description |
|---|---|---|
| id | INT AUTO_INCREMENT PK | Identifiant unique du point GPS |
| order_id | INT (INDEX) | Commande associée au trajet |
| driver_id | INT (INDEX) | Livreur effectuant la livraison |
| lat | DECIMAL(10,7) | Latitude en degrés décimaux |
| lng | DECIMAL(10,7) | Longitude en degrés décimaux |
| app_ts | BIGINT | Timestamp Unix ms côté application |
| recorded_at | DATETIME DEFAULT NOW() | Horodatage serveur d'insertion |
Corrections de bugs
driver_app — stabilité et fiabilité du flux de livraison
Dialogue → Route plein écran pour TipRequestView
Fix
Le
showDialog ne permettait pas de fermer TipRequestView programmatiquement (force_close, assignation à un autre livreur). Remplacé par Navigator.push(fullscreenDialog: true) avec maybePop.
Gestion force_close ignorée
Fix
Quand le socket recevait
force_close: true, le dialogue d'offre restait ouvert et l'alarme continuait. Corrigé : stopEmergencySound() + maybePop('force_closed').
popUntil cassait la navigation
Fix
popUntil comparait le nom de route 'TipRequestView' mais la route s'appelait 'TipRequestView_$orderId' — la comparaison était toujours fausse et vidait la pile entière. Remplacé par maybePop.
URL hardcodée dans CompteView
Fix
L'upload de photo de profil pointait vers
https://driver.tacos-locos-app.fr en dur. Remplacé par await DriverService.getBaseUrl() pour fonctionner en dev et en prod.
Doublons son d'alarme + vue TipRequestView
Fix
Le son démarrait à la fermeture au lieu de l'ouverture. La méthode privée
_stopEmergencySound était un doublon inutile. L'alarme était arrêtée par erreur lors du refus si la commande venait de Socket (déjà marquée via OrderDeduplicator).
WillPopScope → PopScope (API dépréciée)
Fix
Migration vers
PopScope avec onPopInvokedWithResult pour compatibilité Flutter 3.22+. L'ancienne API WillPopScope / onPopInvoked générait des warnings de dépréciation.
Récapitulatif des fichiers
Tous les fichiers créés ou modifiés dans cette version
MODdriver_app/lib/view/home/tip_request_view.dartRefonte complète Uber-style
MODdriver_app/lib/view/home/tipdetailsview.dartBouton JE SUIS LÀ + GPS recording
MODdriver_app/lib/view/home/home_view.dartCorrections force_close, popUntil, dialog→route
MODdriver_app/lib/view/home/compte.dartFix URL hardcodée
MODdriver_app/lib/services/driver_service.dart+ notifyClientArrival, recordTrackPoint
MODdriver_app/lib/services/fcm_service.dartFix startOfferAlert, stopEmergencySound, dead code
MODdriver_app/lib/common/maps_config.dartClé API Google Maps
MODdriver_app/android/app/src/main/AndroidManifest.xmlClé API Google Maps meta-data
MODfood_delivery/pubspec.yaml+ firebase_core, firebase_messaging, flutter_local_notifications
NEWfood_delivery/lib/common/fcm_service.dartFoodFCMService — init, register token, handler push
MODfood_delivery/lib/main.dart+ Firebase.initializeApp, FoodFCMService.init
MODfood_delivery/lib/common/globs.dart+ svRegisterFcmToken
MODfood_delivery/android/build.gradle+ classpath google-services
MODfood_delivery/android/app/build.gradle+ plugin google-services
MODfood_delivery/android/app/src/main/AndroidManifest.xml+ POST_NOTIFICATIONS + FCM channel meta-data
MODdriver_node/controllers/orders_controller.js+ POST /order/driver-arrived + POST /driver/track-point
MODdriver_node/helpers/fcm_v1.js+ sendFCMtoClient()
NEWuser_node/controllers/notifications_controller.jsPOST /api/register_fcm_token
NEWuser_node/public/changelog.htmlCette page