Update: 2026-08-07 02:32:14

This commit is contained in:
Hamza-Ayed
2026-08-07 02:32:15 +03:00
parent 3081aea802
commit 70772cf0d2
6 changed files with 283 additions and 5 deletions
+5
View File
@@ -228,6 +228,11 @@ class AppLink {
static String get addCancelRideFromPassenger =>
"$rideServerSide/cancelRide/add.php";
static String get cancelRide => "$rideServerSide/cancelRide/get.php";
/// معاينة رسم الإلغاء قبل تنفيذه — قراءة خالصة لا تلغي شيئاً.
/// تستخدم نفس دالة الحساب التي يستخدمها الإلغاء الفعلي، فما يُعرض
/// للراكب هو ما سيُخصم منه بالضبط.
static String get previewCancelFee => "$server/ride/rides/preview_cancel_fee.php";
//-----------------ridessss------------------
static String get addRides => "$rideServerSide/ride/rides/add.php";
static String get getRides => "$rideServerSide/ride/rides/get.php";
@@ -3991,6 +3991,55 @@ class RideLifecycleController extends GetxController {
}
}
/// ‏يسأل الخادم كم سيكلّف الإلغاء، ويعرض تأكيداً إن كان هناك رسم.
///
/// ‏يرجع true للمتابعة وfalse للتراجع. الإعفاءات الثلاثة (لا سائق قَبِل،
/// ‏ضمن الدقائق المجانية، السائق تأخّر) يحسمها الخادم فلا حاجة لتكرار
/// ‏المنطق هنا — وتكراره كان سيسمح للنسختين بالتباعد.
///
/// ‏عند أي فشل شبكي نُكمل الإلغاء بلا تحذير: حبس الراكب في رحلة بسبب
/// ‏عطل عندنا أسوأ من خصم لم يُحذَّر منه.
Future<bool> _confirmCancelFee() async {
if (rideId == 'yet' || rideId == null) return true;
try {
final res = await CRUD().post(
link: AppLink.previewCancelFee,
payload: {"ride_id": rideId.toString()},
);
final data = res is Map ? (res['message'] ?? res['data']) : null;
if (data is! Map) return true;
final bool willCharge = data['will_charge'] == true;
if (!willCharge) return true;
final String amount = data['cancel_fee']?.toString() ?? '0';
final String currency = data['fee_currency']?.toString() ?? '';
bool confirmed = false;
await Get.defaultDialog(
title: 'تأكيد الإلغاء'.tr,
middleText:
'السائق في طريقه إليك. سيُخصم $amount $currency كتعويض له عن'
' المسافة والوقت.'
.tr,
textConfirm: 'إلغاء الرحلة'.tr,
textCancel: 'تراجع'.tr,
onConfirm: () {
confirmed = true;
Get.back();
},
onCancel: () => confirmed = false,
);
return confirmed;
} catch (e) {
Log.print("⚠️ تعذّرت معاينة رسم الإلغاء: $e");
return true;
}
}
Future<void> cancelRide() async {
if (selectedReasonIndex == -1) {
mySnackbarWarning('Please select a reason first'.tr);
@@ -4006,6 +4055,11 @@ class RideLifecycleController extends GetxController {
finalReason = otherReasonController.text.trim();
}
// ‏تحذير الرسم قبل أي تفكيك للحالة. لو جاء بعده، ورفض الراكب
// ‏الاستمرار، لوجد رحلته وقد أُلغيت على الشاشة بلا رجعة.
final bool proceed = await _confirmCancelFee();
if (!proceed) return;
Get.back();
if (isCancelRidePageShown) {
mapEngine.changeCancelRidePageShow();