Update: 2026-06-10 18:11:50

This commit is contained in:
Hamza-Ayed
2026-06-10 18:11:50 +03:00
parent a0473a8b0f
commit 977adfe99d
27 changed files with 3946 additions and 206 deletions

View File

@@ -112,6 +112,7 @@ class RideLifecycleController extends GetxController {
late String driverId = '';
late String make = '';
late String model = '';
late String gender = '';
late String carColor = '';
late String licensePlate = '';
late String driverName = '';
@@ -120,6 +121,9 @@ class RideLifecycleController extends GetxController {
late String colorHex = '';
late String carYear = '';
late String driverRate = '5.0';
late String driverRatingCount = '0';
late String driverCompletedRides = '0';
late String driverTier = 'Verified driver';
late String driverToken = '';
double kazan = 8;
@@ -1481,7 +1485,8 @@ class RideLifecycleController extends GetxController {
// إيقاف جلب السيارات المجاورة ومسحها، باستثناء السائق الذي قبل الطلب
mapEngine.reloadStartApp = false;
mapEngine.markers.removeWhere((marker) => marker.markerId.value != driverId.toString());
mapEngine.markers
.removeWhere((marker) => marker.markerId.value != driverId.toString());
mapEngine.update();
await getDriverCarsLocationToPassengerAfterApplied();
@@ -1490,8 +1495,7 @@ class RideLifecycleController extends GetxController {
LatLng driverPos = driverCarsLocationToPassengerAfterApplied.last;
Log.print(
'[rideAppliedFromDriver] 📍 Driver at: $driverPos, Passenger at: $passengerLocation');
await getInitialDriverDistanceAndDuration(driverPos, passengerLocation);
await drawDriverPathOnly(driverPos, passengerLocation);
await calculateDriverToPassengerRoute(driverPos, passengerLocation);
mapEngine.fitCameraToPoints(driverPos, passengerLocation);
}
@@ -1656,6 +1660,9 @@ class RideLifecycleController extends GetxController {
driverToken = data['token']?.toString() ?? '';
carYear = data['year']?.toString() ?? '';
driverRate = data['ratingDriver']?.toString() ?? '5.0';
driverRatingCount = data['ratingCount']?.toString() ?? '0';
driverCompletedRides = data['completedRides']?.toString() ?? '0';
driverTier = data['driverTier']?.toString() ?? 'Verified driver';
update();
}
@@ -2221,6 +2228,15 @@ class RideLifecycleController extends GetxController {
polyLines = polyLines
.where((p) => !p.polylineId.value.startsWith('driver_route'))
.toSet();
polyLines = {
...polyLines,
Polyline(
polylineId: const PolylineId('main_route'),
points: decodedPoints,
color: const Color(0xFF2196F3),
width: 6,
)
};
} else {
// مسح السلمات القديمة أولاً
polyLines = polyLines
@@ -2290,7 +2306,9 @@ class RideLifecycleController extends GetxController {
_routeHeadingMismatchCount = 0;
_isRecalculatingRoute = true;
if (statusRide == 'Begin' ||
currentRideState.value == RideState.inProgress) {
statusRide == 'Arrived' ||
currentRideState.value == RideState.inProgress ||
currentRideState.value == RideState.driverArrived) {
await calculateDriverToPassengerRoute(driverPos, myDestination,
isBeginPhase: true);
} else {
@@ -2504,6 +2522,8 @@ class RideLifecycleController extends GetxController {
String icon;
if (model.contains('دراجة') || make.contains('دراجة')) {
icon = mapEngine.motoIcon;
} else if (gender == 'Female') {
icon = mapEngine.ladyIcon;
} else {
icon = mapEngine.carIcon;
}
@@ -3026,6 +3046,17 @@ class RideLifecycleController extends GetxController {
mapEngine.playRouteAnimation(
mapEngine.polylineCoordinates, mapEngine.lastComputedBounds);
}
if (driverCarsLocationToPassengerAfterApplied.isNotEmpty &&
myDestination.latitude != 0 &&
myDestination.longitude != 0) {
await calculateDriverToPassengerRoute(
driverCarsLocationToPassengerAfterApplied.last,
myDestination,
isBeginPhase: true,
);
}
update();
}
@@ -3903,12 +3934,37 @@ class RideLifecycleController extends GetxController {
make = data['make']?.toString() ?? '';
model = data['model']?.toString() ?? '';
gender = data['gender']?.toString() ?? '';
carColor = data['color']?.toString() ?? '';
colorHex = data['color_hex']?.toString() ?? '';
licensePlate = data['car_plate']?.toString() ?? '';
carYear = data['year']?.toString() ?? '';
// المحاولة الفورية لرسم السائق إذا توفرت الإحداثيات في البيانات
double lat = double.tryParse(
data['latitude']?.toString() ?? data['lat']?.toString() ?? '0') ??
0;
double lng = double.tryParse(data['longitude']?.toString() ??
data['lng']?.toString() ??
'0') ??
0;
double heading = double.tryParse(data['heading']?.toString() ?? '0') ?? 0;
if (lat != 0 && lng != 0) {
LatLng initialPos = LatLng(lat, lng);
if (driverCarsLocationToPassengerAfterApplied.isEmpty) {
driverCarsLocationToPassengerAfterApplied.add(initialPos);
} else {
driverCarsLocationToPassengerAfterApplied[0] = initialPos;
}
// تحديث الماركر فوراً لضمان ظهوره بشكل موثوق
updateDriverMarker(initialPos, heading);
}
driverRate = data['ratingDriver']?.toString() ?? '5.0';
driverRatingCount = data['ratingCount']?.toString() ?? '0';
driverCompletedRides = data['completedRides']?.toString() ?? '0';
driverTier = data['driverTier']?.toString() ?? 'Verified driver';
driverToken = data['token']?.toString() ?? '';
update();
@@ -4185,55 +4241,6 @@ class RideLifecycleController extends GetxController {
);
}
Future<void> getDistanceFromDriverAfterAcceptedRide(
String origin, String destination) async {
String apiKey = Env.mapKeyOsm;
if (origin.isEmpty) {
origin = '${passengerLocation.latitude},${passengerLocation.longitude}';
}
var uri = Uri.parse(
'$dynamicApiUrl?origin=$origin&destination=$destination&steps=false&overview=false');
Log.print('uri: $uri');
http.Response response;
Map<String, dynamic> responseData;
try {
response = await http.get(
uri,
headers: {
'X-API-KEY': apiKey,
},
).timeout(const Duration(seconds: 20));
if (response.statusCode != 200) {
Log.print('Error from API: ${response.statusCode}');
isLoading = false;
update();
return;
}
if (Get.isBottomSheetOpen ?? false) {
Get.back();
}
isDrawingRoute = false;
responseData = json.decode(response.body);
Log.print('responseData: $responseData');
if (responseData['status'] != 'ok') {
Log.print('API returned an error: ${responseData['message']}');
isLoading = false;
update();
return;
}
} catch (e) {
Log.print('Failed to get directions: $e');
isLoading = false;
update();
return;
}
}
Future<void> _stageNiceToHave() async {
Log.print('🚀 MapPassengerController: Starting _stageNiceToHave');