Update: 2026-08-07 05:29:18
This commit is contained in:
@@ -411,6 +411,11 @@ class AppLink {
|
||||
"$server/api/ride/get_competitor_context.php";
|
||||
|
||||
static String get addRateToDriver => "$server/ride/rate/addRateToDriver.php";
|
||||
|
||||
/// هل على المستخدم تقييم متأخر؟ نقطة مستقلة عن حالة الرحلة الجارية.
|
||||
/// needsReview في getRideStatusFromStartApp محصور بنافذة ساعة مقصودة
|
||||
/// لاستئناف رحلة قائمة، فمن يغلق التطبيق بعد نزوله لا يُطلب منه تقييم.
|
||||
static String get pendingRating => "$server/ride/rate/pending_rating.php";
|
||||
static String get getDriverRate => "$server/ride/rate/getDriverRate.php";
|
||||
static String get getPassengerRate =>
|
||||
"$server/ride/rate/getPassengerRate.php";
|
||||
|
||||
@@ -660,6 +660,42 @@ class RideLifecycleController extends GetxController {
|
||||
_handleRideState(currentRideState.value);
|
||||
}
|
||||
|
||||
/// يسأل الخادم عن آخر رحلة منتهية لم تُقيَّم خلال آخر أسبوع، ويفتح
|
||||
/// شاشة التقييم إن وُجدت.
|
||||
///
|
||||
/// لا يرمي أبداً ولا يوقف شيئاً: تعذّر التقييم لا يمنع الراكب من طلب
|
||||
/// رحلة جديدة.
|
||||
Future<void> _checkPendingRating() async {
|
||||
if (_isRatingScreenOpen) return;
|
||||
|
||||
try {
|
||||
final res = await CRUD().post(
|
||||
link: AppLink.pendingRating,
|
||||
payload: {'role': 'passenger'},
|
||||
);
|
||||
|
||||
final data = res is Map ? (res['message'] ?? res['data']) : null;
|
||||
if (data is! Map || data['pending'] != true) return;
|
||||
|
||||
_isRatingScreenOpen = true;
|
||||
await Get.to(
|
||||
() => RatingDriverBottomSheet(),
|
||||
arguments: {
|
||||
'driverId': data['targetId']?.toString() ?? '',
|
||||
'rideId': data['rideId']?.toString() ?? '',
|
||||
'driverName': data['targetName']?.toString() ?? '',
|
||||
'price': data['price']?.toString() ?? '',
|
||||
},
|
||||
preventDuplicates: true,
|
||||
popGesture: false,
|
||||
);
|
||||
_isRatingScreenOpen = false;
|
||||
} catch (e) {
|
||||
Log.print('⚠️ تعذّر فحص التقييم المتأخر: $e');
|
||||
_isRatingScreenOpen = false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _checkLastRideForReview() async {
|
||||
// 🛡️ Gatekeeper: منع فتح التقييم مرتين (Race Condition)
|
||||
if (_isReviewProcessed) {
|
||||
@@ -704,6 +740,11 @@ class RideLifecycleController extends GetxController {
|
||||
currentRideState.value = RideState.noRide;
|
||||
startMasterTimer();
|
||||
} else {
|
||||
// لا تقييم ضمن نافذة الساعة — لكن قد يكون هناك تقييم متأخر لرحلة
|
||||
// أقدم. needsReview محصور بتلك النافذة عمداً (وظيفتها استئناف رحلة
|
||||
// قائمة)، فمن يغلق التطبيق فور نزوله لا يصله طلب تقييم أبداً.
|
||||
await _checkPendingRating();
|
||||
|
||||
// 🔥 [Fix Polyline] لا حاجة للتقييم — لازم نمسح مسار الرحلة المنتهية
|
||||
// قبل العودة لحالة noRide، وإلا يبقى ظاهراً على الخريطة الخاملة
|
||||
restCounter();
|
||||
|
||||
Reference in New Issue
Block a user