Files
Siro/siro_admin/lib/controller/admin/food_merchants_controller.dart
T

104 lines
3.1 KiB
Dart

import 'dart:convert';
import 'package:get/get.dart';
import 'package:siro_admin/constant/links.dart';
import 'package:siro_admin/controller/functions/crud.dart';
import 'package:siro_admin/views/widgets/snackbar.dart';
import '../../print.dart';
/// إدارة المطاعم (وحدة الطعام).
/// الباك إند كان جاهزاً بالكامل في backend/food/admin/ منذ البداية
/// (merchants / merchant_approve / payouts) دون أي واجهة في اللوحة.
class FoodMerchantsController extends GetxController {
bool isLoading = true;
List<dynamic> merchants = [];
String filter = 'all';
/// المطعم قيد المعالجة — لتعطيل أزراره أثناء الطلب
int? busyId;
/// الحالات كما تقبلها backend/food/admin/merchants.php حرفياً
static const statuses = <String, String>{
'all': 'الكل',
'pending_approval': 'بانتظار الاعتماد',
'active': 'نشط',
'paused': 'موقوف مؤقتاً',
'suspended': 'معلّق',
'rejected': 'مرفوض',
};
@override
void onInit() {
super.onInit();
fetchMerchants();
}
Future<void> changeFilter(String next) async {
if (filter == next) return;
filter = next;
await fetchMerchants();
}
Future<void> fetchMerchants() async {
isLoading = true;
update();
try {
var res = await CRUD()
.post(link: AppLink.foodMerchants, payload: {'status': filter});
if (res != 'failure' && res != null) {
var d = res is String ? jsonDecode(res) : res;
if (d['status'] == 'success') {
// jsonSuccess يغلّف الحمولة في message لا data
final payload = d['message'] ?? d['data'];
if (payload is Map && payload['merchants'] is List) {
merchants = payload['merchants'];
} else {
merchants = [];
}
} else {
mySnackbarError('${d['message'] ?? 'تعذّر جلب المطاعم'}');
}
}
} catch (e) {
Log.print('Error fetching merchants: $e');
mySnackbarError('$e');
}
isLoading = false;
update();
}
/// approve أو reject — الخادم يقبلهما فقط لمطعم بحالة pending_approval.
Future<void> decide(int merchantId, String action) async {
busyId = merchantId;
update();
try {
var res = await CRUD().post(
link: AppLink.foodMerchantApprove,
payload: {
'merchant_id': merchantId.toString(),
'action': action,
},
);
if (res != 'failure' && res != null) {
var d = res is String ? jsonDecode(res) : res;
if (d['status'] == 'success') {
mySnackbarSuccess(
action == 'approve' ? 'تم اعتماد المطعم' : 'تم رفض المطعم');
busyId = null;
await fetchMerchants();
return;
}
mySnackbarError('${d['message'] ?? 'تعذّر تنفيذ الإجراء'}');
}
} catch (e) {
Log.print('Error deciding merchant: $e');
mySnackbarError('$e');
}
busyId = null;
update();
}
}