From 3313cb0203aa4a317ca7ef9cc07dadb7f62f9201 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sat, 21 Sep 2024 00:19:38 +0300 Subject: [PATCH] 9/21/1 --- lib/constant/links.dart | 4 + .../captin/help/assurance_controller.dart | 66 ++ lib/controller/local/translations.dart | 33 + .../home/Captin/assurance_health_page.dart | 227 ++++++ .../Captin/home_captain/drawer_captain.dart | 8 + .../home/my_wallet/card_wallet_widget.dart | 179 +++-- .../home/my_wallet/transfer_budget_page.dart | 28 +- lib/views/home/my_wallet/walet_captain.dart | 752 ++++++++---------- 8 files changed, 780 insertions(+), 517 deletions(-) create mode 100644 lib/controller/home/captin/help/assurance_controller.dart create mode 100644 lib/views/home/Captin/assurance_health_page.dart diff --git a/lib/constant/links.dart b/lib/constant/links.dart index e2d73a5..4068bd7 100644 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -146,6 +146,10 @@ class AppLink { static String checkPhoneNumberISVerfiedDriver = "$auth/checkPhoneNumberISVerfiedDriver.php"; +//-----------------healthInsuranceProvider------------------ + static String addHealthInsuranceProvider = "$server/driver_assurance/add.php"; + static String getHealthInsuranceProvider = "$server/driver_assurance/get.php"; + //-----------------Feed Back------------------ static String addFeedBack = "$ride/feedBack/add.php"; static String getFeedBack = "$ride/feedBack/get.php"; diff --git a/lib/controller/home/captin/help/assurance_controller.dart b/lib/controller/home/captin/help/assurance_controller.dart new file mode 100644 index 0000000..e6c81e4 --- /dev/null +++ b/lib/controller/home/captin/help/assurance_controller.dart @@ -0,0 +1,66 @@ +import 'dart:convert'; + +import 'package:SEFER/constant/box_name.dart'; +import 'package:SEFER/constant/links.dart'; +import 'package:SEFER/controller/functions/crud.dart'; +import 'package:SEFER/main.dart'; +import 'package:get/get.dart'; + +import '../../../../constant/colors.dart'; + +class AssuranceHealthController extends GetxController { + bool isLoading = false; + Map tripCount = {}; + + Future getTripCountByCaptain() async { + var res = await CRUD().get(link: AppLink.getTripCountByCaptain, payload: { + "driver_id": box.read(BoxName.driverID).toString(), + }); + if (res != 'failure') { + tripCount = jsonDecode(res)['message']; + update(); + } + } + + Future addDriverHealthAssurance({ + String? driverId, + String? assured, + required String healthInsuranceProvider, + }) async { + // Define the URL to your PHP backend + + // Data to be sent to the backend + Map data = { + "driver_id": box.read(BoxName.driverID).toString(), + "assured": '1', + "health_insurance_provider": healthInsuranceProvider, + }; + + try { + // Send the POST request to your backend + var response = await CRUD() + .post(link: AppLink.addHealthInsuranceProvider, payload: data); + + if (response != 'failure') { + // Handle success (e.g., show a success message) + print("Health assurance data saved successfully"); + Get.snackbar( + "Success".tr, + "You have successfully opted for health insurance.".tr, + backgroundColor: AppColor.greenColor, + ); + } else { + // Handle failure (e.g., show an error message) + print("Failed to save health assurance data"); + Get.snackbar( + "Error".tr, + "Please enter a health insurance status.".tr, + backgroundColor: AppColor.redColor, + ); + } + } catch (e) { + // Handle any errors + print("Error: $e"); + } + } +} diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index b6f6a15..c562094 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -8,6 +8,28 @@ class MyTranslation extends Translations { 'إذا كنت بحاجة إلى أي مساعدة أو لديك أي أسئلة، فهذا هو المكان المناسب لذلك. أهلاً وسهلاً بك!', 'ID Mismatch': "عدم تطابق الرقم التعريفي", "face detect": "كشف الوجه", + "Would you like to proceed with health insurance?": + "هل ترغب في الاستمرار مع التأمين الصحي؟", + "Confirmation": "تأكيد", + "Enter Health Insurance Provider": "أدخل مزود التأمين الصحي", + "Yes": "نعم", + "No": "لا", + "You need to complete 500 trips": "يجب عليك إكمال 500 رحلة", + "Please enter a valid insurance provider": + "الرجاء إدخال مزود تأمين صالح", + "Opted out": "اختيار عدم الاستمرار", + "You have chosen not to proceed with health insurance.": + "لقد اخترت عدم الاستمرار مع التأمين الصحي.", + "Do you have a disease for a long time?": + "هل لديك مرض منذ فترة طويلة؟", + + "When you complete 500 trips, you will be eligible for exclusive health insurance offers.": + "عند إكمال 500 رحلة، ستكون مؤهلاً للحصول على عروض حصرية للتأمين الصحي.", + "We have partnered with health insurance providers to offer you special health coverage. Complete 500 trips and receive a 20% discount on health insurance premiums.": + "لقد عقدنا شراكة مع مزودي التأمين الصحي لتقديم تغطية صحية خاصة لك. أكمل 500 رحلة واحصل على خصم 20% على أقساط التأمين الصحي.", + "Show health insurance providers near me": + "اعرض مزودي التأمين الصحي القريبين مني", + "Health Insurance": "التأمين الصحي", 'An error occurred while saving driver data': "حدث خطأ أثناء حفظ بيانات السائق", "Face Detection Result": "نتيجة كشف الوجه", @@ -127,6 +149,17 @@ class MyTranslation extends Translations { "Afternoon Promo Rides": "رحلات بونص بعد الظهر", "Heading your way now. Please be ready.": "في طريقي إليك الآن. يرجى الاستعداد.", + "Alert": "تنبيه", + "You have successfully opted for health insurance.": + "لقد اخترت التأمين الصحي بنجاح.", + "Please enter a health insurance status.": + "يرجى إدخال حالة التأمين الصحي", + "The 3000 points equal 3000 L.E for you \nSo go and gain your money": + "3000 نقطة تساوي 3000 جنيه لك \nلذا اذهب واحصل على أموالك", + "Info": "معلومات", + "You dont have money in your Wallet": "ليس لديك أموال في محفظتك", + "You dont have money in your Wallet or you should less transfer 5 LE to activate": + "ليس لديك أموال في محفظتك أو يجب عليك تحويل 5 جنيهات على الأقل لتفعيل الحساب", "Approaching your area. Should be there in 3 minutes.": "اقترب من منطقتك. يجب أن أكون هناك خلال 3 دقائق.", "There's heavy traffic here. Can you suggest an alternate pickup point?": diff --git a/lib/views/home/Captin/assurance_health_page.dart b/lib/views/home/Captin/assurance_health_page.dart new file mode 100644 index 0000000..e37a574 --- /dev/null +++ b/lib/views/home/Captin/assurance_health_page.dart @@ -0,0 +1,227 @@ +import 'package:SEFER/constant/box_name.dart'; +import 'package:SEFER/main.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../controller/home/captin/help/assurance_controller.dart'; + +import 'package:flutter/cupertino.dart'; + +class AssuranceHealthPage extends StatelessWidget { + AssuranceHealthPage({super.key}); + AssuranceHealthController assuranceHealthController = + Get.put(AssuranceHealthController()); + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text("Health Insurance".tr), + ), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: GetBuilder( + builder: (assuranceHealthController) { + return Column( + children: [ + Text( + "When you complete 500 trips, you will be eligible for exclusive health insurance offers." + .tr, + textAlign: TextAlign.center, + style: CupertinoTheme.of(context).textTheme.navTitleTextStyle, + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + CupertinoButton.filled( + child: Text("Show My Trip Count".tr), + onPressed: () async { + assuranceHealthController.getTripCountByCaptain(); + }, + ), + _buildTripCountAvatar( + assuranceHealthController.tripCount['count'] == null + ? '0' + : assuranceHealthController.tripCount['count'] + .toString(), + ), + ], + ), + const SizedBox(height: 10), + Container( + decoration: BoxDecoration( + color: CupertinoColors.systemGrey6, + borderRadius: BorderRadius.circular(10), + ), + child: Padding( + padding: const EdgeInsets.all(14), + child: Text( + "We have partnered with health insurance providers to offer you special health coverage. Complete 500 trips and receive a 20% discount on health insurance premiums." + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ), + ), + const SizedBox(height: 10), + CupertinoButton.filled( + disabledColor: AppColor.blueColor, + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + borderRadius: BorderRadius.circular(12), + child: Text( + "Would you like to proceed with health insurance?".tr, + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + onPressed: () async { + // Show confirmation dialog before proceeding + showCupertinoDialog( + context: context, + builder: (BuildContext context) { + // Variable to store the health insurance provider chosen by the driver + TextEditingController providerController = + TextEditingController(); + + return CupertinoAlertDialog( + title: Text( + "Confirmation".tr, + style: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + ), + content: Column( + children: [ + Text( + "Would you like to proceed with health insurance?" + .tr, + style: const TextStyle(fontSize: 14), + ), + const SizedBox(height: 20), + CupertinoTextField( + controller: providerController, + placeholder: + "Do you have a disease for a long time?".tr, + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + border: Border.all( + color: CupertinoColors.systemGrey, + width: 1), + borderRadius: BorderRadius.circular(8), + ), + ), + ], + ), + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + child: Text( + "Yes".tr, + style: const TextStyle( + color: CupertinoColors.activeBlue), + ), + onPressed: () async { + // Ensure the provider name is not empty + if (providerController.text.isNotEmpty) { + // Call the function to insert data into the database + await assuranceHealthController + .addDriverHealthAssurance( + healthInsuranceProvider: + providerController.text, + ); + + // Close the dialog and navigate to a success screen or show a snackbar + Navigator.of(context).pop(); + } else { + // Show an alert if the provider name is empty + showCupertinoDialog( + context: context, + builder: (_) => CupertinoAlertDialog( + title: Text("Error".tr), + content: Text( + "Do you have a disease for a long time?" + .tr), + actions: [ + CupertinoDialogAction( + child: Text("OK".tr), + onPressed: () => + Navigator.of(context).pop(), + ), + ], + ), + ); + } + }, + ), + CupertinoDialogAction( + child: Text( + "No".tr, + style: const TextStyle( + color: CupertinoColors.destructiveRed), + ), + onPressed: () { + Navigator.of(context) + .pop(); // Just close the dialog + // Optionally show feedback if the driver opts out + Get.snackbar( + "Opted out".tr, + "You have chosen not to proceed with health insurance." + .tr, + backgroundColor: + CupertinoColors.systemGrey); + }, + ), + ], + ); + }, + ); + }, + ), + ], + ); + }), + ), + ), + ); + } + + Widget _buildTripCountAvatar(String count) { + return Container( + width: 80, + height: 80, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: const RadialGradient( + colors: [ + Color(0xFF42A5F5), + Color(0xFF1976D2), + ], // Health theme colors + center: Alignment.center, + radius: 0.8, + ), + boxShadow: [ + BoxShadow( + color: CupertinoColors.black.withOpacity(0.2), + blurRadius: 8, + offset: const Offset(0, 4), + ), + ], + ), + child: Center( + child: Text( + count, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: CupertinoColors.white, + ), + ), + ), + ); + } +} diff --git a/lib/views/home/Captin/home_captain/drawer_captain.dart b/lib/views/home/Captin/home_captain/drawer_captain.dart index 8b5fff8..0130b32 100644 --- a/lib/views/home/Captin/home_captain/drawer_captain.dart +++ b/lib/views/home/Captin/home_captain/drawer_captain.dart @@ -19,6 +19,7 @@ import 'package:SEFER/views/notification/notification_captain.dart'; import '../../../../constant/colors.dart'; import '../../../../controller/functions/upload_image.dart'; +import '../assurance_health_page.dart'; import '../maintain_center_page.dart'; import 'package:flutter/cupertino.dart'; @@ -86,6 +87,13 @@ class CupertinoDrawerCaptain extends StatelessWidget { onTap: () => Get.to(() => MaintainCenterPage()), ), _buildDivider(), + _buildDrawerItem( + icon: + CupertinoIcons.heart, // Updated icon to represent health + text: "Health Insurance".tr, // Updated English text + onTap: () => Get.to(() => AssuranceHealthPage()), + ), + _buildDivider(), _buildDrawerItem( icon: CupertinoIcons.mail, text: "Contact Us".tr, diff --git a/lib/views/home/my_wallet/card_wallet_widget.dart b/lib/views/home/my_wallet/card_wallet_widget.dart index 66a1871..d3773e0 100644 --- a/lib/views/home/my_wallet/card_wallet_widget.dart +++ b/lib/views/home/my_wallet/card_wallet_widget.dart @@ -1,4 +1,5 @@ import 'package:SEFER/print.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -20,23 +21,15 @@ class CardSeferWalletDriver extends StatelessWidget { @override Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GetBuilder(builder: (captainWalletController) { - return InkWell( + return Center( + child: GetBuilder( + builder: (captainWalletController) { + return GestureDetector( onTap: () async { final now = DateTime.now(); DateTime? lastRequestTime = box.read(BoxName.lastTimeCaptainWalletCashOut); - // if (lastRequestTime == null || - // now.difference(lastRequestTime).inHours >= 24) { - // // Update the last request time to now - // lastRequestTime = now; - // await box.write( - // BoxName.lastTimeCaptainWalletCashOut, lastRequestTime); - // box.write(BoxName.cvvCode, 1111); if (double.parse( Get.find().totalAmountVisa) >= 20) { @@ -45,40 +38,37 @@ class CardSeferWalletDriver extends StatelessWidget { title: 'Do you want to collect your earnings?'.tr, titleStyle: AppStyle.title, content: Column( + crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ + const Icon(Icons.account_balance_wallet, + color: AppColor.primaryColor), + const SizedBox(width: 10), Text( - 'Total wallet is '.tr, - style: AppStyle.title, - ), - const SizedBox( - width: 5, + 'Total wallet: '.tr, + style: AppStyle.title.copyWith(fontSize: 16), ), Text( - Get.find() - .totalAmountVisa, - style: AppStyle.number, + '${Get.find().totalAmountVisa} \$', + style: AppStyle.number.copyWith(fontSize: 16), ), ], ), - const SizedBox( - height: 5, - ), + const SizedBox(height: 20), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'Wallet Type'.tr, - style: AppStyle.title, - ), - const SizedBox( - width: 5, + 'Wallet Type: '.tr, + style: AppStyle.title.copyWith(fontSize: 16), ), + const SizedBox(width: 10), MyDropDown1(), ], ), + const SizedBox(height: 20), Form( key: captainWalletController.formKey, child: MyTextForm( @@ -87,7 +77,7 @@ class CardSeferWalletDriver extends StatelessWidget { hint: "Enter your wallet number".tr, type: TextInputType.phone, ), - ) + ), ], ), confirm: MyElevatedButton( @@ -104,9 +94,6 @@ class CardSeferWalletDriver extends StatelessWidget { .totalAmountVisa) - 5) .toStringAsFixed(0); - // .dropdownValue - // .toString()); - // .toString()); await Get.put(PaymobPayout()).payToWalletDriverAll( amountAfter5LE, Get.find().dropdownValue.toString(), @@ -124,88 +111,108 @@ class CardSeferWalletDriver extends StatelessWidget { kolor: AppColor.greenColor, ), cancel: MyElevatedButton( - title: 'cancel'.tr, + title: 'Cancel'.tr, onPressed: () { Get.back(); }, kolor: AppColor.redColor, )); } else { - { - Get.snackbar( - '${'The Amount is less than'.tr}${box.read(BoxName.countryCode) == 'Egypt' ? '20' : '20'}', - '', - backgroundColor: AppColor.yellowColor); - } + // Replacing Get.snackbar with CupertinoAlertDialog + showCupertinoDialog( + context: context, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: Text("Alert".tr), + content: Text( + '${'The Amount is less than'.tr}${box.read(BoxName.countryCode) == 'Egypt' ? '20' : '20'}', + ), + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + child: Text("OK".tr), + onPressed: () { + Navigator.of(context).pop(); // Close the dialog + }, + ), + ], + ); + }, + ); } - // } else { - // // Optionally show a message or handle the throttling case - // final hoursLeft = 24 - now.difference(lastRequestTime).inHours; - // Get.snackbar( - // '${'Please wait'.tr} $hoursLeft ${"hours before trying again.".tr}', - // ''); - // } }, child: Container( width: Get.width * .85, - height: Get.height * .2, + height: Get.height * .22, decoration: BoxDecoration( - color: AppColor.deepPurpleAccent, - borderRadius: const BorderRadius.all(Radius.circular(12)), - gradient: const LinearGradient(colors: [ - AppColor.greyColor, - AppColor.greyColor, - AppColor.secondaryColor, - AppColor.writeColor - ]), + borderRadius: BorderRadius.circular(15), + gradient: LinearGradient( + colors: [ + AppColor.secondaryColor.withOpacity(0.85), + AppColor.primaryColor.withOpacity(0.85), + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 10, + offset: const Offset(0, 5), + ), + ], ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Text( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( '${AppInformation.appName} Wallet', style: AppStyle.headTitle .copyWith(color: AppColor.writeColor), ), - ) - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - '${Get.find().totalAmountVisa}\$' ?? - '0.0 \$', - style: AppStyle.headTitle2, - ) - ], - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( + const Icon(Icons.account_balance_wallet, + color: AppColor.writeColor, size: 24), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '${Get.find().totalAmountVisa}\$' ?? + '0.0 \$', + style: AppStyle.headTitle2.copyWith( + color: AppColor.writeColor, fontSize: 28), + ), + ], + ), + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( box.read(BoxName.nameDriver), - style: AppStyle.title, + style: AppStyle.title.copyWith( + color: AppColor.writeColor.withOpacity(0.9)), ), Text( "Cash Out".tr, - style: AppStyle.title, - ) + style: AppStyle.title.copyWith( + color: AppColor.writeColor.withOpacity(0.9)), + ), ], ), - ) - ], + ], + ), ), ), ); - }), - ], + }, + ), ); } } diff --git a/lib/views/home/my_wallet/transfer_budget_page.dart b/lib/views/home/my_wallet/transfer_budget_page.dart index a04100f..84909d9 100644 --- a/lib/views/home/my_wallet/transfer_budget_page.dart +++ b/lib/views/home/my_wallet/transfer_budget_page.dart @@ -3,6 +3,7 @@ import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/my_scafold.dart'; import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:SEFER/views/widgets/mycircular.dart'; +import 'package:SEFER/views/widgets/mydialoug.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -105,11 +106,28 @@ class TransferBudgetPage extends StatelessWidget { ? MyElevatedButton( title: 'Transfer'.tr, onPressed: () async { - await captainWalletController - .addTransferDriversWallet( - 'TransferFrom', - 'TransferTo', - ); + if (double.parse( + captainWalletController + .amountFromBudgetController + .text) < + double.parse( + captainWalletController + .totalAmountVisa) - + 5) { + await captainWalletController + .addTransferDriversWallet( + 'TransferFrom', + 'TransferTo', + ); + } else { + MyDialog().getDialog( + "You dont have money in your Wallet" + .tr, + "You dont have money in your Wallet or you should less transfer 5 LE to activate" + .tr, () { + Get.back(); + }); + } }) : const SizedBox() ], diff --git a/lib/views/home/my_wallet/walet_captain.dart b/lib/views/home/my_wallet/walet_captain.dart index 67aff41..fa5b0b2 100644 --- a/lib/views/home/my_wallet/walet_captain.dart +++ b/lib/views/home/my_wallet/walet_captain.dart @@ -5,6 +5,7 @@ import 'package:SEFER/controller/home/payment/paymob_payout.dart'; import 'package:SEFER/views/home/my_wallet/bank_account_egypt.dart'; import 'package:SEFER/views/home/my_wallet/payment_history_driver_page.dart'; import 'package:SEFER/views/widgets/mydialoug.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/box_name.dart'; @@ -48,7 +49,6 @@ class WalletCaptain extends StatelessWidget { children: [ const SizedBox(), Container( - // decoration: AppStyle.boxDecoration1.copyWith( color: double.parse(captainWalletController .totalPoints .toString()) < @@ -63,16 +63,27 @@ class WalletCaptain extends StatelessWidget { -3000 ? AppColor.redColor : AppColor.greenColor, - // ), child: InkWell( onTap: () { - Get.snackbar( - 'the 3000 points equal 3000 L.E'.tr, - 'the 3000 points equal 3000 L.E for you \nSo go and gain your money' - .tr, - backgroundColor: AppColor.greenColor, - snackPosition: SnackPosition.BOTTOM, - duration: const Duration(seconds: 4), + showCupertinoDialog( + context: context, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: Text('Info'.tr), + content: Text( + 'The 3000 points equal 3000 L.E for you \nSo go and gain your money' + .tr, + ), + actions: [ + CupertinoDialogAction( + child: Text("OK".tr), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, ); }, child: Padding( @@ -86,437 +97,127 @@ class WalletCaptain extends StatelessWidget { ), ), ), - const SizedBox( - height: 10, - ), - double.parse(captainWalletController.totalPoints - .toString()) < - -3000 - ? MyElevatedButton( - title: 'Charge your Account'.tr, - onPressed: () {}) - : const SizedBox(), - const SizedBox( - height: 10, - ), + const SizedBox(height: 10), + if (double.parse(captainWalletController.totalPoints + .toString()) < + -3000) + CupertinoButton.filled( + child: Text('Charge your Account'.tr), + onPressed: () { + // Add your charge account logic here + }, + ), + const SizedBox(height: 10), const CardSeferWalletDriver(), Card( - elevation: 4, + elevation: 8, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), + padding: const EdgeInsets.all(16), child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Total Budget from trips is '.tr, - style: AppStyle.title, - ), - Container( - decoration: BoxDecoration( - border: Border.all( - width: 2, - color: AppColor.writeColor)), - child: GestureDetector( - onTap: () { - Log.print( - 'captainWalletController.totalAmount: ${captainWalletController.totalAmount}'); - Get.snackbar( - icon: InkWell( - onTap: () async { - await Get.put( - TextToSpeechController()) - .speakText( - 'This amount for all trip I get from Passengers' - .tr); - }, - child: const Icon( - Icons.headphones)), - '${'Total Amount:'.tr} ${captainWalletController.totalAmount}\$', - 'This amount for all trip I get from Passengers' - .tr, - duration: - const Duration(seconds: 6), - backgroundColor: - AppColor.yellowColor, - snackPosition: SnackPosition.BOTTOM, - ); - }, - child: Padding( - padding: const EdgeInsets.all(2), - child: Text( - '${captainWalletController.totalAmount}\$'), - ), - ), - ) - ], - ), - const SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Total Budget from trips by\nCredit card is ' + _buildBudgetRow( + title: 'Total Budget from trips is '.tr, + amount: captainWalletController.totalAmount, + onTap: () { + Get.snackbar( + icon: InkWell( + onTap: () async { + await Get.put( + TextToSpeechController()) + .speakText( + 'This amount for all trip I get from Passengers' + .tr); + }, + child: const Icon(Icons.headphones)), + '${'Total Amount:'.tr} ${captainWalletController.totalAmount}\$', + 'This amount for all trip I get from Passengers' .tr, - style: AppStyle.title, - ), - Container( - decoration: BoxDecoration( - border: Border.all( - width: 2, - color: AppColor.writeColor)), - child: Padding( - padding: const EdgeInsets.all(2), - child: InkWell( - onTap: () { - Get.snackbar( - icon: InkWell( - onTap: () async { - await Get.find< - TextToSpeechController>() - .speakText( - 'This amount for all trip I get from Passengers and Collected For me in' - .tr + - ' SAFAR Wallet'.tr, - ); - }, - child: const Icon( - Icons.headphones), - ), - '${'Total Amount:'.tr} ${captainWalletController.totalAmountVisa}\$', - 'This amount for all trip I get from Passengers and Collected For me in' - .tr + - ' ${AppInformation.appName} Wallet' - .tr, - duration: - const Duration(seconds: 6), - backgroundColor: - AppColor.redColor, - snackPosition: - SnackPosition.BOTTOM, - ); - }, - child: Text( - '${captainWalletController.totalAmountVisa}\$'), - ), - )) - ], - ), - const SizedBox( - height: 10, - ), - MyElevatedButton( - title: - 'You can buy points from your budget'.tr, - onPressed: () { - Get.defaultDialog( - title: 'Pay from my budget'.tr, - titleStyle: AppStyle.title, - content: Form( - key: captainWalletController.formKey, - child: MyTextForm( - controller: captainWalletController - .amountFromBudgetController, - label: - '${'You have in account'.tr} ${captainWalletController.totalAmountVisa}', - hint: - '${'You have in account'.tr} ${captainWalletController.totalAmountVisa}', - type: TextInputType.number, - ), - ), - confirm: MyElevatedButton( - title: 'Pay'.tr, - onPressed: () async { - if (double.parse( - captainWalletController - .amountFromBudgetController - .text) < - double.parse( - captainWalletController - .totalAmountVisa)) { - await captainWalletController - .payFromBudget(); - } else { - Get.back(); - Get.snackbar( - 'Your Budget less than needed' - .tr, - '', - duration: const Duration( - seconds: 3), - backgroundColor: - AppColor.redColor, - snackPosition: - SnackPosition.BOTTOM, - ); - } - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - onPressed: () { - Get.back(); - })); + duration: const Duration(seconds: 6), + backgroundColor: AppColor.yellowColor, + snackPosition: SnackPosition.BOTTOM, + ); }, ), - MyElevatedButton( - title: 'Transfer budget'.tr, - onPressed: () { - if (double.parse(captainWalletController - .totalAmountVisa) > - 15) { - Get.to( - () => const TransferBudgetPage()); - } else { - Get.snackbar( - "You don't have enough money in your SEFER wallet" - .tr, - ''); - } - }) + const SizedBox(height: 16), + _buildBudgetRow( + title: + 'Total Budget from trips by\nCredit card is ' + .tr, + amount: + captainWalletController.totalAmountVisa, + onTap: () { + Get.snackbar( + icon: InkWell( + onTap: () async { + await Get.find< + TextToSpeechController>() + .speakText( + 'This amount for all trip I get from Passengers and Collected For me in' + .tr + + ' SAFAR Wallet'.tr, + ); + }, + child: const Icon(Icons.headphones), + ), + '${'Total Amount:'.tr} ${captainWalletController.totalAmountVisa}\$', + 'This amount for all trip I get from Passengers and Collected For me in' + .tr + + ' ${AppInformation.appName} Wallet' + .tr, + duration: const Duration(seconds: 6), + backgroundColor: AppColor.redColor, + snackPosition: SnackPosition.BOTTOM, + ); + }, + ), + const SizedBox(height: 16), + _buildBuyPointsButton(captainWalletController), + const SizedBox(height: 16), + _buildTransferBudgetButton( + captainWalletController), + const SizedBox(height: 16), + _buildPurchaseInstructions(), + const SizedBox(height: 8), + _buildPointsOptions(), ], ), ), ), - const SizedBox( - height: 10, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - decoration: AppStyle.boxDecoration, - child: Column(children: [ - Text( - "You can purchase a budget to enable online access through the options listed below." - .tr, - textAlign: TextAlign.center, - style: AppStyle.title, - ), - const Divider( - indent: 30, - endIndent: 30, - color: AppColor.accentColor, - thickness: 3, - ), - const SizedBox( - height: 10, - ), - Container( - decoration: AppStyle.boxDecoration, - height: Get.height * .19, - child: ListView( - scrollDirection: Axis.horizontal, - children: [ - PointsCaptain( - kolor: AppColor.greyColor, - pricePoint: - box.read(BoxName.countryCode) == - 'Jordan' - ? 5 - : 80, - countPoint: - box.read(BoxName.countryCode) == - 'Jordan' - ? '3000' - : '1000', - ), - PointsCaptain( - kolor: AppColor - .bronze, // Bronze color for medium value - pricePoint: - box.read(BoxName.countryCode) == - 'Jordan' - ? 10 - : 200, - countPoint: - box.read(BoxName.countryCode) == - 'Jordan' - ? '1040' - : '2500', - ), - PointsCaptain( - kolor: AppColor - .goldenBronze, // Golden bronze color for higher value - pricePoint: - box.read(BoxName.countryCode) == - 'Jordan' - ? 22 - : 400, - countPoint: - box.read(BoxName.countryCode) == - 'Jordan' - ? '23000' - : '5100', - ), - PointsCaptain( - kolor: AppColor - .gold, // Gold color for highest value - pricePoint: - box.read(BoxName.countryCode) == - 'Jordan' - ? 50 - : 1000, - countPoint: - box.read(BoxName.countryCode) == - 'Jordan' - ? '55000' - : '130000', - ), - ], - ), - ), - ]))), - const SizedBox( - height: 30, - ), - box - .read(BoxName.accountIdStripeConnect) - .toString() - .isEmpty - ? Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - MyElevatedButton( - title: - 'Create Wallet to receive your money', - onPressed: () async { - box.read(BoxName.countryCode) == 'Egypt' - ? addBankCodeEgypt( - captainWalletController) - : Get.find() - .createConnectAccount(); - }), - ], - ) - : const SizedBox( - height: 30, - ), GetBuilder( - builder: (captainWalletController) { - return InkWell( - onTap: () { - MyDialog().getDialog( - 'Morning Promo'.tr, - "this is count of your all trips in the morning promo today from 7:00am-10:00am" - .tr, () { - Get.back(); - }); - }, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - SizedBox( - width: Get.width * .9, - // height: Get.height * .1, - // decoration: AppStyle.boxDecoration, - child: Stack( - children: [ - LinearProgressIndicator( - minHeight: 35, - color: AppColor.blueColor, - borderRadius: - BorderRadius.circular(12), - backgroundColor: AppColor.accentColor - .withOpacity(.5), - value: double.parse( - captainWalletController - .walletDate['message'][0] - ['morning_count'] - .toString()) / - 5, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Text( - 'Morning Promo Rides'.tr, - style: AppStyle.title, - ), - const SizedBox( - width: 20, - ), - Text( - '${captainWalletController.walletDate['message'][0]['morning_count']} / 5', - style: AppStyle.title, - ), - ], - ), - ], - ), - ) - ], - ), - ), - ); - }), - GetBuilder( - builder: (captainWalletController) { - return InkWell( - onTap: () { - MyDialog().getDialog( - 'Afternoon Promo'.tr, - "this is count of your all trips in the Afternoon promo today from 3:00pm-6:00 pm" - .tr, () { - Get.back(); - }); - }, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - SizedBox( - width: Get.width * .9, - // height: Get.height * .1, - // decoration: AppStyle.boxDecoration, - child: Stack( - children: [ - LinearProgressIndicator( - minHeight: 35, - color: AppColor.blueColor, - borderRadius: - BorderRadius.circular(12), - backgroundColor: AppColor.accentColor - .withOpacity(.5), - value: double.parse( - captainWalletController - .walletDate['message'][0] - ['afternoon_count'] - .toString()) / - 5, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Text( - 'Afternoon Promo Rides'.tr, - style: AppStyle.title, - ), - const SizedBox( - width: 20, - ), - Text( - '${captainWalletController.walletDate['message'][0]['afternoon_count']} / 5', - style: AppStyle.title, - ), - ], - ), - ], - ), - ) - ], - ), - ), - ); - }), - + builder: (captainWalletController) { + return Column( + children: [ + _buildPromoCard( + title: 'Morning Promo'.tr, + count: captainWalletController + .walletDate['message'][0] + ['morning_count'], + maxCount: 5, + description: + "this is count of your all trips in the morning promo today from 7:00am-10:00am" + .tr, + ), + const SizedBox( + height: 16), // Add space between the cards + _buildPromoCard( + title: 'Afternoon Promo'.tr, + count: captainWalletController + .walletDate['message'][0] + ['afternoon_count'], + maxCount: 5, + description: + "this is count of your all trips in the Afternoon promo today from 3:00pm-6:00 pm" + .tr, + ), + ], + ); + }, + ), Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Row( @@ -570,6 +271,205 @@ class WalletCaptain extends StatelessWidget { child: const Icon(Icons.refresh)), ); } + +// Helper methods for better structure + Widget _buildBudgetRow( + {required String title, + required String amount, + required VoidCallback onTap}) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + title, + style: AppStyle.title, + ), + ), + Container( + decoration: BoxDecoration( + border: Border.all(width: 2, color: AppColor.writeColor), + borderRadius: BorderRadius.circular(12), + ), + child: GestureDetector( + onTap: onTap, + child: Padding( + padding: const EdgeInsets.all(8), + child: Text( + '$amount\$', + style: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + ), + ), + ), + ], + ); + } + + Widget _buildPromoCard( + {required String title, + required int count, + required int maxCount, + required String description}) { + return InkWell( + onTap: () { + MyDialog().getDialog(title, description, () { + Get.back(); + }); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + SizedBox( + width: Get.width * .9, + child: Stack( + children: [ + LinearProgressIndicator( + minHeight: 35, + color: AppColor.blueColor, + borderRadius: BorderRadius.circular(12), + backgroundColor: AppColor.accentColor.withOpacity(.5), + value: count / maxCount, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + title, + style: AppStyle.title, + ), + const SizedBox(width: 20), + Text( + '$count / $maxCount', + style: AppStyle.title, + ), + ], + ), + ], + ), + ), + ], + ), + ), + ); + } + + Widget _buildBuyPointsButton(CaptainWalletController controller) { + return MyElevatedButton( + title: 'You can buy points from your budget'.tr, + onPressed: () { + Get.defaultDialog( + title: 'Pay from my budget'.tr, + content: Form( + key: controller.formKey, + child: MyTextForm( + controller: controller.amountFromBudgetController, + label: + '${'You have in account'.tr} ${controller.totalAmountVisa}', + hint: '${'You have in account'.tr} ${controller.totalAmountVisa}', + type: TextInputType.number, + ), + ), + confirm: MyElevatedButton( + title: 'Pay'.tr, + onPressed: () async { + if (double.parse(controller.amountFromBudgetController.text) < + double.parse(controller.totalAmountVisa)) { + await controller.payFromBudget(); + } else { + Get.back(); + Get.snackbar('Your Budget less than needed'.tr, '', + duration: const Duration(seconds: 3), + backgroundColor: AppColor.redColor, + snackPosition: SnackPosition.BOTTOM); + } + }, + ), + cancel: MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () { + Get.back(); + }, + ), + ); + }, + ); + } + + Widget _buildTransferBudgetButton(CaptainWalletController controller) { + return MyElevatedButton( + title: 'Transfer budget'.tr, + onPressed: () { + if (double.parse(controller.totalAmountVisa) > 15) { + Get.to(() => const TransferBudgetPage()); + } else { + Get.snackbar( + "You don't have enough money in your SEFER wallet".tr, ''); + } + }, + ); + } + + Widget _buildPurchaseInstructions() { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + decoration: AppStyle.boxDecoration, + child: Column( + children: [ + Text( + "You can purchase a budget to enable online access through the options listed below." + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const Divider( + indent: 30, + endIndent: 30, + color: AppColor.accentColor, + thickness: 3), + ], + ), + ), + ); + } + + Widget _buildPointsOptions() { + return Container( + height: Get.height * 0.19, + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + PointsCaptain( + kolor: AppColor.greyColor, + pricePoint: box.read(BoxName.countryCode) == 'Jordan' ? 5 : 80, + countPoint: + box.read(BoxName.countryCode) == 'Jordan' ? '3000' : '1000', + ), + PointsCaptain( + kolor: AppColor.bronze, + pricePoint: box.read(BoxName.countryCode) == 'Jordan' ? 10 : 200, + countPoint: + box.read(BoxName.countryCode) == 'Jordan' ? '1040' : '2500', + ), + PointsCaptain( + kolor: AppColor.goldenBronze, + pricePoint: box.read(BoxName.countryCode) == 'Jordan' ? 22 : 400, + countPoint: + box.read(BoxName.countryCode) == 'Jordan' ? '23000' : '5100', + ), + PointsCaptain( + kolor: AppColor.gold, + pricePoint: box.read(BoxName.countryCode) == 'Jordan' ? 50 : 1000, + countPoint: + box.read(BoxName.countryCode) == 'Jordan' ? '55000' : '130000', + ), + ], + ), + ); + } } Future addBankCodeEgypt(