Update: 2026-08-07 01:53:09

This commit is contained in:
Hamza-Ayed
2026-08-07 01:53:09 +03:00
parent 5b864e30df
commit 9830e5f649
7 changed files with 289 additions and 26 deletions
@@ -137,6 +137,61 @@ Future<bool> onStart(ServiceInstance service) async {
payload: jsonEncode(data));
}
});
// ══════════════════════════════════════════════════════════════════
// 🚫 الرحلة أخذها سائق آخر
//
// ‏نافذة الأوفرلي تعيش في عزلة منفصلة بلا سوكِت خاص بها، فلا تعلم
// ‏بشيء من نفسها. وهذه العزلة الخلفية هي الوحيدة التي تسمع الحدث
// ‏والتطبيق مغلق. بدون هذا المستمع تبقى النافذة معروضة وعدّادها
// ‏يعمل على رحلة لم تعد موجودة، ويضغط السائق "قبول" فيجدها مأخوذة.
//
// ‏نغلق النافذتين معاً: نافذة فلاتر (مسار السوكِت) والنافذة الأصلية
// ‏(مسار FCM) — لا نعرف أيّهما معروضة الآن.
// ══════════════════════════════════════════════════════════════════
socket.on('ride_taken', (data) async {
try {
await GetStorage.init();
final box = GetStorage();
final String myDriverId = box.read(BoxName.driverID).toString();
final String whoTookIt = data?['taken_by_driver_id']?.toString() ?? '';
// ‏لا نغلق على من فاز بها — تطبيقه في طريقه لفتح شاشة الرحلة.
if (whoTookIt == myDriverId) return;
bool closedAny = false;
if (Platform.isAndroid) {
if (await Overlay.FlutterOverlayWindow.isActive()) {
await Overlay.FlutterOverlayWindow.closeOverlay();
closedAny = true;
}
if (await TripOverlayPlugin.isOverlayActive()) {
await TripOverlayPlugin.hideOverlay();
closedAny = true;
}
}
// ‏الإشعار فقط إن كان هناك ما يُغلق فعلاً — وإلا أزعجنا سائقاً
// ‏لم يُعرض عليه شيء أصلاً (الحدث يُبثّ للجميع).
if (closedAny) {
flutterLocalNotificationsPlugin.show(
id: 1003,
title: "الطلب لم يعد متاحاً",
body: "قام سائق آخر بقبول هذه الرحلة",
notificationDetails: const NotificationDetails(
iOS: DarwinNotificationDetails(
presentAlert: true,
presentBadge: false,
presentSound: false,
),
),
payload: '');
}
} catch (e) {
print("⚠️ ride_taken handler error: $e");
}
});
}