6/30/1
This commit is contained in:
@@ -53,7 +53,7 @@ class LoginController extends GetxController {
|
||||
Get.offAll(SmsSignupEgypt());
|
||||
isloading = false;
|
||||
update();
|
||||
Get.snackbar("User does not exist.".tr, '', backgroundColor: Colors.red);
|
||||
// Get.snackbar("User does not exist.".tr, '', backgroundColor: Colors.red);
|
||||
} else {
|
||||
var jsonDecoeded = jsonDecode(res);
|
||||
if (jsonDecoeded.isNotEmpty) {
|
||||
@@ -75,6 +75,7 @@ class LoginController extends GetxController {
|
||||
'token change'.tr,
|
||||
'change device'.tr,
|
||||
jsonDecode(token)['data'][0]['token'].toString(),
|
||||
'cancel.wav',
|
||||
);
|
||||
Future.delayed(const Duration(seconds: 1));
|
||||
await CRUD().post(link: AppLink.addTokens, payload: {
|
||||
|
||||
@@ -159,6 +159,12 @@ class FirebaseMessagesController extends GetxController {
|
||||
.showNotification('message From passenger'.tr, ''.tr, 'tone2');
|
||||
passengerDialog(message.notification!.body!);
|
||||
|
||||
update();
|
||||
} else if (message.notification!.title! == 'message From Driver'.tr) {
|
||||
NotificationController()
|
||||
.showNotification('message From passenger'.tr, ''.tr, 'tone2');
|
||||
passengerDialog(message.notification!.body!);
|
||||
|
||||
update();
|
||||
} else if (message.notification!.title! == 'RideIsBegin') {
|
||||
Get.find<MapPassengerController>().getBeginRideFromDriver();
|
||||
@@ -332,7 +338,9 @@ class FirebaseMessagesController extends GetxController {
|
||||
FirebaseMessagesController().sendNotificationToPassengerToken(
|
||||
'Hi ,I will go now'.tr,
|
||||
'I will go now'.tr,
|
||||
Get.find<MapPassengerController>().driverToken, []);
|
||||
Get.find<MapPassengerController>().driverToken,
|
||||
[],
|
||||
'ding.wav');
|
||||
Get.find<MapPassengerController>()
|
||||
.startTimerDriverWaitPassenger5Minute();
|
||||
|
||||
@@ -412,7 +420,7 @@ class FirebaseMessagesController extends GetxController {
|
||||
'notification': <String, dynamic>{
|
||||
'title': title,
|
||||
'body': body,
|
||||
'sound': 'start.wav'
|
||||
'sound': 'ding.wav'
|
||||
},
|
||||
'priority': 'high',
|
||||
'data': <String, dynamic>{
|
||||
@@ -455,7 +463,7 @@ class FirebaseMessagesController extends GetxController {
|
||||
// }
|
||||
|
||||
void sendNotificationToPassengerToken(
|
||||
String title, body, token, List<String> map) async {
|
||||
String title, body, token, List<String> map, String tone) async {
|
||||
try {
|
||||
final response = await http.post(
|
||||
Uri.parse('https://fcm.googleapis.com/fcm/send'),
|
||||
@@ -467,7 +475,7 @@ class FirebaseMessagesController extends GetxController {
|
||||
'notification': <String, dynamic>{
|
||||
'title': title,
|
||||
'body': body,
|
||||
'sound': 'tone2.wav'
|
||||
'sound': tone
|
||||
},
|
||||
'data': {
|
||||
'passengerList': map,
|
||||
@@ -489,7 +497,7 @@ class FirebaseMessagesController extends GetxController {
|
||||
}
|
||||
|
||||
void sendNotificationToAnyWithoutData(
|
||||
String title, String body, String token) async {
|
||||
String title, String body, String token, String tone) async {
|
||||
try {
|
||||
final response = await http.post(
|
||||
Uri.parse('https://fcm.googleapis.com/fcm/send'),
|
||||
@@ -501,7 +509,7 @@ class FirebaseMessagesController extends GetxController {
|
||||
'notification': <String, dynamic>{
|
||||
'title': title,
|
||||
'body': body,
|
||||
'sound': 'promo.wav'
|
||||
'sound': tone
|
||||
},
|
||||
'data': <String, dynamic>{
|
||||
'click_action': 'FLUTTER_NOTIFICATION_CLICK',
|
||||
@@ -524,8 +532,8 @@ class FirebaseMessagesController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
void sendNotificationToDriverMAP(
|
||||
String title, String body, String token, List<String> data) async {
|
||||
void sendNotificationToDriverMAP(String title, String body, String token,
|
||||
List<String> data, String tone) async {
|
||||
try {
|
||||
final response = await http.post(
|
||||
Uri.parse('https://fcm.googleapis.com/fcm/send'),
|
||||
@@ -538,7 +546,7 @@ class FirebaseMessagesController extends GetxController {
|
||||
'title': title,
|
||||
'body': body,
|
||||
// 'sound': 'tone2.wav',
|
||||
'sound': 'order.wav'
|
||||
'sound': tone
|
||||
},
|
||||
'data': {
|
||||
'DriverList': data,
|
||||
|
||||
@@ -50,6 +50,7 @@ class CallController extends GetxController {
|
||||
uid.toString(),
|
||||
remoteUid.toString(),
|
||||
],
|
||||
'iphone_ringtone.wav',
|
||||
);
|
||||
join();
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ class CRUD {
|
||||
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}',
|
||||
},
|
||||
);
|
||||
print(response.request);
|
||||
// if (response.statusCode == 200) {
|
||||
var jsonData = jsonDecode(response.body);
|
||||
if (jsonData['status'] == 'success') {
|
||||
|
||||
@@ -7,6 +7,14 @@ void showInBrowser(String url) async {
|
||||
} else {}
|
||||
}
|
||||
|
||||
Future<void> makePhoneCall(String phoneNumber) async {
|
||||
final Uri launchUri = Uri(
|
||||
scheme: 'tel',
|
||||
path: phoneNumber,
|
||||
);
|
||||
await launchUrl(launchUri);
|
||||
}
|
||||
|
||||
void launchCommunication(
|
||||
String method, String contactInfo, String message) async {
|
||||
String url;
|
||||
@@ -35,6 +43,7 @@ void launchCommunication(
|
||||
case 'phone':
|
||||
url = 'tel:$contactInfo';
|
||||
break;
|
||||
|
||||
case 'sms':
|
||||
url = 'sms:$contactInfo?body=${Uri.encodeComponent(message)}';
|
||||
break;
|
||||
|
||||
@@ -44,6 +44,7 @@ class MapPassengerController extends GetxController {
|
||||
TextEditingController wayPoint3Controller = TextEditingController();
|
||||
TextEditingController wayPoint4Controller = TextEditingController();
|
||||
TextEditingController sosPhonePassengerProfile = TextEditingController();
|
||||
TextEditingController whatsAppLocationText = TextEditingController();
|
||||
final sosFormKey = GlobalKey<FormState>();
|
||||
final increaseFeeFormKey = GlobalKey<FormState>();
|
||||
List data = [];
|
||||
@@ -111,6 +112,7 @@ class MapPassengerController extends GetxController {
|
||||
bool isDriverArrivePassenger = false;
|
||||
bool startLocationFromMap = false;
|
||||
bool isAnotherOreder = false;
|
||||
bool isWhatsAppOrder = false;
|
||||
bool passengerStartLocationFromMap = false;
|
||||
bool workLocationFromMap = false;
|
||||
bool homeLocationFromMap = false;
|
||||
@@ -472,6 +474,11 @@ class MapPassengerController extends GetxController {
|
||||
update();
|
||||
}
|
||||
|
||||
void changeIsWhatsAppOrder(bool val) {
|
||||
isWhatsAppOrder = val;
|
||||
update();
|
||||
}
|
||||
|
||||
void sendSMS(String to) async {
|
||||
// Get the driver's phone number.
|
||||
String driverPhone =
|
||||
@@ -682,10 +689,11 @@ class MapPassengerController extends GetxController {
|
||||
box.write(BoxName.passengerWalletTotal, '0');
|
||||
if (box.read(BoxName.parentTripSelected) == true) {
|
||||
FirebaseMessagesController().sendNotificationToPassengerToken(
|
||||
"Finish Monitor",
|
||||
"Finish Monitor".tr,
|
||||
"Finish Monitor".tr,
|
||||
box.read(BoxName.tokenParent),
|
||||
[],
|
||||
'order1.wav',
|
||||
);
|
||||
box.write(BoxName.parentTripSelected, false);
|
||||
box.remove(BoxName.tokenParent);
|
||||
@@ -878,6 +886,72 @@ class MapPassengerController extends GetxController {
|
||||
}));
|
||||
}
|
||||
|
||||
Map<String, double>? extractCoordinatesFromWhatsAppLink(String link) {
|
||||
try {
|
||||
Uri uri = Uri.parse(link);
|
||||
|
||||
if (uri.host == 'maps.google.com') {
|
||||
String? query = uri.queryParameters['q'];
|
||||
|
||||
if (query != null) {
|
||||
List<String> coordinates = query.split(',');
|
||||
|
||||
if (coordinates.length == 2) {
|
||||
double latitude = double.parse(coordinates[0]);
|
||||
double longitude = double.parse(coordinates[1]);
|
||||
|
||||
return {
|
||||
'latitude': latitude,
|
||||
'longitude': longitude,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error parsing WhatsApp location link: $e');
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
double latitudeWhatsApp = 0;
|
||||
double longitudeWhatsApp = 0;
|
||||
void handleWhatsAppLink(String link) {
|
||||
Map<String, double>? coordinates = extractCoordinatesFromWhatsAppLink(link);
|
||||
|
||||
if (coordinates != null) {
|
||||
latitudeWhatsApp = coordinates['latitude']!;
|
||||
longitudeWhatsApp = coordinates['longitude']!;
|
||||
|
||||
print(
|
||||
'Extracted coordinates: Lat: $latitudeWhatsApp, Long: $longitudeWhatsApp');
|
||||
// Use these coordinates in your app as needed
|
||||
} else {
|
||||
print('Failed to extract coordinates from the link');
|
||||
}
|
||||
}
|
||||
|
||||
// Example usage
|
||||
void someFunction() {
|
||||
String whatsAppLink = 'https://maps.google.com/maps?q=37.4220,-122.0841';
|
||||
handleWhatsAppLink(whatsAppLink);
|
||||
}
|
||||
|
||||
void goToWhatappLocation() async {
|
||||
if (sosFormKey.currentState!.validate()) {
|
||||
changeIsWhatsAppOrder(true);
|
||||
Get.back();
|
||||
handleWhatsAppLink(whatsAppLocationText.text);
|
||||
myDestination = LatLng(latitudeWhatsApp, longitudeWhatsApp);
|
||||
await mapController?.animateCamera(CameraUpdate.newLatLng(
|
||||
LatLng(passengerLocation.latitude, passengerLocation.longitude)));
|
||||
changeMainBottomMenuMap();
|
||||
passengerStartLocationFromMap = true;
|
||||
isPickerShown = true;
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
int currentTimeSearchingCaptainWindow = 0;
|
||||
late String driverPhone = '';
|
||||
late String driverRate = '';
|
||||
@@ -939,7 +1013,8 @@ class MapPassengerController extends GetxController {
|
||||
'carType': box.read(BoxName.carType),
|
||||
"price_for_driver": totalPassenger.toString(),
|
||||
"price_for_passenger": totalME.toString(),
|
||||
"distance": distance.toString()
|
||||
"distance": distance.toString(),
|
||||
"paymentMethod": paymentController.isWalletChecked.toString(),
|
||||
}).then((value) {
|
||||
// List<String> body = [
|
||||
rideId = jsonDecode(value)['message'];
|
||||
@@ -987,12 +1062,15 @@ class MapPassengerController extends GetxController {
|
||||
passengerRate.toStringAsFixed(2),
|
||||
]; //
|
||||
FirebaseMessagesController().sendNotificationToDriverMAP(
|
||||
'Order',
|
||||
jsonDecode(value)['message'].toString(),
|
||||
dataCarsLocationByPassenger['message'][carsOrder]['token'].toString(),
|
||||
body,
|
||||
// polylineCoordinates.toString()
|
||||
);
|
||||
'Order'.tr,
|
||||
jsonDecode(value)['message'].toString(),
|
||||
dataCarsLocationByPassenger['message'][carsOrder]['token']
|
||||
.toString(),
|
||||
body,
|
||||
'order.wav'
|
||||
|
||||
// polylineCoordinates.toString()
|
||||
);
|
||||
});
|
||||
delayAndFetchRideStatus(rideId);
|
||||
if (shouldFetch == false) {
|
||||
@@ -1188,9 +1266,11 @@ class MapPassengerController extends GetxController {
|
||||
driversToken.remove(driverToken);
|
||||
for (var i = 1; i < driversToken.length; i++) {
|
||||
FirebaseMessagesController().sendNotificationToAnyWithoutData(
|
||||
'Order Applied',
|
||||
'$driverName Apply order\nTake attention in other order'.tr,
|
||||
driversToken[i]);
|
||||
'Order Applied',
|
||||
'$driverName Apply order\nTake attention in other order'.tr,
|
||||
driversToken[i],
|
||||
'start.wav',
|
||||
);
|
||||
}
|
||||
// }
|
||||
}
|
||||
@@ -1212,6 +1292,26 @@ class MapPassengerController extends GetxController {
|
||||
'northeastLat': bounds.northeast.latitude.toString(),
|
||||
'northeastLon': bounds.northeast.longitude.toString(),
|
||||
});
|
||||
} else if (box.read(BoxName.carType) == 'Speed') {
|
||||
res = await CRUD().get(
|
||||
link: AppLink.getCarsLocationByPassengerSpeed,
|
||||
payload: {
|
||||
'southwestLat': bounds.southwest.latitude.toString(),
|
||||
'southwestLon': bounds.southwest.longitude.toString(),
|
||||
'northeastLat': bounds.northeast.latitude.toString(),
|
||||
'northeastLon': bounds.northeast.longitude.toString(),
|
||||
},
|
||||
);
|
||||
} else if (box.read(BoxName.carType) == 'Delivery') {
|
||||
res = await CRUD().get(
|
||||
link: AppLink.getCarsLocationByPassengerDelivery,
|
||||
payload: {
|
||||
'southwestLat': bounds.southwest.latitude.toString(),
|
||||
'southwestLon': bounds.southwest.longitude.toString(),
|
||||
'northeastLat': bounds.northeast.latitude.toString(),
|
||||
'northeastLon': bounds.northeast.longitude.toString(),
|
||||
},
|
||||
);
|
||||
} else {
|
||||
res = await CRUD()
|
||||
.get(link: AppLink.getCarsLocationByPassenger, payload: {
|
||||
@@ -1373,10 +1473,12 @@ class MapPassengerController extends GetxController {
|
||||
} else if (res1['status'] == 'success') {
|
||||
var tokenParent = res1['data'][0]['token'];
|
||||
FirebaseMessagesController().sendNotificationToPassengerToken(
|
||||
"Trip Monitoring",
|
||||
"Trip Monitoring".tr,
|
||||
tokenParent,
|
||||
[rideId, driverId]);
|
||||
"Trip Monitoring".tr,
|
||||
"Trip Monitoring".tr,
|
||||
tokenParent,
|
||||
[rideId, driverId],
|
||||
'order1.wav',
|
||||
);
|
||||
box.write(BoxName.parentTripSelected, true);
|
||||
box.write(BoxName.tokenParent, tokenParent);
|
||||
}
|
||||
@@ -1519,7 +1621,12 @@ class MapPassengerController extends GetxController {
|
||||
"status": 'Cancel'
|
||||
});
|
||||
FirebaseMessagesController().sendNotificationToDriverMAP(
|
||||
'Cancel Trip', 'Trip Cancelled'.tr, driverToken, []);
|
||||
'Cancel Trip'.tr,
|
||||
'Trip Cancelled'.tr,
|
||||
driverToken,
|
||||
[],
|
||||
'cancel.wav',
|
||||
);
|
||||
}
|
||||
// rideConfirm = false;
|
||||
// shouldFetch = false;
|
||||
@@ -2152,8 +2259,10 @@ class MapPassengerController extends GetxController {
|
||||
data = response['routes'][0]['legs'];
|
||||
box.remove(BoxName.tripData);
|
||||
box.write(BoxName.tripData, response);
|
||||
startNameAddress = data[0]['start_address'];
|
||||
endNameAddress = data[0]['end_address'];
|
||||
|
||||
startNameAddress = shortenAddress(data[0]['start_address']);
|
||||
print('data[0][start_address]: ${data[0]['start_address']}');
|
||||
endNameAddress = shortenAddress(data[0]['end_address']);
|
||||
isLoading = false;
|
||||
newStartPointLocation = LatLng(
|
||||
data[0]["start_location"]['lat'], data[0]["start_location"]['lng']);
|
||||
@@ -2220,6 +2329,43 @@ class MapPassengerController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
String shortenAddress(String fullAddress) {
|
||||
// Split the address into parts
|
||||
List<String> parts = fullAddress.split('،');
|
||||
|
||||
// Remove any leading or trailing whitespace from each part
|
||||
parts = parts.map((part) => part.trim()).toList();
|
||||
|
||||
// Remove any empty parts
|
||||
parts = parts.where((part) => part.isNotEmpty).toList();
|
||||
|
||||
// Initialize the short address
|
||||
String shortAddress = '';
|
||||
|
||||
// Add the first part (usually the most specific location)
|
||||
if (parts.isNotEmpty) {
|
||||
shortAddress += parts[0];
|
||||
}
|
||||
|
||||
// Add the district or area name (usually the third part in this format)
|
||||
if (parts.length > 2) {
|
||||
shortAddress += '، ${parts[2]}';
|
||||
}
|
||||
|
||||
// Add the country (usually the last part)
|
||||
if (parts.length > 1) {
|
||||
shortAddress += '، ${parts.last}';
|
||||
}
|
||||
|
||||
// Remove any part that's just numbers (like postal codes)
|
||||
shortAddress = shortAddress
|
||||
.split('،')
|
||||
.where((part) => !RegExp(r'^[0-9 ]+$').hasMatch(part.trim()))
|
||||
.join('،');
|
||||
|
||||
return shortAddress;
|
||||
}
|
||||
|
||||
double distanceOfDestination = 0;
|
||||
bool haveSteps = false;
|
||||
late LatLng latestPosition;
|
||||
|
||||
@@ -4,6 +4,15 @@ class MyTranslation extends Translations {
|
||||
@override
|
||||
Map<String, Map<String, String>> get keys => {
|
||||
"ar": {
|
||||
'Change Ride': 'تغيير الرحلة',
|
||||
'You can change the destination by long-pressing any point on the map':
|
||||
'يمكنك تغيير الوجهة بالضغط مطولاً على أي نقطة على الخريطة',
|
||||
|
||||
"WhatsApp Location Extractor": "مستخرج موقع واتساب",
|
||||
"Location Link": "رابط الموقع",
|
||||
"Paste location link here": "الصق رابط الموقع هنا",
|
||||
"Go to this location": "انتقل إلى هذا الموقع",
|
||||
"Paste WhatsApp location link here": "الصق رابط موقع واتساب هنا",
|
||||
"Pick from map destination": "حدد وجهتك على الخريطة",
|
||||
"Pick or Tap to confirm": "حدد أو انقر للتأكيد",
|
||||
"Select Order Type": "حدد نوع الطلب",
|
||||
@@ -765,6 +774,14 @@ iOS [https://getapp.cc/app/6458734951]
|
||||
"Duration is": "المدة هي",
|
||||
"Leave": "مغادرة",
|
||||
"Join": "الانضمام",
|
||||
"Heading your way now. Please be ready.":
|
||||
"في طريقي إليك الآن. يرجى الاستعداد.",
|
||||
"Approaching your area. Should be there in 3 minutes.":
|
||||
"اقترب من منطقتك. يجب أن أكون هناك خلال 3 دقائق.",
|
||||
"There's heavy traffic here. Can you suggest an alternate pickup point?":
|
||||
"هناك حركة مرور كثيفة هنا. هل يمكنك اقتراح نقطة استلام بديلة؟",
|
||||
"This ride is already taken by another driver.":
|
||||
"تم حجز هذه الرحلة من قبل سائق آخر.",
|
||||
"You Should be select reason.": "يجب أن تختار السبب.",
|
||||
" \$": " دينار ",
|
||||
"Waiting for Driver ...": "في انتظار السائق...",
|
||||
|
||||
@@ -53,8 +53,13 @@ class PassengerNotificationController extends GetxController {
|
||||
'title': title,
|
||||
'body': body,
|
||||
});
|
||||
FirebaseMessagesController()
|
||||
.sendNotificationToPassengerToken(title, body, 'token', []);
|
||||
FirebaseMessagesController().sendNotificationToPassengerToken(
|
||||
title,
|
||||
body,
|
||||
'token',
|
||||
[],
|
||||
'iphone_ringtone.wav',
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -14,7 +14,7 @@ class ProfileController extends GetxController {
|
||||
bool isloading = false;
|
||||
Map prfoileData = {};
|
||||
TextEditingController txtController = TextEditingController();
|
||||
List genders = ['Male', 'Female', 'Non-binary'];
|
||||
List genders = ['Male', 'Female', 'Other'];
|
||||
|
||||
String gender = 'Male';
|
||||
|
||||
@@ -99,6 +99,10 @@ class ProfileController extends GetxController {
|
||||
} else {
|
||||
var jsonDecoded = jsonDecode(res);
|
||||
prfoileData = jsonDecoded['data'];
|
||||
box.write(BoxName.sosPhonePassenger, prfoileData['sosPhone'].toString());
|
||||
box.write(BoxName.gender, prfoileData['gender'].toString());
|
||||
box.write(BoxName.name,
|
||||
'${prfoileData['first_name']} ${prfoileData['last_name']}');
|
||||
isloading = false;
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -71,9 +71,10 @@ class RateController extends GetxController {
|
||||
});
|
||||
if (res != 'failure') {
|
||||
FirebaseMessagesController().sendNotificationToAnyWithoutData(
|
||||
'You Have Tips',
|
||||
'You Have Tips'.tr,
|
||||
'${'${tip.toString()}\$${' tips\nTotal is'.tr}'} ${tip + (Get.find<MapPassengerController>().totalPassenger)}',
|
||||
Get.find<MapPassengerController>().driverToken.toString(),
|
||||
'ding.wav',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user