From d423cc083122392a9e50e9b69a7c7dbf75e1f59e Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sun, 30 Jun 2024 12:35:55 +0300 Subject: [PATCH] 6/30/1 --- .env | 2 +- android/app/build.gradle | 8 +- android/app/src/main/res/raw/ding.wav | Bin 0 -> 87771 bytes ios/Runner.xcodeproj/project.pbxproj | 4 + ios/Runner/Info.plist | 4 +- lib/constant/api_key.dart | 3 +- lib/constant/box_name.dart | 1 + lib/constant/links.dart | 2 + .../auth/captin/login_captin_controller.dart | 98 +--- .../captin/register_captin_controller.dart | 14 +- lib/controller/firebase/firbase_messge.dart | 41 +- lib/controller/functions/crud.dart | 11 +- lib/controller/functions/gemeni.dart | 3 + lib/controller/functions/launch.dart | 8 + lib/controller/functions/upload_image.dart | 1 + .../home/captin/map_driver_controller.dart | 35 +- .../home/captin/order_request_controller.dart | 31 +- .../payment/captain_wallet_controller.dart | 12 +- lib/controller/local/translations.dart | 17 +- .../passenger_notification_controller.dart | 2 +- lib/controller/rate/rate_conroller.dart | 11 +- .../Captin/home_captain/widget/call_page.dart | 10 +- .../widget/left_menu_map_captain.dart | 4 +- .../passenger_info_window.dart | 136 +++++- .../orderCaptin/order_request_page.dart | 27 +- .../orderCaptin/order_speed_request.dart | 50 +- .../notification/available_rides_page.dart | 434 +++++++++--------- 27 files changed, 517 insertions(+), 452 deletions(-) create mode 100644 android/app/src/main/res/raw/ding.wav diff --git a/.env b/.env index 07042e8..d0621d2 100644 --- a/.env +++ b/.env @@ -30,7 +30,7 @@ passwordPayMob='g@nkD2#99!hD_.wXrXlBl' integrationIdPayMob=0237730XrXlBl payMobApikey='MDrGqKEWS1rVqHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=XrXlBl' integrationIdPayMobWallet=0237739XrXlBl -ocpApimSubscriptionKey=17373j50x53u07q0830634f512j731yuXrXlBl +ocpApimSubscriptionKey=0f5dacccdbce4131b1a5f952996302e3 smsPasswordEgypt="J)Vh=qb/@MXrXlBl" chatGPTkeySeferNew4=zg-vlie-2l1ZlpxiLJ6wQOvbb4TnC9XrxgUEyVQIu6TID4qP4FUUqoS5XrXlBl anthropicAIkeySeferNew=zg-qbc-qvo39-n4VdMQ5nuJeIYhMN4PDYr7qox3-t2i1Lh7aNTDfYF-Gf8whUJZCs47EeelKn8_UcmUMmiSLaf0UJg0DvUlQrDt-76CRrkQQXrXlBl diff --git a/android/app/build.gradle b/android/app/build.gradle index 9a56511..db05599 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -32,7 +32,7 @@ def keystorePropertiesFile = rootProject.file('key.properties') android { namespace "com.sefer_driver" - compileSdkVersion 34 + compileSdkVersion 33 ndkVersion flutter.ndkVersion compileOptions { @@ -54,9 +54,9 @@ android { // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 23 - targetSdkVersion flutter.targetSdkVersion - versionCode 40 - versionName '1.5.40' + targetSdkVersion 33 + versionCode 43 + versionName '1.5.43' // manifestPlaceholders = [mapsApiKey: 'android/app/src/main/AndroidManifest.xml'] } 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.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 4735433..e6ef576 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ C624C4682BD56D34002834AF /* cancel.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4602BD56D34002834AF /* cancel.wav */; }; C624C4692BD56D34002834AF /* iphone_ringtone.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4612BD56D34002834AF /* iphone_ringtone.wav */; }; C624C46A2BD56D34002834AF /* order1.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4622BD56D34002834AF /* order1.wav */; }; + C628BC3F2C31427000E4D33B /* ding.wav in Resources */ = {isa = PBXBuildFile; fileRef = C628BC3E2C31427000E4D33B /* ding.wav */; }; C690B4752A80554500E1D66E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C690B4742A80554500E1D66E /* GoogleService-Info.plist */; }; C6B15AA12B5FB24600746405 /* order.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15A9F2B5FB24600746405 /* order.wav */; }; C6B15AA22B5FB24600746405 /* tone2.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15AA02B5FB24600746405 /* tone2.wav */; }; @@ -78,6 +79,7 @@ C624C4602BD56D34002834AF /* cancel.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = cancel.wav; path = ../../android/app/src/main/res/raw/cancel.wav; sourceTree = ""; }; C624C4612BD56D34002834AF /* iphone_ringtone.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = iphone_ringtone.wav; path = ../../android/app/src/main/res/raw/iphone_ringtone.wav; sourceTree = ""; }; C624C4622BD56D34002834AF /* order1.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = order1.wav; path = ../../android/app/src/main/res/raw/order1.wav; sourceTree = ""; }; + C628BC3E2C31427000E4D33B /* ding.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ding.wav; path = ../../android/app/src/main/res/raw/ding.wav; sourceTree = ""; }; C690B4742A80554500E1D66E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; C69588332A8C1F6B00C3AC67 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; C6B15A9F2B5FB24600746405 /* order.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = order.wav; sourceTree = ""; }; @@ -167,6 +169,7 @@ C6B15AA02B5FB24600746405 /* tone2.wav */, C624C4602BD56D34002834AF /* cancel.wav */, C624C4612BD56D34002834AF /* iphone_ringtone.wav */, + C628BC3E2C31427000E4D33B /* ding.wav */, C624C4622BD56D34002834AF /* order1.wav */, C624C45F2BD56D34002834AF /* promo.wav */, C624C45D2BD56D34002834AF /* start.wav */, @@ -297,6 +300,7 @@ C624C4682BD56D34002834AF /* cancel.wav in Resources */, C6B15AA12B5FB24600746405 /* order.wav in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + C628BC3F2C31427000E4D33B /* ding.wav in Resources */, C690B4752A80554500E1D66E /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, C624C4692BD56D34002834AF /* iphone_ringtone.wav in Resources */, diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 3101804..780b27e 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -21,7 +21,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 37 + 40 CFBundleSignature ???? CFBundleURLTypes @@ -36,7 +36,7 @@ CFBundleVersion - 4.0.37 + 4.0.40 FirebaseAppDelegateProxyEnabled NO GMSApiKey diff --git a/lib/constant/api_key.dart b/lib/constant/api_key.dart index f8ae211..d49b40b 100644 --- a/lib/constant/api_key.dart +++ b/lib/constant/api_key.dart @@ -54,8 +54,7 @@ class AK { a.r(a.r(a.r(Env.integrationIdPayMobWallet, cn), cC), cs); static final String smsPasswordEgypt = a.r(a.r(a.r(Env.smsPasswordEgypt, cn), cC), cs); - static final String ocpApimSubscriptionKey = - a.r(a.r(a.r(Env.ocpApimSubscriptionKey, cn), cC), cs); + static final String ocpApimSubscriptionKey = Env.ocpApimSubscriptionKey; static final String chatGPTkeySeferNew4 = a.r(a.r(a.r(Env.chatGPTkeySeferNew4, cn), cC), cs); static final String anthropicAIkeySeferNew = diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart index f8c9b44..dc7a43f 100644 --- a/lib/constant/box_name.dart +++ b/lib/constant/box_name.dart @@ -4,6 +4,7 @@ class BoxName { static const String googlaMapApp = "googlaMapApp"; static const String lang = "lang"; + static const String gender = "gender"; static const String carType = "carType"; static const String deviceInfo = "deviceInfo"; static const String phoneVerified = "phoneVerified"; diff --git a/lib/constant/links.dart b/lib/constant/links.dart index df70f6b..58ffee1 100644 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -96,6 +96,8 @@ class AppLink { //-----------------Driver NotificationCaptain------------------ static String addNotificationCaptain = "$ride/notificationCaptain/add.php"; static String addWaitingRide = "$ride/notificationCaptain/addWaitingRide.php"; + static String updateWaitingRide = + "$ride/notificationCaptain/updateWaitingTrip.php"; static String getRideWaiting = "$ride/notificationCaptain/getRideWaiting.php"; static String getNotificationCaptain = "$ride/notificationCaptain/get.php"; static String updateNotificationCaptain = diff --git a/lib/controller/auth/captin/login_captin_controller.dart b/lib/controller/auth/captin/login_captin_controller.dart index bd2e052..91e4488 100644 --- a/lib/controller/auth/captin/login_captin_controller.dart +++ b/lib/controller/auth/captin/login_captin_controller.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/controller/functions/location_background_controller.dart'; import 'package:SEFER/views/auth/captin/cards/sms_signup.dart'; +import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get/get.dart'; @@ -48,68 +49,6 @@ class LoginDriverController extends GetxController { update(); } - void login() async { - isloading = true; - update(); - var res = await CRUD().get(link: AppLink.loginCaptin, payload: { - 'email': emailController.text, - 'phone': phoneController.text, - 'password': passwordController.text - }); - if (res == 'failure') { - //Failure - isloading = false; - update(); - Get.snackbar('Failure', '', backgroundColor: Colors.red); - } else { - var jsonDecoeded = jsonDecode(res); - if (jsonDecoeded.isNotEmpty) { - if (jsonDecoeded['status'] == 'success') { - if (jsonDecoeded['data'][0]['verified'] == 1) { - box.write(BoxName.driverID, jsonDecoeded['data'][0]['id']); - box.write(BoxName.emailDriver, jsonDecoeded['data'][0]['email']); - box.write( - BoxName.nameDriver, jsonDecoeded['data'][0]['first_name']); - box.write(BoxName.phoneDriver, jsonDecoeded['data'][0]['phone']); - SecureStorage() - .saveData(BoxName.passwordDriver, passwordController.text); - Get.offAll(() => HomeCaptain()); - isloading = false; - update(); - await CRUD().post(link: AppLink.addTokensDriver, payload: { - 'token': box.read(BoxName.tokenDriver), - 'captain_id': box.read(BoxName.driverID).toString() - }); - } else { - isloading = false; - update(); - Get.defaultDialog( - title: 'You must Verify email !.'.tr, - middleText: '', - backgroundColor: Colors.yellow[300], - onConfirm: () async { - int randomNumber = Random().nextInt(100000) + 1; - await CRUD().post(link: AppLink.sendVerifyEmail, payload: { - 'email': emailController.text, - 'token': randomNumber.toString(), - }); - Get.to(() => VerifyEmailCaptainPage()); - }, - ); - } - } else if (jsonDecoeded['status'] == 'Failure') { - Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'], - backgroundColor: Colors.redAccent); - isloading = false; - update(); - } - } else { - isloading = false; - update(); - } - } - } - loginUsingCredentials(String driverID, email) async { isloading = true; update(); @@ -129,6 +68,7 @@ class LoginDriverController extends GetxController { if (jsonDecoeded['status'] == 'success' && jsonDecoeded['data'][0]['is_verified'] == 1) { box.write(BoxName.emailDriver, jsonDecoeded['data'][0]['email']); + box.write(BoxName.gender, jsonDecoeded['data'][0]['gender']); box.write(BoxName.phoneVerified, jsonDecoeded['data'][0]['is_verified'].toString()); box.write(BoxName.phoneDriver, jsonDecoeded['data'][0]['phone']); @@ -150,14 +90,23 @@ class LoginDriverController extends GetxController { box.read(BoxName.tokenDriver)) { Get.put(FirebaseMessagesController()) .sendNotificationToAnyWithoutData( - 'token change', - 'change device', - jsonDecode(token)['data'][0]['token'].toString(), - ); - await CRUD().post(link: AppLink.addTokensDriver, payload: { - 'token': box.read(BoxName.tokenDriver), - 'captain_id': box.read(BoxName.driverID).toString() - }); + 'token change'.tr, + 'change device'.tr, + jsonDecode(token)['data'][0]['token'].toString(), + 'promo.wav'); + Get.defaultDialog( + title: 'you will use this device?'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () async { + await CRUD() + .post(link: AppLink.addTokensDriver, payload: { + 'token': box.read(BoxName.tokenDriver), + 'captain_id': box.read(BoxName.driverID).toString() + }); + Get.back(); + })); } } @@ -184,13 +133,4 @@ class LoginDriverController extends GetxController { 'captain_id': box.read(BoxName.driverID).toString() }); } - - @override - void onInit() async { - super.onInit(); - - // if (box.read(BoxName.driverID).toString() != null) { - // loginByBoxData(); - // } - } } diff --git a/lib/controller/auth/captin/register_captin_controller.dart b/lib/controller/auth/captin/register_captin_controller.dart index d2810db..44dc978 100644 --- a/lib/controller/auth/captin/register_captin_controller.dart +++ b/lib/controller/auth/captin/register_captin_controller.dart @@ -111,12 +111,14 @@ class RegisterCaptainController extends GetxController { box.write(BoxName.phoneDriver, '+2${phoneController.text}'); box.write(BoxName.phoneVerified, 1); - var res1 = await CRUD().post( - link: AppLink.updateAccountBank, - payload: {'phone': '+2${phoneController.text}'}); - if (jsonDecode(res1)['status'] == 'success') { - Get.to(EgyptCardAI()); - } + // var res1 = await CRUD().post( + // link: AppLink.updateAccountBank, + // payload: {'phone': '+2${phoneController.text}'}); + // if (res1 != 'failure') { + Get.to(EgyptCardAI()); + // } else { + // Get.snackbar('title', 'message'); + // } } } } diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart index 7e22f98..efd5ab2 100644 --- a/lib/controller/firebase/firbase_messge.dart +++ b/lib/controller/firebase/firbase_messge.dart @@ -90,9 +90,9 @@ class FirebaseMessagesController extends GetxController { } void fireBaseTitles(RemoteMessage message) { - if (message.notification!.title! == 'Order') { + if (message.notification!.title! == 'Order'.tr) { if (Platform.isAndroid) { - NotificationController().showNotification('Order', '', 'order'); + NotificationController().showNotification('Order'.tr, '', 'order'); } var myListString = message.data['DriverList']; // var points = message.data['PolylineJson']; @@ -109,27 +109,27 @@ class FirebaseMessagesController extends GetxController { // 'PolylineJson': myPoints, 'body': message.notification!.body }); - } else if (message.notification!.title == 'Cancel Trip') { + } else if (message.notification!.title == 'Cancel Trip'.tr) { NotificationController().showNotification( 'Cancel Trip'.tr, 'Passenger Cancel Trip'.tr, 'cancel'); cancelTripDialog(); - } else if (message.notification!.title! == 'token change') { + } else if (message.notification!.title! == 'token change'.tr) { NotificationController() - .showNotification('token change', 'token change', 'cancel'); + .showNotification('token change'.tr, 'token change', 'cancel'); GoogleSignInHelper.signOut(); - } else if (message.notification!.title! == 'message From passenger') { + } else if (message.notification!.title! == 'message From passenger'.tr) { NotificationController() .showNotification('message From passenger'.tr, ''.tr, 'tone2'); passengerDialog(message.notification!.body!); update(); - } else if (message.notification!.title! == 'Hi ,I will go now') { + } else if (message.notification!.title! == 'Hi ,I will go now'.tr) { // Get.snackbar('Hi ,I will go now', '', // backgroundColor: AppColor.greenColor); NotificationController().showNotification( 'Passenger come to you'.tr, 'Hi ,I will go now'.tr, 'tone2'); update(); - } else if (message.notification!.title! == 'Call Income') { + } else if (message.notification!.title! == 'Call Income'.tr) { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; @@ -147,7 +147,8 @@ class FirebaseMessagesController extends GetxController { // remoteID: driverList[2].toString(), // )); } catch (e) {} - } else if (message.notification!.title! == 'Call Income from Passenger') { + } else if (message.notification!.title! == + 'Call Income from Passenger'.tr) { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; @@ -165,7 +166,7 @@ class FirebaseMessagesController extends GetxController { // remoteID: driverList[2].toString(), )); } catch (e) {} - } else if (message.notification!.title! == 'Call End') { + } else if (message.notification!.title! == 'Call End'.tr) { try { var myListString = message.data['passengerList']; var driverList = jsonDecode(myListString) as List; @@ -179,7 +180,7 @@ class FirebaseMessagesController extends GetxController { // Assuming GetMaterialApp is initialized and context is valid for navigation Get.off(const CallPage()); } catch (e) {} - } else if (message.notification!.title! == 'Order Applied') { + } else if (message.notification!.title! == 'Order Applied'.tr) { Get.snackbar( "The order has been accepted by another driver." .tr, // Corrected grammar @@ -202,7 +203,7 @@ class FirebaseMessagesController extends GetxController { // 'PolylineJson': myPoints, 'body': message.notification!.body }); - } else if (message.notification!.title! == 'Order Applied') { + } else if (message.notification!.title! == 'Order Applied'.tr) { NotificationController().showNotification( 'The order Accepted by another Driver'.tr, 'We regret to inform you that another driver has accepted this order.' @@ -361,7 +362,7 @@ class FirebaseMessagesController extends GetxController { 'notification': { 'title': title, 'body': body, - 'sound': 'start.wav' + 'sound': 'ding.wav' }, 'priority': 'high', 'data': { @@ -404,7 +405,7 @@ class FirebaseMessagesController extends GetxController { // } //android/app/src/main/res/raw/iphone_ringtone.wav 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'), @@ -416,7 +417,7 @@ class FirebaseMessagesController extends GetxController { 'notification': { 'title': title, 'body': body, - 'sound': 'tone2.wav' + 'sound': tone }, 'data': { 'passengerList': map, @@ -472,7 +473,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'), @@ -484,7 +485,7 @@ class FirebaseMessagesController extends GetxController { 'notification': { 'title': title, 'body': body, - 'sound': 'promo.wav' + 'sound': tone }, 'data': { 'click_action': 'FLUTTER_NOTIFICATION_CLICK', @@ -507,8 +508,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'), @@ -521,7 +522,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/crud.dart b/lib/controller/functions/crud.dart index 5331f22..d31ea1a 100644 --- a/lib/controller/functions/crud.dart +++ b/lib/controller/functions/crud.dart @@ -98,6 +98,7 @@ class CRUD { await arabicTextExtractByVisionAndAI(imagePath: imagePath); var json = jsonDecode(extractedString); var textValues = extractTextFromLines(json); + print(textValues); // await Get.put(AI()).geminiAiExtraction(prompt, textValues); await Get.put(AI()).anthropicAI(textValues, prompt, imagePath); } @@ -129,8 +130,9 @@ class CRUD { }; String imagePathFull = - '${AppLink.server}card_image/$imagePath-${box.read(BoxName.driverID)}.jpg'; - + '${AppLink.server}/card_image/$imagePath-${box.read(BoxName.driverID)}.jpg'; + // print(box.read(BoxName.driverID)); + // print(imagePathFull); var request = http.Request('POST', Uri.parse( // 'https://ocrhamza.cognitiveservices.azure.com/vision/v2.1/ocr?language=ar')); // 'https://eastus.api.cognitive.microsoft.com/vision/v3.2/ocr' @@ -141,6 +143,7 @@ class CRUD { http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { + // print(await response.stream.bytesToString()); return await response.stream.bytesToString(); } else {} } @@ -218,7 +221,9 @@ class CRUD { 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', }, ); - + print(response.request); + print(response.body); + print(response.statusCode); var jsonData = jsonDecode(response.body); if (response.statusCode == 200) { if (jsonData['status'] == 'success') { diff --git a/lib/controller/functions/gemeni.dart b/lib/controller/functions/gemeni.dart index cedae7c..0e66334 100644 --- a/lib/controller/functions/gemeni.dart +++ b/lib/controller/functions/gemeni.dart @@ -393,10 +393,13 @@ class AI extends GetxController { update(); await ImageController().choosImage(linkPHP, imagePath); Future.delayed(const Duration(seconds: 2)); + // print(imagePath); var extractedString = await CRUD().arabicTextExtractByVisionAndAI(imagePath: imagePath); + print(extractedString); var json = jsonDecode(extractedString); var textValues = CRUD().extractTextFromLines(json); + print(textValues); // await Get.put(AI()).geminiAiExtraction(prompt, textValues, imagePath); await Get.put(AI()).anthropicAI(textValues, prompt, imagePath); isLoading = false; diff --git a/lib/controller/functions/launch.dart b/lib/controller/functions/launch.dart index eaeecd2..26a7026 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; diff --git a/lib/controller/functions/upload_image.dart b/lib/controller/functions/upload_image.dart index 6e6e45b..115eb1c 100644 --- a/lib/controller/functions/upload_image.dart +++ b/lib/controller/functions/upload_image.dart @@ -54,6 +54,7 @@ class ImageController extends GetxController { update(); // Save the cropped image File savedCroppedImage = File(croppedFile!.path); + print('link =$link'); try { await uploadImage( savedCroppedImage, diff --git a/lib/controller/home/captin/map_driver_controller.dart b/lib/controller/home/captin/map_driver_controller.dart index 151906c..1ad17b5 100644 --- a/lib/controller/home/captin/map_driver_controller.dart +++ b/lib/controller/home/captin/map_driver_controller.dart @@ -222,7 +222,8 @@ class MapDriverController extends GetxController { FirebaseMessagesController().sendNotificationToAnyWithoutData( 'DriverIsGoingToPassenger', box.read(BoxName.name).toString(), - tokenPassenger); + tokenPassenger, + 'start.wav'); if (box.read(BoxName.googlaMapApp) == true) { await openGoogleMapFromDriverToPassenger(); } @@ -288,7 +289,10 @@ class MapDriverController extends GetxController { }); FirebaseMessagesController().sendNotificationToAnyWithoutData( - 'RideIsBegin', box.read(BoxName.name).toString(), tokenPassenger); + 'RideIsBegin', + box.read(BoxName.name).toString(), + tokenPassenger, + 'start.wav'); rideIsBeginPassengerTimer(); // var d = jsonDecode(res); @@ -352,6 +356,7 @@ class MapDriverController extends GetxController { } calculateDistanceBetweenDriverAndPassengerLocation() { + Get.put(LocationController()); double distance2 = Geolocator.distanceBetween( latLngPassengerLocation.latitude, latLngPassengerLocation.longitude, @@ -533,19 +538,19 @@ class MapDriverController extends GetxController { }); Future.delayed(const Duration(milliseconds: 300)); FirebaseMessagesController().sendNotificationToPassengerToken( - 'Driver Finish Trip', - '${'you will pay to Driver'.tr} $paymentAmount \$', - tokenPassenger, - [ - box.read(BoxName.driverID), - rideId, - box.read(BoxName.tokenDriver), - // carType == 'Comfort' || carType == 'Mashwari' - // ? price.toStringAsFixed(2) - // : totalPassenger - paymentAmount.toString() - ], - ); + 'Driver Finish Trip', + '${'you will pay to Driver'.tr} $paymentAmount \$', + tokenPassenger, + [ + box.read(BoxName.driverID), + rideId, + box.read(BoxName.tokenDriver), + // carType == 'Comfort' || carType == 'Mashwari' + // ? price.toStringAsFixed(2) + // : totalPassenger + paymentAmount.toString() + ], + 'ding.wav'); Get.to(() => RatePassenger(), arguments: { 'passengerId': passengerId, 'rideId': rideId, diff --git a/lib/controller/home/captin/order_request_controller.dart b/lib/controller/home/captin/order_request_controller.dart index 8460e35..ab74524 100644 --- a/lib/controller/home/captin/order_request_controller.dart +++ b/lib/controller/home/captin/order_request_controller.dart @@ -95,21 +95,29 @@ class OrderRequestController extends GetxController { List> results = await sql.getCustomQuery(customQuery); } - void startTimer(String driverID, orderID) async { - for (int i = 0; i <= duration; i++) { + bool _timerActive = false; + + Future startTimer(String driverID, String orderID) async { + _timerActive = true; + for (int i = 0; i <= duration && _timerActive; i++) { await Future.delayed(const Duration(seconds: 1)); progress = i / duration; remainingTime = duration - i; update(); } - if (remainingTime == 0) { + if (remainingTime == 0 && _timerActive) { if (applied == false) { + endTimer(); refuseOrder(orderID); } } } + void endTimer() { + _timerActive = false; + } + void startTimerSpeed(String driverID, orderID) async { for (int i = 0; i <= durationSpeed; i++) { await Future.delayed(const Duration(seconds: 1)); @@ -144,15 +152,16 @@ class OrderRequestController extends GetxController { }); // applied = true; - sql.insertData({ - 'order_id': orderID, - 'created_at': DateTime.now().toString(), - 'driver_id': box.read(BoxName.driverID).toString(), - }, TableName.driverOrdersRefuse); - getRefusedOrderByCaptain(); - + if (box.read(BoxName.gender).toString() != 'Female') { + sql.insertData({ + 'order_id': orderID, + 'created_at': DateTime.now().toString(), + 'driver_id': box.read(BoxName.driverID).toString(), + }, TableName.driverOrdersRefuse); + getRefusedOrderByCaptain(); + } update(); - Get.back(); + // Get.back(); // Get.offAll(HomeCaptain()); } diff --git a/lib/controller/home/payment/captain_wallet_controller.dart b/lib/controller/home/payment/captain_wallet_controller.dart index f043b1d..89b286d 100644 --- a/lib/controller/home/payment/captain_wallet_controller.dart +++ b/lib/controller/home/payment/captain_wallet_controller.dart @@ -223,12 +223,12 @@ class CaptainWalletController extends GetxController { }); if (res1 != 'failure') { FirebaseMessagesController().sendNotificationToDriverMAP( - 'Transfer', - '${'You have transfer to your wallet from'.tr}' - '${box.read(BoxName.nameDriver)}', - amountToNewDriverMap[0]['token'].toString(), - [], - ); + 'Transfer', + '${'You have transfer to your wallet from'.tr}' + '${box.read(BoxName.nameDriver)}', + amountToNewDriverMap[0]['token'].toString(), + [], + 'order1.wav'); await addSeferWallet('payout fee', '5'); Get.defaultDialog( diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index ec6980e..4949cce 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -4,7 +4,16 @@ class MyTranslation extends Translations { @override Map> get keys => { "ar": { - 'Add Question': '', + "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.": + "تم حجز هذه الرحلة من قبل سائق آخر.", + 'Price: ': 'السعر ', + 'Add Question': "أضف سؤالاً", "Please enter a valid card 16-digit number.": "الرجاء إدخال رقم بطاقة صحيح مكون من 16 رقمًا.", "Insert card number": "أدخل رقم البطاقة", @@ -199,7 +208,7 @@ class MyTranslation extends Translations { "Invalid OTP": "رمز التحقق غير صالح", "Enter your email address": "أدخل عنوان بريدك الإلكتروني", "Please enter Your Email.": "يُرجى إدخال...", - "Enter your phone number": "أدخلي رقم هاتفك", + "Enter your phone number": "أدخل رقم هاتفك", "Please enter your phone number.": "الرجاء إدخال رقم هاتفك.", "Please enter Your Password.": "إدخال كلمة المرور الخاصة بك", "Submit": "إرسال", @@ -284,7 +293,7 @@ class MyTranslation extends Translations { "Send Verfication Code": "إرسال رمز التحقق", "End Ride": "‏إنهاء الرحلة", "Minute": "الدقيقة", - "Go to passenger Location now": "انتقل إلى موقع الراكب الآن", + "Go to passenger Location": "انتقل إلى موقع الراكب ", "Duration of the Ride is": "مدة المشوار هي", "Distance of the Ride is": "مسافة المشوار هي", "Name of the Passenger is": "اسم الراكب هو", @@ -375,7 +384,7 @@ class MyTranslation extends Translations { "Driver Applied the Ride for You": "سائق قدم الرحلة من أجلك", "Show latest promo": "أظهر أحدث عرض ترويجي", "Cancel Trip": "إلغاء الرحلة", - "Passenger Cancel Trip": "راكب يلغي الرحلة", + "Passenger Cancel Trip": "الرحلة ألغيت من قبل المسافر", "Please stay on the picked point.": "يرجى البقاء على النقطة المحددة.", "Trip is Begin": "الرحلة بدأت", "Hi ,I will go now": "مرحبًا، سأذهب الآن", diff --git a/lib/controller/notification/passenger_notification_controller.dart b/lib/controller/notification/passenger_notification_controller.dart index 1ed0009..c23bb24 100644 --- a/lib/controller/notification/passenger_notification_controller.dart +++ b/lib/controller/notification/passenger_notification_controller.dart @@ -54,7 +54,7 @@ class PassengerNotificationController extends GetxController { 'body': body, }); FirebaseMessagesController() - .sendNotificationToPassengerToken(title, body, 'token', []); + .sendNotificationToPassengerToken(title, body, 'token', [], 'ding.wav'); } @override diff --git a/lib/controller/rate/rate_conroller.dart b/lib/controller/rate/rate_conroller.dart index 2b0ec0f..469a72e 100644 --- a/lib/controller/rate/rate_conroller.dart +++ b/lib/controller/rate/rate_conroller.dart @@ -83,13 +83,14 @@ class RateController extends GetxController { 'token': paymentToken4, 'driverID': box.read(BoxName.driverID).toString(), }); + FirebaseMessagesController().sendNotificationToAnyWithoutData( + 'Wallet Added'.tr, + 'Wallet Added${(pointsSubtraction).toStringAsFixed(0)}'.tr, + Get.find().tokenPassenger, + 'tone2.wav'); + walletChecked = 'true'; } - FirebaseMessagesController().sendNotificationToAnyWithoutData( - 'Wallet Added', - 'Wallet Added'.tr, - Get.find().tokenPassenger); - walletChecked = 'true'; update(); } }); diff --git a/lib/views/home/Captin/home_captain/widget/call_page.dart b/lib/views/home/Captin/home_captain/widget/call_page.dart index ecc6b36..906db0d 100644 --- a/lib/views/home/Captin/home_captain/widget/call_page.dart +++ b/lib/views/home/Captin/home_captain/widget/call_page.dart @@ -56,11 +56,11 @@ GetBuilder callPage() { GestureDetector( onTap: () async { FirebaseMessagesController().sendNotificationToPassengerToken( - 'Call End'.tr, - 'Call End', - Get.find().tokenPassenger, - [], - ); + 'Call End'.tr, + 'Call End', + Get.find().tokenPassenger, + [], + 'iphone_ringtone.wav'); callController.leave(); Get.back(); }, diff --git a/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart b/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart index 2c1e806..426693d 100644 --- a/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart +++ b/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart @@ -10,6 +10,7 @@ import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../../../../../constant/char_map.dart'; import '../../../../../constant/colors.dart'; import '../../../../../constant/credential.dart'; +import '../../../../../controller/functions/launch.dart'; import '../../../../Rate/ride_calculate_driver.dart'; import '../../../../../controller/functions/location_controller.dart'; @@ -166,8 +167,7 @@ GetBuilder leftMainMenuCaptainIcons() { // borderRadius: BorderRadius.circular(15)), // child: IconButton( // onPressed: () { - // Get.to(() => PassengerLocationMapPage(), - // arguments: box.read(BoxName.rideArguments)); + // launchCommunication('phone', '+201023248456', ''); // }, // icon: const Icon( // FontAwesome5.grin_tears, diff --git a/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart b/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart index 12ed1ee..964fbab 100644 --- a/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart +++ b/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart @@ -47,7 +47,7 @@ class PassengerInfoWindow extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - 'Go to passenger Location now'.tr, + 'Go to passenger Location'.tr, style: AppStyle.title .copyWith(color: AppColor.greenColor), ), @@ -63,10 +63,16 @@ class PassengerInfoWindow extends StatelessWidget { true; await controller .driverCallPassenger(); // to check from scam - Get.to( - () => const CallPage()); - // launchCommunication('phone', - // controller.phone.toString(), ''); + // Get.to( + // () => const CallPage()); + makePhoneCall(controller + .passengerPhone + .toString()); + // launchCommunication( + // 'phone', + // controller.passengerPhone + // , + // ''); }, child: const Icon( Icons.phone, @@ -76,17 +82,113 @@ class PassengerInfoWindow extends StatelessWidget { width: 25, ), GestureDetector( - onTap: () { - controller.isSocialPressed = - true; - launchCommunication( - 'email', - controller.passengerPhone - .toString(), - '${'Hello this is Driver'.tr} ${box.read(BoxName.nameDriver)}'); + onTap: () async { + Get.defaultDialog( + title: + 'Select one message' + .tr, + titleStyle: + AppStyle.title, + content: SizedBox( + height: Get.height * .5, + child: Column( + mainAxisAlignment: + MainAxisAlignment + .spaceEvenly, + children: [ + InkWell( + onTap: () { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + 'message From Driver' + .tr, + "There's heavy traffic here. Can you suggest an alternate pickup point?" + .tr, + controller + .tokenPassenger, + 'ding.wav'); + Get.back(); + }, + child: Container( + decoration: AppStyle + .boxDecoration1, + child: Padding( + padding: + const EdgeInsets + .all( + 10), + child: Text( + "There's heavy traffic here. Can you suggest an alternate pickup point?" + .tr, + style: AppStyle + .title, + ), + ), + ), + ), + InkWell( + onTap: () { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + 'message From Driver' + .tr, + "Heading your way now. Please be ready." + .tr, + controller + .tokenPassenger, + 'ding.wav'); + Get.back(); + }, + child: Container( + decoration: AppStyle + .boxDecoration1, + child: Padding( + padding: + const EdgeInsets + .all( + 10), + child: Text( + "Heading your way now. Please be ready." + .tr, + style: AppStyle + .title, + ), + ), + ), + ), + InkWell( + onTap: () { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + 'message From Driver' + .tr, + 'Approaching your area. Should be there in 3 minutes.' + .tr, + controller + .tokenPassenger, + 'ding.wav'); + Get.back(); + }, + child: Container( + decoration: AppStyle + .boxDecoration1, + child: Padding( + padding: + const EdgeInsets + .all( + 10), + child: Text( + 'Approaching your area. Should be there in 3 minutes.' + .tr, + style: AppStyle + .title, + ), + ), + ), + ), + ], + ), + )); }, child: const Icon( - Icons.email, + Icons.message, color: AppColor.redColor, )), const SizedBox( @@ -269,7 +371,8 @@ class PassengerInfoWindow extends StatelessWidget { .tr, controller .tokenPassenger, - []); + [], + 'start.wav'); controller .startTimerToShowDriverWaitPassengerDuration(); controller @@ -356,7 +459,8 @@ class PassengerInfoWindow extends StatelessWidget { .tr, controller .tokenPassenger, - []); + [], + 'cancel.wav'); await controller .addWaitingTimeCostFromPassengerToDriverWallet(); controller diff --git a/lib/views/home/Captin/orderCaptin/order_request_page.dart b/lib/views/home/Captin/orderCaptin/order_request_page.dart index 4619e26..d84b614 100644 --- a/lib/views/home/Captin/orderCaptin/order_request_page.dart +++ b/lib/views/home/Captin/orderCaptin/order_request_page.dart @@ -296,6 +296,7 @@ class OrderRequestPage extends StatelessWidget { onPressed: () async { box.write(BoxName.statusDriverLocation, 'on'); + orderRequestController.endTimer(); orderRequestController.changeApplied(); await CRUD().postFromDialogue( link: AppLink.addDriverOrder, @@ -320,12 +321,13 @@ class OrderRequestPage extends StatelessWidget { ]; FirebaseMessagesController() .sendNotificationToPassengerToken( - 'Apply Ride', 'your ride is applied'.tr, - // arguments['DriverList'][9].toString(), - arguments['DriverList'][9].toString(), - // box.read(BoxName.tokenDriver).toString(), - bodyToPassenger, - ); + 'Apply Ride', + 'your ride is applied'.tr, + // arguments['DriverList'][9].toString(), + arguments['DriverList'][9].toString(), + // box.read(BoxName.tokenDriver).toString(), + bodyToPassenger, + 'start.wav'); Get.back(); box.write(BoxName.rideArguments, { 'passengerLocation': myList[0].toString(), @@ -392,6 +394,7 @@ class OrderRequestPage extends StatelessWidget { MyElevatedButton( title: 'Refuse Order'.tr, onPressed: () async { + orderRequestController.endTimer(); List bodyToPassenger = [ box.read(BoxName.driverID).toString(), box.read(BoxName.nameDriver).toString(), @@ -400,12 +403,12 @@ class OrderRequestPage extends StatelessWidget { FirebaseMessagesController() .sendNotificationToPassengerToken( - 'Refused Ride', - '${box.read(BoxName.nameDriver)} ${'reject your order.'.tr}', - arguments['DriverList'][9].toString(), - // box.read(BoxName.tokenDriver).toString(), - bodyToPassenger, - ); + 'Refused Ride'.tr, + '${box.read(BoxName.nameDriver)} ${'reject your order.'.tr}', + arguments['DriverList'][9].toString(), + // box.read(BoxName.tokenDriver).toString(), + bodyToPassenger, + 'cancel.wav'); orderRequestController.refuseOrder( myList[16].toString(), ); diff --git a/lib/views/home/Captin/orderCaptin/order_speed_request.dart b/lib/views/home/Captin/orderCaptin/order_speed_request.dart index 4b5e398..f96a3b1 100644 --- a/lib/views/home/Captin/orderCaptin/order_speed_request.dart +++ b/lib/views/home/Captin/orderCaptin/order_speed_request.dart @@ -350,12 +350,13 @@ class OrderSpeedRequest extends StatelessWidget { }); FirebaseMessagesController() .sendNotificationToPassengerToken( - 'Apply Ride', 'your ride is applied'.tr, - // arguments['DriverList'][9].toString(), - arguments['DriverList'][9].toString(), - // box.read(BoxName.tokenDriver).toString(), - bodyToPassenger, - ); + 'Apply Ride', + 'your ride is applied'.tr, + // arguments['DriverList'][9].toString(), + arguments['DriverList'][9].toString(), + // box.read(BoxName.tokenDriver).toString(), + bodyToPassenger, + 'start.wav'); Get.back(); // 'Arguments passed to PassengerLocationMapPage:'); @@ -397,42 +398,7 @@ class OrderSpeedRequest extends StatelessWidget { 'endNameLocation': myList[30].toString(), }); Get.to(() => PassengerLocationMapPage(), - arguments: box.read(BoxName.rideArguments) - // { - // 'passengerLocation': myList[0].toString(), - // 'passengerDestination': myList[1].toString(), - // 'Duration': myList[4].toString(), - // 'totalCost': myList[26].toString(), - // 'Distance': myList[5].toString(), - // 'name': myList[8].toString(), - // 'phone': myList[10].toString(), - // 'email': myList[28].toString(), - // 'WalletChecked': myList[13].toString(), - // 'tokenPassenger': myList[9].toString(), - // 'direction': - // 'https://www.google.com/maps/dir/${myList[0]}/${myList[1]}/', - // 'DurationToPassenger': myList[15].toString(), - // 'rideId': myList[16].toString(), - // 'passengerId': myList[7].toString(), - // 'driverId': myList[18].toString(), - // 'durationOfRideValue': myList[19].toString(), - // 'paymentAmount': myList[2].toString(), - // 'paymentMethod': myList[13].toString() == 'true' - // ? 'visa' - // : 'cash', - // 'isHaveSteps': myList[20].toString(), - // 'step0': myList[21].toString(), - // 'step1': myList[22].toString(), - // 'step2': myList[23].toString(), - // 'step3': myList[24].toString(), - // 'step4': myList[25].toString(), - // 'passengerWalletBurc': myList[26].toString(), - // 'timeOfOrder': DateTime.now().toString(), - // 'totalPassenger': myList[2].toString(), - // 'carType': myList[31].toString(), - // 'kazan': myList[32].toString(), - // } - ); + arguments: box.read(BoxName.rideArguments)); } // }); // Get.back(); diff --git a/lib/views/notification/available_rides_page.dart b/lib/views/notification/available_rides_page.dart index a82cb4c..8fbe8c2 100644 --- a/lib/views/notification/available_rides_page.dart +++ b/lib/views/notification/available_rides_page.dart @@ -30,233 +30,235 @@ class AvailableRidesPage extends StatelessWidget { body: [ rideAvailableController.isLoading ? const MyCircularProgressIndicator() - : Padding( - padding: const EdgeInsets.all(8.0), - child: ListView.builder( - itemCount: rideAvailableController - .rideAvailableMap['message'].length, - itemBuilder: (BuildContext context, int index) { - var list = rideAvailableController - .rideAvailableMap['message'][index]; - return Container( - width: Get.width * .9, - decoration: AppStyle.boxDecoration1, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - '🟢 ', + : ListView.builder( + itemCount: rideAvailableController + .rideAvailableMap['message'].length, + itemBuilder: (BuildContext context, int index) { + var list = rideAvailableController + .rideAvailableMap['message'][index]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: Get.width * .9, + decoration: AppStyle.boxDecoration1, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '🟢 ', + style: AppStyle.subtitle, + ), + SizedBox( + height: Get.height * .06, + width: Get.width * .8, + child: Text( + '${list['startName']}', style: AppStyle.subtitle, ), - SizedBox( - height: Get.height * .06, - width: Get.width * .8, - child: Text( - '${list['startName']}', - style: AppStyle.subtitle, - ), - ), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - '🔴 ', + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '🔴 ', + style: AppStyle.subtitle, + ), + SizedBox( + height: Get.height * .06, + width: Get.width * .8, + child: Text( + '${list['endName']}', style: AppStyle.subtitle, ), - SizedBox( - height: Get.height * .06, - width: Get.width * .8, - child: Text( - '${list['endName']}', - style: AppStyle.subtitle, - ), - ), - ], - ), - const SizedBox(height: 4), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - children: [ - Text('${'Price: '.tr}${list['price']} \$'), - const SizedBox(height: 4), - Text( - '${list['carType']}', - style: AppStyle.title - .copyWith(color: AppColor.greenColor), - ), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - children: [ - Text('📈 ${list['passengerRate']}', - style: AppStyle.title), - MyElevatedButton( - title: 'Accept'.tr, - onPressed: () async { - box.write( - BoxName.statusDriverLocation, 'on'); + ), + ], + ), + const SizedBox(height: 4), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + Text('${'Price: '.tr}${list['price']} \$'), + const SizedBox(height: 4), + Text( + '${list['carType']}', + style: AppStyle.title + .copyWith(color: AppColor.greenColor), + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + Text('📈 ${list['passengerRate']}', + style: AppStyle.title), + MyElevatedButton( + title: 'Accept'.tr, + onPressed: () async { + box.write( + BoxName.statusDriverLocation, 'on'); - var res = await CRUD().post( - link: AppLink.updateStausFromSpeed, + var res = await CRUD().post( + link: AppLink.updateStausFromSpeed, + payload: { + 'id': list['id'], + 'rideTimeStart': + DateTime.now().toString(), + 'status': 'Apply', + 'driver_id': + box.read(BoxName.driverID), + }); + // .then((value) { + // var json = jsonDecode(res); + if (res == "failure") { + Get.defaultDialog( + title: + "This ride is already taken by another driver." + .tr, + middleText: '', + titleStyle: AppStyle.title, + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + Get.back(); + // Get.back(); + // Get.back(); + })); + } else if (jsonDecode(res)['status'] == + "success") { + List bodyToPassenger = [ + box.read(BoxName.driverID).toString(), + box + .read(BoxName.nameDriver) + .toString(), + box + .read(BoxName.tokenDriver) + .toString(), + ]; + await CRUD().postFromDialogue( + link: AppLink.addDriverOrder, payload: { - 'id': list['id'], - 'rideTimeStart': - DateTime.now().toString(), - 'status': 'Apply', 'driver_id': box.read(BoxName.driverID), + // box.read(BoxName.driverID).toString(), + 'order_id': list['id'], + 'status': 'Apply' + }); + await CRUD().post( + link: AppLink.updateRides, + payload: { + 'id': list['id'], + 'DriverIsGoingToPassenger': + DateTime.now().toString(), + 'status': 'Applied' + }); + await CRUD().post( + link: AppLink.updateWaitingRide, + payload: { + 'id': list['id'], + 'status': 'Applied' }); - // .then((value) { - // var json = jsonDecode(res); - if (res == "failure") { - Get.defaultDialog( - title: - "This ride is already taken by another driver." - .tr, - middleText: '', - titleStyle: AppStyle.title, - middleTextStyle: AppStyle.title, - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - Get.back(); - Get.back(); - Get.back(); - })); - } else if (jsonDecode(res)['status'] == - "success") { - List bodyToPassenger = [ - box - .read(BoxName.driverID) - .toString(), - box - .read(BoxName.nameDriver) - .toString(), - box - .read(BoxName.tokenDriver) - .toString(), - ]; - await CRUD().postFromDialogue( - link: AppLink.addDriverOrder, - payload: { - 'driver_id': - box.read(BoxName.driverID), - // box.read(BoxName.driverID).toString(), - 'order_id': list['id'], - 'status': 'Apply' - }); - await CRUD().post( - link: AppLink.updateRides, - payload: { - 'id': list['id'], - 'DriverIsGoingToPassenger': - DateTime.now().toString(), - 'status': 'Applied' - }); - FirebaseMessagesController() - .sendNotificationToPassengerToken( - 'Apply Ride', - 'your ride is applied'.tr, - // arguments['DriverList'][9].toString(), - list['passengerToken'].toString(), - // box.read(BoxName.tokenDriver).toString(), - bodyToPassenger, - ); - Get.back(); - Get.to( - () => PassengerLocationMapPage(), - arguments: { - 'passengerLocation': - list['start_location'] - .toString(), - 'passengerDestination': - list['end_location'] - .toString(), - 'Duration': - list['duration'].toString(), - 'totalCost': - list['price'].toString(), - 'Distance': - list['distance'].toString(), - 'name': list['first_name'] + FirebaseMessagesController() + .sendNotificationToPassengerToken( + 'Apply Ride', + 'your ride is applied'.tr, + // arguments['DriverList'][9].toString(), + list['passengerToken'] .toString(), - 'phone': - list['phone'].toString(), - 'email': - list['email'].toString(), - 'WalletChecked': - list['payment_method'] - .toString(), - 'tokenPassenger': - list['passengerToken'] - .toString(), - 'direction': - 'https://www.google.com/maps/dir/${list['start_location']}/${list['end_location']}/', - 'DurationToPassenger': - list['duration'].toString(), - 'rideId': list['id'].toString(), - 'passengerId': - list['passenger_id'] - .toString(), - 'driverId': box - .read(BoxName.driverID) - .toString(), - 'durationOfRideValue': - list['duration'].toString(), - 'paymentAmount': - list['price'].toString(), - 'paymentMethod': - 'cash'.toString() == //todo fix payment method - 'true' - ? 'visa' - : 'cash', - 'isHaveSteps': - 'startEnd'.toString(), - 'step0': ''.toString(), - 'step1': ''.toString(), - 'step2': ''.toString(), - 'step3': ''.toString(), - 'step4': ''.toString(), - 'passengerWalletBurc': - list['bruc'].toString(), - 'timeOfOrder': - DateTime.now().toString(), - 'totalPassenger': - list['price'].toString(), - 'carType': - list['carType'].toString(), - 'kazan': Get.find< - HomeCaptainController>() - .kazan - .toString(), - }); - } - }, - kolor: AppColor.greenColor, - ), - Text( - '📍 ${list['distance']} ${'KM'.tr}', - style: AppStyle.title - .copyWith(color: AppColor.greenColor), - ), - ], - ) - ], - ), - ); - }), - ) + // box.read(BoxName.tokenDriver).toString(), + bodyToPassenger, + 'start.wav'); + Get.back(); + Get.to(() => PassengerLocationMapPage(), + arguments: { + 'passengerLocation': + list['start_location'] + .toString(), + 'passengerDestination': + list['end_location'] + .toString(), + 'Duration': + list['duration'].toString(), + 'totalCost': + list['price'].toString(), + 'Distance': + list['distance'].toString(), + 'name': + list['first_name'].toString(), + 'phone': list['phone'].toString(), + 'email': list['email'].toString(), + 'WalletChecked': + list['payment_method'] + .toString(), + 'tokenPassenger': + list['passengerToken'] + .toString(), + 'direction': + 'https://www.google.com/maps/dir/${list['start_location']}/${list['end_location']}/', + 'DurationToPassenger': + list['duration'].toString(), + 'rideId': list['id'].toString(), + 'passengerId': + list['passenger_id'] + .toString(), + 'driverId': box + .read(BoxName.driverID) + .toString(), + 'durationOfRideValue': + list['duration'].toString(), + 'paymentAmount': + list['price'].toString(), + 'paymentMethod': + 'cash'.toString() == //todo fix payment method + 'true' + ? 'visa' + : 'cash', + 'isHaveSteps': + 'startEnd'.toString(), + 'step0': ''.toString(), + 'step1': ''.toString(), + 'step2': ''.toString(), + 'step3': ''.toString(), + 'step4': ''.toString(), + 'passengerWalletBurc': + list['bruc'].toString(), + 'timeOfOrder': + DateTime.now().toString(), + 'totalPassenger': + list['price'].toString(), + 'carType': + list['carType'].toString(), + 'kazan': Get.find< + HomeCaptainController>() + .kazan + .toString(), + }); + } + }, + kolor: AppColor.greenColor, + ), + Text( + '📍 ${list['distance']} ${'KM'.tr}', + style: AppStyle.title + .copyWith(color: AppColor.greenColor), + ), + ], + ) + ], + ), + ), + ); + }) ], isleading: true); });