import 'package:local_auth/local_auth.dart'; import 'package:sefer_driver/constant/links.dart'; import 'package:sefer_driver/controller/functions/crud.dart'; import 'package:sefer_driver/controller/functions/tts.dart'; import 'package:sefer_driver/controller/home/payment/paymob_payout.dart'; import 'package:sefer_driver/views/home/my_wallet/bank_account_egypt.dart'; import 'package:sefer_driver/views/home/my_wallet/payment_history_driver_page.dart'; import 'package:sefer_driver/views/widgets/error_snakbar.dart'; import 'package:sefer_driver/views/widgets/mydialoug.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:sefer_driver/constant/box_name.dart'; import 'package:sefer_driver/constant/colors.dart'; import 'package:sefer_driver/constant/info.dart'; import 'package:sefer_driver/constant/style.dart'; import 'package:sefer_driver/controller/home/payment/captain_wallet_controller.dart'; import 'package:sefer_driver/main.dart'; import 'package:sefer_driver/views/widgets/elevated_btn.dart'; import 'package:sefer_driver/views/widgets/my_textField.dart'; import 'package:sefer_driver/views/widgets/mycircular.dart'; import '../../../controller/payment/driver_payment_controller.dart'; import '../../widgets/my_scafold.dart'; import 'card_wallet_widget.dart'; import 'points_captain.dart'; import 'transfer_budget_page.dart'; import 'weekly_payment_page.dart'; class WalletCaptain extends StatelessWidget { WalletCaptain({super.key}); CaptainWalletController captainWalletController = Get.put(CaptainWalletController()); @override Widget build(BuildContext context) { // Get.put(MapDriverController()).totalPricePassenger = '0'; captainWalletController.refreshCaptainWallet(); return MyScafolld( title: 'Driver Wallet'.tr, body: [ GetBuilder( builder: (captainWalletController) => captainWalletController .isLoading ? const MyCircularProgressIndicator() : Padding( padding: const EdgeInsets.all(10), child: ListView( children: [ const SizedBox(), Container( color: double.parse(captainWalletController .totalPoints .toString()) < 0 && double.parse(captainWalletController .totalPoints .toString()) > -300 ? AppColor.yellowColor : double.parse(captainWalletController.totalPoints .toString()) < -300 ? AppColor.redColor : AppColor.greenColor, child: InkWell( onTap: () { showCupertinoDialog( context: context, builder: (BuildContext context) { return CupertinoAlertDialog( title: Text('Info'.tr), content: Text( 'The 300 points equal 300 L.E for you \nSo go and gain your money' .tr, ), actions: [ CupertinoDialogAction( child: Text("OK".tr), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); }, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 4), child: Text( '${'Total Points is'.tr} ${captainWalletController.totalPoints.toString()} 💎', style: AppStyle.headTitle2, textAlign: TextAlign.center, ), ), ), ), const SizedBox(height: 10), if (double.parse(captainWalletController.totalPoints .toString()) < -300) CupertinoButton.filled( child: Text('Charge your Account'.tr), onPressed: () { // Add your charge account logic here }, ), const SizedBox(height: 10), const CardSeferWalletDriver(), Card( elevation: 8, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _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} ${'L.E'.tr}', 'This amount for all trip I get from Passengers' .tr, duration: const Duration(seconds: 6), backgroundColor: AppColor.yellowColor, snackPosition: SnackPosition.BOTTOM, ); }, ), 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} ${'L.E'.tr}', '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(), ], ), ), ), GetBuilder( builder: (captainWalletController) { return Column( children: [ _buildPromoCard( title: 'Morning Promo'.tr, timePromo: 'Morning Promo', 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( timePromo: 'Afternoon Promo', 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( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ MyElevatedButton( kolor: AppColor.blueColor, title: 'Payment History'.tr, onPressed: () async { await Get.put(DriverWalletHistoryController()) .getArchivePayment(); Get.to(() => const PaymentHistoryDriverPage(), transition: Transition.size); }, ), MyElevatedButton( kolor: AppColor.blueColor, title: 'Weekly Budget'.tr, onPressed: () async { await Get.put(DriverWalletHistoryController()) .getWeekllyArchivePayment(); Get.to(() => const WeeklyPaymentPage(), transition: Transition.size); }, ), ], ), ), // TextButton( // onPressed: () async { // PaymentController paymentController = // Get.put(PaymentController()); // await paymentController.createTransactionToCaptain( // '1000', // box.read(BoxName.accountIdStripeConnect)); // }, // child: const Text( // "Pay to Captain", // ), // ) ], ), )) ], isleading: true, action: InkWell( onTap: () async { captainWalletController.refreshCaptainWallet(); }, 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 ${'L.E'.tr}', style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), ), ), ), ], ); } Widget _buildPromoCard( {required String title, required timePromo, required int count, required int maxCount, required String description}) { return InkWell( onTap: () { MyDialog().getDialog(title, description, () async { if (count == 5) { Get.find() .addDriverWalletFromPromo(timePromo, 50); } 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 { bool isAvailable = await LocalAuthentication().isDeviceSupported(); if (isAvailable) { // Authenticate the user bool didAuthenticate = await LocalAuthentication().authenticate( localizedReason: 'Use Touch ID or Face ID to confirm payment', options: AuthenticationOptions( biometricOnly: true, sensitiveTransaction: true, )); if (didAuthenticate) { if (double.parse(controller.amountFromBudgetController.text) < double.parse(controller.totalAmountVisa)) { await controller.payFromBudget(); } else { Get.back(); mySnackeBarError('Your Budget less than needed'.tr); } } else { // Authentication failed, handle accordingly MyDialog().getDialog('Authentication failed'.tr, ''.tr, () { Get.back(); }); } } else { MyDialog().getDialog('Biometric Authentication'.tr, 'You should use Touch ID or Face ID to confirm payment'.tr, () { Get.back(); }); } }, ), cancel: MyElevatedButton( title: 'Cancel'.tr, onPressed: () { Get.back(); }, ), ); }, ); } Widget _buildTransferBudgetButton(CaptainWalletController controller) { return MyElevatedButton( title: 'Transfer budget'.tr, onPressed: () async { bool isAvailable = await LocalAuthentication().isDeviceSupported(); if (isAvailable) { // Authenticate the user bool didAuthenticate = await LocalAuthentication().authenticate( localizedReason: 'Use Touch ID or Face ID to confirm payment', options: AuthenticationOptions( biometricOnly: true, sensitiveTransaction: true, )); if (didAuthenticate) { if (double.parse(controller.totalAmountVisa) > 15) { Get.to(() => const TransferBudgetPage()); } else { mySnackeBarError( "You don't have enough money in your SEFER wallet".tr); } } else { // Authentication failed, handle accordingly MyDialog().getDialog('Authentication failed'.tr, ''.tr, () { Get.back(); }); } } else { MyDialog().getDialog('Biometric Authentication'.tr, 'You should use Touch ID or Face ID to confirm payment'.tr, () { Get.back(); }); } }, ); } 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' : '80', ), PointsCaptain( kolor: AppColor.bronze, pricePoint: box.read(BoxName.countryCode) == 'Jordan' ? 10 : 200, countPoint: box.read(BoxName.countryCode) == 'Jordan' ? '1040' : '210', ), PointsCaptain( kolor: AppColor.goldenBronze, pricePoint: box.read(BoxName.countryCode) == 'Jordan' ? 22 : 400, countPoint: box.read(BoxName.countryCode) == 'Jordan' ? '23000' : '450', ), PointsCaptain( kolor: AppColor.gold, pricePoint: box.read(BoxName.countryCode) == 'Jordan' ? 50 : 1000, countPoint: box.read(BoxName.countryCode) == 'Jordan' ? '55000' : '1100', ), ], ), ); } } Future addBankCodeEgypt( CaptainWalletController captainWalletController) { return Get.defaultDialog( title: "Insert Account Bank".tr, content: Form( key: captainWalletController.formKeyAccount, child: Column( children: [ Text("Insert Card Bank Details to Receive Your Visa Money Weekly" .tr), MyTextForm( controller: captainWalletController.cardBank, label: "Insert card number".tr, hint: '4123 4567 8910 1235', type: TextInputType.number), const SizedBox( height: 10, ), BankDropdown() ], )), confirm: MyElevatedButton( title: 'Ok'.tr, onPressed: () async { if (captainWalletController.formKeyAccount.currentState! .validate()) { Get.back(); var res = await CRUD().post(link: AppLink.updateAccountBank, payload: { "bankCode": Get.find().selectedBank.toString(), "accountBank": captainWalletController.cardBank.text.toString(), "id": box.read(BoxName.driverID).toString() }); print('res: ${res}'); if (res != 'failure') { mySnackbarSuccess('bank account added succesfly'.tr); } } })); } class MyDropDown1 extends StatelessWidget { @override Widget build(BuildContext context) { Get.put(PaymobPayout()); return GetBuilder(builder: (controller) { return DropdownButton( value: controller.dropdownValue, icon: const Icon(Icons.arrow_drop_down), elevation: 16, style: const TextStyle(color: Colors.deepPurple), underline: Container( height: 2, color: Colors.deepPurpleAccent, ), onChanged: (String? newValue) { controller.dropdownValue = newValue!; controller.update(); }, items: ['etisalat', 'aman', 'orange', 'vodafone'] .map>((String value) { return DropdownMenuItem( value: value, child: Text(value), ); }).toList(), ); }); } }