Update: 2026-08-07 05:29:18

This commit is contained in:
Hamza-Ayed
2026-08-07 05:29:18 +03:00
parent b938e287c6
commit 0b8b687ce1
5 changed files with 208 additions and 0 deletions
+5
View File
@@ -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();