// food_delivery_controller.dart — حالة تبويب التوصيل (وضع التوصيل، العروض، المهام النشطة) import 'dart:async'; import 'package:get/get.dart'; import '../../views/widgets/error_snakbar.dart'; import 'food_delivery_models.dart'; import 'food_delivery_service.dart'; class FoodDeliveryController extends GetxController { bool isDeliveryModeEnabled = false; bool isTogglingMode = false; List pendingOffers = []; List activeTasks = []; bool isLoadingTasks = false; final Set _respondingOfferIds = {}; final Set _busyTaskIds = {}; Timer? _pollTimer; @override void onInit() { super.onInit(); _refreshAll(); _pollTimer = Timer.periodic(const Duration(seconds: 4), (_) => _refreshAll()); } Future _refreshAll() async { if (isDeliveryModeEnabled) { await _fetchPendingOffers(); } await fetchActiveTasks(); } Future toggleDeliveryMode(bool enable) async { isTogglingMode = true; update(); final res = await FoodDeliveryService.toggleAvailability(enable); isTogglingMode = false; if (res.success) { isDeliveryModeEnabled = enable; if (!enable) pendingOffers = []; } else { mySnackbarWarning(res.message); } update(); } Future _fetchPendingOffers() async { final res = await FoodDeliveryService.getPendingOffers(); if (res.success) { pendingOffers = res.data ?? []; update(); } } Future fetchActiveTasks() async { isLoadingTasks = true; final res = await FoodDeliveryService.getActiveTasks(); isLoadingTasks = false; if (res.success) activeTasks = res.data ?? []; update(); } bool isRespondingToOffer(int orderId) => _respondingOfferIds.contains(orderId); bool isTaskBusy(int orderId) => _busyTaskIds.contains(orderId); Future respondToOffer(int orderId, bool accept) async { if (_respondingOfferIds.contains(orderId)) return; _respondingOfferIds.add(orderId); update(); final res = await FoodDeliveryService.respondToOffer(orderId, accept); _respondingOfferIds.remove(orderId); pendingOffers.removeWhere((o) => o.orderId == orderId); if (!res.success) { mySnackbarWarning(res.message); } else if (accept) { mySnackbarSuccess('تم قبول طلب التوصيل'); } update(); await fetchActiveTasks(); } Future markPickedUp(int orderId) async { if (_busyTaskIds.contains(orderId)) return; _busyTaskIds.add(orderId); update(); final res = await FoodDeliveryService.markPickedUp(orderId); _busyTaskIds.remove(orderId); if (res.success) { mySnackbarSuccess('تم استلام الطلب من المطعم'); await fetchActiveTasks(); } else { mySnackbarWarning(res.message); } update(); } Future markDelivered(int orderId) async { if (_busyTaskIds.contains(orderId)) return; _busyTaskIds.add(orderId); update(); final res = await FoodDeliveryService.markDelivered(orderId); _busyTaskIds.remove(orderId); if (res.success) { mySnackbarSuccess('تم تسليم الطلب بنجاح'); await fetchActiveTasks(); } else { mySnackbarWarning(res.message); } update(); } @override void onClose() { _pollTimer?.cancel(); super.onClose(); } }