feat: implement core architecture, design system, localization, and trip features for both driver and rider apps.
This commit is contained in:
@@ -210,3 +210,15 @@ if (Features.chat) routes.add(GoRoute(path: '/chat', builder: ...));
|
||||
## 14. مؤجَّل بقرار المالك (2026-07-18)
|
||||
|
||||
- **Android Auto** (موجود في سيرو: `MyCarSession` · `MyCarScreen` · `MyCarAppService`) و**CarPlay** — عليهما مشاكل ولا أولوية لهما الآن. يُنظر فيهما لاحقاً.
|
||||
|
||||
---
|
||||
|
||||
## 15. القناة المزدوجة للزمن الحقيقي — قرار المالك 2026-07-19 🔒
|
||||
|
||||
> السيرفر يرسل كل انتقال حالة **مرتين أصلاً**: WebSocket (`trip:update`) + FCM data-message (A1/A7). التطبيق يستثمر الاثنتين معاً — لا يختار واحدة.
|
||||
|
||||
1. **من يسبق يفوز.** مدخل موحّد واحد (`TripEventMerger` داخل `TripBloc`/`OffersBloc`) يستقبل من القناتين ويطبّق الحدث الأسبق وصولاً. عرض الرحلة للسائق كذلك: `trip:offer` عبر السوكت + FCM dataOnly بالحمولة الكاملة → أيّهما وصل أولاً يعرض الـoverlay.
|
||||
2. **إزالة الازدواج بآلة حالة رتيبة، لا بمعرّفات.** ترتيب الحالات معروف ثابت (`searching < assigned < driver_arriving < driver_arrived < in_progress < completed < paid`). الحدث الذي يحمل حالة ≤ الحالة المعروضة **يُهمل بصمت**. هذا يحلّ الازدواج والوصول المعكوس معاً بلا تتبّع معرّفات رسائل.
|
||||
3. **صمام الأمان الثالث: المصالحة (reconciliation).** `GET /trips/:id` تُنادى عند: (أ) عودة التطبيق من الخلفية، (ب) إعادة اتصال السوكت بعد انقطاع، (ج) مؤقّت خفيف **أثناء رحلة نشطة فقط** (افتراضي كل 25 ثانية، قابل للضبط، يتوقف كلياً خارج الرحلة). سؤال المالك «هل يلزم كل فترة؟» — الجواب نعم لكن بهذا الشرط الضيّق: FCM قد يتأخر دقائق في Doze والسوكت قد يموت صامتاً؛ المؤقّت يغطي نافذة فشل القناتين معاً، وكلفته استعلام Redis واحد (A3).
|
||||
4. **الفتح البارد**: `GET /trips/mine` (استئناف أي رحلة غير منتهية) + `GET /trips/rating/pending` (فرض شاشة التقييم قبل أي رحلة جديدة).
|
||||
5. **العرض دائماً من حالة الـBloc الموحّدة** — لا شاشة تستمع للسوكت أو FCM مباشرة.
|
||||
|
||||
Reference in New Issue
Block a user