130 lines
3.4 KiB
Dart
130 lines
3.4 KiB
Dart
// 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<FoodDeliveryOffer> pendingOffers = [];
|
|
List<FoodDeliveryTask> activeTasks = [];
|
|
bool isLoadingTasks = false;
|
|
|
|
final Set<int> _respondingOfferIds = {};
|
|
final Set<int> _busyTaskIds = {};
|
|
|
|
Timer? _pollTimer;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
_refreshAll();
|
|
_pollTimer = Timer.periodic(const Duration(seconds: 4), (_) => _refreshAll());
|
|
}
|
|
|
|
Future<void> _refreshAll() async {
|
|
if (isDeliveryModeEnabled) {
|
|
await _fetchPendingOffers();
|
|
}
|
|
await fetchActiveTasks();
|
|
}
|
|
|
|
Future<void> 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<void> _fetchPendingOffers() async {
|
|
final res = await FoodDeliveryService.getPendingOffers();
|
|
if (res.success) {
|
|
pendingOffers = res.data ?? [];
|
|
update();
|
|
}
|
|
}
|
|
|
|
Future<void> 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<void> 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<void> 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<void> 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();
|
|
}
|
|
}
|