Update: 2026-08-07 02:32:14
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user