driverList, {String source = "Unknown"})
```
1. نقل الحالة لـ `RideState.finished` وإيقاف وتصفير كافة عدادات ومؤقتات المراقبة.
2. تدمير وإغلاق سوكيت الرحلة النشط عبر `mapSocket.disposeRideSocket()`.
3. إيقاف وإغلاق خدمة الملاحة الحية على iOS والأنشطة الحية.
4. توجيه الراكب فوراً لصفحة التقييم والدفع المخصصة `RateDriverFromPassenger` وتمرير معرف السائق والرحلة والفاتورة.
---
## 2. بنية تحديث الويب سوكيت للمواقع (WebSocket Location Handler)
يتولى الكنترولر
[MapSocketController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_rider/lib/controller/home/map/map_socket_controller.dart)
استقبال تحديثات السائق لحظياً عبر الحدث
`driver_location_update`
وتمرير البيانات المعالجة لمحركات الحساب والتحكم كالتالي:
```dart
void handleDriverLocationUpdate(dynamic data)
```
الخطوات التي تنفذها الدالة:
1. استلام وتمرير إحداثيات السائق الحالية وسرعته واتجاهه.
2. إذا تم استلام أكثر من 3 تحديثات ناجحة ومتتالية وموثوقة عبر السوكيت، يقوم بإيقاف استعلامات الـ Polling الدورية (`stopDriverLocationPolling()`) لتوفير استهلاك البيانات والبطارية.
3. استدعاء فحص الانحراف والمطابقة الجغرافية عبر `checkAndRecalculateIfDeviated()`.
4. توجيه كاميرا خريطة الراكب لاتباع إحداثيات السائق مع تعديل نسبة التقريب (Zoom) ديناميكياً بناءً على سرعة السيارة (تقريب الكاميرا عند البطء وتوسيع الرؤية عند السرعة العالية).
5. قراءة الحسابات الجاهزة للوقت المتبقي والمسافة من السيرفر إن وجدت وتمريرها، وإلا يتم استدعاء محرك الحساب المحلي للراكب عبر `updateRemainingRoute()`.
6. تحديث موقع ماركر سيارة السائق على الخريطة بسلاسة وتمرير زاوية الدوران الصحيحة (`updateDriverMarker()`).
---
## 3. محرك الحساب المحلي وحماية الانحراف (Local Routing & Deviation Engine)
لتلافي المشاكل الجغرافية وعرض أرقام مضللة للراكب، تم بناء محركات ذكية ومحلية لمعالجة المواقع:
### 3.1 مطابقة المسار وإعادة الحساب (Deviation Guard)
```dart
Future checkAndRecalculateIfDeviated(LatLng driverPos, {double? heading, double? speed})
```
1. تقوم الدالة بمسح كافة نقاط المسار النشط ومقارنتها بموقع السائق الحالي لحساب أقرب نقطة جغرافية.
2. إذا تجاوزت المسافة الفاصلة بين السائق والمسار المخطط قيمة حد الانحراف (`_deviationThresholdMeters` - عادة 50 متر)، أو عند تطابق انحراف الاتجاه لمرتين متتاليتين، يتم إصدار أمر فوري بإعادة جلب ورسم المسار من إحداثيات السائق الحالية:
* إذا كانت الرحلة جارية نحو الوجهة: يتم رسم مسار جديد باتجاه وجهة الراكب النهائية.
* إذا كان السائق في طريقه للراكب: يتم رسم مسار جديد باتجاه موقع الراكب.
### 3.2 قص المسار واحتساب الـ ETA محلياً (Dynamic Route Trimming)
```dart
void updateRemainingRoute(LatLng driverPos, {bool updateEta = true})
```
1. عند تقدم السائق، تقوم الدالة بالبحث عن أقرب نقطة على خط المسار المتجه نحو الوجهة وقص (Trim) الأجزاء التي قطعتها السيارة بالفعل (`remainingPoints = route.sublist(closestIdx)`).
2. عند تفعيل `updateEta` (في حال عدم توفر معلومات مباشرة من السيرفر)، تقوم الدالة بحساب النسبة المئوية للمسافة المتبقية مقارنة بالمسافة الكلية الأصلية، وضربها في الزمن الكلي التقديري الأصلي لاستخراج قيمة زمن الوصول التقديري (ETA) المتبقي **محلياً وبشكل لحظي ودقيق جداً** دون الحاجة لإجراء اتصالات إضافية بالسيرفر.
3. تحديث خطوط الـ Polylines النشطة على الخريطة بالمسار المقصوص الجديد لضمان بقائه دقيقاً.