import 'dart:convert'; import 'package:get/get.dart'; import '../../constant/links.dart'; import '../../views/widgets/error_snakbar.dart'; import '../functions/crud.dart'; class DriverScheduledRidesController extends GetxController { final CRUD _crud = CRUD(); final bookings = >[].obs; final isLoading = false.obs; /// ‏فشل الجلب ≠ لا توجد حجوزات. بدون هذا العلم كانت الشاشة تعرض /// ‏"لا حجوزات قادمة" حتى حين يردّ السيرفر 500، فيطمئن الكابتن /// ‏لعدم وجود عمل بينما الحقيقة أننا لا نعرف. final hasError = false.obs; @override void onInit() { super.onInit(); fetch(); } Future fetch() async { isLoading.value = true; try { final res = await _crud.post( link: AppLink.scheduledList, payload: {'scope': 'upcoming_driver'}, ); final data = _extract(res); if (data == null) { hasError.value = true; return; } final list = (data['bookings'] as List?) ?? []; bookings.assignAll( list.map((e) => Map.from(e as Map)).toList()); hasError.value = false; } catch (e) { hasError.value = true; mySnackbarError('Failed to fetch scheduled rides'.tr); } finally { isLoading.value = false; } } Map? _extract(dynamic res) { final decoded = res is String ? jsonDecode(res) : res; if (decoded is! Map) { return null; } if (decoded['status'] != 'success') { return null; } final data = decoded['message'] ?? decoded['data']; return data is Map ? Map.from(data) : {}; } }