From d0dd09dc6c61fd10dec45f7ac844fa12b0a18b66 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Thu, 26 Dec 2024 18:27:30 +0300 Subject: [PATCH] 24-12/26/1 --- ios/Runner/Info.plist | 4 +- .../home/captin/map_driver_controller.dart | 10 +- lib/controller/local/translations.dart | 36 +- lib/views/home/Captin/driver_map_page.dart | 2 +- .../home/Captin/home_captain/home_captin.dart | 6 +- .../mapDriverWidgets/google_map_app.dart | 2 +- .../passenger_info_window.dart | 919 +++++++----------- .../Captin/mapDriverWidgets/sos_connect.dart | 234 +++-- .../orderCaptin/order_request_page.dart | 51 +- lib/views/widgets/elevated_btn.dart | 2 +- 10 files changed, 594 insertions(+), 672 deletions(-) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index ee54537..c4b9495 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -35,7 +35,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 84 + 85 CFBundleSignature ???? CFBundleURLTypes @@ -50,7 +50,7 @@ CFBundleVersion - 4.0.84 + 4.0.85 FirebaseAppDelegateProxyEnabled NO GMSApiKey diff --git a/lib/controller/home/captin/map_driver_controller.dart b/lib/controller/home/captin/map_driver_controller.dart index f7fe37c..29df390 100644 --- a/lib/controller/home/captin/map_driver_controller.dart +++ b/lib/controller/home/captin/map_driver_controller.dart @@ -415,8 +415,12 @@ class MapDriverController extends GetxController { 'status': 'Begin' }); } - FirebaseMessagesController().sendNotificationToDriverMAP('RideIsBegin', - box.read(BoxName.name).toString(), tokenPassenger, [], 'start.wav'); + FirebaseMessagesController().sendNotificationToDriverMAP( + 'Trip is Begin'.tr, + box.read(BoxName.name).toString(), + tokenPassenger, + [], + 'start.wav'); rideIsBeginPassengerTimer(); // var d = jsonDecode(res); @@ -725,7 +729,7 @@ class MapDriverController extends GetxController { }); Future.delayed(const Duration(milliseconds: 300)); FirebaseMessagesController().sendNotificationToDriverMAP( - 'Driver Finish Trip', + "Driver Finish Trip".tr, '${'you will pay to Driver'.tr} $paymentAmount \$', tokenPassenger, [ diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index 5513bfd..ed6d1bf 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -4,6 +4,38 @@ class MyTranslation extends Translations { @override Map> get keys => { "ar": { + "Call Passenger": "اتصل بالراكب", + "Send Message": "إرسال رسالة", + "Open in Maps": "فتح في الخرائط", + "Duration": "المدة", + "Distance": "المسافة", + "Passenger": "الراكب", + "Cost": "التكلفة", + "Car Type": "نوع ‏الطلب", + "Start the Ride": "ابدأ الرحلة", + "Is the Passenger in your Car?": "هل الراكب في سيارتك؟", + "Don't start trip if passenger not in your car": + "لا تبدأ الرحلة إذا لم يكن الراكب في سيارتك", + "I Arrive": "لقد وصلت", "Trip is Begin": "بدأت الرحلة", + "You are not near the passenger location": + "أنت لست بالقرب من موقع الراكب", + "Driver Finish Trip": "السواق أنهى الرحلة", + "Please go to the pickup location exactly": + "يرجى الذهاب إلى موقع الالتقاط بالضبط", + "You Can Cancel the Trip and get Cost From": + "يمكنك إلغاء الرحلة واسترداد التكلفة من", + "Are you sure to cancel?": "هل أنت متأكد من الإلغاء؟", + "Driver Cancelled Your Trip": "السائق ألغى رحلتك", + "You will need to pay the cost to the driver, or it will be deducted from your next trip": + "سيتم دفع التكلفة للسائق أو خصمها من رحلتك القادمة", + "Select a quick message": "اختر رسالة سريعة", + "Where are you, sir?": "أين أنت يا سيدي؟", + "I've been trying to reach you but your phone is off.": + "كنت أحاول الوصول إليك لكن هاتفك مغلق.", + "Please don't be late, I'm waiting for you at the specified location.": + "يرجى عدم التأخير، أنا في انتظارك في الموقع المحدد.", + "Please don't be late": "يرجى عدم التأخير", + "Type something": "اكتب شيئًا", 'Passenger Information': 'معلومات الراكب', 'Name': 'الاسم', "wallet_updated": "تم تحديث المحفظة", @@ -857,11 +889,11 @@ Store your money with us and receive it in your bank as a monthly salary.''': "Cancel Trip": "إلغاء الرحلة", "Passenger Cancel Trip": "الرحلة ألغيت من قبل المسافر", "Please stay on the picked point.": "يرجى البقاء على النقطة المحددة.", - "Trip is Begin": "الرحلة بدأت", + "Hi ,I will go now": "مرحبًا، سأذهب الآن", "Passenger come to you": "الراكب يأتي إليك", "Hi ,I Arrive your site": "مرحبًا، لقد وصلت إلى موقعك.", - "Driver Finish Trip": "انتهاء الرحلة للسائق", + "you will pay to Driver": "سوف تدفع للسائق", "Driver Cancel Your Trip": "ألغِ رحلتك، سائق.", "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": diff --git a/lib/views/home/Captin/driver_map_page.dart b/lib/views/home/Captin/driver_map_page.dart index b354fac..5de3a32 100644 --- a/lib/views/home/Captin/driver_map_page.dart +++ b/lib/views/home/Captin/driver_map_page.dart @@ -48,7 +48,7 @@ class PassengerLocationMapPage extends StatelessWidget { driverEndRideBar(), const SosConnect(), speedCircle(), - const GoogleMapApp(), + // const GoogleMapApp(), const PricesWindow(), ], ), diff --git a/lib/views/home/Captin/home_captain/home_captin.dart b/lib/views/home/Captin/home_captain/home_captin.dart index cd44ff6..cc62d95 100644 --- a/lib/views/home/Captin/home_captain/home_captin.dart +++ b/lib/views/home/Captin/home_captain/home_captin.dart @@ -66,7 +66,11 @@ class HomeCaptain extends StatelessWidget { ), title: Row( children: [ - Image.asset('assets/images/logo.png', height: 32), + Image.asset( + 'assets/images/logo.gif', + height: 32, + width: 35, + ), const SizedBox(width: 8), Text( 'SEFER'.tr, diff --git a/lib/views/home/Captin/mapDriverWidgets/google_map_app.dart b/lib/views/home/Captin/mapDriverWidgets/google_map_app.dart index 18d46a1..7481fd2 100644 --- a/lib/views/home/Captin/mapDriverWidgets/google_map_app.dart +++ b/lib/views/home/Captin/mapDriverWidgets/google_map_app.dart @@ -14,7 +14,7 @@ class GoogleMapApp extends StatelessWidget { return GetBuilder( builder: (mapDriverController) => mapDriverController.isRideStarted ? Positioned( - left: 125, + left: 150, bottom: 20, child: Container( decoration: AppStyle.boxDecoration, diff --git a/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart b/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart index 5713118..e1cf89b 100644 --- a/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart +++ b/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart @@ -17,577 +17,384 @@ import '../../../../constant/style.dart'; import '../../../../controller/functions/launch.dart'; class PassengerInfoWindow extends StatelessWidget { - const PassengerInfoWindow({ - super.key, - }); + const PassengerInfoWindow({super.key}); @override Widget build(BuildContext context) { - // Get.put(MapDriverController()); return GetBuilder( builder: (controller) => controller.isPassengerInfoWindow == true - ? Stack( - children: [ - Positioned( - bottom: 5, - // left: 8, - child: AnimatedContainer( - duration: const Duration(milliseconds: 300), - height: Get.height * .4, - width: Get.width, - decoration: AppStyle.boxDecoration1, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( + ? Positioned( + bottom: 10, + left: 10, + right: 10, + child: Card( + elevation: 5, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, children: [ - DefaultTextStyle( - style: AppStyle.title, - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Go to passenger Location'.tr, - style: AppStyle.title - .copyWith(color: AppColor.greenColor), - ), - controller.isRideBegin - ? const SizedBox() - : Row( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - children: [ - GestureDetector( - onTap: () async { - controller.isSocialPressed = - true; - await controller - .driverCallPassenger(); // to check from scam - // Get.to( - // () => const CallPage()); - makePhoneCall(controller - .passengerPhone - .toString()); - // launchCommunication( - // 'phone', - // controller.passengerPhone - // , - // ''); - }, - child: const Icon( - Icons.phone, - color: AppColor.blueColor, - )), - const SizedBox( - width: 25, - ), - GestureDetector( - onTap: () async { - Get.defaultDialog( - title: - 'Select one message' - .tr, - titleStyle: - AppStyle.title, - content: SizedBox( - height: Get.height * .5, - width: Get.width * .6, - child: ListView( - // mainAxisAlignment: - // MainAxisAlignment - // .spaceEvenly, - children: [ - InkWell( - onTap: () { - FirebaseMessagesController().sendNotificationToDriverMAP( - 'message From Driver', - "Where are you, sir?" - .tr, - controller - .tokenPassenger, - [], - 'ding.wav'); - Get.back(); - }, - child: Container( - decoration: AppStyle - .boxDecoration1, - child: Padding( - padding: - const EdgeInsets - .all( - 10), - child: Text( - "Where are you, sir?" - .tr, - style: AppStyle - .title, - ), - ), - ), - ), - const SizedBox( - height: 5, - ), - InkWell( - onTap: () { - FirebaseMessagesController().sendNotificationToDriverMAP( - 'message From Driver', - "I've been trying to reach you but your phone is off." - .tr, - controller - .tokenPassenger, - [], - 'ding.wav'); - Get.back(); - }, - child: Container( - decoration: AppStyle - .boxDecoration1, - child: Padding( - padding: - const EdgeInsets - .all( - 10), - child: Text( - "I've been trying to reach you but your phone is off." - .tr, - style: AppStyle - .title, - ), - ), - ), - ), - const SizedBox( - height: 5, - ), - InkWell( - onTap: () { - FirebaseMessagesController().sendNotificationToDriverMAP( - 'message From Driver', - "Please don't be late, I'm waiting for you at the specified location." - .tr, - controller - .tokenPassenger, - [], - 'ding.wav'); - Get.back(); - }, - child: Container( - decoration: AppStyle - .boxDecoration1, - child: Padding( - padding: - const EdgeInsets - .all( - 10), - child: Text( - "Please don't be late, I'm waiting for you at the specified location." - .tr, - style: AppStyle - .title, - ), - ), - ), - ), - const SizedBox( - height: 5, - ), - InkWell( - onTap: () { - FirebaseMessagesController().sendNotificationToDriverMAP( - 'message From Driver', - "Please don't be late" - .tr, - controller - .tokenPassenger, - [], - 'cancel.wav'); - Get.back(); - }, - child: Container( - decoration: AppStyle - .boxDecoration1, - child: Padding( - padding: - const EdgeInsets - .all( - 10), - child: Text( - "Please don't be late" - .tr, - style: AppStyle - .title, - ), - ), - ), - ), - const SizedBox( - height: 5, - ), - SizedBox( - width: 200, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .center, - children: [ - Form( - key: controller - .formKey2, - child: - SizedBox( - width: - 160, - child: MyTextForm( - controller: - controller.messageToPassenger, - label: 'Type Any thing'.tr, - hint: 'Type Any thing'.tr, - type: TextInputType.name), - )), - IconButton( - onPressed: - () { - FirebaseMessagesController().sendNotificationToDriverMAP( - 'message From Driver', - controller.messageToPassenger.text, - controller.tokenPassenger, - [], - 'ding.wav'); - controller - .messageToPassenger - .clear(); - Get.back(); - }, - icon: const Icon( - Icons - .send)) - ], - ), - ) - ], - ), - )); - }, - child: const Icon( - Icons.message, - color: AppColor.redColor, - )), - const SizedBox( - width: 25, - ), - Container( - decoration: - AppStyle.boxDecoration, - child: IconButton( - onPressed: () async { - if (Platform.isAndroid) { - Bubble().startBubbleHead( - sendAppToBackground: - true); - } - await controller - .openGoogleMapFromDriverToPassenger(); - }, - icon: const Icon( - MaterialCommunityIcons - .map_marker_radius, - size: 35, - color: AppColor.blueColor, - ), - )), - ], - ), - ], - )), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // First Row: Trip Info (Duration, Distance, Passenger Name) - Row( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - children: [ - // Ride Duration - Container( - decoration: AppStyle.boxDecoration1, - width: Get.width * .28, - child: Padding( - padding: const EdgeInsets.all(6.0), - child: Row( - children: [ - Icon(Icons.timer, - color: Colors - .grey[700]), // Duration Icon - const SizedBox(width: 6), - Text( - controller.hours > 1 - ? '${controller.hours}h ${controller.minutes}${'m'.tr}' - : '${controller.minutes}${'m'.tr}', - style: AppStyle.number, - ), - ], - ), - ), - ), - - // Ride Distance - Container( - decoration: AppStyle.boxDecoration1, - width: Get.width * .28, - child: Padding( - padding: const EdgeInsets.all(6.0), - child: Row( - children: [ - Icon(Icons.map, - color: Colors - .grey[700]), // Distance Icon - const SizedBox(width: 6), - Text( - '${controller.distance} km', - style: AppStyle.number, - ), - ], - ), - ), - ), - - // Passenger Name - Container( - decoration: AppStyle.boxDecoration1, - width: Get.width * .38, - child: Padding( - padding: const EdgeInsets.all(6.0), - child: Row( - children: [ - Icon(Icons.person, - color: Colors - .grey[700]), // Passenger Icon - const SizedBox(width: 6), - Text( - controller.passengerName, - style: AppStyle.title, - ), - ], - ), - ), - ), - ], - ), - - const SizedBox( - height: 16), // Spacing between rows - - // Second Row: Cost & Car Type - Row( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - children: [ - // Ride Cost - Container( - decoration: AppStyle.boxDecoration1, - width: Get.width * .45, - child: Padding( - padding: const EdgeInsets.all(6.0), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Icon(Icons.attach_money, - color: Colors - .grey[700]), // Cost Icon - const SizedBox(width: 6), - Text("cost is ".tr, - style: AppStyle.title), - ], - ), - Text( - controller.totalPricePassenger, - style: AppStyle.number, - ), - ], - ), - ), - ), - - // Car Type - Container( - decoration: AppStyle.boxDecoration1, - width: Get.width * .45, - child: Padding( - padding: const EdgeInsets.all(6.0), - child: Row( - children: [ - Icon(Icons.directions_car, - color: - Colors.grey[700]), // Car Icon - const SizedBox(width: 6), - Text(controller.carType.tr, - style: AppStyle.title), - ], - ), - ), - ), - ], - ), - ], + Text( + 'Go to passenger Location'.tr, + style: AppStyle.title.copyWith( + color: AppColor.greenColor, + fontWeight: FontWeight.bold, + ), ), - controller.isRideBegin - ? const SizedBox() - : Column( - children: [ - // First Row: Start Ride or Arrive at Location - Row( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - children: [ - // Start Ride Button - MyElevatedButton( - title: 'Start the Ride'.tr, - kolor: AppColor.greenColor, - onPressed: () { - MyDialog().getDialog( - "Is the Passenger in your Car?" - .tr, // "هل الراكب في سيارتك؟" - - "Don't start trip if passenger not in your car" - .tr, // "لا تبدأ الرحلة إذا لم يكن الراكب في سيارتك" - - () async { - await controller - .startRideFromDriver(); - Get.back(); - // Close dialog after confirmation - }, - ); - }, - ), - - // Arrive Notification Button - controller.isArrivedSend - ? MyElevatedButton( - title: 'I Arrive'.tr, - kolor: AppColor.yellowColor, - onPressed: () async { - if (await controller - .calculateDistanceBetweenDriverAndPassengerLocation() < - 140) { - // Notify Passenger - FirebaseMessagesController() - .sendNotificationToDriverMAP( - 'Hi ,I Arrive your site', - 'I Arrive at your site' - .tr, - controller.tokenPassenger, - [], - 'ding.wav', - ); - controller - .startTimerToShowDriverWaitPassengerDuration(); - controller.isArrivedSend = - false; - } else { - MyDialog().getDialog( - 'You are not near the passenger location' - .tr, - 'Please go to the pickup location exactly' - .tr, () { - Get.back(); - }); - // Show error dialog if the driver is far from passenger - } - }, - ) - : const SizedBox(), // Hide if already sent - ], - ), - - // const SizedBox( - // height: 16), // Space between rows - - // Progress Bar for Waiting Time - controller.remainingTimeInPassengerLocatioWait < - 300 && - controller - .remainingTimeInPassengerLocatioWait != - 0 - ? Stack( - children: [ - LinearProgressIndicator( - backgroundColor: - AppColor.greyColor, - color: controller - .remainingTimeInPassengerLocatioWait < - 60 - ? AppColor.redColor - : AppColor.greenColor, - minHeight: 25, - borderRadius: - BorderRadius.circular(15), - value: controller - .progressInPassengerLocationFromDriver - .toDouble(), - ), - Center( - child: Text( - controller - .stringRemainingTimeWaitingPassenger, - style: AppStyle.title, - ), - ), - ], - ) - : const SizedBox(), - - const SizedBox( - height: - 16), // Space between progress and next section - - // Cancel Trip and Charge Passenger - controller.isdriverWaitTimeEnd - ? MyElevatedButton( - title: - 'You Can Cancel the Trip and get Cost From ' - .tr + - AppInformation.appName.tr, - kolor: AppColor.deepPurpleAccent, - onPressed: () { - MyDialog().getDialog( - 'Are you sure to cancel?'.tr, - '', () async { - FirebaseMessagesController() - .sendNotificationToDriverMAP( - 'Driver Cancelled Your Trip', - 'You will need to pay the cost to the driver, or it will be deducted from your next trip' - .tr, - controller.tokenPassenger, - [], - 'cancel.wav', - ); - await controller - .addWaitingTimeCostFromPassengerToDriverWallet(); - controller.isdriverWaitTimeEnd = - false; - Get.back(); - }); - }, - ) - : const SizedBox(), - ], + if (!controller.isRideBegin) + Wrap( + spacing: 16.0, + children: [ + IconButton( + onPressed: () async { + controller.isSocialPressed = true; + await controller.driverCallPassenger(); + makePhoneCall( + controller.passengerPhone.toString()); + }, + icon: const Icon( + Icons.phone, + color: AppColor.blueColor, + ), + tooltip: 'Call Passenger', ), + IconButton( + onPressed: () { + Get.bottomSheet( + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(20)), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: _buildMessageOptions(controller), + ), + ); + }, + icon: const Icon( + Icons.message, + color: AppColor.redColor, + ), + tooltip: 'Send Message', + ), + IconButton( + onPressed: () async { + if (Platform.isAndroid) { + Bubble().startBubbleHead( + sendAppToBackground: true); + } + await controller + .openGoogleMapFromDriverToPassenger(); + }, + icon: const Icon( + MaterialCommunityIcons.map_marker_radius, + size: 28, + color: AppColor.blueColor, + ), + tooltip: 'Open in Maps', + ), + ], + ), ], ), - ), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildInfoTile( + icon: Icons.timer, + text: controller.hours > 1 + ? '${controller.hours}h ${controller.minutes}m' + : '${controller.minutes}m', + label: 'Duration', + ), + _buildInfoTile( + icon: Icons.map, + text: '${controller.distance} km', + label: 'Distance', + ), + _buildInfoTile( + icon: Icons.person, + text: controller.passengerName, + label: 'Passenger', + ), + ], + ), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildInfoTile( + icon: Icons.attach_money, + text: controller.totalPricePassenger, + label: 'Cost', + ), + _buildInfoTile( + icon: Icons.directions_car, + text: controller.carType.tr, + label: 'Car Type', + ), + ], + ), + const SizedBox(height: 16), + if (!controller.isRideBegin) + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: MyElevatedButton( + title: 'Start the Ride'.tr, + kolor: AppColor.greenColor, + onPressed: () { + MyDialog().getDialog( + "Is the Passenger in your Car?".tr, + "Don't start trip if passenger not in your car" + .tr, + () async { + await controller + .startRideFromDriver(); + Get.back(); + }, + ); + }, + ), + ), + const SizedBox(width: 8), + if (controller.isArrivedSend) + Expanded( + child: MyElevatedButton( + title: 'I Arrive'.tr, + kolor: AppColor.yellowColor, + onPressed: () async { + if (await controller + .calculateDistanceBetweenDriverAndPassengerLocation() < + 140) { + FirebaseMessagesController() + .sendNotificationToDriverMAP( + 'Hi ,I Arrive your site', + 'I Arrive at your site'.tr, + controller.tokenPassenger, + [], + 'ding.wav', + ); + controller + .startTimerToShowDriverWaitPassengerDuration(); + controller.isArrivedSend = false; + } else { + MyDialog().getDialog( + 'You are not near the passenger location' + .tr, + 'Please go to the pickup location exactly' + .tr, () { + Get.back(); + }); + } + }, + ), + ), + ], + ), + const SizedBox(height: 12), + if (controller.remainingTimeInPassengerLocatioWait < + 300 && + controller + .remainingTimeInPassengerLocatioWait != + 0) + Stack( + alignment: Alignment.center, + children: [ + LinearProgressIndicator( + backgroundColor: AppColor.greyColor, + color: controller + .remainingTimeInPassengerLocatioWait < + 60 + ? AppColor.redColor + : AppColor.greenColor, + minHeight: 20, + borderRadius: BorderRadius.circular(10), + value: controller + .progressInPassengerLocationFromDriver + .toDouble(), + ), + Text( + controller + .stringRemainingTimeWaitingPassenger, + style: AppStyle.title, + ), + ], + ), + const SizedBox(height: 12), + if (controller.isdriverWaitTimeEnd) + MyElevatedButton( + title: + 'You Can Cancel the Trip and get Cost From ' + .tr + + AppInformation.appName.tr, + kolor: AppColor.deepPurpleAccent, + onPressed: () { + MyDialog().getDialog( + 'Are you sure to cancel?'.tr, '', + () async { + FirebaseMessagesController() + .sendNotificationToDriverMAP( + 'Driver Cancelled Your Trip', + 'You will need to pay the cost to the driver, or it will be deducted from your next trip' + .tr, + controller.tokenPassenger, + [], + 'cancel.wav', + ); + await controller + .addWaitingTimeCostFromPassengerToDriverWallet(); + controller.isdriverWaitTimeEnd = false; + Get.back(); + }); + }, + ), + ], + ), + ], ), ), - ], + ), ) : const SizedBox(), ); } + + Widget _buildInfoTile({ + required IconData icon, + required String text, + required String label, + }) { + return Column( + children: [ + Icon(icon, color: Colors.grey[700]), + const SizedBox(height: 4), + Text(text, style: AppStyle.title.copyWith(fontWeight: FontWeight.bold)), + Text(label.tr, style: AppStyle.title), + ], + ); + } + + Widget _buildMessageOptions(MapDriverController controller) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Select a quick message'.tr, style: AppStyle.title), + const SizedBox(height: 16), + _buildMessageTile( + text: "Where are you, sir?".tr, + onTap: () { + FirebaseMessagesController().sendNotificationToDriverMAP( + 'message From Driver', + "Where are you, sir?".tr, + controller.tokenPassenger, + [], + 'ding.wav', + ); + Get.back(); + }, + ), + _buildMessageTile( + text: "I've been trying to reach you but your phone is off.".tr, + onTap: () { + FirebaseMessagesController().sendNotificationToDriverMAP( + 'message From Driver', + "I've been trying to reach you but your phone is off.".tr, + controller.tokenPassenger, + [], + 'ding.wav', + ); + Get.back(); + }, + ), + _buildMessageTile( + text: + "Please don't be late, I'm waiting for you at the specified location." + .tr, + onTap: () { + FirebaseMessagesController().sendNotificationToDriverMAP( + 'message From Driver', + "Please don't be late, I'm waiting for you at the specified location." + .tr, + controller.tokenPassenger, + [], + 'ding.wav', + ); + Get.back(); + }, + ), + _buildMessageTile( + text: "Please don't be late".tr, + onTap: () { + FirebaseMessagesController().sendNotificationToDriverMAP( + 'message From Driver', + "Please don't be late".tr, + controller.tokenPassenger, + [], + 'cancel.wav', + ); + Get.back(); + }, + ), + const SizedBox(height: 16), + Row( + children: [ + Expanded( + child: Form( + key: controller.formKey2, + child: MyTextForm( + controller: controller.messageToPassenger, + label: 'Type something'.tr, + hint: 'Type something'.tr, + type: TextInputType.text, + ), + ), + ), + IconButton( + onPressed: () { + FirebaseMessagesController().sendNotificationToDriverMAP( + 'message From Driver', + controller.messageToPassenger.text, + controller.tokenPassenger, + [], + 'ding.wav', + ); + controller.messageToPassenger.clear(); + Get.back(); + }, + icon: const Icon(Icons.send), + ), + ], + ), + ], + ); + } + + Widget _buildMessageTile( + {required String text, required VoidCallback onTap}) { + return InkWell( + onTap: onTap, + child: Container( + padding: const EdgeInsets.all(12), + margin: const EdgeInsets.symmetric(vertical: 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Colors.grey[100], + ), + child: Text(text, style: AppStyle.title), + ), + ); + } } diff --git a/lib/views/home/Captin/mapDriverWidgets/sos_connect.dart b/lib/views/home/Captin/mapDriverWidgets/sos_connect.dart index b50291f..c0e8942 100644 --- a/lib/views/home/Captin/mapDriverWidgets/sos_connect.dart +++ b/lib/views/home/Captin/mapDriverWidgets/sos_connect.dart @@ -1,3 +1,6 @@ +import 'dart:io'; + +import 'package:bubble_head/bubble.dart'; import 'package:flutter/material.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:get/get.dart'; @@ -5,6 +8,7 @@ import 'package:sefer_driver/constant/info.dart'; import 'package:sefer_driver/controller/functions/location_controller.dart'; import 'package:sefer_driver/views/widgets/elevated_btn.dart'; import 'package:sefer_driver/views/widgets/my_textField.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../../../constant/box_name.dart'; import '../../../../constant/colors.dart'; @@ -14,104 +18,176 @@ import '../../../../controller/home/captin/map_driver_controller.dart'; import '../../../../main.dart'; class SosConnect extends StatelessWidget { - const SosConnect({ - super.key, - }); + const SosConnect({super.key}); @override Widget build(BuildContext context) { return GetBuilder( - builder: (mapDriverController) => mapDriverController.isRideStarted - ? Positioned( - left: 5, - bottom: 20, - child: Container( - decoration: AppStyle.boxDecoration, + builder: (mapDriverController) => mapDriverController.isRideStarted + ? Positioned( + left: 16, + bottom: 16, + child: Card( + elevation: 4, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + child: SizedBox( height: 60, - width: 110, + width: 180, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - InkWell( - onTap: () { - if (box.read(BoxName.sosPhoneDriver) == null) { - Get.defaultDialog( - title: 'Insert Emergincy Number'.tr, - content: Form( - key: mapDriverController.formKey1, - child: MyTextForm( - controller: mapDriverController - .sosEmergincyNumberCotroller, - label: 'Insert Emergency Number'.tr, - hint: 'Insert Emergency Number'.tr, - type: TextInputType.phone), - ), - confirm: MyElevatedButton( - title: 'Insert'.tr, - onPressed: () { - if (mapDriverController - .formKey1.currentState! - .validate()) { - box.write( - BoxName.sosPhoneDriver, - mapDriverController - .sosEmergincyNumberCotroller - .text); - } - })); - } - launchCommunication( - 'phone', box.read(BoxName.sosPhoneDriver), ''); + IconButton( + onPressed: () { + _handleSosCall(mapDriverController); }, - child: const Icon( + icon: const Icon( Icons.sos_sharp, - size: 45, + size: 32, color: AppColor.redColor, ), + tooltip: 'SOS - Call Emergency', ), - InkWell( - onTap: () { - if (box.read(BoxName.sosPhoneDriver) == null) { - Get.defaultDialog( - title: 'Insert Emergency Number'.tr, - content: Form( - key: mapDriverController.formKey1, - child: MyTextForm( - controller: mapDriverController - .sosEmergincyNumberCotroller, - label: 'Insert Emergency Number'.tr, - hint: 'Insert Emergency Number'.tr, - type: TextInputType.phone), - ), - confirm: MyElevatedButton( - title: 'Insert'.tr, - onPressed: () { - if (mapDriverController - .formKey1.currentState! - .validate()) { - box.write( - BoxName.sosPhoneDriver, - mapDriverController - .sosEmergincyNumberCotroller - .text); - } - })); - } else { - launchCommunication( - 'whatsapp', - '+2${box.read(BoxName.sosPhoneDriver)}', //todo add number from driver - "${"Hello this is Driver".tr} ${box.read(BoxName.nameDriver)}.${" My current location is:".tr} https://www.google.com/maps/place/${Get.find().myLocation.latitude},${Get.find().myLocation.longitude}${" \nand I have a trip on".tr} ${AppInformation.appName} ${"App \nwith Passenger ".tr}${mapDriverController.passengerName}"); - } + VerticalDivider( + color: Colors.grey[300], + thickness: 1, + ), + IconButton( + onPressed: () { + _handleWhatsApp(mapDriverController); }, - child: const Icon( + icon: const Icon( FontAwesome.whatsapp, color: AppColor.greenColor, - size: 45, + size: 32, ), + tooltip: 'SOS - Send WhatsApp Message', + ), + VerticalDivider( + color: Colors.grey[300], + thickness: 1, + ), + IconButton( + onPressed: () { + _handleGoogleMap(mapDriverController); + }, + icon: const Icon( + MaterialCommunityIcons.map_marker_radius, + color: AppColor.primaryColor, + size: 32, + ), + tooltip: 'Google Maps - Navigate', ), ], ), - )) - : const SizedBox()); + ), + ), + ) + : const SizedBox(), + ); + } + + void _handleSosCall(MapDriverController mapDriverController) { + if (box.read(BoxName.sosPhoneDriver) == null) { + Get.defaultDialog( + title: 'Insert Emergency Number'.tr, + content: Form( + key: mapDriverController.formKey1, + child: MyTextForm( + controller: mapDriverController.sosEmergincyNumberCotroller, + label: 'Emergency Number'.tr, + hint: 'Enter phone number'.tr, + type: TextInputType.phone, + ), + ), + confirm: MyElevatedButton( + title: 'Save'.tr, + onPressed: () { + if (mapDriverController.formKey1.currentState!.validate()) { + box.write(BoxName.sosPhoneDriver, + mapDriverController.sosEmergincyNumberCotroller.text); + Get.back(); // Close the dialog + launchCommunication( + 'phone', box.read(BoxName.sosPhoneDriver), ''); + } + }, + ), + ); + } else { + launchCommunication('phone', box.read(BoxName.sosPhoneDriver), ''); + } + } + + void _handleWhatsApp(MapDriverController mapDriverController) { + if (box.read(BoxName.sosPhoneDriver) == null) { + Get.defaultDialog( + title: 'Insert Emergency Number'.tr, + content: Form( + key: mapDriverController.formKey1, + child: MyTextForm( + controller: mapDriverController.sosEmergincyNumberCotroller, + label: 'Emergency Number'.tr, + hint: 'Enter phone number'.tr, + type: TextInputType.phone, + ), + ), + confirm: MyElevatedButton( + title: 'Save'.tr, + onPressed: () { + if (mapDriverController.formKey1.currentState!.validate()) { + box.write(BoxName.sosPhoneDriver, + mapDriverController.sosEmergincyNumberCotroller.text); + Get.back(); // Close the dialog + _sendWhatsAppMessage(mapDriverController); + } + }, + ), + ); + } else { + _sendWhatsAppMessage(mapDriverController); + } + } + + void _handleGoogleMap(MapDriverController mapDriverController) { + () async { + if (Platform.isAndroid) { + Bubble().startBubbleHead(sendAppToBackground: true); + } + var startLat = + Get.find().latLngPassengerLocation.latitude; + var startLng = + Get.find().latLngPassengerLocation.longitude; + + var endLat = + Get.find().latLngPassengerDestination.latitude; + var endLng = + Get.find().latLngPassengerDestination.longitude; + + String url = + 'https://www.google.com/maps/dir/$startLat,$startLng/$endLat,$endLng/&directionsmode=driving'; + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else { + throw 'Could not launch google maps'; + } + }; + } + + void _sendWhatsAppMessage(MapDriverController mapDriverController) { + final sosNumber = box.read(BoxName.sosPhoneDriver); + if (sosNumber != null) { + launchCommunication( + 'whatsapp', + '+2$sosNumber', // Consider international format + "${"Hello, this is Driver".tr} ${box.read(BoxName.nameDriver)}. " + "${"My current location is:".tr} " + "https://www.google.com/maps/place/" + "${Get.find().myLocation.latitude}," + "${Get.find().myLocation.longitude} " + "${"\nI have a trip on".tr} ${AppInformation.appName} " + "${"app with passenger".tr} ${mapDriverController.passengerName}.", + ); + } } } diff --git a/lib/views/home/Captin/orderCaptin/order_request_page.dart b/lib/views/home/Captin/orderCaptin/order_request_page.dart index 15898ca..e979058 100644 --- a/lib/views/home/Captin/orderCaptin/order_request_page.dart +++ b/lib/views/home/Captin/orderCaptin/order_request_page.dart @@ -429,47 +429,27 @@ class _OrderRequestPageState extends State { box.write(BoxName.statusDriverLocation, 'on'); orderRequestController.endTimer(); orderRequestController.changeApplied(); - await CRUD().postFromDialogue( - link: AppLink.addDriverOrder, - payload: { - 'driver_id': myList[6].toString(), - // box.read(BoxName.driverID).toString(), - 'order_id': myList[16].toString(), - 'status': 'Apply' - }); - if (AppLink.endPoint != AppLink.seferCairoServer) { - CRUD().postFromDialogue( - link: - '${AppLink.endPoint}/rides/driver_order/add.php', - payload: { - 'driver_id': myList[6].toString(), - // box.read(BoxName.driverID).toString(), - 'order_id': myList[16].toString(), - 'status': 'Apply' - }); - } /// var res = await CRUD().post( - link: AppLink.updateRideAndCheckIfApplied, + link: AppLink.updateStausFromSpeed, payload: { - 'id': myList[16], + 'id': orderRequestController.myList[16], 'rideTimeStart': DateTime.now().toString(), 'status': 'Apply', - 'driver_id': myList[6].toString(), + 'driver_id': box.read(BoxName.driverID), }); if (AppLink.endPoint != AppLink.seferCairoServer) { CRUD().post( link: - '${AppLink.endPoint}/rides/updateRideAndCheckIfApplied.php', + "${AppLink.endPoint}/ride/rides/updateStausFromSpeed.php", payload: { - 'id': myList[16], + 'id': orderRequestController.myList[16], 'rideTimeStart': DateTime.now().toString(), 'status': 'Apply', - 'driver_id': myList[6].toString(), + 'driver_id': box.read(BoxName.driverID), }); } - if (res == 'failure') { MyDialog().getDialog( "This ride is already applied by another driver." @@ -478,6 +458,25 @@ class _OrderRequestPageState extends State { Get.back(); }); } else { + await CRUD().postFromDialogue( + link: AppLink.addDriverOrder, + payload: { + 'driver_id': myList[6].toString(), + // box.read(BoxName.driverID).toString(), + 'order_id': myList[16].toString(), + 'status': 'Apply' + }); + if (AppLink.endPoint != AppLink.seferCairoServer) { + CRUD().postFromDialogue( + link: + '${AppLink.endPoint}/rides/driver_order/add.php', + payload: { + 'driver_id': myList[6].toString(), + // box.read(BoxName.driverID).toString(), + 'order_id': myList[16].toString(), + 'status': 'Apply' + }); + } List bodyToPassenger = [ myList[6].toString(), //driver id myList[8].toString(), // driver name diff --git a/lib/views/widgets/elevated_btn.dart b/lib/views/widgets/elevated_btn.dart index 8bf8fa7..be60a32 100644 --- a/lib/views/widgets/elevated_btn.dart +++ b/lib/views/widgets/elevated_btn.dart @@ -27,7 +27,7 @@ class MyElevatedButton extends StatelessWidget { bool vibrate = box.read(BoxName.isvibrate) ?? true; return ElevatedButton( style: ButtonStyle( - backgroundColor: WidgetStateProperty.all(AppColor.blueColor), + backgroundColor: WidgetStateProperty.all(kolor), shadowColor: WidgetStateProperty.all(Colors.transparent), shape: WidgetStateProperty.all( RoundedRectangleBorder(