Update codebase
This commit is contained in:
@@ -6,9 +6,9 @@ import 'dart:math';
|
||||
import 'dart:math' as math;
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:tripz_driver/controller/home/captin/home_captain_controller.dart';
|
||||
import 'package:tripz_driver/views/widgets/error_snakbar.dart';
|
||||
import 'package:tripz_driver/views/widgets/mydialoug.dart';
|
||||
import 'package:siro_driver/controller/home/captin/home_captain_controller.dart';
|
||||
import 'package:siro_driver/views/widgets/error_snakbar.dart';
|
||||
import 'package:siro_driver/views/widgets/mydialoug.dart';
|
||||
import 'package:bubble_head/bubble.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:geolocator/geolocator.dart' as geo;
|
||||
@@ -535,6 +535,18 @@ class MapDriverController extends GetxController
|
||||
);
|
||||
|
||||
if (response['status'] == 'success') {
|
||||
// 💰 التعويض عن عدم حضور الراكب — يحسبه الخادم من مسافة الاقتراب
|
||||
// ودقائق الانتظار، ويُضيفه لمحفظة السائق. صفر يعني أن الإلغاء وقع
|
||||
// قبل تسجيل الوصول أو قبل اكتمال مدة الانتظار المقررة.
|
||||
final num compensation = response['compensation'] ?? 0;
|
||||
if (compensation > 0) {
|
||||
final int waited = response['waited_minutes'] ?? 0;
|
||||
mySnackbarSuccess(
|
||||
"تم تعويضك $compensation عن المسافة و $waited دقيقة انتظار."
|
||||
.tr,
|
||||
);
|
||||
}
|
||||
|
||||
// 🔥🔥 معالجة الحظر (The Penalty Logic) 🔥🔥
|
||||
bool isBlocked = response['is_blocked'] ?? false;
|
||||
|
||||
@@ -1401,9 +1413,8 @@ class MapDriverController extends GetxController
|
||||
// الثابتين (distance/duration) اللذين يمثلان المسار المخطط أصلاً
|
||||
// ولا يُحدَّثان أبداً أثناء الرحلة — كانا يُبطلان فعلياً حماية
|
||||
// "إعادة حساب السعر من المسافة الفعلية" في الباك إند.
|
||||
final double actualDistanceKm = currentRideDistanceKm > 0
|
||||
? currentRideDistanceKm
|
||||
: safeParseDouble(distance);
|
||||
final double actualDistanceKm =
|
||||
currentRideDistanceKm > 0 ? currentRideDistanceKm : safeParseDouble(distance);
|
||||
final int actualDurationMinutes = _rideStartTime != null
|
||||
? (DateTime.now().difference(_rideStartTime!).inSeconds / 60).ceil()
|
||||
: safeParseInt(duration);
|
||||
@@ -1872,7 +1883,7 @@ class MapDriverController extends GetxController
|
||||
box.write(BoxName.countryCode, 'Jordan');
|
||||
update(); // [Fix N-5]
|
||||
// box.write(BoxName.serverChosen,
|
||||
// AppLink.TripzSyriaServer); // مثال: اختر سيرفر سوريا للبيانات
|
||||
// AppLink.SiroSyriaServer); // مثال: اختر سيرفر سوريا للبيانات
|
||||
return 'Jordan';
|
||||
}
|
||||
|
||||
@@ -1898,7 +1909,7 @@ class MapDriverController extends GetxController
|
||||
|
||||
/// **جلب ورسم المسار (OSRM - New Standard System)**
|
||||
///
|
||||
/// تستخدم السيرفر الجديد: https://routesy.tripz.xyz/route/v1/driving
|
||||
/// تستخدم السيرفر الجديد: https://routesy.intaleq.xyz/route/v1/driving
|
||||
Future<void> getRoute({
|
||||
required LatLng origin,
|
||||
required LatLng destination,
|
||||
@@ -2581,10 +2592,42 @@ class MapDriverController extends GetxController
|
||||
}
|
||||
}
|
||||
|
||||
/// يسأل الخادم عن آخر رحلة منتهية لم يقيّم السائق راكبها، ويفتح شاشة
|
||||
/// التقييم إن وُجدت. لا ينتظر ولا يرمي — لا يعطّل بدء العمل.
|
||||
void _checkPendingPassengerRating() async {
|
||||
try {
|
||||
final res = await CRUD().post(
|
||||
link: AppLink.pendingRating,
|
||||
payload: {'role': 'driver'},
|
||||
);
|
||||
|
||||
final data = res is Map ? (res['message'] ?? res['data']) : null;
|
||||
if (data is! Map || data['pending'] != true) return;
|
||||
|
||||
Get.to(
|
||||
() => RatePassenger(),
|
||||
arguments: {
|
||||
'passengerId': data['targetId']?.toString() ?? '',
|
||||
'rideId': data['rideId']?.toString() ?? '',
|
||||
'price': data['price']?.toString() ?? '',
|
||||
'walletChecked': 'false',
|
||||
},
|
||||
preventDuplicates: true,
|
||||
);
|
||||
} catch (e) {
|
||||
Log.print('⚠️ تعذّر فحص التقييم المتأخر: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() async {
|
||||
mapAPIKEY = await storage.read(key: BoxName.mapAPIKEY);
|
||||
await argumentLoading();
|
||||
|
||||
// شاشة تقييم الراكب تُفتح مباشرة بعد إنهاء الرحلة (Get.off أدناه)،
|
||||
// لكن السائق الذي يغلقها أو يُقفل تطبيقه لا يُطلب منه التقييم ثانيةً.
|
||||
// هذا الفحص يلتقط المتأخر عند أول فتح للتطبيق.
|
||||
_checkPendingPassengerRating();
|
||||
Get.put(FirebaseMessagesController());
|
||||
runGoogleMapDirectly();
|
||||
addCustomCarIcon();
|
||||
@@ -2881,8 +2924,7 @@ class MapDriverController extends GetxController
|
||||
polyLines.removeWhere(
|
||||
(p) => p.polylineId.value.startsWith('passenger_walk_line'));
|
||||
|
||||
if (!isRideStarted &&
|
||||
isArrivedSend &&
|
||||
if (!isRideStarted && isArrivedSend &&
|
||||
upcomingPathPoints.isNotEmpty &&
|
||||
latLngPassengerLocation.latitude != 0) {
|
||||
final LatLng lastRoadPt = upcomingPathPoints.last;
|
||||
|
||||
Reference in New Issue
Block a user