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(