diff --git a/assets/images/wallet_screen/d_step_1.svg b/assets/images/wallet_screen/d_step_1.svg new file mode 100644 index 0000000..471f315 --- /dev/null +++ b/assets/images/wallet_screen/d_step_1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/wallet_screen/d_step_2.svg b/assets/images/wallet_screen/d_step_2.svg new file mode 100644 index 0000000..8ac4ee7 --- /dev/null +++ b/assets/images/wallet_screen/d_step_2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/wallet_screen/d_step_3.svg b/assets/images/wallet_screen/d_step_3.svg new file mode 100644 index 0000000..dcf91fd --- /dev/null +++ b/assets/images/wallet_screen/d_step_3.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/welcome_screen/svg/Splash_BG.svg b/assets/images/welcome_screen/svg/Splash_BG.svg index 77ce035..f2de534 100644 --- a/assets/images/welcome_screen/svg/Splash_BG.svg +++ b/assets/images/welcome_screen/svg/Splash_BG.svg @@ -1,13 +1,13 @@ - - + + - - + + - - - + + + diff --git a/lib/core/routes/route_name.dart b/lib/core/routes/route_name.dart index 4d5a298..ba8597a 100644 --- a/lib/core/routes/route_name.dart +++ b/lib/core/routes/route_name.dart @@ -43,6 +43,8 @@ class RouteName { static const String withdrawalConfirmation = 'withdrawalConfirmation'; static const String depositScreen = 'depositScreen'; static const String depositPreview = 'depositPreview'; + static const String selectDepositMethodScreen = 'selectDepositMethodScreen'; + static const String depositStepScreen = 'depositStepScreen'; //Biometric static const String biometricScreen = 'biometricScreen'; diff --git a/lib/core/routes/routes.dart b/lib/core/routes/routes.dart index 16142f6..3b439e2 100644 --- a/lib/core/routes/routes.dart +++ b/lib/core/routes/routes.dart @@ -8,12 +8,14 @@ import 'package:tanami_app/features/MainScreens/Invest/presentation/pages/paymen import 'package:tanami_app/features/MainScreens/Invest/presentation/pages/payment/invest_payment_screen.dart'; import 'package:tanami_app/features/MainScreens/Portfolio/presentation/pages/portfolio_details_screen.dart'; import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/deposit_screen.dart'; +import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/deposit_step_screen.dart'; import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/preview.dart'; +import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposit/select_deposit_method_screen.dart'; import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/filter_screen.dart'; -import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/walletDetails.dart'; +import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/wallet_details.dart'; import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/withdrawal/confirmation.dart'; import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/withdrawal/preview.dart'; -import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawalScreen.dart'; +import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawal_screen.dart'; import 'package:tanami_app/features/biometric/presentation/pages/biometric_screen.dart'; import 'package:tanami_app/features/changePassword/presentation/pages/change_password_screen.dart'; import 'package:tanami_app/features/contactAdmin/presentation/pages/contact_admin_screen.dart'; @@ -208,6 +210,20 @@ final goRouter = GoRouter( return const DepositScreen(); }, ), + GoRoute( + name: RouteName.selectDepositMethodScreen, + path: RouteName.selectDepositMethodScreen, + builder: (context, state) { + return const SelectDepositMethodScreen(); + }, + ), + GoRoute( + name: RouteName.depositStepScreen, + path: RouteName.depositStepScreen, + builder: (context, state) { + return const DepositStepScreen(); + }, + ), GoRoute( name: RouteName.depositPreview, path: RouteName.depositPreview, diff --git a/lib/core/styles/app_images.dart b/lib/core/styles/app_images.dart index 7990c31..7acdbdc 100644 --- a/lib/core/styles/app_images.dart +++ b/lib/core/styles/app_images.dart @@ -1,7 +1,7 @@ class AppImages { //Splash static const String splashBg = - "assets/images/welcome_screen/svg/tanamibg.svg"; + "assets/images/welcome_screen/svg/Splash_BG.svg"; static const String splashLogo = "assets/images/welcome_screen/svg/Tanami_Capital_Splash_Logo.svg"; @@ -129,7 +129,6 @@ class AppImages { 'assets/images/wallet_screen/search.png'; static const String walletFilterIcon = 'assets/images/wallet_screen/filter.png'; - static const String depositListIcon = 'assets/images/wallet_screen/deposit_list.png'; static const String withdrawalListIcon = @@ -140,4 +139,7 @@ class AppImages { 'assets/images/wallet_screen/yield_list.png'; static const String refundListIcon = 'assets/images/wallet_screen/refund_list.png'; + static const String dStep1Icon = 'assets/images/wallet_screen/d_step_1.svg'; + static const String dStep2Icon = 'assets/images/wallet_screen/d_step_2.svg'; + static const String dStep3Icon = 'assets/images/wallet_screen/d_step_3.svg'; } 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 83788bf..c1ce836 100644 --- a/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_layout.dart +++ b/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_layout.dart @@ -14,12 +14,12 @@ import '../../../../../../core/styles/app_images.dart'; import '../../../../../../core/styles/app_text.dart'; import '../../../../../../core/utils/language/localizations_delegate.dart'; import '../../../../../../core/utils/text_formatter/comma_input_text_formatter.dart'; +import '../../../../../../shared/components/text_widget.dart'; import '../../../../../countrySelection/bloc/choose_country_bloc.dart'; import '../../../../../countrySelection/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'; -import '../../widgets/deposit_pay_method_section.dart'; class DepositLayout extends StatelessWidget { const DepositLayout({super.key}); @@ -28,13 +28,12 @@ class DepositLayout extends StatelessWidget { Widget build(BuildContext context) { var localizations = AppLocalizations.of(context); final depositPaymentBloc = context.read(); - + int selectedIndex = 0; return Scaffold( bottomNavigationBar: BlocBuilder( builder: (context, state) { return BlocBuilder( builder: (context, radioState) { - int selectedIndex = 0; if (radioState is RadioSelectionChanged) { selectedIndex = radioState.selectedIndex; } @@ -93,7 +92,7 @@ class DepositLayout extends StatelessWidget { : AppColor.inactiveBtnColor), child: Center( child: Text( - localizations.translate(AppText.depositNoti), + localizations.translate(AppText.next), style: GoogleFonts.dmSans( color: state.isFormValid ? AppColor.plainWhite @@ -117,258 +116,222 @@ class DepositLayout extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - RichText( - text: TextSpan( - children: [ - TextSpan( - text: '${localizations.translate(AppText.balance)}: ', - style: GoogleFonts.dmSans( - color: Colors.grey, - fontSize: 12.sp, - fontWeight: FontWeight.bold, - ), - ), - TextSpan( - text: 'SAR 178,000', - style: GoogleFonts.dmSans( - color: Colors.black, - fontSize: 14.sp, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - SizedBox( - height: 20.h, - ), + // RichText( + // text: TextSpan( + // children: [ + // TextSpan( + // text: '${localizations.translate(AppText.balance)}: ', + // style: GoogleFonts.dmSans( + // color: Colors.grey, + // fontSize: 12.sp, + // fontWeight: FontWeight.bold, + // ), + // ), + // TextSpan( + // text: 'SAR 178,000', + // style: GoogleFonts.dmSans( + // color: Colors.black, + // fontSize: 14.sp, + // fontWeight: FontWeight.bold, + // ), + // ), + // ], + // ), + // ), + + // SizedBox( + // height: 20.h, + // ), 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, - ), - ), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(12.0), + child: selectedIndex == 1 + ? Row(children: [ + SvgPicture.asset(AppImages.applePayIcon), + const Gap(5), + TextWidget().text14W700( + localizations + .translate(AppText.applePayText), + clr: AppColor.textLabelColor), + ]) + : Row( + children: [ + SvgPicture.asset(AppImages.walletIcon), + const Gap(5), + TextWidget().text14W700( + localizations + .translate(AppText.bankTransfer), + clr: AppColor.textLabelColor), + ], ), - SizedBox( - width: 12.w, + ), + 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.w400, ), - Text( - localizations.translate(AppText.depositTitle), + ), + 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 localizations.translate( + 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: 17.sp, - fontWeight: FontWeight.w700, + 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), + ), ), ), - ], - ), + ), + ], ), - 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: 280.w, - child: TextFormField( - inputFormatters: [ - CommaTextInputFormatter(), - FilteringTextInputFormatter.deny( - RegExp(r'\s')), - LengthLimitingTextInputFormatter(20), - ], - validator: (value) { - if (depositPaymentBloc - .amountController.text.isEmpty) { - return localizations.translate( - 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), - ), - ), - ), - ), - ], + ), + // 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, + // children: [ + // Text( + // localizations + // .translate(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, + // ), + // ), + // ], + // ), + // ], + // ), + // ), + // ), + + const Gap(15), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + localizations + .translate("Total : SAR ${state.amount}"), + style: GoogleFonts.dmSans( + color: const Color(0xFF066123), + fontSize: 16.sp, + fontWeight: FontWeight.w700, ), ), - ), - 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, - children: [ - Text( - localizations - .translate(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, - ), - ), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - localizations - .translate(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(), - const Gap(16), + // const Gap(30), + // const DepositPayMethodSection(), + // const Gap(16), ], ), ), diff --git a/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_screen.dart b/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_screen.dart index da29299..8ff0de7 100644 --- a/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_screen.dart +++ b/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_screen.dart @@ -8,15 +8,9 @@ import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/deposi import '../../../../../../core/utils/language/localizations_delegate.dart'; -class DepositScreen extends StatefulWidget { +class DepositScreen extends StatelessWidget { const DepositScreen({super.key}); - @override - State createState() => _DepositScreenState(); -} - -class _DepositScreenState extends State { - int selectedIndex = 0; @override Widget build(BuildContext context) { var localizations = AppLocalizations.of(context); @@ -28,7 +22,7 @@ class _DepositScreenState extends State { scrolledUnderElevation: 0.0, centerTitle: true, title: Text( - localizations.translate(AppText.depositScreenTitle), + localizations.translate(AppText.deposit), style: GoogleFonts.dmSans( color: const Color(0xFF272727), fontSize: 20.sp, diff --git a/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_step_screen.dart b/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_step_screen.dart new file mode 100644 index 0000000..cde91cc --- /dev/null +++ b/lib/features/MainScreens/Wallet/presentation/pages/deposit/deposit_step_screen.dart @@ -0,0 +1,161 @@ +import 'package:flutter/material.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 'package:tanami_app/core/routes/routes.dart'; +import 'package:tanami_app/core/styles/app_images.dart'; +import 'package:tanami_app/shared/components/text_widget.dart'; + +import '../../../../../../core/styles/app_color.dart'; +import '../../../../../../core/styles/app_text.dart'; +import '../../../../../../core/utils/language/localizations_delegate.dart'; +import '../../../../../../shared/components/button_widget.dart'; + +class DepositStepScreen extends StatelessWidget { + const DepositStepScreen({super.key}); + + @override + Widget build(BuildContext context) { + var localizations = AppLocalizations.of(context); + + return Scaffold( + backgroundColor: Colors.white, + bottomNavigationBar: Container( + margin: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), + width: 1.sw, + height: 56.h, + child: ButtonWidget().elevatedBtn( + txtClr: AppColor.plainWhite, + function: () { + goRouter.pushNamed(RouteName.depositScreen); + }, + text: localizations.translate(AppText.next), + clr: AppColor.primaryColor2, + ), + ), + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0, + scrolledUnderElevation: 0.0, + centerTitle: true, + title: Text( + localizations.translate(AppText.bankTransfer), + style: GoogleFonts.dmSans( + color: const Color(0xFF272727), + fontSize: 20.sp, + fontWeight: FontWeight.w700, + ), + ), + actions: const [ + Icon( + Icons.info, + color: Color(0xFF363636), + ), + Gap(10) + ], + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 20), + decoration: ShapeDecoration( + color: const Color(0xFFF6F6F6), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(22), + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + width: 0.8.sw, + child: Text( + 'In order for you to complete a bank transfer, you need will need to create a deposit notification and transfer funds from your wallet, directly into your bank account.', + style: GoogleFonts.dmSans( + color: const Color(0xFF363636), + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + ), + const Spacer(), + const Icon( + Icons.close, + color: Color(0xFF363636), + ) + ], + ), + ), + const Gap(16), + TextWidget().text15W700("Please complete the below steps", + clr: AppColor.plainBlack), + const Gap(16), + Padding( + padding: const EdgeInsets.all(16.0), + child: ListView( + shrinkWrap: true, + children: [ + Row( + children: [ + SvgPicture.asset(AppImages.dStep1Icon), + const Gap(16), + Expanded( + child: TextWidget().text14W400( + "Insert the amount you would like to transfer.", + clr: const Color(0xFF363636), + txtAlign: TextAlign.start, + ), + ) + ], + ), + const Gap(24), + Row( + children: [ + SvgPicture.asset(AppImages.dStep2Icon), + const Gap(16), + Expanded( + child: TextWidget().text14W400( + "Copy the bank details of your Tanami account shown on the next page. Make sure to keep note of the reference ID.", + clr: const Color(0xFF363636), + txtAlign: TextAlign.start, + ), + ) + ], + ), + const Gap(24), + Row( + children: [ + SvgPicture.asset(AppImages.dStep3Icon), + const Gap(16), + Expanded( + child: TextWidget().text14W400( + "Insert the amount you would like to transfer.", + clr: const Color(0xFF363636), + txtAlign: TextAlign.start, + ), + ) + ], + ), + ], + ), + ), + const Spacer(), + TextWidget().text13W500( + "Tanami will notify you upon receipt of your funds and it will appear in your wallet balance 3-4 business days after initiating the transfer.", + clr: const Color(0xFF888888), + fontStyle: FontStyle.italic), + ], + ), + ), + ); + } +} diff --git a/lib/features/MainScreens/Wallet/presentation/pages/deposit/preview.dart b/lib/features/MainScreens/Wallet/presentation/pages/deposit/preview.dart index c783b34..aa7719d 100644 --- a/lib/features/MainScreens/Wallet/presentation/pages/deposit/preview.dart +++ b/lib/features/MainScreens/Wallet/presentation/pages/deposit/preview.dart @@ -3,8 +3,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:gap/gap.dart'; import 'package:google_fonts/google_fonts.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/shared/components/text_widget.dart'; import '../../../../../../core/utils/language/localizations_delegate.dart'; @@ -17,13 +17,13 @@ class DepositPreview extends StatefulWidget { class _DepositPreviewState extends State { List values = [ - 'Name Surname', - 'DE 1234 5678 9012 3456', - 'Hohenzollernring 58, 95444', - 'Name Bank', - 'Hohenzollernring 58, 95444', - 'BC12345', - 'FRYU FHDU 1234', + 'Tanami Capital W.L.L', + '100000480779', + 'BH 23 BBKU 00100 00048 0779', + 'BBKUBHBM', + 'Bank of Bahrain and Kuwait B.S.C', + '43 Government Avenue, Manama, Kingdom of Bahrain', + 'BH00600000', ]; List titles2 = [ @@ -42,13 +42,13 @@ class _DepositPreviewState extends State { Widget build(BuildContext context) { var localizations = AppLocalizations.of(context); List titles = [ - localizations.translate(AppText.accountHolderName), - localizations.translate(AppText.iban), - localizations.translate(AppText.beneficiaryAddress), - localizations.translate(AppText.bankName), - localizations.translate(AppText.branchAddress), - localizations.translate(AppText.SWIFTcode), - localizations.translate(AppText.refid), + localizations.translate("Account Name"), + localizations.translate("Account No."), + localizations.translate("IBAN"), + localizations.translate("SWIFT Code"), + localizations.translate("Bank Name"), + localizations.translate("Bank Address"), + localizations.translate("Client ID"), ]; return Scaffold( backgroundColor: Colors.white, @@ -58,7 +58,7 @@ class _DepositPreviewState extends State { scrolledUnderElevation: 0.0, centerTitle: true, title: Text( - localizations.translate(AppText.depositScreenTitle), + localizations.translate("Deposit confirmation"), style: GoogleFonts.dmSans( color: const Color(0xFF272727), fontSize: 20.sp, @@ -281,90 +281,102 @@ class _DepositPreviewState extends State { // SizedBox( // height: 20.h, // ), - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - localizations.translate(AppText.depositDetails), - style: GoogleFonts.dmSans( - color: Colors.black, - fontSize: 15.sp, - fontWeight: FontWeight.w700, - ), - ), - SizedBox( - height: 10.h, - ), - const Divider( - color: Color(0xFFE3E3E3), - ), - SizedBox( - height: 10.h, - ), - ListView.builder( - physics: const NeverScrollableScrollPhysics(), - itemCount: titles.length, - shrinkWrap: true, - itemBuilder: (context, index) { - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + Card( + color: AppColor.plainWhite, + elevation: 5, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + localizations.translate(AppText.depositDetails), + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 15.sp, + fontWeight: FontWeight.w700, + ), + ), + SizedBox( + height: 10.h, + ), + const Divider( + color: Color(0xFFE3E3E3), + ), + SizedBox( + height: 10.h, + ), + ListView.builder( + physics: const NeverScrollableScrollPhysics(), + itemCount: titles.length, + shrinkWrap: true, + itemBuilder: (context, index) { + return Column( children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - titles[index], - style: GoogleFonts.dmSans( - color: Colors.black, - fontSize: 14.sp, - fontWeight: FontWeight.w700, - ), - ), - SizedBox( - height: 8.h, - ), - Text( - values[index], - style: GoogleFonts.dmSans( - color: const Color(0xFF191B1E), - fontSize: 14.sp, - fontWeight: FontWeight.w400, - ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + titles[index], + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + SizedBox( + height: 8.h, + ), + SizedBox( + width: 0.8.sw, + child: Text( + values[index], + style: GoogleFonts.dmSans( + color: const Color(0xFF191B1E), + fontSize: 14.sp, + fontWeight: FontWeight.w400, + ), + ), + ), + ], ), + // Image.asset( + // 'assets/images/wallet_screen/copy.png', + // height: 25.h, + // ) ], ), - Image.asset( - 'assets/images/wallet_screen/copy.png', - height: 25.h, - ) + (index != titles.length - 1) + ? Column( + children: [ + SizedBox( + height: 12.h, + ), + Divider( + color: const Color(0xFFE3E3E3), + height: 2.h), + SizedBox( + height: 12.h, + ), + ], + ) + : SizedBox( + height: 10.h, + ), ], - ), - (index != titles.length - 1) - ? Column( - children: [ - SizedBox( - height: 12.h, - ), - Divider( - color: const Color(0xFFE3E3E3), - height: 2.h), - SizedBox( - height: 12.h, - ), - ], - ) - : SizedBox( - height: 10.h, - ), - ], - ); - }, - ) - ], + ); + }, + ) + ], + ), + ), ), ], ), @@ -378,6 +390,8 @@ class _DepositPreviewState extends State { onTap: () { goRouter.pop(); goRouter.pop(); + goRouter.pop(); + goRouter.pop(); }, child: Container( margin: const EdgeInsets.all(10.0), @@ -391,7 +405,7 @@ class _DepositPreviewState extends State { padding: const EdgeInsets.symmetric(vertical: 20.0), child: Center( child: Text( - localizations.translate(AppText.submitDeposit), + localizations.translate(AppText.depositNoti), style: GoogleFonts.dmSans( color: Colors.white, fontSize: 14.sp, @@ -403,19 +417,19 @@ class _DepositPreviewState extends State { ), ), const Gap(10), - GestureDetector( - onTap: () { - goRouter.pop(); - }, - child: Center( - child: TextWidget().text14W700( - localizations.translate(AppText.back), - clr: const Color(0xFF363636), - textDecoration: TextDecoration.underline, - ), - ), - ), - const Gap(20), + // GestureDetector( + // onTap: () { + // goRouter.pop(); + // }, + // child: Center( + // child: TextWidget().text14W700( + // localizations.translate(AppText.back), + // clr: const Color(0xFF363636), + // textDecoration: TextDecoration.underline, + // ), + // ), + // ), + // const Gap(20), ], ), ); diff --git a/lib/features/MainScreens/Wallet/presentation/pages/deposit/select_deposit_method_screen.dart b/lib/features/MainScreens/Wallet/presentation/pages/deposit/select_deposit_method_screen.dart new file mode 100644 index 0000000..9f9eded --- /dev/null +++ b/lib/features/MainScreens/Wallet/presentation/pages/deposit/select_deposit_method_screen.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:tanami_app/core/routes/route_name.dart'; +import 'package:tanami_app/core/routes/routes.dart'; + +import '../../../../../../core/styles/app_color.dart'; +import '../../../../../../core/styles/app_text.dart'; +import '../../../../../../core/utils/language/localizations_delegate.dart'; +import '../../../../../../shared/components/button_widget.dart'; +import '../../../../../countrySelection/bloc/choose_country_bloc.dart'; +import '../../widgets/deposit_pay_method_section.dart'; + +class SelectDepositMethodScreen extends StatelessWidget { + const SelectDepositMethodScreen({super.key}); + + @override + Widget build(BuildContext context) { + var localizations = AppLocalizations.of(context); + final radioBloc = context.read(); + return Scaffold( + backgroundColor: Colors.white, + bottomNavigationBar: Container( + margin: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), + width: 1.sw, + height: 56.h, + child: ButtonWidget().elevatedBtn( + txtClr: AppColor.plainWhite, + function: () { + if (radioBloc.selectedCountry == 0) { + goRouter.pushNamed(RouteName.depositStepScreen); + } else { + goRouter.pushNamed(RouteName.depositScreen); + } + }, + text: localizations.translate(AppText.next), + clr: AppColor.primaryColor2, + ), + ), + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0, + scrolledUnderElevation: 0.0, + centerTitle: true, + title: Text( + localizations.translate(AppText.deposit), + style: GoogleFonts.dmSans( + color: const Color(0xFF272727), + fontSize: 20.sp, + fontWeight: FontWeight.w700, + ), + ), + ), + body: const Padding( + padding: EdgeInsets.all(16.0), + child: Column( + children: [ + DepositPayMethodSection(), + ], + ), + ), + ); + } +} diff --git a/lib/features/MainScreens/Wallet/presentation/pages/walletDetails.dart b/lib/features/MainScreens/Wallet/presentation/pages/wallet_details.dart similarity index 100% rename from lib/features/MainScreens/Wallet/presentation/pages/walletDetails.dart rename to lib/features/MainScreens/Wallet/presentation/pages/wallet_details.dart diff --git a/lib/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart b/lib/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart index 075434b..2086a9a 100644 --- a/lib/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart +++ b/lib/features/MainScreens/Wallet/presentation/pages/wallet_screen.dart @@ -88,7 +88,8 @@ class _WalletScreenState extends State { children: [ GestureDetector( onTap: () { - goRouter.pushNamed(RouteName.depositScreen); + goRouter.pushNamed( + RouteName.selectDepositMethodScreen); }, child: Column( mainAxisSize: MainAxisSize.min, diff --git a/lib/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawalScreen.dart b/lib/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawal_screen.dart similarity index 100% rename from lib/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawalScreen.dart rename to lib/features/MainScreens/Wallet/presentation/pages/withdrawal/withdrawal_screen.dart diff --git a/lib/features/OTP/bloc/OTPStateEvent.dart b/lib/features/OTP/bloc/OTPStateEvent.dart deleted file mode 100644 index 53b7f73..0000000 --- a/lib/features/OTP/bloc/OTPStateEvent.dart +++ /dev/null @@ -1,37 +0,0 @@ - -abstract class OTPEvent { - const OTPEvent(); - - List get props => []; -} - -class RequestOTP extends OTPEvent { - final Map OTPRequestData; - RequestOTP(this.OTPRequestData); - - @override - List get props => [OTPRequestData]; - -} -class VerifyOTP extends OTPEvent { - VerifyOTP(); - - -} -abstract class OTPState{} -class OTPInitial extends OTPState {} - -class OTPLoading extends OTPState {} - -class OTPLoaded extends OTPState {} - -class OTPFailed extends OTPState { - final String failedmessage; - - OTPFailed(this.failedmessage); -} -class OTPError extends OTPState { - final String errormessage; - - OTPError(this.errormessage); -} diff --git a/lib/features/countrySelection/bloc/GetCountry/get_country_bloc.dart b/lib/features/countrySelection/bloc/GetCountry/get_country_bloc.dart new file mode 100644 index 0000000..cb671fd --- /dev/null +++ b/lib/features/countrySelection/bloc/GetCountry/get_country_bloc.dart @@ -0,0 +1,27 @@ +import 'package:bloc/bloc.dart'; +import 'package:tanami_app/features/countrySelection/bloc/GetCountry/get_country_event.dart'; + +import '../../../../Api_Helper/base_manager.dart'; +import '../../domain/model/get_country_model.dart'; +import '../../domain/repositories/get_country_api.dart'; +import 'get_country_state.dart'; + +class GetCountryBlock extends Bloc { + GetCountryBlock() : super(CountryInitial()) { + on(mapEventToState); + } + Future mapEventToState( + GetCountry event, Emitter emit) async { + emit(CountryLoading()); + try { + ResponseData response = await GetCountryAPI().getcountryAPI(); + if (response.status == ResponseStatus.SUCCESS) { + GetCountryModel countryModel = GetCountryModel.fromJson(response.data); + emit(CountryLoaded(countryModel)); + } + print("//"); + } catch (e) { + emit(CountryError("Oops Something went wrong")); + } + } +} diff --git a/lib/features/countrySelection/bloc/GetCountry/get_country_event.dart b/lib/features/countrySelection/bloc/GetCountry/get_country_event.dart new file mode 100644 index 0000000..f9b1eb5 --- /dev/null +++ b/lib/features/countrySelection/bloc/GetCountry/get_country_event.dart @@ -0,0 +1,9 @@ +abstract class GetCountryEvent { + const GetCountryEvent(); + + get props => []; +} + +class GetCountry extends GetCountryEvent { + GetCountry(); +} diff --git a/lib/features/countrySelection/bloc/GetCountry/getcountryevent_bloc.dart b/lib/features/countrySelection/bloc/GetCountry/get_country_state.dart similarity index 64% rename from lib/features/countrySelection/bloc/GetCountry/getcountryevent_bloc.dart rename to lib/features/countrySelection/bloc/GetCountry/get_country_state.dart index 01b4751..b7dddf1 100644 --- a/lib/features/countrySelection/bloc/GetCountry/getcountryevent_bloc.dart +++ b/lib/features/countrySelection/bloc/GetCountry/get_country_state.dart @@ -1,17 +1,7 @@ -import '../../domain/model/GetCountry_model.dart'; +import '../../domain/model/get_country_model.dart'; -abstract class GetCountryEvent { - const GetCountryEvent(); +abstract class GetCountryState {} - get props => []; -} - -class GetCountry extends GetCountryEvent { - GetCountry(); - - -} -abstract class GetCountryState{} // Define states //enum GetCountryState { initial, loading, success, failure, error } class CountryInitial extends GetCountryState {} @@ -28,4 +18,4 @@ class CountryError extends GetCountryState { final String message; CountryError(this.message); -} \ No newline at end of file +} diff --git a/lib/features/countrySelection/bloc/GetCountry/getcountry_bloc.dart b/lib/features/countrySelection/bloc/GetCountry/getcountry_bloc.dart deleted file mode 100644 index 7584cd5..0000000 --- a/lib/features/countrySelection/bloc/GetCountry/getcountry_bloc.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:bloc/bloc.dart'; -import 'package:tanami_app/features/countrySelection/bloc/GetCountry/getcountryevent_bloc.dart'; - -import '../../../../Api_Helper/base_manager.dart'; -import '../../domain/model/GetCountry_model.dart'; -import 'GetCountryAPI.dart'; - - -class GetCountryBlock extends Bloc { - GetCountryBlock() : super(CountryInitial()) { - on(mapEventToState); - } - Future mapEventToState( - GetCountry event, Emitter emit) async { - if (event is GetCountry) { - emit(CountryLoading()); - try { - ResponseData response = await GetCountryAPI().getcountryAPI(); - if (response.status == ResponseStatus.SUCCESS) { - GetCountryModel countryModel = - GetCountryModel.fromJson(response.data); - emit(CountryLoaded(countryModel)); - } - print("//"); - } catch (e) { - emit(CountryError("Oops Something went wrong")); - } - } - } -} diff --git a/lib/features/countrySelection/domain/model/GetCountry_model.dart b/lib/features/countrySelection/domain/model/get_country_model.dart similarity index 64% rename from lib/features/countrySelection/domain/model/GetCountry_model.dart rename to lib/features/countrySelection/domain/model/get_country_model.dart index 78638a3..d62df32 100644 --- a/lib/features/countrySelection/domain/model/GetCountry_model.dart +++ b/lib/features/countrySelection/domain/model/get_country_model.dart @@ -1,20 +1,19 @@ class GetCountryModel { List? data; - GetCountryModel({ this.data}); + GetCountryModel({this.data}); GetCountryModel.fromJson(Map json) { if (json['data'] != null) { data = []; json['data'].forEach((v) { - data!.add(new Data.fromJson(v)); + data!.add(Data.fromJson(v)); }); } - } Map toJson() { - final Map data = new Map(); + final Map data = {}; if (this.data != null) { data['data'] = this.data!.map((v) => v.toJson()).toList(); } @@ -28,10 +27,10 @@ class Data { String? countryCode; String? isdCode; String? flagIcon; - Null? currencyXid; + Null currencyXid; bool? isActive; - Null? createdBy; - Null? modifiedBy; + Null createdBy; + Null modifiedBy; Data( {this.id, @@ -57,16 +56,16 @@ class Data { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['countryName'] = this.countryName; - data['countryCode'] = this.countryCode; - data['isdCode'] = this.isdCode; - data['flagIcon'] = this.flagIcon; - data['currency_xid'] = this.currencyXid; - data['isActive'] = this.isActive; - data['createdBy'] = this.createdBy; - data['modifiedBy'] = this.modifiedBy; + final Map data = {}; + data['id'] = id; + data['countryName'] = countryName; + data['countryCode'] = countryCode; + data['isdCode'] = isdCode; + data['flagIcon'] = flagIcon; + data['currency_xid'] = currencyXid; + data['isActive'] = isActive; + data['createdBy'] = createdBy; + data['modifiedBy'] = modifiedBy; return data; } } diff --git a/lib/features/countrySelection/bloc/GetCountry/GetCountryAPI.dart b/lib/features/countrySelection/domain/repositories/get_country_api.dart similarity index 100% rename from lib/features/countrySelection/bloc/GetCountry/GetCountryAPI.dart rename to lib/features/countrySelection/domain/repositories/get_country_api.dart diff --git a/lib/features/countrySelection/presentation/widgets/country_selection_list.dart b/lib/features/countrySelection/presentation/widgets/country_selection_list.dart index 9887941..8767478 100644 --- a/lib/features/countrySelection/presentation/widgets/country_selection_list.dart +++ b/lib/features/countrySelection/presentation/widgets/country_selection_list.dart @@ -4,12 +4,12 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:gap/gap.dart'; import 'package:tanami_app/core/styles/app_color.dart'; -import 'package:tanami_app/core/utils/constant/country_flag_data.dart'; -import 'package:tanami_app/features/countrySelection/bloc/GetCountry/getcountry_bloc.dart'; -import 'package:tanami_app/features/countrySelection/bloc/GetCountry/getcountryevent_bloc.dart'; +import 'package:tanami_app/features/countrySelection/bloc/GetCountry/get_country_bloc.dart'; +import 'package:tanami_app/features/countrySelection/bloc/GetCountry/get_country_event.dart'; import 'package:tanami_app/shared/components/text_widget.dart'; import '../../../../shared/api/api_endpoints.dart'; +import '../../bloc/GetCountry/get_country_state.dart'; import '../../bloc/choose_country_bloc.dart'; import '../../bloc/choose_country_event.dart'; import '../../bloc/choose_country_state.dart'; @@ -30,11 +30,11 @@ class CountrySelectionList extends StatelessWidget { return BlocConsumer( listener: (context, state) { - if (state == CountryLoaded) { + if (state is CountryLoaded) { const SnackBar(content: Text("Successfully fetch")); - } else if (state == CountryError) { + } else if (state is CountryError) { const SnackBar(content: Text("error while fetching data")); - Future.delayed(Duration(milliseconds: 3), () { + Future.delayed(const Duration(milliseconds: 3), () { context.read().add(GetCountry()); }); } else { @@ -43,7 +43,7 @@ class CountrySelectionList extends StatelessWidget { }, builder: (context, state) { print(state); if (state is CountryLoading) { - return Center(child: CircularProgressIndicator()); + return const Center(child: CircularProgressIndicator()); } else if (state is CountryLoaded) { return ListView.builder( itemCount: state.countryModel.data?.length ?? 0, @@ -54,26 +54,28 @@ class CountrySelectionList extends StatelessWidget { title: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Container( + SizedBox( height: 24.h, width: 24.w, child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(100)), + borderRadius: + const BorderRadius.all(Radius.circular(100)), child: CachedNetworkImage( maxHeightDiskCache: 200, maxWidthDiskCache: 200, cacheKey: country.countryName, key: UniqueKey(), - imageUrl: "${ApiEndpoints.base}${country.flagIcon}", + imageUrl: + "${ApiEndpoints.base}${country.flagIcon}", height: 24.h, width: 24.w, - placeholder: (context, url) => Container( + placeholder: (context, url) => SizedBox( height: 24.h, width: 24.w, - child: CircularProgressIndicator(), + child: const CircularProgressIndicator(), ), errorWidget: (context, url, error) => - Icon(Icons.error), + const Icon(Icons.error), fit: BoxFit.cover), ), ), @@ -103,7 +105,8 @@ class CountrySelectionList extends StatelessWidget { } else if (state is CountryError) { return Center(child: Text(state.message)); } else { - return Center(child: Text('Press button to fetch country data')); + return const Center( + child: Text('Press button to fetch country data')); } }); }, diff --git a/lib/features/OTP/bloc/OTP_bloc.dart b/lib/features/otpVerification/bloc/otp_bloc.dart similarity index 52% rename from lib/features/OTP/bloc/OTP_bloc.dart rename to lib/features/otpVerification/bloc/otp_bloc.dart index ede3651..021cb28 100644 --- a/lib/features/OTP/bloc/OTP_bloc.dart +++ b/lib/features/otpVerification/bloc/otp_bloc.dart @@ -1,30 +1,29 @@ import 'package:bloc/bloc.dart'; -import 'package:tanami_app/features/OTP/bloc/OTPStateEvent.dart'; import '../../../Api_Helper/base_manager.dart'; -import '../Repository/OTP_API.dart'; +import '../domain/Repository/otp_api.dart'; +import 'otp_event.dart'; +import 'otp_state.dart'; class OTPBloc extends Bloc { - OTPBloc() : super (OTPInitial()) { - on(RequestOTPCall); + OTPBloc() : super(OTPInitial()) { + on(requestOTPCall); // on(VerifyOTPCall); } - Future RequestOTPCall(RequestOTP event, Emitter emit) async { - if (event is RequestOTP) { - emit(OTPLoading()); - final otprequestdata = event.OTPRequestData; + Future requestOTPCall(RequestOTP event, Emitter emit) async { + emit(OTPLoading()); + final otprequestdata = event.OTPRequestData; - try { - ResponseData response = await OTPAPI().RequestOTP(otprequestdata); - if (response.status == ResponseStatus.SUCCESS) { - emit(OTPLoaded()); - } else { - emit(OTPFailed("Oops something went wrong")); - } - print("//"); - } catch (e) { - emit(OTPError("Oops something went wrong")); + try { + ResponseData response = await OTPAPI().requestOTP(otprequestdata); + if (response.status == ResponseStatus.SUCCESS) { + emit(OTPLoaded()); + } else { + emit(OTPFailed("Oops something went wrong")); } + print("//"); + } catch (e) { + emit(OTPError("Oops something went wrong")); } } diff --git a/lib/features/otpVerification/bloc/otp_event.dart b/lib/features/otpVerification/bloc/otp_event.dart new file mode 100644 index 0000000..f994462 --- /dev/null +++ b/lib/features/otpVerification/bloc/otp_event.dart @@ -0,0 +1,17 @@ +abstract class OTPEvent { + const OTPEvent(); + + List get props => []; +} + +class RequestOTP extends OTPEvent { + final Map OTPRequestData; + RequestOTP(this.OTPRequestData); + + @override + List get props => [OTPRequestData]; +} + +class VerifyOTP extends OTPEvent { + VerifyOTP(); +} diff --git a/lib/features/otpVerification/bloc/otp_state.dart b/lib/features/otpVerification/bloc/otp_state.dart new file mode 100644 index 0000000..5d35cba --- /dev/null +++ b/lib/features/otpVerification/bloc/otp_state.dart @@ -0,0 +1,19 @@ +abstract class OTPState {} + +class OTPInitial extends OTPState {} + +class OTPLoading extends OTPState {} + +class OTPLoaded extends OTPState {} + +class OTPFailed extends OTPState { + final String failedmessage; + + OTPFailed(this.failedmessage); +} + +class OTPError extends OTPState { + final String errormessage; + + OTPError(this.errormessage); +} diff --git a/lib/features/OTP/Repository/OTP_API.dart b/lib/features/otpVerification/domain/Repository/otp_api.dart similarity index 55% rename from lib/features/OTP/Repository/OTP_API.dart rename to lib/features/otpVerification/domain/Repository/otp_api.dart index e0560c2..6837ecf 100644 --- a/lib/features/OTP/Repository/OTP_API.dart +++ b/lib/features/otpVerification/domain/Repository/otp_api.dart @@ -1,21 +1,22 @@ -import '../../../../Api_Helper/base_manager.dart'; -import '../../../../shared/api/api_endpoints.dart'; -import '../../../../shared/api/network_api_services.dart'; +import '../../../../../Api_Helper/base_manager.dart'; +import '../../../../../shared/api/api_endpoints.dart'; +import '../../../../../shared/api/network_api_services.dart'; class OTPAPI { OTPAPI(); - Future RequestOTP(Map data) async { + Future requestOTP(Map data) async { String url = ApiEndpoints.requestotpapi; final response = await NetworkApiService().post(url, data); return response; } - Future ResendOTPRequest(Map data) async { + + Future resendOTPRequest(Map data) async { String url = ApiEndpoints.requestresendotp; final response = await NetworkApiService().post(url, data); return response; } - Future VerifyOTP(Map data) async { + Future verifyOTP(Map data) async { String url = ApiEndpoints.verifyotp; final response = await NetworkApiService().post(url, data); return response; diff --git a/lib/features/otpVerification/presentation/bloc/otp_bloc.dart b/lib/features/otpVerification/presentation/bloc/otp_bloc.dart index c26a9dd..01ed9a9 100644 --- a/lib/features/otpVerification/presentation/bloc/otp_bloc.dart +++ b/lib/features/otpVerification/presentation/bloc/otp_bloc.dart @@ -4,7 +4,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:sms_autofill/sms_autofill.dart'; import 'package:tanami_app/Api_Helper/base_manager.dart'; import 'package:tanami_app/Globalconst.dart'; -import '../../../OTP/Repository/OTP_API.dart'; + +import '../../domain/Repository/otp_api.dart'; import 'otp_event.dart'; import 'otp_state.dart'; @@ -31,14 +32,14 @@ class OtpBloc extends Bloc { void _onOtpSubmit(OtpSubmit event, Emitter emit) async { emit(OtpSubmitting()); try { - Map otpdata= { - "token":Globalconst.token, - "otp":otpController.text + Map otpdata = { + "token": Globalconst.token, + "otp": otpController.text }; - ResponseData response= await OTPAPI().VerifyOTP(otpdata); + ResponseData response = await OTPAPI().verifyOTP(otpdata); // Add your OTP verification logic here - // await Future.delayed(const Duration(seconds: 2)); - if (response.status==ResponseStatus.SUCCESS) { + // await Future.delayed(const Duration(seconds: 2)); + if (response.status == ResponseStatus.SUCCESS) { emit(OtpSubmissionSuccess()); } else { emit(const OtpSubmissionFailure("Otp Invalid !")); diff --git a/lib/features/otpVerification/presentation/widgets/resend_otp_section.dart b/lib/features/otpVerification/presentation/widgets/resend_otp_section.dart index fe6b195..a3028f3 100644 --- a/lib/features/otpVerification/presentation/widgets/resend_otp_section.dart +++ b/lib/features/otpVerification/presentation/widgets/resend_otp_section.dart @@ -1,7 +1,5 @@ - import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_screenutil/flutter_screenutil.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/text_widget.dart'; @@ -24,9 +22,9 @@ class ResendOtpSection extends StatelessWidget { Widget build(BuildContext context) { String token = ""; var loginBloc = context.read(); - loginBloc.isdcode=Globalconst.isdcode; - loginBloc.phoneNumberTextField.text=Globalconst.phonenumber; - loginBloc.countrySelectionTextField.text=Globalconst.name; + loginBloc.isdcode = Globalconst.isdcode; + loginBloc.phoneNumberTextField.text = Globalconst.phonenumber; + loginBloc.countrySelectionTextField.text = Globalconst.name; var localizations = AppLocalizations.of(context); return BlocBuilder( builder: (context, state) { @@ -45,14 +43,14 @@ class ResendOtpSection extends StatelessWidget { if (state is RegisterLoading) { Loader.loader(context); } else if (state is RegisterSuccess) { - successToastMessage(context, "OTP Resend Sucessfully !"); + successToastMessage(context, "OTP Resend Sucessfully !"); goRouter.pop(); } else if (state is RegisterFailure) { goRouter.pop(); errorToastMessage( - context, - state.error, - ); + context, + state.error, + ); } }, builder: (context, state) { @@ -66,11 +64,11 @@ class ResendOtpSection extends StatelessWidget { } return GestureDetector( onTap: () { - loginBloc.add( + loginBloc.add( Resendotp(Globalconst.token), ); print("///"); - + // successToastMessage(context, "OTP Resend Sucessfully !"); }, child: TextWidget().text14W500( diff --git a/lib/features/register/presentation/bloc/register_bloc.dart b/lib/features/register/presentation/bloc/register_bloc.dart index 2dbd996..f995cee 100644 --- a/lib/features/register/presentation/bloc/register_bloc.dart +++ b/lib/features/register/presentation/bloc/register_bloc.dart @@ -1,8 +1,9 @@ import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; + import '../../../../Api_Helper/base_manager.dart'; import '../../../../Globalconst.dart'; -import '../../../OTP/Repository/OTP_API.dart'; +import '../../../otpVerification/domain/Repository/otp_api.dart'; import 'register_event.dart'; import 'register_state.dart'; @@ -32,13 +33,13 @@ class RegisterBloc extends Bloc { "countryId":event.id, "phoneNumber":event.phoneNumber }; - ResponseData response = await OTPAPI().RequestOTP(requestdata); + ResponseData response = await OTPAPI().requestOTP(requestdata); if (response.status == ResponseStatus.SUCCESS) { print("///////success"); - var data=response.data["data"]; - String token=data["token"]; - Globalconst.token=token; - emit(RegisterSuccess(token));//emit(OTPLoaded()); + var data = response.data["data"]; + String token = data["token"]; + Globalconst.token = token; + emit(RegisterSuccess(token)); //emit(OTPLoaded()); } else { emit(const RegisterFailure( "Register failed. Please check your credentials.")); @@ -49,15 +50,15 @@ class RegisterBloc extends Bloc { } }); - on((event, emit) async { + on((event, emit) async { emit(RegisterLoading()); try { - Map requestdata={ - "token":Globalconst.token, + Map requestdata = { + "token": Globalconst.token, }; - ResponseData response = await OTPAPI().ResendOTPRequest(requestdata); + ResponseData response = await OTPAPI().resendOTPRequest(requestdata); if (response.status == ResponseStatus.SUCCESS) { - emit(RegisterSuccess(event.token));//emit(OTPLoaded()); + emit(RegisterSuccess(event.token)); //emit(OTPLoaded()); } else { emit(const RegisterFailure( "Register failed. Please check your credentials.")); diff --git a/lib/features/register/presentation/widgets/register_form.dart b/lib/features/register/presentation/widgets/register_form.dart index 8775002..3c37992 100644 --- a/lib/features/register/presentation/widgets/register_form.dart +++ b/lib/features/register/presentation/widgets/register_form.dart @@ -4,13 +4,13 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:gap/gap.dart'; import 'package:tanami_app/core/styles/app_text.dart'; -import 'package:tanami_app/features/countrySelection/bloc/GetCountry/getcountryevent_bloc.dart'; import '../../../../Globalconst.dart'; import '../../../../core/utils/language/localizations_delegate.dart'; import '../../../../shared/api/api_endpoints.dart'; import '../../../../shared/components/form_label_textfield.dart'; -import '../../../countrySelection/bloc/GetCountry/getcountry_bloc.dart'; +import '../../../countrySelection/bloc/GetCountry/get_country_bloc.dart'; +import '../../../countrySelection/bloc/GetCountry/get_country_state.dart'; import '../../../countrySelection/bloc/choose_country_bloc.dart'; import '../../../countrySelection/bloc/choose_country_state.dart'; import '../bloc/register_bloc.dart'; @@ -39,13 +39,14 @@ class RegisterForm extends StatelessWidget { loginBloc.countryId="${countryState.countryModel.data![selectedCountry].id}"; flag = "${ApiEndpoints.base}${countryState.countryModel.data![selectedCountry].flagIcon}"; - Globalconst.phonenumber=loginBloc.phoneNumberTextField.text; + Globalconst.phonenumber = loginBloc.phoneNumberTextField.text; - Globalconst.name=countryState + Globalconst.name = countryState .countryModel.data![selectedCountry].countryName .toString(); - Globalconst.isdcode="${countryState.countryModel.data![selectedCountry].isdCode}"; - } + Globalconst.isdcode = + "${countryState.countryModel.data![selectedCountry].isdCode}"; + } } }, builder: (context, state) { if (state is RadioSelectionChanged) { @@ -69,8 +70,8 @@ class RegisterForm extends StatelessWidget { prefixWidget: selectedCountry == -1 ? null : Padding( - padding: EdgeInsets.only(left: 12.w), - child: SizedBox( + padding: EdgeInsets.only(left: 12.w), + child: SizedBox( height: 50.h, width: 30.w, child: Align( @@ -79,8 +80,8 @@ class RegisterForm extends StatelessWidget { height: 30.h, width: 30.w, child: ClipRRect( - borderRadius: - BorderRadius.all(Radius.circular(100)), + borderRadius: const BorderRadius.all( + Radius.circular(100)), child: CachedNetworkImage( maxHeightDiskCache: 200, maxWidthDiskCache: 200, @@ -90,19 +91,20 @@ class RegisterForm extends StatelessWidget { imageUrl: flag, height: 30.h, width: 30.w, - placeholder: (context, url) => Container( + placeholder: (context, url) => SizedBox( height: 30.h, width: 30.w, - child: CircularProgressIndicator(), + child: + const CircularProgressIndicator(), ), errorWidget: (context, url, error) => - Icon(Icons.error), + const Icon(Icons.error), fit: BoxFit.cover), ), ), ), ), - ), + ), /* Image.asset( countryFlag[selectedCountry], width: 20, @@ -115,11 +117,11 @@ class RegisterForm extends StatelessWidget { ), const Gap(20), FormLabelTextField( - prefixWidget: selectedCountry == -1 ||flag.isEmpty + prefixWidget: selectedCountry == -1 || flag.isEmpty ? null - : Padding( - padding: EdgeInsets.only(left: 12.w), - child: SizedBox( + : Padding( + padding: EdgeInsets.only(left: 12.w), + child: SizedBox( height: 50.h, width: 30.w, child: Align( @@ -128,8 +130,8 @@ class RegisterForm extends StatelessWidget { height: 30.h, width: 30.w, child: ClipRRect( - borderRadius: - BorderRadius.all(Radius.circular(100)), + borderRadius: const BorderRadius.all( + Radius.circular(100)), child: CachedNetworkImage( maxHeightDiskCache: 200, maxWidthDiskCache: 200, @@ -139,19 +141,21 @@ class RegisterForm extends StatelessWidget { imageUrl: flag, height: 30.h, width: 30.w, - placeholder: (context, url) => Container( + placeholder: (context, url) => SizedBox( height: 30.h, width: 30.w, - child: CircularProgressIndicator(), + child: + const CircularProgressIndicator(), ), errorWidget: (context, url, error) => - Icon(Icons.error), + const Icon(Icons.error), fit: BoxFit.cover), ), ), ), ), - ),/* Image.asset( + ), + /* Image.asset( countryFlag[selectedCountry], width: 20, height: 20, diff --git a/lib/features/splash/presentation/pages/splash_layout.dart b/lib/features/splash/presentation/pages/splash_layout.dart index d34acf7..3b7dd46 100644 --- a/lib/features/splash/presentation/pages/splash_layout.dart +++ b/lib/features/splash/presentation/pages/splash_layout.dart @@ -25,7 +25,7 @@ class SplashLayout extends StatelessWidget { fit: BoxFit.cover, ), ), - /* Positioned.fill( + Positioned.fill( child: Align( alignment: Alignment.center, child: SvgPicture.asset( @@ -39,7 +39,7 @@ class SplashLayout extends StatelessWidget { alignment: Alignment.bottomCenter, child: BottomVersionWidget(), ), - ), */ + ), ], ), ), diff --git a/lib/features/welcome/presentation/widgets/login_signup_button.dart b/lib/features/welcome/presentation/widgets/login_signup_button.dart index bf41f12..aea6d19 100644 --- a/lib/features/welcome/presentation/widgets/login_signup_button.dart +++ b/lib/features/welcome/presentation/widgets/login_signup_button.dart @@ -5,8 +5,8 @@ import 'package:gap/gap.dart'; import 'package:tanami_app/core/routes/route_name.dart'; import 'package:tanami_app/core/routes/routes.dart'; import 'package:tanami_app/core/styles/app_color.dart'; -import 'package:tanami_app/features/countrySelection/bloc/GetCountry/getcountry_bloc.dart'; -import 'package:tanami_app/features/countrySelection/bloc/GetCountry/getcountryevent_bloc.dart'; +import 'package:tanami_app/features/countrySelection/bloc/GetCountry/get_country_bloc.dart'; +import 'package:tanami_app/features/countrySelection/bloc/GetCountry/get_country_event.dart'; import 'package:tanami_app/shared/components/button_widget.dart'; import '../../../../core/styles/app_text.dart'; @@ -31,7 +31,7 @@ class LoginSignUpButton extends StatelessWidget { height: 56.h, child: ButtonWidget().elevatedBtn( function: () { - context.read().add(GetCountry()); + context.read().add(GetCountry()); goRouter.goNamed(RouteName.registerStepScreen, pathParameters: { "fromScreentype": "welcome", }); diff --git a/lib/main.dart b/lib/main.dart index 9818507..5e73ba0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,16 +9,11 @@ import 'core/routes/routes.dart'; import 'core/utils/connectivity/network_connectivity.dart'; import 'core/utils/language/localizations_delegate.dart'; import 'core/utils/secure/secure_storage_service.dart'; -import 'features/OTP/bloc/OTP_bloc.dart'; import 'features/biometric/presentation/bloc/biometric_bloc.dart'; import 'features/biometric/presentation/bloc/biometric_event.dart'; -import 'features/countrySelection/bloc/GetCountry/getcountry_bloc.dart'; +import 'features/countrySelection/bloc/GetCountry/get_country_bloc.dart'; import 'features/countrySelection/bloc/choose_country_bloc.dart'; -import 'features/otpVerification/presentation/bloc/otp_bloc.dart'; -import 'features/otpVerification/presentation/bloc/otp_event.dart'; -import 'features/otpVerification/presentation/bloc/timer/timer_bloc.dart'; -import 'features/otpVerification/presentation/bloc/timer/timer_event.dart'; -import 'features/register/presentation/bloc/register_bloc.dart'; +import 'features/otpVerification/bloc/otp_bloc.dart'; import 'shared/components/bloc/bottom_nav_bar/bottom_navigation_bloc.dart'; import 'shared/components/bloc/language/lng_bloc.dart'; import 'shared/components/bloc/language/lng_event.dart'; @@ -114,7 +109,6 @@ class _MyAppState extends State with WidgetsBindingObserver { BlocProvider( create: (_) => OTPBloc(), ), - ], child: ScreenUtilInit( builder: (BuildContext context, Widget? child) => diff --git a/lib/shared/api/api_endpoints.dart b/lib/shared/api/api_endpoints.dart index bca8cc1..8b00684 100644 --- a/lib/shared/api/api_endpoints.dart +++ b/lib/shared/api/api_endpoints.dart @@ -1,10 +1,10 @@ class ApiEndpoints { - static const base="https://tanami.betadelivery.com/"; + static const base = "https://tanami.betadelivery.com/"; static const baseurl = "https://tanami.betadelivery.com/api/development/v1/"; //App Base url - static const getcountryurl = baseurl + "country/getAllCountry"; - static const requestotpapi=baseurl +"auth/public/register"; - static const requestresendotp=baseurl+"auth/public/resend-otp"; - static const verifyotp=baseurl+"auth/public/verify-otp"; + static const getcountryurl = "${baseurl}country/getAllCountry"; + static const requestotpapi = "${baseurl}auth/public/register"; + static const requestresendotp = "${baseurl}auth/public/resend-otp"; + static const verifyotp = "${baseurl}auth/public/verify-otp"; } diff --git a/lib/shared/components/text_widget.dart b/lib/shared/components/text_widget.dart index 6f7f82e..0b7a74c 100644 --- a/lib/shared/components/text_widget.dart +++ b/lib/shared/components/text_widget.dart @@ -88,10 +88,11 @@ class TextWidget { ); } - Widget text13W500(String text, {Color? clr}) { + Widget text13W500(String text, {Color? clr, FontStyle? fontStyle}) { return Text( text, style: GoogleFonts.dmSans( + fontStyle: fontStyle ?? FontStyle.normal, fontSize: 13, fontWeight: FontWeight.w500, color: clr ?? AppColor.plainWhite,