From 1a6858d34f75591e42ba75d8afee1265e106c687 Mon Sep 17 00:00:00 2001 From: jayesh Date: Fri, 5 Jul 2024 15:36:29 +0530 Subject: [PATCH] fingerprint auth added --- lib/core/styles/app_text.dart | 7 +- .../utils/constant/country_flag_data.dart | 9 + .../comma_input_text_formatter.dart | 19 + .../bloc/payment/invest_payment_bloc.dart | 6 +- .../bloc/payment/invest_payment_state.dart | 14 +- .../pages/invest_details_layout.dart | 18 +- .../invest_closed_details_section.dart | 30 +- .../invest_detail_details_section.dart | 74 ++- .../widgets/invest_detail_image_carousel.dart | 8 +- .../payment/invest_pay_bottom_section.dart | 115 +++- .../payment/invest_pay_method_section.dart | 10 +- .../payment/invest_pay_top_section.dart | 119 +++-- .../presentation/pages/portfolio_layout.dart | 4 +- .../presentation/widgets/details_section.dart | 18 +- .../presentation/widgets/exited_card.dart | 16 +- .../presentation/widgets/pending_card.dart | 16 +- .../widgets/general_settings_section.dart | 2 +- .../presentation/widgets/kyc_card.dart | 2 +- .../bloc/deposit/deposit_payment_bloc.dart | 13 +- .../bloc/deposit/deposit_payment_state.dart | 8 +- .../pages/deposit/deposit_layout.dart | 491 ++++++++++-------- .../presentation/pages/walletDetails.dart | 28 +- .../presentation/pages/wallet_screen.dart | 43 +- .../pages/withdrawal/withdrawalScreen.dart | 264 +++++----- .../widgets/deposit_pay_method_section.dart | 1 - lib/features/MainScreens/main_screen.dart | 4 +- .../presentation/bloc}/biometric_bloc.dart | 0 .../presentation/bloc}/biometric_event.dart | 0 .../presentation/bloc}/biometric_state.dart | 0 .../presentation/pages/biometric_layout.dart | 6 +- ...tore_password_phone_verification_bloc.dart | 2 +- ...tore_password_phone_verification_form.dart | 2 + .../login/presentation/bloc/login_bloc.dart | 3 +- .../presentation/widgets/login_form.dart | 2 + .../presentation/widgets/register_form.dart | 2 + .../presentation/pages/splash_screen.dart | 16 +- lib/main.dart | 27 +- .../bottom_navigation_bloc.dart | 2 +- .../components/device_locked_dialog.dart | 6 +- lib/shared/components/log_out_dialog.dart | 2 +- 40 files changed, 817 insertions(+), 592 deletions(-) create mode 100644 lib/core/utils/text_formatter/comma_input_text_formatter.dart rename lib/{core/utils/biometric => features/biometric/presentation/bloc}/biometric_bloc.dart (100%) rename lib/{core/utils/biometric => features/biometric/presentation/bloc}/biometric_event.dart (100%) rename lib/{core/utils/biometric => features/biometric/presentation/bloc}/biometric_state.dart (100%) diff --git a/lib/core/styles/app_text.dart b/lib/core/styles/app_text.dart index ac63f15..da1a2f2 100644 --- a/lib/core/styles/app_text.dart +++ b/lib/core/styles/app_text.dart @@ -126,8 +126,8 @@ class AppText { static const String userYourAppPinToLoginEnterTanami = "Use your app PIN to login to enter Tanami"; static const String forgotPinCode = "Forgot Pin Code"; - static const String notificationText = "Notification"; + static const String allowNotificationText = "Allow notification"; static const String toRestorePinYouWillBeLoggedOut = "To restore PIN you will be Logged out"; static const String allowText = "Allow"; @@ -192,6 +192,7 @@ class AppText { 'To accomplish payment please use payment details and Reference ID in tour Bank'; static const String next = 'Next'; static const String depositNoti = 'Create deposit notification'; + static const String payWithAppleText = 'Pay with Apple Pay'; static const String submit = 'Submit request'; static const String Submit = 'Submit'; static const String submitDeposit = 'Submit deposit'; @@ -211,6 +212,7 @@ class AppText { //Settings static const String settingsText = "Settings"; static const String experiencedInvestorText = "Experienced investor?"; + static const String removeInvestmentText = "Remove investment thresholds"; static const String upgradeText = "Upgrade your investor status today in a few simple steps to allows investments higher than SAR 200,000"; static const String generalText = "General"; @@ -290,7 +292,7 @@ class AppText { static const String investmentDetailsText = "Investment details"; static const String enterInvestmentAmountText = "Enter investment amount"; static const String thisIsUsdInvestmentOpportunityText = - "This is a USD investment opportunity. Funds will be converted into USD upon confirmation."; + "This is a USD investment opportunity. Funds will be converted into USD at a rate of x upon confirmation"; static const String choosePaymentMethodText = "Choose payment method"; static const String balanceText = "Balance"; static const String applePayText = "Apple Pay"; @@ -307,6 +309,7 @@ class AppText { "Upgrade your investor status to increase your investment limit."; static const String currentExchangeText = "Current Exchange"; static const String feeText = "Fee"; + static const String processingFees = "Processing fee"; static const String debitedAmountText = "Debited amount"; static const String totalInvestmentAmountText = "Total Investment amount"; static const String confirmInvestmentText = "Confirm investment"; diff --git a/lib/core/utils/constant/country_flag_data.dart b/lib/core/utils/constant/country_flag_data.dart index 5ecfc7a..4623908 100644 --- a/lib/core/utils/constant/country_flag_data.dart +++ b/lib/core/utils/constant/country_flag_data.dart @@ -18,3 +18,12 @@ List countryFlag = [ AppImages.saudiArabiaflag, AppImages.unitedArabEmiratesFlag, ]; + +List isoCountryCode = [ + "+973", + "+965", + "+968", + "+974", + "+966", + "+971", +]; diff --git a/lib/core/utils/text_formatter/comma_input_text_formatter.dart b/lib/core/utils/text_formatter/comma_input_text_formatter.dart new file mode 100644 index 0000000..605bd52 --- /dev/null +++ b/lib/core/utils/text_formatter/comma_input_text_formatter.dart @@ -0,0 +1,19 @@ +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; + +class CommaTextInputFormatter extends TextInputFormatter { + @override + TextEditingValue formatEditUpdate( + TextEditingValue oldValue, TextEditingValue newValue) { + final text = newValue.text; + if (text.isEmpty) { + return newValue; + } + final newText = NumberFormat("#,##0", "en_US") + .format(int.parse(text.replaceAll(',', ''))); + return newValue.copyWith( + text: newText, + selection: TextSelection.collapsed(offset: newText.length), + ); + } +} diff --git a/lib/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_bloc.dart b/lib/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_bloc.dart index b736b3d..b4f020b 100644 --- a/lib/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_bloc.dart +++ b/lib/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_bloc.dart @@ -12,9 +12,11 @@ class InvestPaymentBloc extends Bloc { return formKey; } - InvestPaymentBloc() : super(const InvestPaymentState(isFormValid: false)) { + InvestPaymentBloc() + : super(const InvestPaymentState(isFormValid: false, amount: 0)) { on((event, emit) { - emit(state.copyWith(isFormValid: event.text.isNotEmpty)); + final amount = double.tryParse(event.text.replaceAll(',', '')) ?? 0; + emit(state.copyWith(isFormValid: event.text.isNotEmpty, amount: amount)); }); } diff --git a/lib/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_state.dart b/lib/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_state.dart index e12ba65..e8225a6 100644 --- a/lib/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_state.dart +++ b/lib/features/MainScreens/Invest/presentation/bloc/payment/invest_payment_state.dart @@ -2,15 +2,23 @@ import 'package:equatable/equatable.dart'; class InvestPaymentState extends Equatable { final bool isFormValid; + final double amount; - const InvestPaymentState({required this.isFormValid}); + const InvestPaymentState({ + required this.isFormValid, + required this.amount, + }); - InvestPaymentState copyWith({bool? isFormValid}) { + InvestPaymentState copyWith({ + bool? isFormValid, + double? amount, + }) { return InvestPaymentState( isFormValid: isFormValid ?? this.isFormValid, + amount: amount ?? this.amount, ); } @override - List get props => [isFormValid]; + List get props => [isFormValid, amount]; } diff --git a/lib/features/MainScreens/Invest/presentation/pages/invest_details_layout.dart b/lib/features/MainScreens/Invest/presentation/pages/invest_details_layout.dart index 34ce456..df9afc4 100644 --- a/lib/features/MainScreens/Invest/presentation/pages/invest_details_layout.dart +++ b/lib/features/MainScreens/Invest/presentation/pages/invest_details_layout.dart @@ -37,7 +37,9 @@ class InvestDetailsLayout extends StatelessWidget { ), child: Column( children: [ - InvestDetailCarouselView(), + InvestDetailCarouselView( + type: type, + ), InvestDetailDetailsSection( type: type, ), @@ -48,14 +50,12 @@ class InvestDetailsLayout extends StatelessWidget { 20.h, ), const KeyInvestmentSection(), - Gap( - 20.h, - ), - const InvestIncludedDocumentsSection(), - Gap( - 20.h, - ), - const InvestVideoSection(), + type == "closed" ? const SizedBox() : Gap(20.h), + type == "closed" + ? const SizedBox() + : const InvestIncludedDocumentsSection(), + type == "closed" ? const SizedBox() : Gap(20.h), + type == "closed" ? const SizedBox() : const InvestVideoSection(), ], ), ), diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_details_section.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_details_section.dart index d977cdc..accf319 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_details_section.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_closed_details_section.dart @@ -84,21 +84,21 @@ class InvestClosedDetailsSection extends StatelessWidget { Gap( 10.h, ), - TextWidget() - .text22W900("SAR 1,478,000", clr: AppColor.investTextColor), - const Gap(8.0), - LinearProgressIndicator( - value: 1, - borderRadius: BorderRadius.circular(2), - minHeight: 8.0, - backgroundColor: AppColor.txtBorderColor, - valueColor: const AlwaysStoppedAnimation( - AppColor.investTextColor), - ), - const Gap(8.0), - TextWidget().text11W700("100% ${AppText.fundedText}", - clr: AppColor.portoflioCardTextColor), - const Gap(8.0), + // TextWidget() + // .text22W900("SAR 1,478,000", clr: AppColor.investTextColor), + // const Gap(8.0), + // LinearProgressIndicator( + // value: 1, + // borderRadius: BorderRadius.circular(2), + // minHeight: 8.0, + // backgroundColor: AppColor.txtBorderColor, + // valueColor: const AlwaysStoppedAnimation( + // AppColor.investTextColor), + // ), + // const Gap(8.0), + // TextWidget().text11W700("100% ${AppText.fundedText}", + // clr: AppColor.portoflioCardTextColor), + // const Gap(8.0), TextWidget().text14W400( 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.', clr: Colors.grey, diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_details_section.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_details_section.dart index 7f952bf..a9ceef8 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_details_section.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_details_section.dart @@ -28,24 +28,30 @@ class InvestDetailDetailsSection extends StatelessWidget { Gap( 10.h, ), - TextWidget() - .text22W900("SAR 1,478,000", clr: AppColor.investTextColor), - const Gap(8.0), - LinearProgressIndicator( - value: type == "closed" ? 1 : 0.6, - borderRadius: BorderRadius.circular(2), - minHeight: 8.0, - backgroundColor: AppColor.txtBorderColor, - valueColor: const AlwaysStoppedAnimation( - AppColor.investTextColor), - ), - const Gap(8.0), - TextWidget().text11W700( - type == "closed" - ? "100% ${AppText.fundedText}" - : "60% ${AppText.fundedText}", - clr: AppColor.portoflioCardTextColor), - const Gap(8.0), + type == "closed" + ? const SizedBox() + : TextWidget().text22W900("SAR 1,478,000", + clr: AppColor.investTextColor), + type == "closed" ? const SizedBox() : const Gap(8.0), + type == "closed" + ? const SizedBox() + : LinearProgressIndicator( + value: type == "closed" ? 1 : 0.6, + borderRadius: BorderRadius.circular(2), + minHeight: 8.0, + backgroundColor: AppColor.txtBorderColor, + valueColor: const AlwaysStoppedAnimation( + AppColor.investTextColor), + ), + type == "closed" ? const SizedBox() : const Gap(8.0), + type == "closed" + ? const SizedBox() + : TextWidget().text11W700( + type == "closed" + ? "100% ${AppText.fundedText}" + : "60% ${AppText.fundedText}", + clr: AppColor.portoflioCardTextColor), + type == "closed" ? const SizedBox() : const Gap(8.0), TextWidget().text14W400( 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.', clr: Colors.grey, @@ -87,29 +93,9 @@ class InvestDetailDetailsSection extends StatelessWidget { ) ], ), - SizedBox( - height: 8.h, - ), + type == "closed" ? const SizedBox() : SizedBox(height: 8.h), type == "closed" - ? Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: 200.w, - child: TextWidget().text14W500( - "${AppText.originalEstimatedReturnText}:", - clr: AppColor.portoflioCardTextColor, - txtAlign: TextAlign.start, - ), - ), - TextWidget().text14W700( - '20.0%', - clr: AppColor.plainBlack, - txtAlign: TextAlign.end, - ), - ], - ) + ? const SizedBox() : Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, @@ -142,7 +128,9 @@ class InvestDetailDetailsSection extends StatelessWidget { SizedBox( width: 150.w, child: TextWidget().text14W500( - "${AppText.actualEstimatedReturnText}:", + type == "closed" + ? "${AppText.actualReturnToDate}:" + : "${AppText.actualEstimatedReturnText}:", clr: AppColor.portoflioCardTextColor, txtAlign: TextAlign.start, ), @@ -191,7 +179,9 @@ class InvestDetailDetailsSection extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ TextWidget().text14W500( - "${AppText.payoutDateText}:", + type == "closed" + ? "${AppText.expectedExitDate}:" + : "${AppText.payoutDateText}:", clr: AppColor.portoflioCardTextColor, txtAlign: TextAlign.start, ), diff --git a/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_image_carousel.dart b/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_image_carousel.dart index 75ddae0..28c4d3c 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_image_carousel.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/invest_detail_image_carousel.dart @@ -21,9 +21,11 @@ final List imgList = [ ]; class InvestDetailCarouselView extends StatelessWidget { + final String type; + final CarouselController _controller = CarouselController(); - InvestDetailCarouselView({super.key}); + InvestDetailCarouselView({super.key, required this.type}); @override Widget build(BuildContext context) { @@ -135,7 +137,9 @@ class InvestDetailCarouselView extends StatelessWidget { 5.w, ), TextWidget().text11W500( - '${AppText.closingDateText} Jul 10 2025', + type == "closed" + ? '${AppText.closedDateText} Jul 10 2025' + : '${AppText.closingDateText} Jul 10 2025', clr: AppColor.plainBlack, ), ], diff --git a/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_bottom_section.dart b/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_bottom_section.dart index c08d786..7f08567 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_bottom_section.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_bottom_section.dart @@ -1,13 +1,18 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:gap/gap.dart'; +import 'package:google_fonts/google_fonts.dart'; import 'package:tanami_app/core/routes/route_name.dart'; import '../../../../../../core/routes/routes.dart'; import '../../../../../../core/styles/app_color.dart'; +import '../../../../../../core/styles/app_images.dart'; import '../../../../../../core/styles/app_text.dart'; import '../../../../../../shared/components/button_widget.dart'; +import '../../../../../countrySelection/presentation/bloc/choose_country_bloc.dart'; +import '../../../../../countrySelection/presentation/bloc/choose_country_state.dart'; import '../../bloc/payment/invest_payment_bloc.dart'; import '../../bloc/payment/invest_payment_state.dart'; @@ -21,37 +26,91 @@ class InvestPayBottomSection extends StatelessWidget { children: [ BlocBuilder( builder: (context, state) { - return Container( - margin: const EdgeInsets.symmetric( - horizontal: 16, - ), - width: 1.sw, - height: 56.h, - child: ButtonWidget().elevatedBtn( - txtClr: state.isFormValid - ? AppColor.plainWhite - : AppColor.inactiveBtnTxtColor, - function: () { - if (state.isFormValid) { - goRouter.pushNamed(RouteName.confirmInvestScreen); - } - }, - text: AppText.nextText, - clr: state.isFormValid - ? AppColor.primaryColor2 - : AppColor.inactiveBtnColor), + return BlocBuilder( + builder: (context, radioState) { + int selectedIndex = 0; + if (radioState is RadioSelectionChanged) { + selectedIndex = radioState.selectedIndex; + } + return selectedIndex == 1 + ? InkWell( + onTap: () { + goRouter.pushNamed(RouteName.walletDetails, + pathParameters: { + "type": 'confirm-investment', + }); + }, + child: Container( + margin: const EdgeInsets.all(10.0), + height: 65.h, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(22.r), + color: state.isFormValid + ? AppColor.plainBlack + : AppColor.inactiveBtnColor), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + AppImages.applePayIcon, + color: AppColor.plainWhite, + height: 32, + width: 32, + ), + const Gap(5), + Text( + AppText.payWithAppleText, + style: GoogleFonts.dmSans( + color: state.isFormValid + ? AppColor.plainWhite + : AppColor.inactiveBtnTxtColor, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ), + ) + : Container( + margin: const EdgeInsets.symmetric( + horizontal: 16, + ), + width: 1.sw, + height: 56.h, + child: ButtonWidget().elevatedBtn( + txtClr: state.isFormValid + ? AppColor.plainWhite + : AppColor.inactiveBtnTxtColor, + function: () { + if (state.isFormValid) { + goRouter.pushNamed(RouteName.otpScreen, + pathParameters: { + "fromScreen": "confirm-investment" + }); + } + }, + text: AppText.confirmInvestmentText, + clr: state.isFormValid + ? AppColor.primaryColor2 + : AppColor.inactiveBtnColor), + ); + }, ); }, ), - const Gap(5), - ButtonWidget().textBorderBtn( - borderClr: AppColor.txtBorderColor, - clr: AppColor.plainWhite, - function: () { - goRouter.pop(); - }, - text: AppText.backText, - ), + // const Gap(5), + // ButtonWidget().textBorderBtn( + // borderClr: AppColor.txtBorderColor, + // clr: AppColor.plainWhite, + // function: () { + // goRouter.pop(); + // }, + // text: AppText.backText, + // ), ], ); } diff --git a/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_method_section.dart b/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_method_section.dart index 2435763..942a93e 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_method_section.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_method_section.dart @@ -116,11 +116,11 @@ class InvestPayMethodSection extends StatelessWidget { ], ), ), - const Icon( - Icons.arrow_forward, - color: Colors.grey, - size: 15, - ) + // const Icon( + // Icons.arrow_forward, + // color: Colors.grey, + // size: 15, + // ) ], ), ], diff --git a/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_top_section.dart b/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_top_section.dart index b1c02d6..6240a44 100644 --- a/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_top_section.dart +++ b/lib/features/MainScreens/Invest/presentation/widgets/payment/invest_pay_top_section.dart @@ -7,9 +7,13 @@ import 'package:tanami_app/core/styles/app_images.dart'; import 'package:tanami_app/core/styles/app_text.dart'; import 'package:tanami_app/shared/components/text_widget.dart'; +import '../../../../../../core/utils/text_formatter/comma_input_text_formatter.dart'; import '../../../../../../shared/components/text_from_field_widget.dart'; +import '../../../../../countrySelection/presentation/bloc/choose_country_bloc.dart'; +import '../../../../../countrySelection/presentation/bloc/choose_country_state.dart'; import '../../bloc/payment/invest_payment_bloc.dart'; import '../../bloc/payment/invest_payment_event.dart'; +import '../../bloc/payment/invest_payment_state.dart'; class InvestPayTopSection extends StatelessWidget { const InvestPayTopSection({super.key}); @@ -118,6 +122,9 @@ class InvestPayTopSection extends StatelessWidget { .add(FormTextChanged( text: value)); }, + inputFormatters: [ + CommaTextInputFormatter() + ], texttype: TextInputType.number, textEditingController: investPaymentBloc @@ -134,26 +141,37 @@ class InvestPayTopSection extends StatelessWidget { ], ), ), - const Padding( - padding: EdgeInsets.all(12.0), - child: Column( - children: [ - InvestmentDetailRow( - label: AppText.currentExchangeText, - value: 'SAR 1 = USD 0.267', - ), - SizedBox(height: 8.0), - InvestmentDetailRow( - label: AppText.feeText, - value: '3%', - ), - SizedBox(height: 8.0), - InvestmentDetailRow( - label: '${AppText.totalInvestmentAmountText}:', - value: 'SAR 1000', - ), - ], - ), + BlocBuilder( + builder: (context, radioState) { + int selectedIndex = 0; + if (radioState is RadioSelectionChanged) { + selectedIndex = radioState.selectedIndex; + } + return selectedIndex == 0 + ? const SizedBox() + : const Padding( + padding: EdgeInsets.all(12.0), + child: Column( + children: [ + // InvestmentDetailRow( + // label: AppText.currentExchangeText, + // value: 'SAR 1 = USD 0.267', + // ), + // SizedBox(height: 8.0), + InvestmentDetailRow( + label: AppText.processingFees, + value: '3%', + ), + SizedBox(height: 8.0), + InvestmentDetailRow( + label: + '${AppText.totalInvestmentAmountText}:', + value: 'SAR 1000', + ), + ], + ), + ); + }, ) ], ), @@ -162,37 +180,44 @@ class InvestPayTopSection extends StatelessWidget { ), ), const Gap(24), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset( - width: 24, - height: 24, - AppImages.orangenInfoIcon, - ), - const Gap(8), - Column( + BlocBuilder( + builder: (context, state) { + if (state.amount >= 200000) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox( - width: 0.8.sw, - child: TextWidget().text12W500( - AppText.retailInvestirCanInvestMaxText, - clr: AppColor.infoTextColor, - ), + Image.asset( + width: 24, + height: 24, + AppImages.orangenInfoIcon, ), - SizedBox( - width: 0.8.sw, - child: TextWidget().text12W700( - AppText.upgradeYourInvestorStatusToIncreaseText, - clr: AppColor.infoTextColor, - txtDec: TextDecoration.underline, - decClr: AppColor.infoTextColor, - ), + const Gap(8), + Column( + children: [ + SizedBox( + width: 0.8.sw, + child: TextWidget().text12W500( + AppText.retailInvestirCanInvestMaxText, + clr: AppColor.infoTextColor, + ), + ), + SizedBox( + width: 0.8.sw, + child: TextWidget().text12W700( + AppText.upgradeYourInvestorStatusToIncreaseText, + clr: AppColor.infoTextColor, + txtDec: TextDecoration.underline, + decClr: AppColor.infoTextColor, + ), + ), + ], ), ], - ), - ], - ), + ); + } else { + return const SizedBox(); + } + }), const Gap(15), Row( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/features/MainScreens/Portfolio/presentation/pages/portfolio_layout.dart b/lib/features/MainScreens/Portfolio/presentation/pages/portfolio_layout.dart index 4650329..1d7bc7c 100644 --- a/lib/features/MainScreens/Portfolio/presentation/pages/portfolio_layout.dart +++ b/lib/features/MainScreens/Portfolio/presentation/pages/portfolio_layout.dart @@ -73,9 +73,7 @@ class PortfolioLayout extends StatelessWidget { AppText.portfolioText, clr: const Color(0xFFC9D9CB), ), - Gap( - 8.h, - ), + Gap(8.h), TextWidget().text28W700( 'SAR 178,000', ), diff --git a/lib/features/MainScreens/Portfolio/presentation/widgets/details_section.dart b/lib/features/MainScreens/Portfolio/presentation/widgets/details_section.dart index 0b3bafa..b16c7bb 100644 --- a/lib/features/MainScreens/Portfolio/presentation/widgets/details_section.dart +++ b/lib/features/MainScreens/Portfolio/presentation/widgets/details_section.dart @@ -69,10 +69,10 @@ class DetailsSection extends StatelessWidget { clr: AppColor.plainBlack, txtAlign: TextAlign.end, ), - TextWidget().text11W400( - ' \$ 26,700', - clr: AppColor.plainBlack, - ), + // TextWidget().text11W400( + // ' \$ 26,700', + // clr: AppColor.plainBlack, + // ), ], ) ], @@ -100,10 +100,10 @@ class DetailsSection extends StatelessWidget { clr: AppColor.plainBlack, txtAlign: TextAlign.end, ), - TextWidget().text11W400( - ' \$ 26,700', - clr: AppColor.plainBlack, - ), + // TextWidget().text11W400( + // ' \$ 26,700', + // clr: AppColor.plainBlack, + // ), ], ) ], @@ -131,7 +131,7 @@ class DetailsSection extends StatelessWidget { ], ), SizedBox( - height: 22.h, + height: 8.h, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/features/MainScreens/Portfolio/presentation/widgets/exited_card.dart b/lib/features/MainScreens/Portfolio/presentation/widgets/exited_card.dart index 959d77c..b9be69c 100644 --- a/lib/features/MainScreens/Portfolio/presentation/widgets/exited_card.dart +++ b/lib/features/MainScreens/Portfolio/presentation/widgets/exited_card.dart @@ -122,10 +122,10 @@ class ExitedCard extends StatelessWidget { portfolioModel.investmentAmountSAR, clr: AppColor.plainBlack, ), - TextWidget().text11W400( - '\$ ${portfolioModel.investmentAmountUSD}', - clr: AppColor.plainBlack, - ), + // TextWidget().text11W400( + // '\$ ${portfolioModel.investmentAmountUSD}', + // clr: AppColor.plainBlack, + // ), ], ) ], @@ -148,10 +148,10 @@ class ExitedCard extends StatelessWidget { portfolioModel.currentValuationSAR, clr: AppColor.plainBlack, ), - TextWidget().text11W400( - '\$ ${portfolioModel.currentValuationUSD}', - clr: AppColor.plainBlack, - ), + // TextWidget().text11W400( + // '\$ ${portfolioModel.currentValuationUSD}', + // clr: AppColor.plainBlack, + // ), ], ) ], diff --git a/lib/features/MainScreens/Portfolio/presentation/widgets/pending_card.dart b/lib/features/MainScreens/Portfolio/presentation/widgets/pending_card.dart index a053349..6ec0ddd 100644 --- a/lib/features/MainScreens/Portfolio/presentation/widgets/pending_card.dart +++ b/lib/features/MainScreens/Portfolio/presentation/widgets/pending_card.dart @@ -122,10 +122,10 @@ class PendingCard extends StatelessWidget { portfolioModel.investmentAmountSAR, clr: AppColor.plainBlack, ), - TextWidget().text11W400( - ' \$ ${portfolioModel.investmentAmountUSD}', - clr: AppColor.plainBlack, - ), + // TextWidget().text11W400( + // ' \$ ${portfolioModel.investmentAmountUSD}', + // clr: AppColor.plainBlack, + // ), ], ) ], @@ -148,10 +148,10 @@ class PendingCard extends StatelessWidget { portfolioModel.currentValuationSAR, clr: AppColor.plainBlack, ), - TextWidget().text11W400( - ' \$ ${portfolioModel.currentValuationUSD}', - clr: AppColor.plainBlack, - ), + // TextWidget().text11W400( + // ' \$ ${portfolioModel.currentValuationUSD}', + // clr: AppColor.plainBlack, + // ), ], ) ], diff --git a/lib/features/MainScreens/Settings/presentation/widgets/general_settings_section.dart b/lib/features/MainScreens/Settings/presentation/widgets/general_settings_section.dart index e3cd6b7..fa743b9 100644 --- a/lib/features/MainScreens/Settings/presentation/widgets/general_settings_section.dart +++ b/lib/features/MainScreens/Settings/presentation/widgets/general_settings_section.dart @@ -33,7 +33,7 @@ class GeneralSettingsSection extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TextWidget().text14W600( - AppText.notificationText, + AppText.allowNotificationText, clr: AppColor.textLabelColor, ), BlocProvider( diff --git a/lib/features/MainScreens/Settings/presentation/widgets/kyc_card.dart b/lib/features/MainScreens/Settings/presentation/widgets/kyc_card.dart index 9cf8951..191320b 100644 --- a/lib/features/MainScreens/Settings/presentation/widgets/kyc_card.dart +++ b/lib/features/MainScreens/Settings/presentation/widgets/kyc_card.dart @@ -49,7 +49,7 @@ Widget kycCard() { crossAxisAlignment: CrossAxisAlignment.start, children: [ TextWidget().text14W600( - AppText.experiencedInvestorText, + AppText.removeInvestmentText, clr: AppColor.kycCardTextColor, ), TextWidget().text11W500( diff --git a/lib/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_bloc.dart b/lib/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_bloc.dart index 31d79f3..e75559c 100644 --- a/lib/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_bloc.dart +++ b/lib/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_bloc.dart @@ -13,9 +13,18 @@ class DepositPaymentBloc return formKey; } - DepositPaymentBloc() : super(const DepositPaymentState(isFormValid: false)) { + DepositPaymentBloc() + : super(const DepositPaymentState(isFormValid: false, amount: '0')) { on((event, emit) { - emit(state.copyWith(isFormValid: event.text.isNotEmpty)); + final isFormValid = event.text.isNotEmpty; + emit(state.copyWith( + isFormValid: isFormValid, + amount: event.text.isEmpty ? "0" : event.text)); + }); + + // Ensure the listener is added in the constructor + amountController.addListener(() { + add(FormTextChanged(text: amountController.text)); }); } diff --git a/lib/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_state.dart b/lib/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_state.dart index 0f02297..f1996f1 100644 --- a/lib/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_state.dart +++ b/lib/features/MainScreens/Wallet/presentation/bloc/deposit/deposit_payment_state.dart @@ -2,15 +2,17 @@ import 'package:equatable/equatable.dart'; class DepositPaymentState extends Equatable { final bool isFormValid; + final String amount; - const DepositPaymentState({required this.isFormValid}); + const DepositPaymentState({required this.isFormValid, this.amount = '0'}); - DepositPaymentState copyWith({bool? isFormValid}) { + DepositPaymentState copyWith({bool? isFormValid, String? amount}) { return DepositPaymentState( isFormValid: isFormValid ?? this.isFormValid, + amount: amount ?? this.amount, ); } @override - List get props => [isFormValid]; + List get props => [isFormValid, amount]; } diff --git a/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_layout.dart b/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_layout.dart index f4c8f58..370a71e 100644 --- a/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_layout.dart +++ b/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_layout.dart @@ -3,13 +3,18 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:gap/gap.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../../../../../core/routes/route_name.dart'; import '../../../../../../core/routes/routes.dart'; import '../../../../../../core/styles/app_color.dart'; +import '../../../../../../core/styles/app_images.dart'; import '../../../../../../core/styles/app_text.dart'; +import '../../../../../../core/utils/text_formatter/comma_input_text_formatter.dart'; +import '../../../../../countrySelection/presentation/bloc/choose_country_bloc.dart'; +import '../../../../../countrySelection/presentation/bloc/choose_country_state.dart'; import '../../bloc/deposit/deposit_payment_bloc.dart'; import '../../bloc/deposit/deposit_payment_event.dart'; import '../../bloc/deposit/deposit_payment_state.dart'; @@ -25,37 +30,80 @@ class DepositLayout extends StatelessWidget { return Scaffold( bottomNavigationBar: BlocBuilder( builder: (context, state) { - return Padding( - padding: MediaQuery.of(context).viewInsets, - child: GestureDetector( - onTap: () { - if (state.isFormValid) { - goRouter.pushNamed(RouteName.depositPreview); - } - }, - child: Container( - margin: const EdgeInsets.all(10.0), - height: 65.h, - width: double.infinity, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(22.r), - color: state.isFormValid - ? AppColor.primaryColor2 - : AppColor.inactiveBtnColor), - child: Center( - child: Text( - AppText.depositNoti, - style: GoogleFonts.dmSans( - color: state.isFormValid - ? AppColor.plainWhite - : AppColor.inactiveBtnTxtColor, - fontSize: 14.sp, - fontWeight: FontWeight.w700, - ), - ), + return BlocBuilder( + builder: (context, radioState) { + int selectedIndex = 0; + if (radioState is RadioSelectionChanged) { + selectedIndex = radioState.selectedIndex; + } + return Padding( + padding: MediaQuery.of(context).viewInsets, + child: GestureDetector( + onTap: () { + if (state.isFormValid) { + goRouter.pushNamed(RouteName.depositPreview); + } + }, + child: selectedIndex == 1 + ? Container( + margin: const EdgeInsets.all(10.0), + height: 65.h, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(22.r), + color: state.isFormValid + ? AppColor.plainBlack + : AppColor.inactiveBtnColor), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + AppImages.applePayIcon, + color: AppColor.plainWhite, + height: 32, + width: 32, + ), + const Gap(5), + Text( + AppText.payWithAppleText, + style: GoogleFonts.dmSans( + color: state.isFormValid + ? AppColor.plainWhite + : AppColor.inactiveBtnTxtColor, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ) + : Container( + margin: const EdgeInsets.all(10.0), + height: 65.h, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(22.r), + color: state.isFormValid + ? AppColor.primaryColor2 + : AppColor.inactiveBtnColor), + child: Center( + child: Text( + AppText.depositNoti, + style: GoogleFonts.dmSans( + color: state.isFormValid + ? AppColor.plainWhite + : AppColor.inactiveBtnTxtColor, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ), + ), ), - ), - ), + ); + }, ); }, ), @@ -91,217 +139,226 @@ class DepositLayout extends StatelessWidget { SizedBox( height: 20.h, ), - Container( - width: double.infinity, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(22.r), - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.15), - spreadRadius: 2, - blurRadius: 10, - offset: const Offset(0, 5), + BlocBuilder( + builder: (context, state) { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(22.r), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + spreadRadius: 2, + blurRadius: 10, + offset: const Offset(0, 5), + ), + ], ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(12.0), - child: Row( - children: [ - Container( - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Color(0xFF0FA4A4)), - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Image.asset( - 'assets/images/wallet_screen/deposit_list.png', - height: 36.h, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + children: [ + Container( + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Color(0xFF0FA4A4)), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Image.asset( + 'assets/images/wallet_screen/deposit_list.png', + height: 36.h, + ), + ), ), - ), - ), - SizedBox( - width: 12.w, - ), - Text( - AppText.depositTitle, - style: GoogleFonts.dmSans( - color: Colors.black, - fontSize: 17.sp, - fontWeight: FontWeight.w700, - ), - ), - ], - ), - ), - Container( - decoration: BoxDecoration( - color: const Color(0xFFD8D8D8).withOpacity(0.4), - ), - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 16.0, horizontal: 12.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'SAR', - style: GoogleFonts.dmSans( - color: const Color(0xFF363636), - fontSize: 15.sp, - fontWeight: FontWeight.w700, + SizedBox( + width: 12.w, ), - ), - SizedBox( - width: 12.w, - ), - SizedBox( - width: 280.w, - child: TextFormField( - validator: (value) { - if (depositPaymentBloc - .amountController.text.isEmpty) { - return AppText.pleaseEnterAmountText; - } - return null; - }, - onChanged: (value) { - context - .read() - .add(FormTextChanged(text: value)); - }, - controller: depositPaymentBloc.amountController, - cursorColor: Colors.black, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, + Text( + AppText.depositTitle, style: GoogleFonts.dmSans( color: Colors.black, - fontSize: 16.sp, - fontWeight: FontWeight.w400, + fontSize: 17.sp, + fontWeight: FontWeight.w700, ), - decoration: InputDecoration( - hintText: '1000', - hintStyle: GoogleFonts.dmSans( - color: const Color(0xFFC6C6C6), - fontSize: 16.sp, - fontWeight: FontWeight.w400, - ), - labelStyle: - const TextStyle(color: Colors.black), - contentPadding: const EdgeInsets.symmetric( - vertical: 15, horizontal: 10), - filled: true, - fillColor: Colors.white, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.white, width: 1), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.white, width: 1), - ), - disabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.white, width: 1), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.white, width: 1), - ), - errorBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.red, width: 1), - ), - focusedErrorBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.red, width: 1), - ), - ), - inputFormatters: [ - FilteringTextInputFormatter.deny( - RegExp(r'\s')), - LengthLimitingTextInputFormatter(20), - ], ), - ), - ], + ], + ), ), - ), - ), - Container( - decoration: BoxDecoration( - color: const Color(0xFFD8D8D8).withOpacity(0.4), - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(22.r), - bottomRight: Radius.circular(22.r), - ), - border: const Border( - top: BorderSide(color: Color(0xFFD8D8D8), width: 2.0), - ), - ), - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 16.0, horizontal: 12.0), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + Container( + decoration: BoxDecoration( + color: const Color(0xFFD8D8D8).withOpacity(0.4), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 16.0, horizontal: 12.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - AppText.feeText, + 'SAR', style: GoogleFonts.dmSans( - color: const Color(0xFF535353), - fontSize: 14.sp, - fontWeight: FontWeight.w500, + color: const Color(0xFF363636), + fontSize: 15.sp, + fontWeight: FontWeight.w700, ), ), - Text( - '3%', - style: GoogleFonts.dmSans( - color: Colors.black, - fontSize: 14.sp, - fontWeight: FontWeight.w700, + SizedBox( + width: 12.w, + ), + SizedBox( + width: 280.w, + child: TextFormField( + inputFormatters: [ + CommaTextInputFormatter(), + FilteringTextInputFormatter.deny( + RegExp(r'\s')), + LengthLimitingTextInputFormatter(20), + ], + validator: (value) { + if (depositPaymentBloc + .amountController.text.isEmpty) { + return AppText.pleaseEnterAmountText; + } + return null; + }, + onChanged: (value) { + depositPaymentBloc + .add(FormTextChanged(text: value)); + }, + controller: + depositPaymentBloc.amountController, + cursorColor: Colors.black, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 16.sp, + fontWeight: FontWeight.w400, + ), + decoration: InputDecoration( + hintText: '1000', + hintStyle: GoogleFonts.dmSans( + color: const Color(0xFFC6C6C6), + fontSize: 16.sp, + fontWeight: FontWeight.w400, + ), + labelStyle: + const TextStyle(color: Colors.black), + contentPadding: + const EdgeInsets.symmetric( + vertical: 15, horizontal: 10), + filled: true, + fillColor: Colors.white, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.white, width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.white, width: 1), + ), + disabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.white, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.white, width: 1), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.red, width: 1), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.red, width: 1), + ), + ), ), ), ], ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + ), + ), + Container( + decoration: BoxDecoration( + color: const Color(0xFFD8D8D8).withOpacity(0.4), + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(22.r), + bottomRight: Radius.circular(22.r), + ), + border: const Border( + top: BorderSide( + color: Color(0xFFD8D8D8), width: 2.0), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 16.0, horizontal: 12.0), + child: Column( children: [ - Text( - AppText.depositAmt, - style: GoogleFonts.dmSans( - color: const Color(0xFF535353), - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + AppText.processingFees, + style: GoogleFonts.dmSans( + color: const Color(0xFF535353), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + Text( + '3%', + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ], ), - Text( - 'SAR 253', - style: GoogleFonts.dmSans( - color: Colors.black, - fontSize: 14.sp, - fontWeight: FontWeight.w700, - ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + AppText.depositAmt, + style: GoogleFonts.dmSans( + color: const Color(0xFF535353), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + Text( + 'SAR ${state.amount}', + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ], ), ], ), - ], + ), ), - ), + ], ), - ], - ), + ); + }, ), const Gap(30), const DepositPayMethodSection(), diff --git a/lib/features/MainScreens/Wallet/presentation/pages/walletDetails.dart b/lib/features/MainScreens/Wallet/presentation/pages/walletDetails.dart index bccbe43..ee242fb 100644 --- a/lib/features/MainScreens/Wallet/presentation/pages/walletDetails.dart +++ b/lib/features/MainScreens/Wallet/presentation/pages/walletDetails.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:tanami_app/core/routes/routes.dart'; -import 'package:tanami_app/core/styles/app_text.dart'; -import 'package:ticket_widget/ticket_widget.dart'; import 'package:tanami_app/core/styles/app_color.dart'; +import 'package:tanami_app/core/styles/app_text.dart'; import 'package:tanami_app/shared/components/button_widget.dart'; +import 'package:ticket_widget/ticket_widget.dart'; class WalletDetails extends StatelessWidget { final String type; @@ -54,8 +54,8 @@ class WalletDetails extends StatelessWidget { goRouter.pop(); goRouter.pop(); goRouter.pop(); - goRouter.pop(); - goRouter.pop(); + // goRouter.pop(); + // goRouter.pop(); }, text: AppText.closeText, clr: AppColor.primaryColor2, @@ -71,8 +71,8 @@ class WalletDetails extends StatelessWidget { goRouter.pop(); goRouter.pop(); goRouter.pop(); - goRouter.pop(); - goRouter.pop(); + // goRouter.pop(); + // goRouter.pop(); }, icon: const Icon( Icons.close_sharp, @@ -165,14 +165,14 @@ class WalletDetails extends StatelessWidget { fontWeight: FontWeight.w900, ), ), - Text( - "+ \$100.00", - style: GoogleFonts.dmSans( - color: const Color(0xFF363636), - fontSize: 12.sp, - fontWeight: FontWeight.w500, - ), - ), + // Text( + // "+ \$100.00", + // style: GoogleFonts.dmSans( + // color: const Color(0xFF363636), + // fontSize: 12.sp, + // fontWeight: FontWeight.w500, + // ), + // ), ], ), SizedBox( diff --git a/lib/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart b/lib/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart index be2ef54..9b7b7f9 100644 --- a/lib/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart +++ b/lib/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart @@ -32,28 +32,31 @@ class _WalletScreenState extends State { automaticallyImplyLeading: false, toolbarHeight: 260.h, titleSpacing: 22.w, - title: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - AppText.walletTitle, - style: GoogleFonts.dmSans( - color: const Color(0xFF343434), - fontSize: 14.sp, - fontWeight: FontWeight.w700, + title: Padding( + padding: const EdgeInsets.only(left: 40.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + AppText.walletTitle, + style: GoogleFonts.dmSans( + color: const Color(0xFF343434), + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), ), - ), - Gap(4.h), - Text( - 'SAR 178,000', - style: GoogleFonts.dmSans( - color: const Color(0xFF191B1E), - fontSize: 28.sp, - fontWeight: FontWeight.w700, + Gap(8.h), + Text( + 'SAR 178,000', + style: GoogleFonts.dmSans( + color: const Color(0xFF191B1E), + fontSize: 28.sp, + fontWeight: FontWeight.w700, + ), ), - ), - Gap(80.h) - ], + Gap(80.h) + ], + ), ), flexibleSpace: FlexibleSpaceBar( background: Stack( diff --git a/lib/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawalScreen.dart b/lib/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawalScreen.dart index edce4a7..c478860 100644 --- a/lib/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawalScreen.dart +++ b/lib/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawalScreen.dart @@ -7,6 +7,8 @@ import 'package:tanami_app/core/routes/route_name.dart'; import 'package:tanami_app/core/routes/routes.dart'; import 'package:tanami_app/core/styles/app_text.dart'; +import '../../../../../../core/utils/text_formatter/comma_input_text_formatter.dart'; + class WithdrawalScreen extends StatefulWidget { const WithdrawalScreen({super.key}); @@ -129,81 +131,109 @@ class _WithdrawalScreenState extends State { child: Padding( padding: const EdgeInsets.symmetric( vertical: 16.0, horizontal: 12.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + child: Column( children: [ - Text( - 'SAR', - style: GoogleFonts.dmSans( - color: const Color(0xFF363636), - fontSize: 15.sp, - fontWeight: FontWeight.w700, - ), - ), - SizedBox( - width: 12.w, - ), - SizedBox( - width: 280.w, - child: TextFormField( - cursorColor: Colors.black, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - style: GoogleFonts.dmSans( - color: Colors.black, - fontSize: 16.sp, - fontWeight: FontWeight.w400, - ), - decoration: InputDecoration( - hintText: '1000', - hintStyle: GoogleFonts.dmSans( - color: const Color(0xFFC6C6C6), - fontSize: 16.sp, - fontWeight: FontWeight.w400, - ), - labelStyle: - const TextStyle(color: Colors.black), - contentPadding: const EdgeInsets.symmetric( - vertical: 15, horizontal: 10), - filled: true, - fillColor: Colors.white, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.white, width: 1), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.white, width: 1), - ), - disabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.white, width: 1), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.white, width: 1), - ), - errorBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.red, width: 1), - ), - focusedErrorBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: const BorderSide( - color: Colors.red, width: 1), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'SAR', + style: GoogleFonts.dmSans( + color: const Color(0xFF363636), + fontSize: 15.sp, + fontWeight: FontWeight.w700, ), ), - inputFormatters: [ - FilteringTextInputFormatter.deny( - RegExp(r'\s')), - LengthLimitingTextInputFormatter(20), - ], - ), + SizedBox( + width: 12.w, + ), + SizedBox( + width: 280.w, + child: TextFormField( + cursorColor: Colors.black, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 16.sp, + fontWeight: FontWeight.w400, + ), + decoration: InputDecoration( + hintText: '1000', + hintStyle: GoogleFonts.dmSans( + color: const Color(0xFFC6C6C6), + fontSize: 16.sp, + fontWeight: FontWeight.w400, + ), + labelStyle: + const TextStyle(color: Colors.black), + contentPadding: + const EdgeInsets.symmetric( + vertical: 15, horizontal: 10), + filled: true, + fillColor: Colors.white, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.white, width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.white, width: 1), + ), + disabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.white, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.white, width: 1), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.red, width: 1), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Colors.red, width: 1), + ), + ), + inputFormatters: [ + CommaTextInputFormatter(), + FilteringTextInputFormatter.deny( + RegExp(r'\s')), + LengthLimitingTextInputFormatter(20), + ], + ), + ), + ], + ), + const Gap(12), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppText.processingFees, + style: GoogleFonts.dmSans( + color: const Color(0xFF535353), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + Text( + 'BHD 0.500', + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ], ), ], ), @@ -215,51 +245,51 @@ class _WithdrawalScreenState extends State { SizedBox( height: 20.h, ), - Container( - width: double.infinity, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(22.r), - color: const Color(0xFFEEF6FB), - border: Border.all(color: const Color(0xFF90D4FF)), - boxShadow: const [ - BoxShadow( - color: Color(0xFFB0D3EF), - spreadRadius: 1, - blurRadius: 10, - offset: Offset(0, 3), - ), - ], - ), - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0, horizontal: 16.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/wallet_screen/info.png', - height: 25.h, - ), - Gap( - 10.w, - ), - Expanded( - child: Text( - AppText.info2, - style: GoogleFonts.dmSans( - color: const Color(0xFF015698), - fontSize: 12.sp, - fontWeight: FontWeight.w500, - ), - ), - ), - ], - ), - ), - ), - SizedBox( - height: 20.h, - ), + // Container( + // width: double.infinity, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(22.r), + // color: const Color(0xFFEEF6FB), + // border: Border.all(color: const Color(0xFF90D4FF)), + // boxShadow: const [ + // BoxShadow( + // color: Color(0xFFB0D3EF), + // spreadRadius: 1, + // blurRadius: 10, + // offset: Offset(0, 3), + // ), + // ], + // ), + // child: Padding( + // padding: const EdgeInsets.symmetric( + // vertical: 12.0, horizontal: 16.0), + // child: Row( + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Image.asset( + // 'assets/images/wallet_screen/info.png', + // height: 25.h, + // ), + // Gap( + // 10.w, + // ), + // Expanded( + // child: Text( + // AppText.info2, + // style: GoogleFonts.dmSans( + // color: const Color(0xFF015698), + // fontSize: 12.sp, + // fontWeight: FontWeight.w500, + // ), + // ), + // ), + // ], + // ), + // ), + // ), + // SizedBox( + // height: 20.h, + // ), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(22.r), diff --git a/lib/features/MainScreens/Wallet/presentation/widgets/deposit_pay_method_section.dart b/lib/features/MainScreens/Wallet/presentation/widgets/deposit_pay_method_section.dart index 87432c3..2fe4373 100644 --- a/lib/features/MainScreens/Wallet/presentation/widgets/deposit_pay_method_section.dart +++ b/lib/features/MainScreens/Wallet/presentation/widgets/deposit_pay_method_section.dart @@ -180,7 +180,6 @@ class DepositPayMethodSection extends StatelessWidget { ), ), ), - // const Gap(16), ]); }, ); diff --git a/lib/features/MainScreens/main_screen.dart b/lib/features/MainScreens/main_screen.dart index 1dec790..c27f648 100644 --- a/lib/features/MainScreens/main_screen.dart +++ b/lib/features/MainScreens/main_screen.dart @@ -27,8 +27,8 @@ class MainScreen extends StatelessWidget { const MainScreen({super.key}); @override Widget build(BuildContext context) { - context.read().add(TabChanged(1)); - final PageController pageController = PageController(initialPage: 1); + context.read().add(TabChanged(2)); + final PageController pageController = PageController(initialPage: 2); return BlocBuilder( builder: (context, state) { diff --git a/lib/core/utils/biometric/biometric_bloc.dart b/lib/features/biometric/presentation/bloc/biometric_bloc.dart similarity index 100% rename from lib/core/utils/biometric/biometric_bloc.dart rename to lib/features/biometric/presentation/bloc/biometric_bloc.dart diff --git a/lib/core/utils/biometric/biometric_event.dart b/lib/features/biometric/presentation/bloc/biometric_event.dart similarity index 100% rename from lib/core/utils/biometric/biometric_event.dart rename to lib/features/biometric/presentation/bloc/biometric_event.dart diff --git a/lib/core/utils/biometric/biometric_state.dart b/lib/features/biometric/presentation/bloc/biometric_state.dart similarity index 100% rename from lib/core/utils/biometric/biometric_state.dart rename to lib/features/biometric/presentation/bloc/biometric_state.dart diff --git a/lib/features/biometric/presentation/pages/biometric_layout.dart b/lib/features/biometric/presentation/pages/biometric_layout.dart index b094d15..93a067b 100644 --- a/lib/features/biometric/presentation/pages/biometric_layout.dart +++ b/lib/features/biometric/presentation/pages/biometric_layout.dart @@ -8,9 +8,9 @@ import 'package:flutter_svg/flutter_svg.dart'; import '../../../../core/routes/route_name.dart'; import '../../../../core/routes/routes.dart'; import '../../../../core/styles/app_images.dart'; -import '../../../../core/utils/biometric/biometric_bloc.dart'; -import '../../../../core/utils/biometric/biometric_event.dart'; -import '../../../../core/utils/biometric/biometric_state.dart'; +import '../bloc/biometric_bloc.dart'; +import '../bloc/biometric_event.dart'; +import '../bloc/biometric_state.dart'; import '../../../../shared/components/device_locked_dialog.dart'; class BiometricLayout extends StatelessWidget { diff --git a/lib/features/forgotPassword/presentation/bloc/restore_password_phone_verification_bloc.dart b/lib/features/forgotPassword/presentation/bloc/restore_password_phone_verification_bloc.dart index fee4a10..c0dbc70 100644 --- a/lib/features/forgotPassword/presentation/bloc/restore_password_phone_verification_bloc.dart +++ b/lib/features/forgotPassword/presentation/bloc/restore_password_phone_verification_bloc.dart @@ -30,7 +30,7 @@ class RestorePasswordPhoneVerificationBloc extends Bloc< // Simulate API call await Future.delayed(const Duration(seconds: 2)); // Replace the next line with actual API call - final isSuccess = await _mockLoginApi(event.phoneNumber); + const isSuccess = true; if (isSuccess) { emit(RestorePasswordPhoneVerificationSuccess()); } else { diff --git a/lib/features/forgotPassword/presentation/widgets/restore_password_phone_verification_form.dart b/lib/features/forgotPassword/presentation/widgets/restore_password_phone_verification_form.dart index fa12f76..a8c37df 100644 --- a/lib/features/forgotPassword/presentation/widgets/restore_password_phone_verification_form.dart +++ b/lib/features/forgotPassword/presentation/widgets/restore_password_phone_verification_form.dart @@ -26,6 +26,8 @@ class RestorePasswordPhoneVerificationForm extends StatelessWidget { selectedCountry = state.selectedIndex; restorePasswordBloc.countrySelectionTextField.text = countryName[selectedCountry]; + restorePasswordBloc.phoneNumberTextField.text = + "${isoCountryCode[selectedCountry]} "; } }, builder: (context, state) { int selectedCountry = -1; diff --git a/lib/features/login/presentation/bloc/login_bloc.dart b/lib/features/login/presentation/bloc/login_bloc.dart index a753d11..a124603 100644 --- a/lib/features/login/presentation/bloc/login_bloc.dart +++ b/lib/features/login/presentation/bloc/login_bloc.dart @@ -1,5 +1,6 @@ import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; + import 'login_event.dart'; import 'login_state.dart'; @@ -71,7 +72,7 @@ class LoginBloc extends Bloc { String password, String countryResidence, ) async { - return phoneNumber == "1234567891" && password == "123456"; + return password == "123456"; } @override diff --git a/lib/features/login/presentation/widgets/login_form.dart b/lib/features/login/presentation/widgets/login_form.dart index d933d3a..f888dae 100644 --- a/lib/features/login/presentation/widgets/login_form.dart +++ b/lib/features/login/presentation/widgets/login_form.dart @@ -25,6 +25,8 @@ class LoginForm extends StatelessWidget { if (state is RadioSelectionChanged) { selectedCountry = state.selectedIndex; loginBloc.countrySelectionTextField.text = countryName[selectedCountry]; + loginBloc.phoneNumberTextField.text = + "${isoCountryCode[selectedCountry]} "; } }, builder: (context, state) { int selectedCountry = -1; diff --git a/lib/features/register/presentation/widgets/register_form.dart b/lib/features/register/presentation/widgets/register_form.dart index e9e52ea..e5a9fb3 100644 --- a/lib/features/register/presentation/widgets/register_form.dart +++ b/lib/features/register/presentation/widgets/register_form.dart @@ -20,6 +20,8 @@ class RegisterForm extends StatelessWidget { if (state is RadioSelectionChanged) { selectedCountry = state.selectedIndex; loginBloc.countrySelectionTextField.text = countryName[selectedCountry]; + loginBloc.phoneNumberTextField.text = + "${isoCountryCode[selectedCountry]} "; } }, builder: (context, state) { if (state is RadioSelectionChanged) { diff --git a/lib/features/splash/presentation/pages/splash_screen.dart b/lib/features/splash/presentation/pages/splash_screen.dart index 21bf83c..5de81ee 100644 --- a/lib/features/splash/presentation/pages/splash_screen.dart +++ b/lib/features/splash/presentation/pages/splash_screen.dart @@ -44,14 +44,14 @@ class SplashScreen extends StatelessWidget { // Navigate to the WelcomeScreen using the goRouter goRouter.goNamed(RouteName.welcomeScreen); } else { - if (await secureStorageService.read('biometric') != null && - await secureStorageService.read('biometric') == 'on') { - goRouter.goNamed(RouteName.biometricScreen); - } else { - goRouter.goNamed(RouteName.pinScreen, pathParameters: { - "fromScreen": "LoginedInUser", - }); - } + // if (await secureStorageService.read('biometric') != null && + // await secureStorageService.read('biometric') == 'on') { + // goRouter.goNamed(RouteName.biometricScreen); + // } else { + goRouter.goNamed(RouteName.pinScreen, pathParameters: { + "fromScreen": "LoginedInUser", + }); + // } } } } diff --git a/lib/main.dart b/lib/main.dart index 23abe7c..18fe082 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,12 +3,11 @@ import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:local_auth/local_auth.dart'; -import 'package:statsfl/statsfl.dart'; import 'core/routes/routes.dart'; -import 'core/utils/biometric/biometric_bloc.dart'; -import 'core/utils/biometric/biometric_event.dart'; import 'core/utils/connectivity/network_connectivity.dart'; +import 'features/biometric/presentation/bloc/biometric_bloc.dart'; +import 'features/biometric/presentation/bloc/biometric_event.dart'; import 'features/countrySelection/presentation/bloc/choose_country_bloc.dart'; import 'shared/components/bloc/bottom_nav_bar/bottom_navigation_bloc.dart'; @@ -29,16 +28,18 @@ Future main() async { // Set the preferred orientations of the device. SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, - ]).then((value) => runApp(StatsFl( - isEnabled: true, //Toggle on/off - width: 200, //Set size - height: 50, // - maxFps: 60, // Support custom FPS target (default is 60) - showText: true, // Hide text label - sampleTime: .5, //Interval between fps calculations, in seconds. - totalTime: 15, //Total length of timeline, in seconds. - align: Alignment.center, //Alignment of statsbox - child: const MyApp()))); + ]).then((value) => runApp(const MyApp() + // StatsFl( + // isEnabled: true, //Toggle on/off + // width: 200, //Set size + // height: 50, // + // maxFps: 60, // Support custom FPS target (default is 60) + // showText: true, // Hide text label + // sampleTime: .5, //Interval between fps calculations, in seconds. + // totalTime: 15, //Total length of timeline, in seconds. + // align: Alignment.center, //Alignment of statsbox + // child: const MyApp()) + )); } class MyApp extends StatefulWidget { diff --git a/lib/shared/components/bloc/bottom_nav_bar/bottom_navigation_bloc.dart b/lib/shared/components/bloc/bottom_nav_bar/bottom_navigation_bloc.dart index 988b897..5b3f98c 100644 --- a/lib/shared/components/bloc/bottom_nav_bar/bottom_navigation_bloc.dart +++ b/lib/shared/components/bloc/bottom_nav_bar/bottom_navigation_bloc.dart @@ -6,7 +6,7 @@ import 'bottom_navigation_state.dart'; // Bloc class BottomNavigationBloc extends Bloc { - BottomNavigationBloc() : super(TabState(1)) { + BottomNavigationBloc() : super(TabState(2)) { // Register the event handler on((event, emit) { emit(TabState(event.index)); diff --git a/lib/shared/components/device_locked_dialog.dart b/lib/shared/components/device_locked_dialog.dart index cea4bc1..91e362d 100644 --- a/lib/shared/components/device_locked_dialog.dart +++ b/lib/shared/components/device_locked_dialog.dart @@ -6,10 +6,10 @@ import 'package:gap/gap.dart'; import 'package:tanami_app/core/routes/routes.dart'; import 'package:tanami_app/core/styles/app_color.dart'; import 'package:tanami_app/core/styles/app_text.dart'; -import 'package:tanami_app/core/utils/biometric/biometric_bloc.dart'; +import 'package:tanami_app/features/biometric/presentation/bloc/biometric_bloc.dart'; -import '../../core/utils/biometric/biometric_event.dart'; -import '../../core/utils/biometric/biometric_state.dart'; +import '../../features/biometric/presentation/bloc/biometric_event.dart'; +import '../../features/biometric/presentation/bloc/biometric_state.dart'; import 'text_widget.dart'; deviceLockedDialog( diff --git a/lib/shared/components/log_out_dialog.dart b/lib/shared/components/log_out_dialog.dart index a06e02d..1142c57 100644 --- a/lib/shared/components/log_out_dialog.dart +++ b/lib/shared/components/log_out_dialog.dart @@ -85,7 +85,7 @@ buildprofilelogoutdialog(context) { Gap(28.w), GestureDetector( onTap: () async { - context.read().add(TabChanged(1)); + context.read().add(TabChanged(2)); await secureStorageService.write('isLoginedIn', "false"); goRouter.goNamed(RouteName.loginScreen, pathParameters: { "fromScreen": "registerStep",