130 lines
3.5 KiB
Dart
130 lines
3.5 KiB
Dart
// fuel_admin_controller.dart — تحكم شاشات محفظة الوقود (لوحة إدارة سيرو)
|
|
import 'package:get/get.dart';
|
|
|
|
import 'fuel_admin_models.dart';
|
|
import 'fuel_admin_service.dart';
|
|
|
|
class FuelAdminController extends GetxController {
|
|
bool isLoading = false;
|
|
List<FuelStation> stations = [];
|
|
|
|
/// حالة المنتج — لا حالة الشاشة. الشاشة تعمل دائماً؛ المنتج قد يكون
|
|
/// مُجهَّزاً وغير مُشغَّل حتى يتم الاتفاق مع سلسلة المحطات.
|
|
bool productActive = false;
|
|
|
|
String searchQuery = '';
|
|
bool isSaving = false;
|
|
|
|
bool isLoadingDrawdowns = false;
|
|
FuelDrawdownsPage? drawdowns;
|
|
|
|
String? lastError;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
fetchStations();
|
|
}
|
|
|
|
Future<void> fetchStations() async {
|
|
isLoading = true;
|
|
update();
|
|
|
|
final res = await FuelAdminService.listStations(search: searchQuery);
|
|
if (res.success && res.data != null) {
|
|
stations = res.data!.stations;
|
|
productActive = res.data!.productActive;
|
|
lastError = null;
|
|
} else {
|
|
lastError = res.message;
|
|
}
|
|
|
|
isLoading = false;
|
|
update();
|
|
}
|
|
|
|
/// يُرجع المفتاح الجديد عند الإنشاء، أو null عند التعديل/الفشل.
|
|
///
|
|
/// المفتاح يظهر مرة واحدة فقط — مخزَّن مُهشَّراً على الخادم ولا سبيل
|
|
/// لاستعادته. الشاشة مسؤولة عن عرضه فوراً قبل أي انتقال.
|
|
Future<String?> saveStation({
|
|
int? stationId,
|
|
required String nameAr,
|
|
String? chainName,
|
|
String? city,
|
|
String? address,
|
|
double? lat,
|
|
double? lng,
|
|
String? phone,
|
|
required double discountPercent,
|
|
required bool isActive,
|
|
}) async {
|
|
isSaving = true;
|
|
update();
|
|
|
|
final res = await FuelAdminService.saveStation(
|
|
stationId: stationId,
|
|
nameAr: nameAr,
|
|
chainName: chainName,
|
|
city: city,
|
|
address: address,
|
|
lat: lat,
|
|
lng: lng,
|
|
phone: phone,
|
|
discountPercent: discountPercent,
|
|
isActive: isActive,
|
|
);
|
|
|
|
isSaving = false;
|
|
lastError = res.success ? null : res.message;
|
|
update();
|
|
|
|
if (!res.success) return null;
|
|
|
|
await fetchStations();
|
|
return res.data?['api_key']?.toString();
|
|
}
|
|
|
|
Future<String?> rotateKey(int stationId) async {
|
|
final res = await FuelAdminService.rotateKey(stationId);
|
|
if (!res.success) {
|
|
lastError = res.message;
|
|
update();
|
|
return null;
|
|
}
|
|
return res.data?['api_key']?.toString();
|
|
}
|
|
|
|
/// تشغيل المنتج أو إيقافه. الخادم يرفض التشغيل بلا محطة فعّالة واحدة —
|
|
/// سائق يفعّل محفظته ثم لا يجد أين يصرف قسيمته تجربةٌ تُفقد الثقة.
|
|
Future<bool> toggleProduct(bool value) async {
|
|
final res = await FuelAdminService.toggleProduct(value);
|
|
if (res.success) {
|
|
productActive = res.data ?? value;
|
|
lastError = null;
|
|
update();
|
|
return true;
|
|
}
|
|
lastError = res.message;
|
|
update();
|
|
return false;
|
|
}
|
|
|
|
Future<void> fetchDrawdowns({int? stationId, String? status}) async {
|
|
isLoadingDrawdowns = true;
|
|
update();
|
|
|
|
final res =
|
|
await FuelAdminService.listDrawdowns(stationId: stationId, status: status);
|
|
if (res.success) {
|
|
drawdowns = res.data;
|
|
lastError = null;
|
|
} else {
|
|
lastError = res.message;
|
|
}
|
|
|
|
isLoadingDrawdowns = false;
|
|
update();
|
|
}
|
|
}
|