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.

Télécharger l'App Livreur v1.2 — Android APK
Android 8.0+ · driver_app_v1.2.apk · Version stable
22 avril 2026
3 apps modifiées
2 backends étendus
1 nouvelle table DB
12
Fichiers modifiés
4
Nouveaux fichiers
3
Nouveaux endpoints API
1
Nouvelle table MySQL
6
Bugs corrigés
🛵

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 ScaleTransition pulsant (×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
tip_request_view.dart TickerProviderStateMixin fcm_service.dart
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 »
tipdetailsview.dart driver_service.dart
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_points auto-créée au démarrage
tipdetailsview.dart driver_service.dart POST /driver/track-point
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.
AndroidManifest.xml maps_config.dart Maps SDK for Android Directions API
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-arrived
  • recordTrackPoint(orderId, lat, lng)POST /driver/track-point (fire-and-forget, timeout 5 s)
driver_service.dart
📱

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
fcm_service.dart main.dart firebase_messaging ^16.2 flutter_local_notifications ^21
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 Firebase
  • firebase_messaging ^16.2.0 — FCM tokens + handlers
  • flutter_local_notifications ^21.0.0 — affichage local
  • android/build.gradle → classpath com.google.gms:google-services:4.4.2
  • android/app/build.gradle → plugin com.google.gms.google-services
  • AndroidManifest.xml → permission POST_NOTIFICATIONS + meta-data canal FCM
pubspec.yaml AndroidManifest.xml build.gradle
Nouvel endpoint svRegisterFcmToken API
Constante d'endpoint ajoutée dans SVKey pour l'enregistrement du token FCM client auprès du backend user_node.
globs.dart POST /api/register_fcm_token
⚙️

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_token
2
Livreur arrive → tape « JE SUIS LÀ »
_notifyArrival()POST /order/driver-arrived sur driver_node
3
driver_node récupère user_id + push_token
SELECT order_detail.user_id → SELECT usere_detail.push_token
4
Push FCM envoyé au client via FCM v1 API
sendFCMtoClient() → canal driver_arrived, full-screen intent, LED teal
5
Notification persistante enregistrée en DB
INSERT notification_detail → visible dans l'onglet notifications du client
6
Mise à jour temps réel via Socket.IO
io.to('user_${userId}').emit('new_notification', {...}) — si l'app est ouverte
POST /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_id puis usere_detail → push_token
  • FCM via sendFCMtoClient() (non-urgent, canal driver_arrived)
  • INSERT notification_detail type 2
  • Emit new_notification socket sur room user_${userId}
driver_node/controllers/orders_controller.js
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
driver_node/controllers/orders_controller.js
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' }
user_node/controllers/notifications_controller.js
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_node/helpers/fcm_v1.js canal driver_arrived FCM v1 API
driver_track_points — Nouvelle table · Auto-créée au démarrage driver_node
Colonne Type Description
idINT AUTO_INCREMENT PKIdentifiant unique du point GPS
order_idINT (INDEX)Commande associée au trajet
driver_idINT (INDEX)Livreur effectuant la livraison
latDECIMAL(10,7)Latitude en degrés décimaux
lngDECIMAL(10,7)Longitude en degrés décimaux
app_tsBIGINTTimestamp Unix ms côté application
recorded_atDATETIME 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.
home_view.dart tip_request_view.dart
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').
home_view.dart
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.
home_view.dart _handleOrderCancelled _handleOrderAssignedToOther
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.
compte.dart DriverService.getBaseUrl()
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).
fcm_service.dart tip_request_view.dart OrderDeduplicator
WillPopScopePopScope (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.
tip_request_view.dart Flutter 3.22+
📁

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