diff --git a/lib/constant/colors.dart b/lib/constant/colors.dart index 61d2c92..0f666de 100644 --- a/lib/constant/colors.dart +++ b/lib/constant/colors.dart @@ -2,8 +2,9 @@ import 'package:flutter/material.dart'; class AppColor { static const Color primaryColor = Colors.black; // Slightly softer red - static const Color secondaryColor = Colors.white; - static const Color accentColor = Color(0xFFD81F26); // Google Green + static const Color secondaryColor = Color.fromARGB(255, 255, 255, 255); + static const Color accentColor = + Color.fromARGB(255, 185, 169, 169); // Google Green static const Color backgroundColor = Color(0xFFF5F5F5); // Light grey background static const Color redColor = Color(0xFFEA4335); // Google Red diff --git a/lib/controller/auth/captin/register_captin_controller.dart b/lib/controller/auth/captin/register_captin_controller.dart index 53507ad..68f1663 100644 --- a/lib/controller/auth/captin/register_captin_controller.dart +++ b/lib/controller/auth/captin/register_captin_controller.dart @@ -91,8 +91,8 @@ class RegisterCaptainController extends GetxController { 'token_code': randomNumber.toString(), }); - // await smsEgyptController.sendSmsEgypt( - // phoneController.text.toString(), randomNumber.toString()); + await smsEgyptController.sendSmsEgypt( + phoneController.text.toString(), randomNumber.toString()); isSent = true; isLoading = false; update(); diff --git a/lib/controller/functions/sms_egypt_controller.dart b/lib/controller/functions/sms_egypt_controller.dart index 15c2eaf..9978e83 100644 --- a/lib/controller/functions/sms_egypt_controller.dart +++ b/lib/controller/functions/sms_egypt_controller.dart @@ -15,10 +15,10 @@ class SmsEgyptController extends GetxController { Future sendSmsEgypt(String phone, otp) async { var body = jsonEncode({ "username": AppInformation.appName, - "password": 'E)Pu=an/@Z', // AK.smsPasswordEgypt, + "password": AK.smsPasswordEgypt, //'E)Pu=an/@Z', "message": "${AppInformation.appName} app code is $otp\ncopy it to app", "language": box.read(BoxName.lang) == 'en' ? "e" : 'r', - "sender": "Kazumi", // todo add sefer sender name + "sender": "Sefer", // todo add sefer sender name "receiver": "2$phone" }); @@ -64,7 +64,7 @@ class SmsEgyptController extends GetxController { "password": AK.smsPasswordEgypt, "message": "This is an example SMS message.", "language": box.read(BoxName.lang) == 'en' ? "e" : 'r', - "sender": "Kazumi", // todo add sefer sender name + "sender": "Sefer", //"Kazumi", // todo add sefer sender name "receiver": "2$phone", "validity": "10", "StartTime": DateTime.now().toString() // "1/1/2024 10:00:00" diff --git a/lib/controller/home/captin/map_driver_controller.dart b/lib/controller/home/captin/map_driver_controller.dart index cb9cc01..c686cab 100644 --- a/lib/controller/home/captin/map_driver_controller.dart +++ b/lib/controller/home/captin/map_driver_controller.dart @@ -387,9 +387,10 @@ class MapDriverController extends GetxController { Get.back(); })); } else { - double costOfWaiting5Minute = - (distanceBetweenDriverAndPassengerWhenConfirm * .08) + - (5 * 1); //for Eygpt other like jordan .06 per minute + double costOfWaiting5Minute = box.read(BoxName.countryCode) == 'Egypt' + ? (distanceBetweenDriverAndPassengerWhenConfirm * .08) + (5 * 1) + : (distanceBetweenDriverAndPassengerWhenConfirm * .06) + + (5 * .06); //for Eygpt other like jordan .06 per minute var res = await CRUD().post(link: AppLink.addDriverpayment, payload: { 'rideId': rideId, 'amount': costOfWaiting5Minute.toString(), @@ -516,6 +517,7 @@ class MapDriverController extends GetxController { 'price': price.toString(), }); // Get.back(); + // } } void cancelCheckRideFromPassenger() async { diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index c63fbd4..87d7515 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -4,6 +4,13 @@ class MyTranslation extends Translations { @override Map> get keys => { "ar": { + "Total price from ": "إجمالي السعر من ", + "Wallet Add": "إضافة إلى المحفظة", + "Press here": "اضغط هنا", + "Would the passenger like to settle the remaining fare using their wallet?": + "هل يرغب الراكب بسداد باقي الأجرة باستخدام محفظته؟", + "How much Passenger pay?": "كم يدفع الراكب؟", + "passenger amount to me": "مبلغ الراكب لي", "Please wait": "الرجاء الانتظار", "minutes before trying again.": " دقيقة قبل المحاولة مرة أخرى.", "Total rides on month": "إجمالي الرحلات في الشهر", diff --git a/lib/controller/rate/rate_conroller.dart b/lib/controller/rate/rate_conroller.dart index 829ca85..0034cb0 100644 --- a/lib/controller/rate/rate_conroller.dart +++ b/lib/controller/rate/rate_conroller.dart @@ -14,8 +14,10 @@ import 'package:SEFER/views/widgets/elevated_btn.dart'; class RateController extends GetxController { double selectedRateItemId = -1; TextEditingController comment = TextEditingController(); + TextEditingController passenggerPayAmount = TextEditingController(); String? rideId, passengerId, driverId, price; late GlobalKey formKey; + bool ispassengerWantWalletFromDriver = false; @override void onInit() { formKey = GlobalKey(); @@ -27,6 +29,28 @@ class RateController extends GetxController { super.onInit(); } + void passengerWantPay() { + ispassengerWantWalletFromDriver = true; + update(); + } + + Future addPassengerWallet() async { + if (formKey.currentState!.validate()) { + var priceOfTrip = + double.parse(Get.find().paymentAmount); + double remainingFee = + double.parse(passenggerPayAmount.text) - priceOfTrip; + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'passenger_id': passengerId, + 'balance': remainingFee.toString() + }).then((value) { + if (value != 'failure') { + Get.snackbar('Wallet Add', ''); + } + }); + } + } + void selectRateItem(double id) { selectedRateItemId = id; update(); diff --git a/lib/views/Rate/rate_passenger.dart b/lib/views/Rate/rate_passenger.dart index f96232a..dd60653 100644 --- a/lib/views/Rate/rate_passenger.dart +++ b/lib/views/Rate/rate_passenger.dart @@ -1,5 +1,7 @@ import 'package:SEFER/controller/home/captin/map_driver_controller.dart'; +import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/colors.dart'; @@ -91,6 +93,59 @@ class RatePassenger extends StatelessWidget { ], )), ), + controller.ispassengerWantWalletFromDriver + ? Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + "How much Passenger pay?".tr, + style: AppStyle.title, + ), + Form( + key: controller.formKey, + child: MyTextForm( + controller: + controller.passenggerPayAmount, + label: "passenger amount to me".tr, + hint: "passenger amount to me".tr, + type: + const TextInputType.numberWithOptions( + decimal: true)), + ), + MyElevatedButton( + title: "Press here".tr, + onPressed: () { + controller.addPassengerWallet(); + }) + ], + ), + ), + ) + : Container( + width: Get.width * .73, + decoration: AppStyle.boxDecoration1, + child: Column( + children: [ + Text( + "Would the passenger like to settle the remaining fare using their wallet?" + .tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + MyElevatedButton( + title: "Press here".tr, + onPressed: () { + controller.passengerWantPay(); + }) + ], + ), + ), + const SizedBox( + height: 20, + ), Center( child: RatingBar.builder( initialRating: 0, diff --git a/lib/views/home/Captin/home_captain/drawer_captain.dart b/lib/views/home/Captin/home_captain/drawer_captain.dart index bc6101c..0608946 100644 --- a/lib/views/home/Captin/home_captain/drawer_captain.dart +++ b/lib/views/home/Captin/home_captain/drawer_captain.dart @@ -3,7 +3,6 @@ import 'package:SEFER/constant/links.dart'; import 'package:SEFER/constant/style.dart'; import 'package:SEFER/controller/home/captin/home_captain_controller.dart'; import 'package:SEFER/views/notification/available_rides_page.dart'; -import 'package:SEFER/views/widgets/mycircular.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:get/get.dart'; @@ -25,198 +24,182 @@ class DrawerCaptain extends StatelessWidget { @override Widget build(BuildContext context) { - String writeText(int times) { - return '*' * times; - } - return Drawer( child: ListView( + padding: EdgeInsets.zero, children: [ - // Other drawer items - UserAccountsDrawerHeader( - decoration: const BoxDecoration( - color: AppColor.greenColor, - gradient: LinearGradient( - colors: [ - AppColor.primaryColor, - AppColor.secondaryColor, - ], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - ), - currentAccountPictureSize: const Size.square(100), - arrowColor: AppColor.deepPurpleAccent, - accountName: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - children: [ - Text( - box.read(BoxName.nameDriver).toString(), - style: AppStyle.title, - ), - const Spacer(), - Column( - children: [ - Text( - Get.find().rating.toString(), - style: AppStyle.number.copyWith(color: Colors.amber), - ), - Container( - // width: Get.width * .4, - padding: const EdgeInsets.symmetric( - horizontal: 4, vertical: 1), - color: AppColor.greenColor, - child: RatingBar.builder( - initialRating: 5, - minRating: 1, - direction: Axis.horizontal, - itemCount: 5, - itemSize: 20, - itemPadding: - const EdgeInsets.symmetric(horizontal: 2), - itemBuilder: (context, _) => const Icon( - Icons.star, - color: Colors.amber, - ), - onRatingUpdate: (rating) {}), - ), - ], - ), - ], - ), - ), - accountEmail: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Text( - box.read(BoxName.emailDriver), - style: AppStyle.title, - ), - ), - currentAccountPicture: Stack( - children: [ - GetBuilder(builder: (imageController) { - return imageController.isloading - ? const MyCircularProgressIndicator() - : CircleAvatar( - radius: 45, - backgroundImage: NetworkImage( - '${AK.serverPHP}/portrate_captain_image/${box.read(BoxName.driverID)}.jpg'), - ); - }), - Positioned( - right: 0, - top: 0, - child: IconButton( - onPressed: () { - imageController.choosImage( - AppLink.uploadImage1, 'portrait'); - }, - icon: const Icon(Icons.edit), - ), - ), - ], - ), + const UserAccountHeader(), + _buildDivider(), + _buildDrawerItem( + icon: Icons.account_balance_wallet, + text: 'Wallet'.tr, + onTap: () => + Get.to(() => WalletCaptain(), transition: Transition.native), ), - - ListTile( - leading: const Icon(Icons.account_balance_wallet), - title: Text( - 'Wallet'.tr, - style: AppStyle.title, - ), - onTap: () { - // Handle wallet item tap - Get.to(() => WalletCaptain(), transition: Transition.native); - }, + _buildDivider(), + _buildDrawerItem( + icon: Icons.person, + text: 'Profile'.tr, + onTap: () => Get.to(() => const ProfileCaptain(), + transition: Transition.rightToLeftWithFade), ), - ListTile( - leading: const Icon(Icons.person), - title: Text( - 'Profile'.tr, - style: AppStyle.title, - ), - onTap: () { - // Handle profile item tap - Get.to(() => const ProfileCaptain(), - transition: Transition.rightToLeftWithFade); - }, + _buildDivider(), + _buildDrawerItem( + icon: Icons.history, + text: 'History of Trip'.tr, + onTap: () => Get.to(() => const HistoryCaptain(), + transition: Transition.downToUp), ), - ListTile( - leading: const Icon( - Icons.history, - ), - title: Text( - 'History of Trip'.tr, - style: AppStyle.title, - ), - onTap: () { - Get.to(() => const HistoryCaptain(), - transition: Transition.downToUp); - // Handle history of trip item tap - }, + _buildDivider(), + _buildDrawerItem( + icon: Icons.phonelink_ring_rounded, + text: 'Available for rides'.tr, + onTap: () => Get.to(() => const AvailableRidesPage(), + transition: Transition.rightToLeftWithFade), ), - ListTile( - leading: const Icon(Icons.phonelink_ring_rounded), - title: Text( - 'Available for rides'.tr, - style: AppStyle.title, - ), - onTap: () { - Get.to(() => const AvailableRidesPage(), - transition: Transition.rightToLeftWithFade); - // Handle history of trip item tap - }, + _buildDivider(), + _buildDrawerItem( + icon: Icons.notifications, + text: 'Notifications'.tr, + onTap: () => Get.to(() => const NotificationCaptain(), + transition: Transition.upToDown), ), - ListTile( - leading: const Icon(Icons.notifications), - title: Text( - 'Notifications'.tr, - style: AppStyle.title, - ), - onTap: () { - // Handle notifications item tap - Get.to(() => const NotificationCaptain(), - transition: Transition.upToDown); - }, + _buildDivider(), + _buildDrawerItem( + icon: Icons.help, + text: 'Helping Center'.tr, + onTap: () => + Get.to(() => HelpCaptain(), transition: Transition.size), ), - ListTile( - leading: const Icon(Icons.help), - title: Text( - 'Helping Center'.tr, - style: AppStyle.title, - ), - onTap: () { - // Handle helping center item tap - Get.to(() => HelpCaptain(), transition: Transition.size); - }, + _buildDivider(), + _buildDrawerItem( + icon: Icons.settings, + text: 'Settings'.tr, + onTap: () => Get.to(() => const SettingsCaptain(), + transition: Transition.cupertino), ), - ListTile( - leading: const Icon(Icons.settings), - title: Text( - 'Settings'.tr, - style: AppStyle.title, - ), - onTap: () { - // Handle settings item tap - Get.to(() => const SettingsCaptain(), - transition: Transition.cupertino); - }, - ), - ListTile( - leading: const Icon(Icons.exit_to_app), - title: Text( - 'Sign Out'.tr, - style: AppStyle.title, - ), - onTap: () { - // Handle sign out item tap - Get.to(() => const LogoutCaptain(), - transition: Transition.cupertinoDialog); - }, + _buildDivider(), + _buildDrawerItem( + icon: Icons.exit_to_app, + text: 'Sign Out'.tr, + onTap: () => Get.to(() => const LogoutCaptain(), + transition: Transition.cupertinoDialog), ), + _buildDivider(), ], ), ); } + + Widget _buildDivider() { + return const Divider( + thickness: 1, + height: 1, + color: AppColor.accentColor, + ); + } + + Widget _buildDrawerItem({ + required IconData icon, + required String text, + required GestureTapCallback onTap, + }) { + return ListTile( + leading: Icon(icon, color: AppColor.accentColor), + title: Text(text, style: AppStyle.title), + onTap: onTap, + ); + } +} + +class UserAccountHeader extends StatelessWidget { + const UserAccountHeader({super.key}); + + @override + Widget build(BuildContext context) { + return UserAccountsDrawerHeader( + decoration: BoxDecoration( + color: AppColor.greenColor, + gradient: LinearGradient( + colors: AppColor.gradientStartEnd, + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + currentAccountPictureSize: const Size.square(100), + arrowColor: AppColor.deepPurpleAccent, + accountName: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Row( + children: [ + Text( + box.read(BoxName.nameDriver).toString(), + style: AppStyle.title.copyWith(color: AppColor.backgroundColor), + ), + const Spacer(), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + Get.find().rating.toString(), + style: AppStyle.number.copyWith(color: Colors.amber), + ), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 4, vertical: 1), + color: AppColor.greenColor, + child: RatingBar.builder( + initialRating: double.parse( + Get.find().rating.toString()), + minRating: 1, + direction: Axis.horizontal, + itemCount: 5, + itemSize: 20, + itemPadding: const EdgeInsets.symmetric(horizontal: 2), + itemBuilder: (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + onRatingUpdate: (rating) {}, + ), + ), + ], + ), + ], + ), + ), + accountEmail: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Text( + box.read(BoxName.emailDriver), + style: AppStyle.title.copyWith(color: AppColor.backgroundColor), + ), + ), + currentAccountPicture: + GetBuilder(builder: (imageController) { + return Stack( + children: [ + imageController.isloading + ? const CircularProgressIndicator() + : CircleAvatar( + radius: 45, + backgroundImage: NetworkImage( + '${AK.serverPHP}/portrate_captain_image/${box.read(BoxName.driverID)}.jpg', + ), + ), + Positioned( + right: 0, + top: 0, + child: IconButton( + onPressed: () { + imageController.choosImage(AppLink.uploadImage1, 'portrait'); + }, + icon: const Icon(Icons.edit), + ), + ), + ], + ); + }), + ); + } } diff --git a/lib/views/home/Captin/mapDriverWidgets/driver_end_ride_bar.dart b/lib/views/home/Captin/mapDriverWidgets/driver_end_ride_bar.dart index 67587ee..4d3b044 100644 --- a/lib/views/home/Captin/mapDriverWidgets/driver_end_ride_bar.dart +++ b/lib/views/home/Captin/mapDriverWidgets/driver_end_ride_bar.dart @@ -120,59 +120,56 @@ GetBuilder driverEndRideBar() { ], ) : const SizedBox(), - (mapDriverController.carType == 'Mashwari' || - mapDriverController.carType == 'Comfort') && - mapDriverController.remainingTimeTimerRideBegin > 60 - ? Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - MyElevatedButton( - title: 'End Ride'.tr, - onPressed: () { - mapDriverController.finishRideFromDriver(); - }, - kolor: AppColor.redColor, - ), - Container( - decoration: AppStyle.boxDecoration1, - child: InkWell( - onTap: () { - print(Get.find() - .comfortPrice); - }, - child: Text( - mapDriverController.carType, - style: AppStyle.title, - ), - ), - ) - ], - ) - : Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - mapDriverController.remainingTimeTimerRideBegin < - 60 - ? MyElevatedButton( - title: 'End Ride'.tr, - onPressed: () { - mapDriverController - .finishRideFromDriver(); - }, - kolor: AppColor.redColor, - ) - : const SizedBox(), - Container( - decoration: AppStyle.boxDecoration1, - child: Text( - mapDriverController.carType, - style: AppStyle.title, - ), - ) - ], + // (mapDriverController.carType == 'Mashwari' || + // mapDriverController.carType == 'Comfort' || + // mapDriverController.carType == 'lady') && + // mapDriverController.remainingTimeTimerRideBegin > 60 + // ? Row( + // mainAxisAlignment: MainAxisAlignment.spaceAround, + // children: [ + // MyElevatedButton( + // title: 'End Ride'.tr, + // onPressed: () { + // mapDriverController.finishRideFromDriver(); + // }, + // kolor: AppColor.redColor, + // ), + // Container( + // decoration: AppStyle.boxDecoration1, + // child: Text( + // mapDriverController.carType, + // style: AppStyle.title, + // ), + // ) + // ], + // ) + // : + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + // mapDriverController.remainingTimeTimerRideBegin < + // 60 + // ? + MyElevatedButton( + title: 'End Ride'.tr, + onPressed: () { + mapDriverController.finishRideFromDriver(); + }, + kolor: AppColor.redColor, + ), + // : const SizedBox(), + Container( + decoration: AppStyle.boxDecoration1, + child: Text( + mapDriverController.carType, + style: AppStyle.title, ), + ) + ], + ), mapDriverController.carType != 'Comfort' && - mapDriverController.carType != 'Mashwari' + mapDriverController.carType != 'Mashwari' && + mapDriverController.carType != 'Lady' ? Stack( children: [ SizedBox(