From 176f5105b11979b221c4aa32438e169b4bb6dad1 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sun, 30 Jun 2024 13:27:23 +0300 Subject: [PATCH] 6/30/1 --- android/app/build.gradle | 4 +- android/app/src/main/AndroidManifest.xml | 1 + android/app/src/main/res/raw/ding.wav | Bin 0 -> 87771 bytes ios/Runner/Info.plist | 4 +- lib/constant/box_name.dart | 1 + lib/constant/links.dart | 3 + lib/controller/auth/login_controller.dart | 3 +- lib/controller/firebase/firbase_messge.dart | 26 ++- lib/controller/functions/call_controller.dart | 1 + lib/controller/functions/crud.dart | 1 + lib/controller/functions/launch.dart | 9 + .../home/map_passenger_controller.dart | 182 ++++++++++++++++-- lib/controller/local/translations.dart | 17 ++ .../passenger_notification_controller.dart | 9 +- .../profile/profile_controller.dart | 6 +- lib/controller/rate/rate_conroller.dart | 3 +- lib/views/auth/login_page.dart | 10 +- lib/views/auth/sms_verfy_page.dart | 59 ++---- .../map_widget.dart/apply_order_widget.dart | 54 ++++-- .../map_widget.dart/call_passenger_page.dart | 5 +- .../car_details_widget_to_go.dart | 77 +++++--- .../form_search_places_destenation.dart | 3 +- .../map_widget.dart/left_main_menu_icons.dart | 38 ++-- .../map_widget.dart/main_bottom_Menu_map.dart | 101 ++++++++++ pubspec.yaml | 2 +- 25 files changed, 465 insertions(+), 154 deletions(-) create mode 100644 android/app/src/main/res/raw/ding.wav diff --git a/android/app/build.gradle b/android/app/build.gradle index 498582f..b810933 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -55,8 +55,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 23 targetSdkVersion 33 - versionCode 40 - versionName '1.5.40' + versionCode 42 + versionName '1.5.42' // manifestPlaceholders = [mapsApiKey: 'android/app/src/main/AndroidManifest.xml'] } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 87d5256..2da6c4a 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ + diff --git a/android/app/src/main/res/raw/ding.wav b/android/app/src/main/res/raw/ding.wav new file mode 100644 index 0000000000000000000000000000000000000000..c53cd501ce30486c40aaa65a8bdbab975a6e16e3 GIT binary patch literal 87771 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index df44879..187b651 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -37,11 +37,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 36 + 38 CFBundleSignature ???? CFBundleVersion - 4.3.6 + 4.3.8 FirebaseAppDelegateProxyEnabled NO GMSApiKey diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart index be53a1d..bf87d51 100644 --- a/lib/constant/box_name.dart +++ b/lib/constant/box_name.dart @@ -5,6 +5,7 @@ class BoxName { static const String tokenParent = "tokenParent"; static const String lang = "lang"; + static const String gender = "gender"; static const String carType = "carType"; static const String carPlate = "carPlate"; static const String isVerified = '0'; diff --git a/lib/constant/links.dart b/lib/constant/links.dart index 53f0045..882f52d 100644 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -163,6 +163,9 @@ class AppLink { //==================certifcate========== static String location = '$server/ride/location'; static String getCarsLocationByPassenger = "$location/get.php"; + static String getCarsLocationByPassengerSpeed = "$location/getSpeed.php"; + static String getCarsLocationByPassengerDelivery = + "$location/getDelivery.php"; static String getLocationParents = "$location/getLocationParents.php"; static String getFemalDriverLocationByPassenger = "$location/getFemalDriver.php"; diff --git a/lib/controller/auth/login_controller.dart b/lib/controller/auth/login_controller.dart index cfbfeea..a0f16a9 100644 --- a/lib/controller/auth/login_controller.dart +++ b/lib/controller/auth/login_controller.dart @@ -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: { diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart index ea36440..8bfa17f 100644 --- a/lib/controller/firebase/firbase_messge.dart +++ b/lib/controller/firebase/firbase_messge.dart @@ -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().getBeginRideFromDriver(); @@ -332,7 +338,9 @@ class FirebaseMessagesController extends GetxController { FirebaseMessagesController().sendNotificationToPassengerToken( 'Hi ,I will go now'.tr, 'I will go now'.tr, - Get.find().driverToken, []); + Get.find().driverToken, + [], + 'ding.wav'); Get.find() .startTimerDriverWaitPassenger5Minute(); @@ -412,7 +420,7 @@ class FirebaseMessagesController extends GetxController { 'notification': { 'title': title, 'body': body, - 'sound': 'start.wav' + 'sound': 'ding.wav' }, 'priority': 'high', 'data': { @@ -455,7 +463,7 @@ class FirebaseMessagesController extends GetxController { // } void sendNotificationToPassengerToken( - String title, body, token, List map) async { + String title, body, token, List 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': { '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': { 'title': title, 'body': body, - 'sound': 'promo.wav' + 'sound': tone }, 'data': { 'click_action': 'FLUTTER_NOTIFICATION_CLICK', @@ -524,8 +532,8 @@ class FirebaseMessagesController extends GetxController { } } - void sendNotificationToDriverMAP( - String title, String body, String token, List data) async { + void sendNotificationToDriverMAP(String title, String body, String token, + List 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, diff --git a/lib/controller/functions/call_controller.dart b/lib/controller/functions/call_controller.dart index 5e0a1d5..7c332a7 100644 --- a/lib/controller/functions/call_controller.dart +++ b/lib/controller/functions/call_controller.dart @@ -50,6 +50,7 @@ class CallController extends GetxController { uid.toString(), remoteUid.toString(), ], + 'iphone_ringtone.wav', ); join(); } diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart index 88b8b7e..5006ebb 100644 --- a/lib/controller/functions/crud.dart +++ b/lib/controller/functions/crud.dart @@ -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') { diff --git a/lib/controller/functions/launch.dart b/lib/controller/functions/launch.dart index eaeecd2..f80ab1f 100644 --- a/lib/controller/functions/launch.dart +++ b/lib/controller/functions/launch.dart @@ -7,6 +7,14 @@ void showInBrowser(String url) async { } else {} } +Future 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; diff --git a/lib/controller/home/map_passenger_controller.dart b/lib/controller/home/map_passenger_controller.dart index 26ebec3..be86bf3 100644 --- a/lib/controller/home/map_passenger_controller.dart +++ b/lib/controller/home/map_passenger_controller.dart @@ -44,6 +44,7 @@ class MapPassengerController extends GetxController { TextEditingController wayPoint3Controller = TextEditingController(); TextEditingController wayPoint4Controller = TextEditingController(); TextEditingController sosPhonePassengerProfile = TextEditingController(); + TextEditingController whatsAppLocationText = TextEditingController(); final sosFormKey = GlobalKey(); final increaseFeeFormKey = GlobalKey(); 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? extractCoordinatesFromWhatsAppLink(String link) { + try { + Uri uri = Uri.parse(link); + + if (uri.host == 'maps.google.com') { + String? query = uri.queryParameters['q']; + + if (query != null) { + List 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? 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 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 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; diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index 534f27c..6c1833e 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -4,6 +4,15 @@ class MyTranslation extends Translations { @override Map> 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 ...": "في انتظار السائق...", diff --git a/lib/controller/notification/passenger_notification_controller.dart b/lib/controller/notification/passenger_notification_controller.dart index 1ed0009..39a725b 100644 --- a/lib/controller/notification/passenger_notification_controller.dart +++ b/lib/controller/notification/passenger_notification_controller.dart @@ -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 diff --git a/lib/controller/profile/profile_controller.dart b/lib/controller/profile/profile_controller.dart index 73e92e3..5763af5 100644 --- a/lib/controller/profile/profile_controller.dart +++ b/lib/controller/profile/profile_controller.dart @@ -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(); } diff --git a/lib/controller/rate/rate_conroller.dart b/lib/controller/rate/rate_conroller.dart index 6297617..aa130b0 100644 --- a/lib/controller/rate/rate_conroller.dart +++ b/lib/controller/rate/rate_conroller.dart @@ -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().totalPassenger)}', Get.find().driverToken.toString(), + 'ding.wav', ); } } diff --git a/lib/views/auth/login_page.dart b/lib/views/auth/login_page.dart index 61cf9f7..015d36d 100644 --- a/lib/views/auth/login_page.dart +++ b/lib/views/auth/login_page.dart @@ -1,7 +1,5 @@ import 'dart:io'; -import 'package:SEFER/controller/home/map_passenger_controller.dart'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -88,15 +86,17 @@ class LoginPage extends StatelessWidget { if (user != null) { box.write(BoxName.passengerID, user.uid); box.write(BoxName.email, user.email); - await Get.put(LoginController()) - .loginUsingCredentials( + await controller.loginUsingCredentials( box .read(BoxName.passengerID) .toString(), box.read(BoxName.email).toString(), ); // Navigate to another screen or perform other actions - } else {} + } else { + Get.snackbar('user not found'.tr, '', + backgroundColor: AppColor.redColor); + } }, child: Container( padding: const EdgeInsets.symmetric( diff --git a/lib/views/auth/sms_verfy_page.dart b/lib/views/auth/sms_verfy_page.dart index 015108e..f2428b5 100644 --- a/lib/views/auth/sms_verfy_page.dart +++ b/lib/views/auth/sms_verfy_page.dart @@ -74,51 +74,18 @@ class SmsSignupEgypt extends StatelessWidget { height: 10, ), if (registerController.isSent) - Obx(() => Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: registerController.remainingTime > 0 - ? Column( - children: [ - Text( - '${(registerController.remainingTime / 60).floor()}:${(registerController.remainingTime % 60).toString().padLeft(2, '0')} remaining', - style: AppStyle.subtitle, - textAlign: TextAlign.center, - ), - const SizedBox(height: 8), - LinearProgressIndicator( - value: registerController.remainingTime / - 300, // Assuming 300 seconds (5 minutes) total - backgroundColor: Colors.grey[300], - valueColor: AlwaysStoppedAnimation( - Theme.of(context).primaryColor), - ), - ], - ) - : TextButton( - onPressed: () => - registerController.sendOtpMessage(), - child: Text('Resend code'.tr), - ), - ), - const SizedBox( - height: - 16), // Add some space after the timer or button - ], - )), - Padding( - padding: const EdgeInsets.all(16.0), - child: registerController.isSent - ? Form( - key: registerController.formKey3, - child: MyTextForm( - controller: registerController.verifyCode, - label: '5 digit'.tr, - hint: '5 digit'.tr, - type: TextInputType.number), - ) - : const SizedBox()), + Padding( + padding: const EdgeInsets.all(16.0), + child: registerController.isSent + ? Form( + key: registerController.formKey3, + child: MyTextForm( + controller: registerController.verifyCode, + label: '5 digit'.tr, + hint: '5 digit'.tr, + type: TextInputType.number), + ) + : const SizedBox()), // Submit button MyElevatedButton( onPressed: () async { @@ -132,7 +99,7 @@ class SmsSignupEgypt extends StatelessWidget { ); }), ], - isleading: true, + isleading: false, ); } } diff --git a/lib/views/home/map_widget.dart/apply_order_widget.dart b/lib/views/home/map_widget.dart/apply_order_widget.dart index b398f96..22bea19 100644 --- a/lib/views/home/map_widget.dart/apply_order_widget.dart +++ b/lib/views/home/map_widget.dart/apply_order_widget.dart @@ -9,6 +9,7 @@ import 'package:flutter/services.dart'; import 'package:get/get.dart'; import '../../../constant/box_name.dart'; +import '../../../controller/functions/launch.dart'; class ApplyOrderWidget extends StatelessWidget { const ApplyOrderWidget({super.key}); @@ -108,7 +109,23 @@ class ApplyOrderWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Image.asset( - 'assets/images/blob.png', + box.read(BoxName.carType) == 'Comfort' + ? 'assets/images/blob.png' + : box.read(BoxName.carType) == 'Lady' + ? 'assets/images/lady.png' // Assuming there's an image for Lady + : box.read(BoxName.carType) == 'Speed' + ? 'assets/images/carspeed.png' + : box.read(BoxName.carType) == + 'Delivery' + ? 'assets/images/moto.png' + : box.read(BoxName.carType) == + 'Mashwari' + ? 'assets/images/freeRide.png' + : box.read(BoxName + .carType) == + 'Rayeh Gai' + ? 'assets/images/roundtrip.png' + : 'assets/images/carspeed.png', // Default image if none of the above width: 80, ), Column( @@ -176,11 +193,12 @@ class ApplyOrderWidget extends StatelessWidget { onTap: () { FirebaseMessagesController() .sendNotificationToAnyWithoutData( - 'message From passenger', - 'Hello, I\'m at the agreed-upon location' - .tr, - controller - .driverToken); + 'message From passenger', + 'Hello, I\'m at the agreed-upon location' + .tr, + controller.driverToken, + 'ding.wav', + ); Get.back(); }, child: Container( @@ -202,11 +220,12 @@ class ApplyOrderWidget extends StatelessWidget { onTap: () { FirebaseMessagesController() .sendNotificationToAnyWithoutData( - 'message From passenger', - 'My location is correct. You can search for me using the navigation app' - .tr, - controller - .driverToken); + 'message From passenger', + 'My location is correct. You can search for me using the navigation app' + .tr, + controller.driverToken, + 'ding.wav', + ); Get.back(); }, child: Container( @@ -228,11 +247,11 @@ class ApplyOrderWidget extends StatelessWidget { onTap: () { FirebaseMessagesController() .sendNotificationToAnyWithoutData( - 'message From passenger', - 'I\'m waiting for you' - .tr, - controller - .driverToken); + 'message From passenger', + 'I\'m waiting for you'.tr, + controller.driverToken, + 'ding.wav', + ); Get.back(); }, child: Container( @@ -260,10 +279,11 @@ class ApplyOrderWidget extends StatelessWidget { ), ), IconButton( - onPressed: () { + onPressed: () async { HapticFeedback.heavyImpact(); // Get.to(() => const CallPage()); // Get.to(() => PassengerCallPage()); + makePhoneCall(controller.driverPhone); }, icon: const Icon( Icons.call, diff --git a/lib/views/home/map_widget.dart/call_passenger_page.dart b/lib/views/home/map_widget.dart/call_passenger_page.dart index b6fc978..62730c1 100644 --- a/lib/views/home/map_widget.dart/call_passenger_page.dart +++ b/lib/views/home/map_widget.dart/call_passenger_page.dart @@ -180,9 +180,7 @@ class _PassengerCallPageState extends State { status, style: AppStyle.title, ), - Text(Get.find() - .driverName - .toString()), + Text('Driver Name'), ], ), GestureDetector( @@ -193,6 +191,7 @@ class _PassengerCallPageState extends State { 'Call End', Get.find().driverToken, [], + 'iphone_ringtone.wav', ); leave(); Get.back(); diff --git a/lib/views/home/map_widget.dart/car_details_widget_to_go.dart b/lib/views/home/map_widget.dart/car_details_widget_to_go.dart index 31859d7..fa0ddcd 100644 --- a/lib/views/home/map_widget.dart/car_details_widget_to_go.dart +++ b/lib/views/home/map_widget.dart/car_details_widget_to_go.dart @@ -2,7 +2,9 @@ import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/style.dart'; import 'package:SEFER/main.dart'; +import 'package:SEFER/views/home/profile/passenger_profile_page.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; +import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -440,11 +442,22 @@ class CarDetailsTypeToChoose extends StatelessWidget { title: 'Next'.tr, onPressed: () { Get.back(); - mapPassengerController - .isBottomSheetShown = false; - mapPassengerController.update(); - mapPassengerController - .changeCashConfirmPageShown(); + if (box.read(BoxName.gender) != + null) { + mapPassengerController + .isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController + .changeCashConfirmPageShown(); + } else { + MyDialog().getDialog( + 'Idintify gender', + 'You should ideintify your gender for this type of trip!' + .tr, () { + Get.to(() => + PassengerProfilePage()); + }); + } }), cancel: MyElevatedButton( title: 'Cancel'.tr, @@ -577,32 +590,35 @@ class HeaderDestination extends StatelessWidget { mapPassengerController.isBottomSheetShown && mapPassengerController.rideConfirm == false ? Positioned( - top: Get.height * .1, + top: Get.height * .08, left: 5, right: 5, child: Container( decoration: AppStyle.boxDecoration1, - height: box.read(BoxName.countryCode) == 'Egypt' - ? Get.height * .2 - : Get.height * .14, + height: Get.height * .1, width: Get.width * .8, child: InkWell( onTap: () { - mapPassengerController - .getDialog('Are you want to change'.tr, '', () { + // mapPassengerController + // .getDialog('Are you want to change'.tr, '', () { + // Get.back(); + // mapPassengerController.cancelRide(); + // }); + MyDialog().getDialog( + 'Change Ride'.tr, + 'You can change the destination by long-pressing any point on the map' + .tr, () { Get.back(); - mapPassengerController.cancelRide(); }); }, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.symmetric( + horizontal: 8, vertical: 2), child: SizedBox( - height: box.read(BoxName.countryCode) == 'Egypt' - ? Get.height * .14 - : Get.height * .06, + height: Get.height * .06, child: ListView( // crossAxisAlignment: CrossAxisAlignment.start, // @@ -616,7 +632,7 @@ class HeaderDestination extends StatelessWidget { style: AppStyle.subtitle, ), SizedBox( - height: Get.height * .06, + // height: Get.height * .03, width: Get.width * .8, child: Text( mapPassengerController.startNameAddress, @@ -634,7 +650,7 @@ class HeaderDestination extends StatelessWidget { style: AppStyle.subtitle, ), SizedBox( - height: Get.height * .06, + // height: Get.height * .03, width: Get.width * .8, child: Text( mapPassengerController.endNameAddress, @@ -647,13 +663,24 @@ class HeaderDestination extends StatelessWidget { ), ), ), - Row( - children: [ - Text( - '📍 ${mapPassengerController.distance} ${'KM'.tr} ⌛ ${mapPassengerController.hours > 0 ? '${'Your Ride Duration is '.tr}${mapPassengerController.hours} ${'H and'.tr} ${mapPassengerController.minutes} ${'m'.tr}' : '${'Your Ride Duration is '.tr} ${mapPassengerController.minutes} ${'m'.tr}'}', - style: AppStyle.subtitle, - ), - ], + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '📍 ', + style: AppStyle.subtitle, + ), + SizedBox( + width: Get.width * .8, + child: Text( + '${mapPassengerController.distance} ${'KM'.tr} ⌛ ${mapPassengerController.hours > 0 ? '${'Your Ride Duration is '.tr}${mapPassengerController.hours} ${'H and'.tr} ${mapPassengerController.minutes} ${'m'.tr}' : '${'Your Ride Duration is '.tr} ${mapPassengerController.minutes} ${'m'.tr}'}', + style: AppStyle.subtitle, + ), + ), + ], + ), ), ], ), diff --git a/lib/views/home/map_widget.dart/form_search_places_destenation.dart b/lib/views/home/map_widget.dart/form_search_places_destenation.dart index e8a7fbe..525e642 100644 --- a/lib/views/home/map_widget.dart/form_search_places_destenation.dart +++ b/lib/views/home/map_widget.dart/form_search_places_destenation.dart @@ -134,7 +134,8 @@ GetBuilder formSearchPlacesDestenation() { }, onLongPress: () { Get.defaultDialog( - title: 'Do you want to change Work location', + title: + 'Do you want to change Work location'.tr, middleText: '', confirm: MyElevatedButton( title: 'Yes'.tr, diff --git a/lib/views/home/map_widget.dart/left_main_menu_icons.dart b/lib/views/home/map_widget.dart/left_main_menu_icons.dart index ffd800c..120ba26 100644 --- a/lib/views/home/map_widget.dart/left_main_menu_icons.dart +++ b/lib/views/home/map_widget.dart/left_main_menu_icons.dart @@ -4,6 +4,7 @@ import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../../../constant/box_name.dart'; import '../../../constant/colors.dart'; +import '../../../controller/functions/launch.dart'; import '../../../controller/functions/tts.dart'; import '../../../controller/home/map_passenger_controller.dart'; @@ -82,26 +83,23 @@ GetBuilder leftMainMenuIcons() { const SizedBox( width: 5, ), - // AnimatedContainer( - // duration: const Duration(microseconds: 200), - // width: controller.widthMapTypeAndTraffic, - // decoration: BoxDecoration( - // color: AppColor.secondaryColor, - // border: Border.all(), - // borderRadius: BorderRadius.circular(15)), - // child: IconButton( - // onPressed: () async { - // // AudioRecorderController audioController = - // // Get.put(AudioRecorderController()); - // // sql.deleteAllData(TableName.recentLocations); - // // await audioController.startRecording(); - // }, - // icon: const Icon( - // Icons.voice_chat, - // size: 29, - // ), - // ), - // ), + AnimatedContainer( + duration: const Duration(microseconds: 200), + width: controller.widthMapTypeAndTraffic, + decoration: BoxDecoration( + color: AppColor.secondaryColor, + border: Border.all(), + borderRadius: BorderRadius.circular(15)), + child: IconButton( + onPressed: () async { + makePhoneCall('+201023248456'); + }, + icon: const Icon( + Icons.voice_chat, + size: 29, + ), + ), + ), // AnimatedContainer( // duration: const Duration(microseconds: 200), // width: controller.widthMapTypeAndTraffic, diff --git a/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart b/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart index 211e062..3acfe04 100644 --- a/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart +++ b/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart @@ -1,3 +1,4 @@ +import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -139,6 +140,92 @@ class MainBottomMenuMap extends StatelessWidget { // }), //todo If you want add stop click here + InkWell( + onTap: () { + Get.dialog( + Dialog( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(16)), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'WhatsApp Location Extractor' + .tr, + style: AppStyle.title, + ), + const SizedBox(height: 16), + Form( + key: controller.sosFormKey, + child: Column( + children: [ + MyTextForm( + controller: controller + .whatsAppLocationText, + label: + 'Location Link'.tr, + hint: + 'Paste location link here' + .tr, + type: TextInputType.url, + ), + const SizedBox( + height: 16), + MyElevatedButton( + title: + 'Go to this location' + .tr, + onPressed: () async { + controller + .goToWhatappLocation(); + }, + ) + ], + ), + ), + ], + ), + ), + ), + ); + }, + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Colors.blue[300]!, + Colors.blue[600]! + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Colors.black26, + offset: Offset(0, 4), + blurRadius: 5.0, + ), + ], + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + 'Paste WhatsApp location link here' + .tr, + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + ), + ), + ), CupertinoButton( child: Text( !controller.isAnotherOreder @@ -358,6 +445,20 @@ class MainBottomMenuMap extends StatelessWidget { Get.back(); })); } else {} + if (controller.isWhatsAppOrder == true) { + Get.defaultDialog( + title: 'Destination selected'.tr, + titleStyle: AppStyle.title, + content: Text( + 'Now select start pick'.tr, + style: AppStyle.title, + ), + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () { + Get.back(); + })); + } else {} } controller.placesDestination = []; diff --git a/pubspec.yaml b/pubspec.yaml index 1ac0380..50b95cb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: http: ^0.13.6 get: ^4.6.5 get_storage: ^2.1.1 - url_launcher: ^6.1.12 + url_launcher: ^6.1.20 location: ^5.0.2+1 google_polyline_algorithm: ^3.1.0 animated_text_kit: ^4.2.2