Food delivery driver module + masked calls + TURN

This commit is contained in:
Hamza-Ayed
2026-08-04 01:50:50 +03:00
parent 04c214bdf6
commit f01e408ba6
35 changed files with 3029 additions and 212 deletions
@@ -15,8 +15,13 @@ import '../../constant/box_name.dart';
import '../../constant/links.dart';
import '../../main.dart'; // للوصول لـ box
import '../../print.dart';
import '../../views/food_delivery/food_delivery_home_page.dart';
import '../../views/food_delivery/food_offer_page.dart';
import '../../views/food_delivery/food_task_details_page.dart';
import '../../views/home/Captin/driver_map_page.dart';
import '../../views/home/Captin/orderCaptin/order_request_page.dart';
import '../food_delivery/food_delivery_controller.dart';
import '../food_delivery/food_notification_service.dart';
import '../functions/crud.dart';
import '../home/captin/home_captain_controller.dart';
@@ -213,6 +218,14 @@ class NotificationController extends GetxController {
if (payload == null) return;
final payloadData = jsonDecode(payload) as Map<String, dynamic>;
// إشعارات وحدة التوصيل لها حمولة وأزرار خاصة بها — نفرزها قبل أي شيء
// لأن باقي هذه الدالة يفترض حمولة رحلة (مصفوفة add_ride.php).
if (payloadData.containsKey('food_event')) {
await _handleFoodNotificationResponse(response, payloadData);
return;
}
final rawData = payloadData['data'];
List<dynamic> listData = [];
@@ -248,6 +261,38 @@ class NotificationController extends GetxController {
}
}
// ── فرع وحدة التوصيل — مسار مستقل تماماً عن مسار الرحلات أعلاه ──────────
Future<void> _handleFoodNotificationResponse(
NotificationResponse response, Map<String, dynamic> payloadData) async {
final orderId = int.tryParse(payloadData['order_id']?.toString() ?? '') ?? 0;
if (orderId == 0) return;
await FoodNotificationService.instance.cancelOfferNotification();
// الكنترولر قد لا يكون مسجَّلاً (الضغط على الإشعار والتطبيق مغلق)، فنسجّله
// ليعيد بناء حالته من الخادم قبل عرض أي شاشة.
final controller = Get.isRegistered<FoodDeliveryController>()
? Get.find<FoodDeliveryController>()
: Get.put(FoodDeliveryController());
if (response.actionId == 'FOOD_ACCEPT') {
await controller.respondToOffer(orderId, true);
Get.to(() => FoodTaskDetailsPage(orderId: orderId));
return;
}
if (response.actionId == 'FOOD_REJECT') {
await controller.respondToOffer(orderId, false);
return;
}
if (payloadData['food_event'] == 'offer') {
Get.to(() => const FoodOfferPage(), fullscreenDialog: true);
} else {
Get.to(() => const FoodDeliveryHomePage());
}
}
// ==============================================================================
// 4. منطق القبول الآمن (Safe Accept Logic)
// ==============================================================================