This commit is contained in:
Hamza-Ayed
2024-12-17 00:41:00 +03:00
parent e0c242bd77
commit 8813b4dccd
10 changed files with 334 additions and 301 deletions

View File

@@ -407,7 +407,7 @@ class MapPassengerController extends GetxController {
box.read(BoxName.carType), 4000);
// confirmRideForAllDriverAvailable();
icreaseForSameRideAndDelay();
increaseForSameRideAndDelay();
}
}
}
@@ -932,13 +932,14 @@ class MapPassengerController extends GetxController {
}
}
void tripFinishedFromDriver() async {
void tripFinishedFromDriver() {
isRideFinished = true;
rideTimerBegin = false;
statusRideVip = 'Finished';
box.write(BoxName.arrivalTime, '');
remainingTimeTimerRideBegin = 0;
box.write(BoxName.passengerWalletTotal, '0');
update();
if (box.read(BoxName.parentTripSelected) == true) {
FirebaseMessagesController().sendNotificationToPassengerToken(
"Finish Monitor".tr,
@@ -950,7 +951,6 @@ class MapPassengerController extends GetxController {
box.write(BoxName.parentTripSelected, false);
box.remove(BoxName.tokenParent);
}
update();
}
// bool isBeginRideFromDriver = false;
@@ -998,6 +998,8 @@ class MapPassengerController extends GetxController {
try {
var res = await CRUD().get(
link: AppLink.getRideStatusBegin, payload: {'ride_id': rideId});
print(res);
print('1002');
if (res != 'failure') {
var decode = jsonDecode(res);
_beginRideStreamController
@@ -1067,6 +1069,8 @@ class MapPassengerController extends GetxController {
var res = await CRUD().get(
link: AppLink.getRideStatusFromStartApp,
payload: {'passenger_id': box.read(BoxName.passengerID)});
print(res);
print('1070');
if (res == 'failure') {
print(
"No rides found for the given passenger ID within the last hour.");
@@ -1330,7 +1334,7 @@ class MapPassengerController extends GetxController {
Set<String> notifiedDrivers = {};
addRideToNotificationDriverString() async {
addRideToNotificationDriverAvailable() async {
await CRUD().post(link: AppLink.addWaitingRide, payload: {
'id': rideId.toString(),
'start_location':
@@ -1343,11 +1347,12 @@ class MapPassengerController extends GetxController {
'passenger_id': box.read(BoxName.passengerID).toString(),
'status': 'waiting',
'carType': box.read(BoxName.carType),
'passengerRate': passengerRate,
'price_for_passenger': totalME.toString(),
'distance': distance.toString(),
'duration': duration ?? '10',
'passengerRate': passengerRate.toStringAsFixed(2),
'price_for_passenger': totalME.toStringAsFixed(2),
'distance': distance.toStringAsFixed(1),
'duration': duration.toStringAsFixed(1),
});
if (AppLink.endPoint != AppLink.seferCairoServer) {
CRUD().post(
link: '${AppLink.endPoint}/notificationCaptain/addWaitingRide.php',
@@ -1363,10 +1368,10 @@ class MapPassengerController extends GetxController {
'passenger_id': box.read(BoxName.passengerID).toString(),
'status': 'waiting',
'carType': box.read(BoxName.carType),
'passengerRate': passengerRate,
'price_for_passenger': totalME.toString(),
'distance': distance.toString(),
'duration': duration ?? '10',
'passengerRate': passengerRate.toStringAsFixed(2),
'price_for_passenger': totalME.toStringAsFixed(2),
'distance': distance.toStringAsFixed(1),
'duration': duration.toStringAsFixed(0),
});
}
}
@@ -1382,7 +1387,7 @@ class MapPassengerController extends GetxController {
// if (dataCarsLocationByPassenger != 'failure' &&
// dataCarsLocationByPassenger != null &&
// dataCarsLocationByPassenger.containsKey('data') &&
// dataCarsLocationByPassenger['data'] != null) {
// dataCarsLocationByPassenger['message'] != null) {
// driversFound = true;
// break; // Exit loop if drivers are found
// }
@@ -1445,7 +1450,7 @@ class MapPassengerController extends GetxController {
// "endtime": durationToAdd.toString(),
// "price": totalPassenger.toStringAsFixed(2),
// "passenger_id": box.read(BoxName.passengerID).toString(),
// "driver_id": dataCarsLocationByPassenger['data'][carsOrder]['driver_id']
// "driver_id": dataCarsLocationByPassenger['message'][carsOrder]['driver_id']
// .toString(),
// "status": "waiting",
// 'carType': box.read(BoxName.carType),
@@ -1477,8 +1482,8 @@ class MapPassengerController extends GetxController {
// box.read(BoxName.carType), 3000);
// if (dataCarsLocationByPassenger != null &&
// dataCarsLocationByPassenger.containsKey('data') &&
// dataCarsLocationByPassenger['data'] != null) {
// for (var driverData in dataCarsLocationByPassenger['data']) {
// dataCarsLocationByPassenger['message'] != null) {
// for (var driverData in dataCarsLocationByPassenger['message']) {
// String driverId = driverData['driver_id'].toString();
// if (!notifiedDrivers.contains(driverId)) {
// notifiedDrivers.add(driverId);
@@ -1549,7 +1554,7 @@ class MapPassengerController extends GetxController {
// "endtime": durationToAdd.toString(),
// "price": totalPassenger.toStringAsFixed(2),
// "passenger_id": box.read(BoxName.passengerID).toString(),
// "driver_id": dataCarsLocationByPassenger['data'][carsOrder]['driver_id']
// "driver_id": dataCarsLocationByPassenger['message'][carsOrder]['driver_id']
// .toString(),
// "status": "waiting",
// 'carType': box.read(BoxName.carType),
@@ -1563,116 +1568,117 @@ class MapPassengerController extends GetxController {
// update();
// }
icreaseForSameRideAndDelay() async {
bool driversFound = false;
for (int attempt = 0; attempt < 8; attempt++) {
await getCarsLocationByPassengerAndReloadMarker(
box.read(BoxName.carType), 4500);
increaseForSameRideAndDelay() async {
reSearchAfterCanceledFromDriver();
// bool driversFound = false;
// for (int attempt = 0; attempt < 8; attempt++) {
// await getCarsLocationByPassengerAndReloadMarker(
// box.read(BoxName.carType), 4500);
// Check if dataCarsLocationByPassenger is valid and contains drivers
if (dataCarsLocationByPassenger != 'failure' &&
dataCarsLocationByPassenger != null &&
dataCarsLocationByPassenger.containsKey('data') &&
dataCarsLocationByPassenger['data'] != null) {
driversFound = true;
break; // Exit loop if drivers are found
}
// // Check if dataCarsLocationByPassenger is valid and contains drivers
// if (dataCarsLocationByPassenger != 'failure' &&
// dataCarsLocationByPassenger != null &&
// dataCarsLocationByPassenger.containsKey('message') &&
// dataCarsLocationByPassenger['message'] != null) {
// driversFound = true;
// break; // Exit loop if drivers are found
// }
// Wait 2 seconds before next attempt
await Future.delayed(const Duration(seconds: 2));
}
// // Wait 2 seconds before next attempt
// await Future.delayed(const Duration(seconds: 2));
// }
// If no drivers were found after 4 attempts, show a dialog
if (!driversFound) {
Get.dialog(
BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
child: CupertinoAlertDialog(
title: Text(
"No Car or Driver Found in your area.".tr,
style: AppStyle.title.copyWith(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
content: Text(
"No Car or Driver Found in your area.".tr,
style: AppStyle.title.copyWith(fontSize: 16),
),
actions: [
CupertinoDialogAction(
onPressed: () {
Get.back();
Get.offAll(() => const MapPagePassenger());
},
child: Text('OK'.tr,
style: const TextStyle(color: AppColor.greenColor)),
),
],
),
),
barrierDismissible: false,
);
// // If no drivers were found after 4 attempts, show a dialog
// if (!driversFound) {
// Get.dialog(
// BackdropFilter(
// filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
// child: CupertinoAlertDialog(
// title: Text(
// "No Car or Driver Found in your area.".tr,
// style: AppStyle.title.copyWith(
// fontSize: 20,
// fontWeight: FontWeight.bold,
// ),
// ),
// content: Text(
// "No Car or Driver Found in your area.".tr,
// style: AppStyle.title.copyWith(fontSize: 16),
// ),
// actions: [
// CupertinoDialogAction(
// onPressed: () {
// Get.back();
// Get.offAll(() => const MapPagePassenger());
// },
// child: Text('OK'.tr,
// style: const TextStyle(color: AppColor.greenColor)),
// ),
// ],
// ),
// ),
// barrierDismissible: false,
// );
return;
}
PaymentController paymentController = Get.find<PaymentController>();
rideConfirm = true;
shouldFetch = true;
isBottomSheetShown = false;
timeToPassengerFromDriverAfterApplied = 60;
// confirmRideForAllDriverAvailable();
for (var i = 0; i < dataCarsLocationByPassenger['data'].length; i++) {
List<String> body = [
'${data[0]["start_location"]['lat']},${data[0]["start_location"]['lng']}',
'${data[0]["end_location"]['lat']},${data[0]["end_location"]['lng']}',
totalPassenger.toStringAsFixed(2),
totalDriver.toStringAsFixed(2),
durationToRide.toString(),
distance.toStringAsFixed(2),
dataCarsLocationByPassenger['data'][i]['driver_id'].toString(),
box.read(BoxName.passengerID).toString(),
box.read(BoxName.name).toString(),
box.read(BoxName.tokenFCM).toString(),
box.read(BoxName.phone).toString(),
durationByPassenger.toString(),
distanceByPassenger.toString(),
paymentController.isWalletChecked.toString(),
dataCarsLocationByPassenger['data'][i]['token'].toString(),
durationToPassenger.toString(),
rideId.toString(),
rideTimerBegin.toString(),
dataCarsLocationByPassenger['data'][i]['driver_id'].toString(),
durationToRide.toString(),
Get.find<WayPointController>().wayPoints.length > 1
? 'haveSteps'
: 'startEnd',
placesCoordinate[0],
placesCoordinate[1],
placesCoordinate[2],
placesCoordinate[3],
placesCoordinate[4],
costForDriver.toStringAsFixed(2),
double.parse(box.read(BoxName.passengerWalletTotal)) < 0
? double.parse(box.read(BoxName.passengerWalletTotal))
.toStringAsFixed(2)
: '0',
box.read(BoxName.email).toString(),
data[0]['start_address'],
data[0]['end_address'],
box.read(BoxName.carType),
kazan.toStringAsFixed(0),
passengerRate.toStringAsFixed(2),
];
// Log.print('body: ${body}');
// return;
// }
// PaymentController paymentController = Get.find<PaymentController>();
// rideConfirm = true;
// shouldFetch = true;
// isBottomSheetShown = false;
// timeToPassengerFromDriverAfterApplied = 60;
// // confirmRideForAllDriverAvailable();
// for (var i = 0; i < dataCarsLocationByPassenger['message'].length; i++) {
// List<String> body = [
// '${data[0]["start_location"]['lat']},${data[0]["start_location"]['lng']}',
// '${data[0]["end_location"]['lat']},${data[0]["end_location"]['lng']}',
// totalPassenger.toStringAsFixed(2),
// totalDriver.toStringAsFixed(2),
// durationToRide.toString(),
// distance.toStringAsFixed(2),
// dataCarsLocationByPassenger['message'][i]['driver_id'].toString(),
// box.read(BoxName.passengerID).toString(),
// box.read(BoxName.name).toString(),
// box.read(BoxName.tokenFCM).toString(),
// box.read(BoxName.phone).toString(),
// durationByPassenger.toString(),
// distanceByPassenger.toString(),
// paymentController.isWalletChecked.toString(),
// dataCarsLocationByPassenger['message'][i]['token'].toString(),
// durationToPassenger.toString(),
// rideId.toString(),
// rideTimerBegin.toString(),
// dataCarsLocationByPassenger['message'][i]['driver_id'].toString(),
// durationToRide.toString(),
// Get.find<WayPointController>().wayPoints.length > 1
// ? 'haveSteps'
// : 'startEnd',
// placesCoordinate[0],
// placesCoordinate[1],
// placesCoordinate[2],
// placesCoordinate[3],
// placesCoordinate[4],
// costForDriver.toStringAsFixed(2),
// double.parse(box.read(BoxName.passengerWalletTotal)) < 0
// ? double.parse(box.read(BoxName.passengerWalletTotal))
// .toStringAsFixed(2)
// : '0',
// box.read(BoxName.email).toString(),
// data[0]['start_address'],
// data[0]['end_address'],
// box.read(BoxName.carType),
// kazan.toStringAsFixed(0),
// passengerRate.toStringAsFixed(2),
// ];
// // Log.print('body: ${body}');
FirebaseMessagesController().sendNotificationToDriverMAP(
'OrderSpeed',
rideId.toString(),
dataCarsLocationByPassenger['data'][i]['token'].toString(),
body,
'order.wav');
}
// FirebaseMessagesController().sendNotificationToDriverMAP(
// 'OrderSpeed',
// rideId.toString(),
// dataCarsLocationByPassenger['message'][i]['token'].toString(),
// body,
// 'order.wav');
// }
}
int tick = 0; // Move tick outside the function to maintain its state
@@ -1760,6 +1766,7 @@ class MapPassengerController extends GetxController {
update();
}
String driversStatusForSearchWindow = '';
Future<void> confirmRideForAllDriverAvailable() async {
bool driversFound = false;
const maxAttempts = 8;
@@ -1770,7 +1777,7 @@ class MapPassengerController extends GetxController {
await getCarsLocationByPassengerAndReloadMarker(
box.read(BoxName.carType), reloadDuration);
// await getNearestDriverByPassengerLocation();
driversStatusForSearchWindow = 'We are search for nearst driver'.tr;
if (isDriversDataValid()) {
driversFound = true;
break;
@@ -1783,9 +1790,16 @@ class MapPassengerController extends GetxController {
showNoDriversDialog();
return;
}
driversStatusForSearchWindow = 'Your order is being prepared'.tr;
Log.print('driversStatusForSearchWindow: ${driversStatusForSearchWindow}');
update();
await postRideDetailsToServer();
driversStatusForSearchWindow = 'Your order sent to drivers'.tr;
await notifyAvailableDrivers();
driversStatusForSearchWindow = 'The drivers are reviewing your request'.tr;
Log.print('driversStatusForSearchWindow: ${driversStatusForSearchWindow}');
update();
delayAndFetchRideStatusForAllDriverAvailable(rideId);
update();
}
@@ -1823,8 +1837,8 @@ class MapPassengerController extends GetxController {
bool isDriversDataValid() {
return dataCarsLocationByPassenger != 'failure' &&
dataCarsLocationByPassenger != null &&
dataCarsLocationByPassenger.containsKey('data') &&
dataCarsLocationByPassenger['data'] != null;
dataCarsLocationByPassenger.containsKey('message') &&
dataCarsLocationByPassenger['message'] != null;
}
void showNoDriversDialog() {
@@ -1889,7 +1903,8 @@ class MapPassengerController extends GetxController {
"endtime": durationToAdd.toString(),
"price": totalPassenger.toStringAsFixed(2),
"passenger_id": box.read(BoxName.passengerID).toString(),
"driver_id": dataCarsLocationByPassenger['data'][carsOrder]['driver_id']
"driver_id": dataCarsLocationByPassenger['message'][carsOrder]
['driver_id']
.toString(),
"status": "waiting",
'carType': box.read(BoxName.carType),
@@ -1911,9 +1926,9 @@ class MapPassengerController extends GetxController {
box.read(BoxName.carType), 3000);
if (dataCarsLocationByPassenger != null &&
dataCarsLocationByPassenger.containsKey('data') &&
dataCarsLocationByPassenger['data'] != null) {
for (var driverData in dataCarsLocationByPassenger['data']) {
dataCarsLocationByPassenger.containsKey('message') &&
dataCarsLocationByPassenger['message'] != null) {
for (var driverData in dataCarsLocationByPassenger['message']) {
String driverId = driverData['driver_id'].toString();
if (!notifiedDrivers.contains(driverId)) {
notifiedDrivers.add(driverId);
@@ -1926,14 +1941,18 @@ class MapPassengerController extends GetxController {
driverLng,
);
double distanceToDriverInKm = distanceToDriverInMeters / 1000;
double distanceToDriverInKm = distanceToDriverInMeters *
1.25 / //to approximate to stright distance
1000;
double durationToDriverInHours =
distanceToDriverInKm / 25; // 25 km/h as default speed
double durationToDriverInSeconds = durationToDriverInHours * 3600;
durationToPassenger = durationToDriverInSeconds.toInt();
distanceByPassenger = distanceToDriverInMeters.toStringAsFixed(0);
distanceByPassenger =
(distanceToDriverInMeters * 1.25).toStringAsFixed(0);
Future.delayed(const Duration(microseconds: 10));
final body = constructNotificationBody(driverData);
Log.print('body:ww ${body}');
// Log.print('body:ww ${body}');
FirebaseMessagesController().sendNotificationToDriverMAP(
'OrderSpeed',
rideId,
@@ -1961,8 +1980,8 @@ class MapPassengerController extends GetxController {
box.read(BoxName.name).toString(),
box.read(BoxName.tokenFCM).toString(),
box.read(BoxName.phone).toString(),
durationToPassenger.toString(),
distanceByPassenger.toString(),
durationToPassenger.toStringAsFixed(0) ?? '120',
distanceByPassenger.toString() ?? '2000',
paymentController.isWalletChecked.toString(),
driverData['token'].toString(),
durationToPassenger.toString(),
@@ -1996,12 +2015,13 @@ class MapPassengerController extends GetxController {
StreamController<String>.broadcast();
Stream<String> get rideStatusStream => _rideStatusStreamController.stream;
void delayAndFetchRideStatusForAllDriverAvailable(String rideId) {
Future<void> delayAndFetchRideStatusForAllDriverAvailable(
String rideId) async {
const int maxAttempts = 15;
int attemptCounter = 0;
bool isApplied = false;
tick = 0;
await addRideToNotificationDriverAvailable();
Timer.periodic(const Duration(seconds: 1), (timer) async {
if (attemptCounter >= maxAttempts || isApplied) {
timer.cancel();
@@ -2014,8 +2034,10 @@ class MapPassengerController extends GetxController {
try {
var res = await getRideStatus(rideId);
Log.print('res:2022 ${res}');
String rideStatusDelayed = res.toString();
addRideToNotificationDriverString();
Log.print('rideStatusDelayed: ${rideStatusDelayed}');
_rideStatusStreamController
.add(rideStatusDelayed); // Emit the ride status
// addRideToNotificationDriverString();
@@ -2025,41 +2047,23 @@ class MapPassengerController extends GetxController {
"Order Cancelled".tr, "you canceled order".tr, 'ding');
_rideStatusStreamController
.close(); // Close stream after cancellation
//
//
} else if (rideStatusDelayed == 'Apply' ||
rideStatusDelayed == 'Applied') {
await getUpdatedRideForDriverApply(rideId);
NotificationController().showNotification(
'Order Accepted'.tr,
'$driverName ${'accepted your order at price'.tr} ${totalPassenger.toStringAsFixed(1)} ${'with type'.tr} ${box.read(BoxName.carType)}',
'ding');
if (box.read(BoxName.carType) == 'Speed' ||
box.read(BoxName.carType) == 'Awfar Car') {
NotificationController().showNotification(
'The captain is responsible for the route.'.tr,
'This price is fixed even if the route changes for the driver.'
.tr,
'ding');
} else if (box.read(BoxName.carType) == 'Comfort' ||
box.read(BoxName.carType) == 'Lady') {
NotificationController().showNotification('Attention'.tr,
'The price may increase if the route changes.'.tr, 'ding');
}
isApplied = true;
statusRide = 'Apply';
rideConfirm = false;
isSearchingWindow = false;
startTimer();
update();
startTimerFromDriverToPassengerAfterApplied();
rideAppliedFromDriver(isApplied);
timer.cancel();
_rideStatusStreamController.close(); // Close stream after applying
} else if (attemptCounter >= maxAttempts &&
// Close stream after applying
} else if (attemptCounter >= maxAttempts ||
rideStatusDelayed != 'Cancel') {
timer.cancel();
timer.cancel(); //todo
// addRideToNotificationDriverString();
// Show dialog to increase fee...
MyDialog().getDialog(
'Are you want to wait drivers to accept your order'.tr, '', () {
Get.back();
addRideToNotificationDriverAvailable();
});
update();
_rideStatusStreamController
.close(); // Close stream after max attempts
@@ -2070,6 +2074,36 @@ class MapPassengerController extends GetxController {
});
}
rideAppliedFromDriver(bool isApplied) async {
await getUpdatedRideForDriverApply(rideId);
NotificationController().showNotification(
'Order Accepted'.tr,
'$driverName ${'accepted your order at price'.tr} ${totalPassenger.toStringAsFixed(1)} ${'with type'.tr} ${box.read(BoxName.carType)}',
'ding');
if (box.read(BoxName.carType) == 'Speed' ||
box.read(BoxName.carType) == 'Awfar Car') {
NotificationController().showNotification(
'The captain is responsible for the route.'.tr,
'This price is fixed even if the route changes for the driver.'.tr,
'ding');
} else if (box.read(BoxName.carType) == 'Comfort' ||
box.read(BoxName.carType) == 'Lady') {
NotificationController().showNotification('Attention'.tr,
'The price may increase if the route changes.'.tr, 'ding');
}
isApplied = true;
statusRide = 'Apply';
rideConfirm = false;
isSearchingWindow = false;
update();
startTimer();
// todo stop this because this method in startTimer()
// startTimerFromDriverToPassengerAfterApplied();
// timer.cancel();
_rideStatusStreamController.close();
}
// Listening to the Stream
void listenToRideStatusStream() {
rideStatusStream.listen((rideStatus) {
@@ -2084,15 +2118,12 @@ class MapPassengerController extends GetxController {
}
reSearchAfterCanceledFromDriver() async {
await getCarsLocationByPassengerAndReloadMarker(
box.read(BoxName.carType), 3000);
updateConfirmRideForAllDriverAvailable();
shouldFetch = true; // Stop further fetches
statusRide = 'wait';
rideConfirm = true;
isSearchingWindow = true;
update();
updateConfirmRideForAllDriverAvailable();
}
void start15SecondTimer(String rideId) {
@@ -2131,7 +2162,8 @@ class MapPassengerController extends GetxController {
final response = await CRUD().get(
link: "${AppLink.endPoint}/ride/rides/getRideStatus.php",
payload: {'id': rideId});
print(response);
print('2140');
return jsonDecode(response)['data'];
}
@@ -2492,11 +2524,12 @@ class MapPassengerController extends GetxController {
} else {
noCarString = false;
dataCarsLocationByPassenger = jsonDecode(res);
Log.print('dataCarsLocationByPassenger: ${dataCarsLocationByPassenger}');
Log.print(
'dataCarsLocationByPassenger:getCarsLocationByPassengerAndReloadMarker ${dataCarsLocationByPassenger}');
// Check if 'message' is present and not null
if (dataCarsLocationByPassenger['data'] != null &&
dataCarsLocationByPassenger['data'].isNotEmpty) {
if (dataCarsLocationByPassenger != null &&
dataCarsLocationByPassenger.isNotEmpty) {
// Check if carsOrder is within bounds
// if (carsOrder < dataCarsLocationByPassenger['message'].length) {
// driverId = dataCarsLocationByPassenger['message'][carsOrder]
@@ -2508,7 +2541,7 @@ class MapPassengerController extends GetxController {
// ['token']
// .toString();
// } else {
// print('carsOrder is out of bounds for message array');
print('carsOrder is in of bounds for message array');
// return false;
// }
} else {
@@ -2519,8 +2552,8 @@ class MapPassengerController extends GetxController {
carsLocationByPassenger.clear(); // Clear existing markers
for (var i = 0; i < dataCarsLocationByPassenger['data'].length; i++) {
var json = dataCarsLocationByPassenger['data'][i];
for (var i = 0; i < dataCarsLocationByPassenger['message'].length; i++) {
var json = dataCarsLocationByPassenger['message'][i];
_updateOrCreateMarker(
MarkerId(json['latitude']).toString(),
LatLng(
@@ -3778,13 +3811,15 @@ class MapPassengerController extends GetxController {
if (!rideConfirm) {
if (dataCarsLocationByPassenger != 'failure' &&
dataCarsLocationByPassenger != null &&
dataCarsLocationByPassenger['data'] != null &&
dataCarsLocationByPassenger['data'].length > 0) {
dataCarsLocationByPassenger['message'] != null &&
dataCarsLocationByPassenger['message'].length > 0) {
double nearestDistance = double.infinity; // Initialize nearest distance
CarLocation? nearestCar;
for (var i = 0; i < dataCarsLocationByPassenger['data'].length; i++) {
var carLocation = dataCarsLocationByPassenger['data'][i];
for (var i = 0;
i < dataCarsLocationByPassenger['message'].length;
i++) {
var carLocation = dataCarsLocationByPassenger['message'][i];
Log.print('carLocation: $carLocation');
try {