Compare commits
	
		
			11 Commits
		
	
	
		
			eb99ad9d7f
			...
			23e1a6628f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 23e1a6628f | |||
| 4b07219928 | |||
| 9cdda42b8b | |||
| 6f5d3ccca8 | |||
| ff515e2621 | |||
| f057a346c2 | |||
| f84fe1017d | |||
| 27ba55314b | |||
| 59e046bd92 | |||
| 4461b78565 | |||
| f2f688f9f3 | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-education.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/icons/icon-education.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-fund.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/icons/icon-fund.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 3.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-gadget-outline.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/icons/icon-gadget-outline.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-home.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/icons/icon-home.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-shop.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/icons/icon-shop.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 3.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/img-empty-transaction.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/images/img-empty-transaction.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 70 KiB | 
| @@ -49,11 +49,16 @@ class PathAssets { | |||||||
|   static const String iconTicket = 'assets/icons/icon-ticket.png'; |   static const String iconTicket = 'assets/icons/icon-ticket.png'; | ||||||
|   static const String iconGadget = 'assets/icons/icon-gadget.png'; |   static const String iconGadget = 'assets/icons/icon-gadget.png'; | ||||||
|   static const String iconCar = 'assets/icons/icon-car.png'; |   static const String iconCar = 'assets/icons/icon-car.png'; | ||||||
|   static const String iconNavigationHome = 'assets/icons/icon-navigation-home.png'; |   static const String iconNavigationHome = | ||||||
|   static const String iconNavigationPlan = 'assets/icons/icon-navigation-plan.png'; |       'assets/icons/icon-navigation-home.png'; | ||||||
|   static const String iconNavigationTransaction = 'assets/icons/icon-navigation-transaction.png'; |   static const String iconNavigationPlan = | ||||||
|   static const String iconNavigationPortfolio = 'assets/icons/icon-navigation-portfolio.png'; |       'assets/icons/icon-navigation-plan.png'; | ||||||
|   static const String iconNavigationProfile = 'assets/icons/icon-navigation-profile.png'; |   static const String iconNavigationTransaction = | ||||||
|  |       'assets/icons/icon-navigation-transaction.png'; | ||||||
|  |   static const String iconNavigationPortfolio = | ||||||
|  |       'assets/icons/icon-navigation-portfolio.png'; | ||||||
|  |   static const String iconNavigationProfile = | ||||||
|  |       'assets/icons/icon-navigation-profile.png'; | ||||||
|   static const String iconRemove = 'assets/icons/icon-remove.png'; |   static const String iconRemove = 'assets/icons/icon-remove.png'; | ||||||
|   static const String iconCat = 'assets/icons/icon-cat.png'; |   static const String iconCat = 'assets/icons/icon-cat.png'; | ||||||
|   static const String iconProfile = 'assets/icons/icon-profile.png'; |   static const String iconProfile = 'assets/icons/icon-profile.png'; | ||||||
| @@ -62,6 +67,12 @@ class PathAssets { | |||||||
|   static const String iconSetting = 'assets/icons/icon-setting.png'; |   static const String iconSetting = 'assets/icons/icon-setting.png'; | ||||||
|   static const String iconFaqs = 'assets/icons/icon-faqs.png'; |   static const String iconFaqs = 'assets/icons/icon-faqs.png'; | ||||||
|   static const String iconLogout = 'assets/icons/icon-logout.png'; |   static const String iconLogout = 'assets/icons/icon-logout.png'; | ||||||
|  |   static const String iconEducation = 'assets/icons/icon-education.png'; | ||||||
|  |   static const String iconFund = 'assets/icons/icon-fund.png'; | ||||||
|  |   static const String iconHome = 'assets/icons/icon-home.png'; | ||||||
|  |   static const String iconShop = 'assets/icons/icon-shop.png'; | ||||||
|  |   static const String iconGadgetOutline = | ||||||
|  |       'assets/icons/icon-gadget-outline.png'; | ||||||
|  |  | ||||||
|   /// IMAGE |   /// IMAGE | ||||||
|   static const String imgSplashLogo = 'assets/images/splash-logo.png'; |   static const String imgSplashLogo = 'assets/images/splash-logo.png'; | ||||||
| @@ -96,11 +107,14 @@ class PathAssets { | |||||||
|   static const String imgGuide1 = 'assets/images/img-guide1.png'; |   static const String imgGuide1 = 'assets/images/img-guide1.png'; | ||||||
|   static const String imgGuide2 = 'assets/images/img-guide2.png'; |   static const String imgGuide2 = 'assets/images/img-guide2.png'; | ||||||
|   static const String imgOpenShopping = 'assets/images/img-open-shopping.png'; |   static const String imgOpenShopping = 'assets/images/img-open-shopping.png'; | ||||||
|   static const String imgPaymentSuccess = 'assets/images/img-payment-success.png'; |   static const String imgPaymentSuccess = | ||||||
|  |       'assets/images/img-payment-success.png'; | ||||||
|   static const String frameSignature = 'assets/images/frame-signature.png'; |   static const String frameSignature = 'assets/images/frame-signature.png'; | ||||||
|   static const String imgFinish = 'assets/images/img-finish.png'; |   static const String imgFinish = 'assets/images/img-finish.png'; | ||||||
|   static const String imgDashboardProfile = |   static const String imgDashboardProfile = | ||||||
|       'assets/images/img-dashboard-profile.png'; |       'assets/images/img-dashboard-profile.png'; | ||||||
|  |   static const String imgEmptyTransaction = | ||||||
|  |       'assets/images/img-empty-transaction.png'; | ||||||
|  |  | ||||||
|   static const Map<String, String> goalInvestIcon = { |   static const Map<String, String> goalInvestIcon = { | ||||||
|     'Education': iconToga, |     'Education': iconToga, | ||||||
|   | |||||||
| @@ -0,0 +1,100 @@ | |||||||
|  | import 'package:cims_apps/application/component/image/image_view.dart'; | ||||||
|  | import 'package:cims_apps/application/theme/color_palette.dart'; | ||||||
|  | import 'package:cims_apps/core/utils/size_config.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
|  | class CardTransactionView extends StatelessWidget { | ||||||
|  |   final VoidCallback onTap; | ||||||
|  |   final String iconPath, type, amount, subs, step; | ||||||
|  |   final String? timeTransaction; | ||||||
|  |   const CardTransactionView({ | ||||||
|  |     Key? key, | ||||||
|  |     required this.step, | ||||||
|  |     required this.type, | ||||||
|  |     required this.amount, | ||||||
|  |     required this.iconPath, | ||||||
|  |     required this.subs, | ||||||
|  |     required this.onTap, | ||||||
|  |     this.timeTransaction, | ||||||
|  |   }) : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     TextTheme textTheme = Theme.of(context).textTheme; | ||||||
|  |     return GestureDetector( | ||||||
|  |       onTap: onTap, | ||||||
|  |       child: Container( | ||||||
|  |         margin: const EdgeInsets.symmetric(vertical: 16.0), | ||||||
|  |         padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 16.0), | ||||||
|  |         decoration: BoxDecoration( | ||||||
|  |           color: Colors.white, | ||||||
|  |           border: Border.all(width: 1, color: ColorPalette.slate200), | ||||||
|  |           borderRadius: const BorderRadius.all(Radius.circular(12)), | ||||||
|  |         ), | ||||||
|  |         child: Row( | ||||||
|  |           mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |           crossAxisAlignment: CrossAxisAlignment.center, | ||||||
|  |           children: [ | ||||||
|  |             SizedBox( | ||||||
|  |                 width: SizeConfig.width * .4, | ||||||
|  |                 child: Column( | ||||||
|  |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                   children: [ | ||||||
|  |                     Row( | ||||||
|  |                       children: [ | ||||||
|  |                         ImageView( | ||||||
|  |                             image: iconPath, width: SizeConfig.width * .12), | ||||||
|  |                         Padding( | ||||||
|  |                           padding: const EdgeInsets.only(left: 8.0), | ||||||
|  |                           child: Text( | ||||||
|  |                             type, | ||||||
|  |                             style: textTheme.headlineSmall, | ||||||
|  |                           ), | ||||||
|  |                         ), | ||||||
|  |                       ], | ||||||
|  |                     ), | ||||||
|  |                     Padding( | ||||||
|  |                       padding: const EdgeInsets.only(top: 16.0), | ||||||
|  |                       child: Text( | ||||||
|  |                         amount, | ||||||
|  |                         style: textTheme.headlineSmall, | ||||||
|  |                       ), | ||||||
|  |                     ), | ||||||
|  |                   ], | ||||||
|  |                 )), | ||||||
|  |             SizedBox( | ||||||
|  |                 width: SizeConfig.width * .4, | ||||||
|  |                 child: Column( | ||||||
|  |                   crossAxisAlignment: CrossAxisAlignment.end, | ||||||
|  |                   mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |                   children: [ | ||||||
|  |                     SizedBox( | ||||||
|  |                         height: SizeConfig.height * .08, | ||||||
|  |                         child: Text( | ||||||
|  |                           subs, | ||||||
|  |                           style: const TextStyle(color: ColorPalette.primary), | ||||||
|  |                         )), | ||||||
|  |                     Row( | ||||||
|  |                       mainAxisAlignment: MainAxisAlignment.end, | ||||||
|  |                       children: [ | ||||||
|  |                         step == 'waiting' | ||||||
|  |                             ? const Icon(Icons.access_time_sharp, | ||||||
|  |                                 color: ColorPalette.slate400) | ||||||
|  |                             : const SizedBox(), | ||||||
|  |                         step == 'waiting' | ||||||
|  |                             ? Text(timeTransaction.toString()) | ||||||
|  |                             : const SizedBox(), | ||||||
|  |                         const Padding( | ||||||
|  |                           padding: EdgeInsets.only(left: 16.0), | ||||||
|  |                           child: Icon(Icons.arrow_forward_ios), | ||||||
|  |                         ), | ||||||
|  |                       ], | ||||||
|  |                     ), | ||||||
|  |                   ], | ||||||
|  |                 )), | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | import 'package:cims_apps/application/assets/path_assets.dart'; | ||||||
|  | import 'package:cims_apps/application/component/button/button_view.dart'; | ||||||
|  | import 'package:cims_apps/application/component/image/image_view.dart'; | ||||||
|  | import 'package:cims_apps/core/utils/size_config.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
|  | class EmptyCardTransaction extends StatelessWidget { | ||||||
|  |   final VoidCallback onPressedButton; | ||||||
|  |   const EmptyCardTransaction({Key? key, required this.onPressedButton}) | ||||||
|  |       : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     TextTheme textTheme = Theme.of(context).textTheme; | ||||||
|  |     return Container( | ||||||
|  |       padding: const EdgeInsets.symmetric(vertical: 8.0), | ||||||
|  |       child: Center( | ||||||
|  |         child: Column( | ||||||
|  |           mainAxisAlignment: MainAxisAlignment.spaceAround, | ||||||
|  |           children: [ | ||||||
|  |             ImageView( | ||||||
|  |               image: PathAssets.imgEmptyTransaction, | ||||||
|  |               width: SizeConfig.width * .4, | ||||||
|  |             ), | ||||||
|  |             Text( | ||||||
|  |               'No Transaction Yet', | ||||||
|  |               style: textTheme.headlineSmall, | ||||||
|  |             ), | ||||||
|  |             Text( | ||||||
|  |               "Let's keep building your investment for even greater financial growth!", | ||||||
|  |               style: textTheme.bodyMedium, | ||||||
|  |               textAlign: TextAlign.center, | ||||||
|  |             ), | ||||||
|  |             ButtonView( | ||||||
|  |               name: 'Investing Now', | ||||||
|  |               width: SizeConfig.width * .5, | ||||||
|  |               onPressed: onPressedButton, | ||||||
|  |             ), | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -2,6 +2,7 @@ import 'dart:io'; | |||||||
|  |  | ||||||
| import 'package:cims_apps/application/assets/path_assets.dart'; | import 'package:cims_apps/application/assets/path_assets.dart'; | ||||||
| import 'package:cims_apps/application/component/button/button_view.dart'; | import 'package:cims_apps/application/component/button/button_view.dart'; | ||||||
|  | import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; | ||||||
| import 'package:cims_apps/application/component/image/image_view.dart'; | import 'package:cims_apps/application/component/image/image_view.dart'; | ||||||
| import 'package:cims_apps/application/component/take_picture_screen/take_picture_screen.dart'; | import 'package:cims_apps/application/component/take_picture_screen/take_picture_screen.dart'; | ||||||
| import 'package:cims_apps/application/theme/color_palette.dart'; | import 'package:cims_apps/application/theme/color_palette.dart'; | ||||||
| @@ -94,10 +95,8 @@ class _DisplayPictureScreenState extends State<DisplayPictureScreen> { | |||||||
|           return Consumer<SubmissionDataViewModel>( |           return Consumer<SubmissionDataViewModel>( | ||||||
|               builder: (context, provider, child) { |               builder: (context, provider, child) { | ||||||
|             return Scaffold( |             return Scaffold( | ||||||
|               appBar: AppBar( |               appBar: CustomAppBar( | ||||||
|                 title: const Text('Preview'), |                   height: SizeConfig.height * .08, title: 'Preview'), | ||||||
|                 automaticallyImplyLeading: false, |  | ||||||
|               ), |  | ||||||
|               body: Container( |               body: Container( | ||||||
|                   padding: const EdgeInsets.symmetric(horizontal: 24.0), |                   padding: const EdgeInsets.symmetric(horizontal: 24.0), | ||||||
|                   child: Column( |                   child: Column( | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| import 'package:camera/camera.dart'; | import 'package:camera/camera.dart'; | ||||||
| import 'package:cims_apps/application/assets/path_assets.dart'; | import 'package:cims_apps/application/assets/path_assets.dart'; | ||||||
|  | import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; | ||||||
| import 'package:cims_apps/application/component/image/image_view.dart'; | import 'package:cims_apps/application/component/image/image_view.dart'; | ||||||
| import 'package:cims_apps/application/component/take_picture_screen/display_picture_screen.dart'; | import 'package:cims_apps/application/component/take_picture_screen/display_picture_screen.dart'; | ||||||
| import 'package:cims_apps/core/route/route.dart'; | import 'package:cims_apps/core/route/route.dart'; | ||||||
| @@ -27,7 +28,6 @@ class TakePictureScreenState extends State<TakePictureScreen> { | |||||||
|   late String _takeContent; |   late String _takeContent; | ||||||
|  |  | ||||||
|   Future<void> changeFlash() async { |   Future<void> changeFlash() async { | ||||||
|     await _controller.setFlashMode(FlashMode.auto); |  | ||||||
|     setState(() { |     setState(() { | ||||||
|       isFlash = !isFlash; |       isFlash = !isFlash; | ||||||
|     }); |     }); | ||||||
| @@ -44,6 +44,7 @@ class TakePictureScreenState extends State<TakePictureScreen> { | |||||||
|     // Next, initialize the controller. This returns a Future. |     // Next, initialize the controller. This returns a Future. | ||||||
|     _initializeControllerFuture = _controller.initialize(); |     _initializeControllerFuture = _controller.initialize(); | ||||||
|     _takeContent = widget.takeContent; |     _takeContent = widget.takeContent; | ||||||
|  |     _controller.setFlashMode(isFlash ? FlashMode.torch : FlashMode.off); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
| @@ -57,9 +58,10 @@ class TakePictureScreenState extends State<TakePictureScreen> { | |||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     // Fill this out in the next steps. |     // Fill this out in the next steps. | ||||||
|     return Scaffold( |     return Scaffold( | ||||||
|       appBar: AppBar( |       appBar: CustomAppBar( | ||||||
|         title: const Text('Registration'), |         title: 'Registration', | ||||||
|         actions: [ |         height: SizeConfig.height * .08, | ||||||
|  |         trailing: [ | ||||||
|           IconButton( |           IconButton( | ||||||
|               onPressed: () { |               onPressed: () { | ||||||
|                 changeFlash(); |                 changeFlash(); | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | import 'package:intl/intl.dart'; | ||||||
|  |  | ||||||
| class StringUtils { | class StringUtils { | ||||||
|   static bool emailValidation(String email) { |   static bool emailValidation(String email) { | ||||||
|     return RegExp( |     return RegExp( | ||||||
| @@ -13,4 +15,12 @@ class StringUtils { | |||||||
|     return RegExp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*?[\W_])(?=.{8,})') |     return RegExp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*?[\W_])(?=.{8,})') | ||||||
|         .hasMatch(password); |         .hasMatch(password); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   static String formatTime(DateTime? dateTime) { | ||||||
|  |     if (dateTime != null) { | ||||||
|  |       DateFormat formatter = DateFormat('HH:mm:ss'); | ||||||
|  |       return formatter.format(dateTime); | ||||||
|  |     } | ||||||
|  |     return '--:--:--'; | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,107 +6,120 @@ import 'package:cims_apps/application/theme/color_palette.dart'; | |||||||
| import 'package:cims_apps/core/route/route.dart'; | import 'package:cims_apps/core/route/route.dart'; | ||||||
| import 'package:cims_apps/core/utils/size_config.dart'; | import 'package:cims_apps/core/utils/size_config.dart'; | ||||||
| import 'package:cims_apps/features/auth/registration/view/submission_data/submission_parent.dart'; | import 'package:cims_apps/features/auth/registration/view/submission_data/submission_parent.dart'; | ||||||
|  | import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:provider/provider.dart'; | ||||||
|  |  | ||||||
|  | class ModelDataBank { | ||||||
|  |   final String? title, subtitle; | ||||||
|  |   ModelDataBank(this.title, this.subtitle); | ||||||
|  | } | ||||||
|  |  | ||||||
| class ConfirmBankAccount extends StatelessWidget { | class ConfirmBankAccount extends StatelessWidget { | ||||||
|   const ConfirmBankAccount({Key? key}) : super(key: key); |   const ConfirmBankAccount({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     List listData = [ |     final listDataBank = | ||||||
|       {'title': 'Bank Name', 'subtitle': 'Bank Mandiri'}, |         ModalRoute.of(context)!.settings.arguments as List<ModelDataBank>; | ||||||
|       {'title': 'Account Number', 'subtitle': '123002212084'}, |  | ||||||
|       {'title': 'Account Owner Name', 'subtitle': 'Muhamad Rosyidin'}, |     return ChangeNotifierProvider( | ||||||
|       {'title': 'Name on ID card', 'subtitle': 'Muhamad Rosyidin'}, |         create: (context) => SubmissionDataViewModel(), | ||||||
|     ]; |         builder: (context, child) { | ||||||
|     return Scaffold( |           return Scaffold( | ||||||
|       appBar: AppBar( |             appBar: AppBar( | ||||||
|         toolbarHeight: 70, |               toolbarHeight: 70, | ||||||
|         backgroundColor: Colors.white, |               backgroundColor: Colors.white, | ||||||
|         surfaceTintColor: Colors.white, |               surfaceTintColor: Colors.white, | ||||||
|         automaticallyImplyLeading: false, |               automaticallyImplyLeading: false, | ||||||
|         title: Row( |               title: Row( | ||||||
|           mainAxisAlignment: MainAxisAlignment.spaceBetween, |                 mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|           children: [ |                 children: [ | ||||||
|             const BackButtonView(), |                   const BackButtonView(), | ||||||
|             const Text('Registration'), |                   const Text('Registration'), | ||||||
|             SizedBox( |                   SizedBox( | ||||||
|               width: SizeConfig.width * 0.1, |                     width: SizeConfig.width * 0.1, | ||||||
|             ) |                   ) | ||||||
|           ], |                 ], | ||||||
|         ), |               ), | ||||||
|         shape: const RoundedRectangleBorder( |               shape: const RoundedRectangleBorder( | ||||||
|             side: BorderSide(color: ColorPalette.slate200)), |                   side: BorderSide(color: ColorPalette.slate200)), | ||||||
|       ), |             ), | ||||||
|       body: SingleChildScrollView( |             body: SingleChildScrollView( | ||||||
|         padding: const EdgeInsets.all(16.0), |               padding: const EdgeInsets.all(16.0), | ||||||
|         child: SizedBox( |               child: SizedBox( | ||||||
|           height: SizeConfig.height * .85, |                 height: SizeConfig.height * .85, | ||||||
|           child: Column( |                 child: Consumer<SubmissionDataViewModel>( | ||||||
|             mainAxisAlignment: MainAxisAlignment.spaceBetween, |                     builder: (context, provider, child) { | ||||||
|             crossAxisAlignment: CrossAxisAlignment.start, |                   return Column( | ||||||
|             children: [ |                     mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|               const TextCaption(title: 'Bank account confirmation'), |                     crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|               SizedBox( |                     children: [ | ||||||
|                 height: SizeConfig.height * .6, |                       const TextCaption(title: 'Bank account confirmation'), | ||||||
|                 child: Column( |                       SizedBox( | ||||||
|                   mainAxisAlignment: MainAxisAlignment.start, |                         height: SizeConfig.height * .6, | ||||||
|                   crossAxisAlignment: CrossAxisAlignment.start, |  | ||||||
|                   children: [ |  | ||||||
|                     ...listData.map((e) { |  | ||||||
|                       return Padding( |  | ||||||
|                         padding: const EdgeInsets.only(bottom: 16.0), |  | ||||||
|                         child: Column( |                         child: Column( | ||||||
|                           mainAxisAlignment: MainAxisAlignment.start, |                           mainAxisAlignment: MainAxisAlignment.start, | ||||||
|                           crossAxisAlignment: CrossAxisAlignment.start, |                           crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                           children: [ |                           children: [ | ||||||
|                             Text( |                             ...listDataBank.map((e) { | ||||||
|                               e['title'], |                               return Padding( | ||||||
|                               style: const TextStyle( |                                 padding: const EdgeInsets.only(bottom: 16.0), | ||||||
|                                   color: ColorPalette.slate400, fontSize: 16), |                                 child: Column( | ||||||
|                             ), |                                   mainAxisAlignment: MainAxisAlignment.start, | ||||||
|                             Text( |                                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                               e['subtitle'], |                                   children: [ | ||||||
|                               style: const TextStyle( |                                     Text( | ||||||
|                                   fontSize: 16, |                                       e.title!, | ||||||
|                                   color: ColorPalette.slate800, |                                       style: const TextStyle( | ||||||
|                                   fontWeight: FontWeight.w600), |                                           color: ColorPalette.slate400, | ||||||
|  |                                           fontSize: 16), | ||||||
|  |                                     ), | ||||||
|  |                                     Text( | ||||||
|  |                                       e.subtitle!, | ||||||
|  |                                       style: const TextStyle( | ||||||
|  |                                           fontSize: 16, | ||||||
|  |                                           color: ColorPalette.slate800, | ||||||
|  |                                           fontWeight: FontWeight.w600), | ||||||
|  |                                     ), | ||||||
|  |                                   ], | ||||||
|  |                                 ), | ||||||
|  |                               ); | ||||||
|  |                             }).toList(), | ||||||
|  |                             const ListTileView( | ||||||
|  |                               title: | ||||||
|  |                                   'Make sure your data is correct as it will affect the disbursement process', | ||||||
|                             ), |                             ), | ||||||
|                           ], |                           ], | ||||||
|                         ), |                         ), | ||||||
|                       ); |                       ), | ||||||
|                     }).toList(), |                       Row( | ||||||
|                     const ListTileView( |                         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                       title: |                         children: [ | ||||||
|                           'Make sure your data is correct as it will affect the disbursement process', |                           ButtonView( | ||||||
|                     ), |                             name: 'Recheck', | ||||||
|                   ], |                             isOutlined: true, | ||||||
|                 ), |                             width: SizeConfig.width * .42, | ||||||
|  |                             onPressed: () { | ||||||
|  |                               Navigator.pop(context); | ||||||
|  |                             }, | ||||||
|  |                           ), | ||||||
|  |                           ButtonView( | ||||||
|  |                             name: 'Confirm', | ||||||
|  |                             width: SizeConfig.width * .42, | ||||||
|  |                             onPressed: () { | ||||||
|  |                               routePush(context, | ||||||
|  |                                   page: const SubmissionParent()); | ||||||
|  |                             }, | ||||||
|  |                           ), | ||||||
|  |                         ], | ||||||
|  |                       ) | ||||||
|  |                     ], | ||||||
|  |                   ); | ||||||
|  |                 }), | ||||||
|               ), |               ), | ||||||
|               Row( |             ), | ||||||
|                 mainAxisAlignment: MainAxisAlignment.spaceBetween, |           ); | ||||||
|                 children: [ |         }); | ||||||
|                   ButtonView( |  | ||||||
|                     name: 'Recheck', |  | ||||||
|                     isOutlined: true, |  | ||||||
|                     width: SizeConfig.width * .42, |  | ||||||
|                     onPressed: () { |  | ||||||
|                       Navigator.pop(context); |  | ||||||
|                     }, |  | ||||||
|                   ), |  | ||||||
|                   ButtonView( |  | ||||||
|                     name: 'Confirm', |  | ||||||
|                     width: SizeConfig.width * .42, |  | ||||||
|                     onPressed: () { |  | ||||||
|                       routePush(context, page: const SubmissionParent()); |  | ||||||
|                     }, |  | ||||||
|                   ), |  | ||||||
|                 ], |  | ||||||
|               ) |  | ||||||
|             ], |  | ||||||
|           ), |  | ||||||
|         ), |  | ||||||
|       ), |  | ||||||
|     ); |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -63,61 +63,98 @@ class SubmitBankAccount extends StatelessWidget { | |||||||
|           return SizedBox( |           return SizedBox( | ||||||
|             child: Consumer<SubmissionDataViewModel>( |             child: Consumer<SubmissionDataViewModel>( | ||||||
|                 builder: (context, provider, child) { |                 builder: (context, provider, child) { | ||||||
|               return SingleChildScrollView( |               return SizedBox( | ||||||
|                 child: Column( |                 height: SizeConfig.height * .8, | ||||||
|                   crossAxisAlignment: CrossAxisAlignment.start, |                 child: Form( | ||||||
|                   children: [ |                   key: provider.formKeySubmitDataBank, | ||||||
|                     const TextCaption(title: 'Input your bank account data'), |                   child: Column( | ||||||
|                     TextFormView( |                     crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                       name: 'Bank Name', |                     mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                       hintText: 'Select bank', |                     children: [ | ||||||
|                       readOnly: true, |                       const TextCaption(title: 'Input your bank account data'), | ||||||
|                       ctrl: provider.ctrlBankName, |                       TextFormView( | ||||||
|                       onTap: () { |                         name: 'Bank Name', | ||||||
|                         showSearchBank(provider.ctrlBankName); |                         hintText: 'Select bank', | ||||||
|                       }, |                         readOnly: true, | ||||||
|                       suffixIcon: const Icon( |                         ctrl: provider.ctrlBankName, | ||||||
|                         Icons.keyboard_arrow_down_outlined, |                         onTap: () { | ||||||
|  |                           showSearchBank(provider.ctrlBankName); | ||||||
|  |                         }, | ||||||
|  |                         suffixIcon: const Icon( | ||||||
|  |                           Icons.keyboard_arrow_down_outlined, | ||||||
|  |                         ), | ||||||
|  |                         validator: (value) { | ||||||
|  |                           if (value!.isEmpty) { | ||||||
|  |                             return 'Field must be filled'; | ||||||
|  |                           } | ||||||
|  |                           return null; | ||||||
|  |                         }, | ||||||
|                       ), |                       ), | ||||||
|                     ), |                       TextFormView( | ||||||
|                     TextFormView( |                         name: 'Account Number', | ||||||
|                       name: 'Account Number', |                         hintText: 'Input Account Number', | ||||||
|                       hintText: 'Input Account Number', |                         ctrl: provider.ctrlNoAccountBank, | ||||||
|                       keyboardType: TextInputType.number, |                         keyboardType: TextInputType.number, | ||||||
|                       trailingTitleWidget: SizedBox( |                         validator: (value) { | ||||||
|                         width: 24, |                           if (value!.isEmpty) { | ||||||
|                         child: GestureDetector( |                             return 'Field must be filled'; | ||||||
|                           onTap: () { |                           } | ||||||
|                             routePush(context, page: const GuideScreen()); |                           return null; | ||||||
|                           }, |                         }, | ||||||
|                           child: |                         trailingTitleWidget: SizedBox( | ||||||
|                               const ImageView(image: PathAssets.iconQuestion), |                           width: 24, | ||||||
|  |                           child: GestureDetector( | ||||||
|  |                             onTap: () { | ||||||
|  |                               routePush(context, page: const GuideScreen()); | ||||||
|  |                             }, | ||||||
|  |                             child: | ||||||
|  |                                 const ImageView(image: PathAssets.iconQuestion), | ||||||
|  |                           ), | ||||||
|                         ), |                         ), | ||||||
|                       ), |                       ), | ||||||
|                     ), |                       TextFormView( | ||||||
|                     TextFormView( |                         name: 'Account Owner Name', | ||||||
|                       name: 'Account Owner Name', |                         hintText: 'Input Account Name', | ||||||
|                       hintText: 'Input Account Name', |                         ctrl: provider.ctrlNameAccountBank, | ||||||
|                     ), |                         validator: (value) { | ||||||
|                     const Text( |                           if (value!.isEmpty) { | ||||||
|                       "Make sure the account you use is in your name, not someone else's", |                             return 'Field must be filled'; | ||||||
|                       style: TextStyle( |  | ||||||
|                         color: ColorPalette.slate400, |  | ||||||
|                       ), |  | ||||||
|                     ), |  | ||||||
|                     SizedBox(height: SizeConfig.height * .08), |  | ||||||
|                     ButtonView( |  | ||||||
|                       name: 'Next', |  | ||||||
|                       onPressed: () { |  | ||||||
|                         provider.next(context).then((value) { |  | ||||||
|                           if (value) { |  | ||||||
|                             routePush(context, |  | ||||||
|                                 page: const ConfirmBankAccount()); |  | ||||||
|                           } |                           } | ||||||
|                         }); |                           return null; | ||||||
|                       }, |                         }, | ||||||
|                     ) |                       ), | ||||||
|                   ], |                       const Text( | ||||||
|  |                         "Make sure the account you use is in your name, not someone else's", | ||||||
|  |                         style: TextStyle( | ||||||
|  |                           color: ColorPalette.slate400, | ||||||
|  |                         ), | ||||||
|  |                       ), | ||||||
|  |                       SizedBox(height: SizeConfig.height * .08), | ||||||
|  |                       ButtonView( | ||||||
|  |                         name: 'Next', | ||||||
|  |                         onPressed: () { | ||||||
|  |                           if (provider.formKeySubmitDataBank.currentState! | ||||||
|  |                               .validate()) { | ||||||
|  |                             provider | ||||||
|  |                                 .submitDataBank( | ||||||
|  |                               bankName: provider.ctrlBankName.text, | ||||||
|  |                               accountNumber: provider.ctrlNoAccountBank.text, | ||||||
|  |                               accountName: provider.ctrlNameAccountBank.text, | ||||||
|  |                             ) | ||||||
|  |                                 .then((values) { | ||||||
|  |                               provider.next(context).then((value) { | ||||||
|  |                                 if (value) { | ||||||
|  |                                   routePush(context, | ||||||
|  |                                       page: const ConfirmBankAccount(), | ||||||
|  |                                       arguments: values); | ||||||
|  |                                 } | ||||||
|  |                               }); | ||||||
|  |                             }); | ||||||
|  |                           } | ||||||
|  |                         }, | ||||||
|  |                       ) | ||||||
|  |                     ], | ||||||
|  |                   ), | ||||||
|                 ), |                 ), | ||||||
|               ); |               ); | ||||||
|             }), |             }), | ||||||
|   | |||||||
| @@ -14,12 +14,12 @@ class RiskProfileView extends StatelessWidget { | |||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return Container( |     return Container( | ||||||
|       width: SizeConfig.width, |       width: SizeConfig.width, | ||||||
|       height: SizeConfig.height, |       height: SizeConfig.height * .8, | ||||||
|       padding: EdgeInsets.all(24), |       padding: const EdgeInsets.all(24), | ||||||
|       child: Column( |       child: Column( | ||||||
|         mainAxisAlignment: MainAxisAlignment.spaceBetween, |         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|         children: [ |         children: [ | ||||||
|           Column( |           const Column( | ||||||
|             children: [ |             children: [ | ||||||
|               ImageView(image: PathAssets.imgDataReport), |               ImageView(image: PathAssets.imgDataReport), | ||||||
|               SizedBox( |               SizedBox( | ||||||
| @@ -48,7 +48,7 @@ class RiskProfileView extends StatelessWidget { | |||||||
|           ), |           ), | ||||||
|           Column( |           Column( | ||||||
|             children: [ |             children: [ | ||||||
|               Row( |               const Row( | ||||||
|                 mainAxisAlignment: MainAxisAlignment.center, |                 mainAxisAlignment: MainAxisAlignment.center, | ||||||
|                 children: [ |                 children: [ | ||||||
|                   ImageView( |                   ImageView( | ||||||
| @@ -68,7 +68,7 @@ class RiskProfileView extends StatelessWidget { | |||||||
|                   ) |                   ) | ||||||
|                 ], |                 ], | ||||||
|               ), |               ), | ||||||
|               SizedBox( |               const SizedBox( | ||||||
|                 height: 24, |                 height: 24, | ||||||
|               ), |               ), | ||||||
|               ButtonView( |               ButtonView( | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | import 'package:cims_apps/application/component/button/back_button_view.dart'; | ||||||
| import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; | import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; | ||||||
| import 'package:cims_apps/application/theme/color_palette.dart'; | import 'package:cims_apps/application/theme/color_palette.dart'; | ||||||
| import 'package:cims_apps/core/route/route.dart'; | import 'package:cims_apps/core/route/route.dart'; | ||||||
| @@ -66,47 +67,55 @@ class _SubmissionParentState extends State<SubmissionParent> { | |||||||
|     return ChangeNotifierProvider( |     return ChangeNotifierProvider( | ||||||
|         create: (context) => SubmissionDataViewModel(), |         create: (context) => SubmissionDataViewModel(), | ||||||
|         builder: (context, child) { |         builder: (context, child) { | ||||||
|           return WillPopScope( |           return PopScope( | ||||||
|             onWillPop: () async { |             canPop: false, | ||||||
|  |             onPopInvoked: (didPop) async { | ||||||
|  |               if (didPop) { | ||||||
|  |                 return; | ||||||
|  |               } | ||||||
|               await routePush(context, |               await routePush(context, | ||||||
|                   page: const BottomNavigationView(), |                   page: const BottomNavigationView(), | ||||||
|                   routeType: RouteType.pushReplace); |                   routeType: RouteType.pushReplace); | ||||||
|               return false; |  | ||||||
|             }, |             }, | ||||||
|             child: Consumer<SubmissionDataViewModel>( |             child: Consumer<SubmissionDataViewModel>( | ||||||
|                 builder: (context, provider, child) { |                 builder: (context, provider, child) { | ||||||
|               return Scaffold( |               return Scaffold( | ||||||
|                 appBar: CustomAppBar( |                 appBar: CustomAppBar( | ||||||
|                     height: SizeConfig.height * .1, title: 'Registration'), |                   height: SizeConfig.height * .1, | ||||||
|                 body: Stack( |                   title: 'Registration', | ||||||
|  |                   leading: BackButtonView( | ||||||
|  |                     onPress: () { | ||||||
|  |                       routePush( | ||||||
|  |                         context, | ||||||
|  |                         page: const BottomNavigationView(), | ||||||
|  |                         routeType: RouteType.pushReplace, | ||||||
|  |                       ); | ||||||
|  |                     }, | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |                 body: Column( | ||||||
|  |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                   mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                   children: [ |                   children: [ | ||||||
|                     Column( |                     Padding( | ||||||
|                       crossAxisAlignment: CrossAxisAlignment.start, |                       padding: const EdgeInsets.symmetric( | ||||||
|                       mainAxisAlignment: MainAxisAlignment.spaceBetween, |                           horizontal: 16.0, vertical: 16.0), | ||||||
|                       children: [ |                       child: Row( | ||||||
|                         Padding( |                         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                           padding: const EdgeInsets.symmetric( |                         children: List.generate(provider.stepAmount, (index) { | ||||||
|                               horizontal: 16.0, vertical: 16.0), |                           return _stepItem( | ||||||
|                           child: Row( |                             isCurrentStep: | ||||||
|                             mainAxisAlignment: MainAxisAlignment.spaceBetween, |                                 provider.getCurrentStep == index + 1 || | ||||||
|                             children: |                                     provider.getCurrentStep - 1 > index, | ||||||
|                                 List.generate(provider.stepAmount, (index) { |                           ); | ||||||
|                               return _stepItem( |                         }), | ||||||
|                                 isCurrentStep: |                       ), | ||||||
|                                     provider.getCurrentStep == index + 1 || |                     ), | ||||||
|                                         provider.getCurrentStep - 1 > index, |                     Expanded( | ||||||
|                               ); |                       child: SingleChildScrollView( | ||||||
|                             }), |                         padding: const EdgeInsets.symmetric(horizontal: 16.0), | ||||||
|                           ), |                         child: _content(provider.getCurrentStep), | ||||||
|                         ), |                       ), | ||||||
|                         Expanded( |  | ||||||
|                           child: Container( |  | ||||||
|                             padding: |  | ||||||
|                                 const EdgeInsets.symmetric(horizontal: 16.0), |  | ||||||
|                             child: _content(provider.getCurrentStep), |  | ||||||
|                           ), |  | ||||||
|                         ), |  | ||||||
|                       ], |  | ||||||
|                     ), |                     ), | ||||||
|                   ], |                   ], | ||||||
|                 ), |                 ), | ||||||
|   | |||||||
| @@ -176,79 +176,107 @@ class SubmitDataIdCard extends StatelessWidget { | |||||||
|           return SingleChildScrollView( |           return SingleChildScrollView( | ||||||
|             child: Consumer<SubmissionDataViewModel>( |             child: Consumer<SubmissionDataViewModel>( | ||||||
|                 builder: (context, provider, child) { |                 builder: (context, provider, child) { | ||||||
|               return Column( |               return Form( | ||||||
|                 crossAxisAlignment: CrossAxisAlignment.start, |                 key: provider.formKeySubmitIdCard, | ||||||
|                 children: [ |                 child: Column( | ||||||
|                   const TextCaption( |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                       title: 'Check your ID card data for accuracy'), |                   children: [ | ||||||
|                   TextFormView( |                     const TextCaption( | ||||||
|                     name: 'NIK', |                         title: 'Check your ID card data for accuracy'), | ||||||
|                     keyboardType: TextInputType.number, |                     TextFormView( | ||||||
|                   ), |                       name: 'NIK', | ||||||
|                   TextFormView(name: 'Full Name'), |                       keyboardType: TextInputType.number, | ||||||
|                   DatePickerView( |                       validator: (value) { | ||||||
|  |                         if (value!.isEmpty) { | ||||||
|  |                           return 'Field must be filled'; | ||||||
|  |                         } | ||||||
|  |                         return null; | ||||||
|  |                       }, | ||||||
|  |                     ), | ||||||
|  |                     TextFormView( | ||||||
|  |                       name: 'Full Name', | ||||||
|  |                       validator: (value) { | ||||||
|  |                         if (value!.isEmpty) { | ||||||
|  |                           return 'Field must be filled'; | ||||||
|  |                         } | ||||||
|  |                         return null; | ||||||
|  |                       }, | ||||||
|  |                     ), | ||||||
|  |                     DatePickerView( | ||||||
|                       name: 'Birth Date', |                       name: 'Birth Date', | ||||||
|                       ctrl: provider.ctrlBirthDate, |                       ctrl: provider.ctrlBirthDate, | ||||||
|                       maxDate: DateTime.now(), |                       maxDate: DateTime.now(), | ||||||
|                       isMultipleSelection: false, |                       isMultipleSelection: false, | ||||||
|                       enabled: true), |                       enabled: true, | ||||||
|                   photoDocument(provider), |                       validatorDate: (value) { | ||||||
|                   Container( |                         if (value!.isEmpty) { | ||||||
|                     width: SizeConfig.width, |                           return 'Field must be filled'; | ||||||
|                     padding: const EdgeInsets.symmetric(horizontal: 16.0), |                         } | ||||||
|                     margin: const EdgeInsets.symmetric(vertical: 16.0), |                         return null; | ||||||
|                     decoration: BoxDecoration( |                       }, | ||||||
|                       color: ColorPalette.blue50, |  | ||||||
|                       borderRadius: BorderRadius.circular(10), |  | ||||||
|                       border: Border.all( |  | ||||||
|                         color: ColorPalette.greyLights, |  | ||||||
|                         width: 1, |  | ||||||
|                       ), |  | ||||||
|                     ), |                     ), | ||||||
|                     child: Row( |                     photoDocument(provider), | ||||||
|                       mainAxisAlignment: MainAxisAlignment.spaceBetween, |                     Container( | ||||||
|                       children: [ |                       width: SizeConfig.width, | ||||||
|                         const ImageView( |                       padding: const EdgeInsets.symmetric(horizontal: 16.0), | ||||||
|                           image: PathAssets.iconShield, |                       margin: const EdgeInsets.symmetric(vertical: 16.0), | ||||||
|                           width: 20, |                       decoration: BoxDecoration( | ||||||
|                           height: 22, |                         color: ColorPalette.blue50, | ||||||
|  |                         borderRadius: BorderRadius.circular(10), | ||||||
|  |                         border: Border.all( | ||||||
|  |                           color: ColorPalette.greyLights, | ||||||
|  |                           width: 1, | ||||||
|                         ), |                         ), | ||||||
|                         const SizedBox( |                       ), | ||||||
|                           width: 8, |                       child: Row( | ||||||
|                         ), |                         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                         const Expanded( |                         children: [ | ||||||
|                           child: Text( |                           const ImageView( | ||||||
|                             'Will my data be safe?', |                             image: PathAssets.iconShield, | ||||||
|                             style: TextStyle( |                             width: 20, | ||||||
|                               fontWeight: FontWeight.w600, |                             height: 22, | ||||||
|                               color: ColorPalette.primary, |                           ), | ||||||
|  |                           const SizedBox( | ||||||
|  |                             width: 8, | ||||||
|  |                           ), | ||||||
|  |                           const Expanded( | ||||||
|  |                             child: Text( | ||||||
|  |                               'Will my data be safe?', | ||||||
|  |                               style: TextStyle( | ||||||
|  |                                 fontWeight: FontWeight.w600, | ||||||
|  |                                 color: ColorPalette.primary, | ||||||
|  |                               ), | ||||||
|                             ), |                             ), | ||||||
|                           ), |                           ), | ||||||
|                         ), |                           IconButton( | ||||||
|                         IconButton( |                             onPressed: () { | ||||||
|                           onPressed: () { |                               bottomSheet(); | ||||||
|                             bottomSheet(); |                             }, | ||||||
|                           }, |                             icon: const Icon( | ||||||
|                           icon: const Icon( |                               Icons.arrow_forward_ios, | ||||||
|                             Icons.arrow_forward_ios, |                               color: ColorPalette.primary, | ||||||
|                             color: ColorPalette.primary, |                               size: 20, | ||||||
|                             size: 20, |                             ), | ||||||
|                           ), |                           ) | ||||||
|                         ) |                         ], | ||||||
|                       ], |                       ), | ||||||
|                     ), |                     ), | ||||||
|                   ), |                     ButtonView( | ||||||
|                   ButtonView( |                       name: 'Next', | ||||||
|                     name: 'Next', |                       onPressed: () async { | ||||||
|                     onPressed: () async { |                         if (provider.formKeySubmitIdCard.currentState! | ||||||
|                       await provider.next(context).then((value) { |                             .validate()) { | ||||||
|                         if (value) { |                           await provider.next(context).then((value) { | ||||||
|                           routePush(context, page: const SubmissionParent()); |                             if (value) { | ||||||
|  |                               routePush(context, | ||||||
|  |                                   page: const SubmissionParent()); | ||||||
|  |                             } | ||||||
|  |                           }); | ||||||
|                         } |                         } | ||||||
|                       }); |                       }, | ||||||
|                     }, |                     ) | ||||||
|                   ) |                   ], | ||||||
|                 ], |                 ), | ||||||
|               ); |               ); | ||||||
|             }), |             }), | ||||||
|           ); |           ); | ||||||
|   | |||||||
| @@ -15,41 +15,70 @@ import 'package:provider/provider.dart'; | |||||||
| class SubmitEmail extends StatelessWidget { | class SubmitEmail extends StatelessWidget { | ||||||
|   const SubmitEmail({Key? key}) : super(key: key); |   const SubmitEmail({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|   Widget _emailVerify() { |   Widget _emailVerify(BuildContext context, SubmissionDataViewModel provider) { | ||||||
|     return Column( |     var textTheme = Theme.of(context).textTheme; | ||||||
|       children: [ |     return Padding( | ||||||
|         const ImageView(image: PathAssets.imgEmail), |       padding: const EdgeInsets.all(24.0), | ||||||
|         Align( |       child: Column( | ||||||
|           alignment: Alignment.center, |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|           child: RichText( |         children: [ | ||||||
|             textAlign: TextAlign.center, |           const TextCaption(title: 'Check your e-mail'), | ||||||
|             text: TextSpan(children: [ |           const ImageView(image: PathAssets.imgEmail), | ||||||
|               const TextSpan( |           Align( | ||||||
|                 text: |             alignment: Alignment.center, | ||||||
|                     'We have sent a verification link to your e-mail. \nPlease check your email for ', |             child: RichText( | ||||||
|                 style: TextStyle( |               textAlign: TextAlign.center, | ||||||
|                   color: Colors.black, |               text: TextSpan(children: [ | ||||||
|                   decoration: TextDecoration.none, |                 TextSpan( | ||||||
|  |                   text: | ||||||
|  |                       'We have sent a verification link to your e-mail. \nPlease check your email for ', | ||||||
|  |                   style: textTheme.displayMedium, | ||||||
|                 ), |                 ), | ||||||
|               ), |                 TextSpan( | ||||||
|               TextSpan( |                   recognizer: TapGestureRecognizer() | ||||||
|                 recognizer: TapGestureRecognizer()..onTap = () {}, |                     ..onTap = () async { | ||||||
|                 text: 'verification', |                       await provider.next(context).then((value) { | ||||||
|                 style: const TextStyle( |                         if (value) { | ||||||
|                   color: Colors.blue, |                           routePush(context, page: const SubmissionParent()); | ||||||
|  |                         } | ||||||
|  |                       }); | ||||||
|  |                     }, | ||||||
|  |                   text: 'verification', | ||||||
|  |                   style: const TextStyle( | ||||||
|  |                     color: Colors.blue, | ||||||
|  |                   ), | ||||||
|                 ), |                 ), | ||||||
|               ), |                 TextSpan( | ||||||
|               const TextSpan( |                   text: ' to \ncontinue registration.', | ||||||
|                 text: ' to \ncontinue registration.', |                   style: textTheme.displayMedium, | ||||||
|                 style: TextStyle( |  | ||||||
|                   color: Colors.black, |  | ||||||
|                   decoration: TextDecoration.none, |  | ||||||
|                 ), |                 ), | ||||||
|               ), |               ]), | ||||||
|             ]), |             ), | ||||||
|           ), |           ), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   showEmailVerify(BuildContext context, SubmissionDataViewModel provider) { | ||||||
|  |     showModalBottomSheet( | ||||||
|  |       context: context, | ||||||
|  |       isScrollControlled: true, | ||||||
|  |       enableDrag: false, | ||||||
|  |       shape: const RoundedRectangleBorder( | ||||||
|  |         borderRadius: BorderRadius.vertical( | ||||||
|  |           top: Radius.zero, | ||||||
|         ), |         ), | ||||||
|       ], |       ), | ||||||
|  |       builder: (context) { | ||||||
|  |         var flutterView = View.of(context); | ||||||
|  |         return Padding( | ||||||
|  |           padding: EdgeInsets.only( | ||||||
|  |             top: MediaQueryData.fromView(flutterView).padding.top, | ||||||
|  |           ), | ||||||
|  |           child: _emailVerify(context, provider), | ||||||
|  |         ); | ||||||
|  |       }, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -60,45 +89,41 @@ class SubmitEmail extends StatelessWidget { | |||||||
|         builder: (context, child) { |         builder: (context, child) { | ||||||
|           return Consumer<SubmissionDataViewModel>( |           return Consumer<SubmissionDataViewModel>( | ||||||
|               builder: (context, provider, child) { |               builder: (context, provider, child) { | ||||||
|             return SingleChildScrollView( |             return SizedBox( | ||||||
|               child: Column( |               height: SizeConfig.height * .78, | ||||||
|                 crossAxisAlignment: CrossAxisAlignment.start, |               child: Form( | ||||||
|                 // mainAxisAlignment: MainAxisAlignment.spaceBetween, |                 key: provider.formKeySubmitEmail, | ||||||
|                 children: [ |                 child: Column( | ||||||
|                   !provider.isEmailVerify |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                       ? const TextCaption(title: 'Enter your e-mail') |                   mainAxisAlignment: MainAxisAlignment.spaceAround, | ||||||
|                       : const TextCaption(title: 'Check your e-mail '), |                   children: [ | ||||||
|                   !provider.isEmailVerify |                     const TextCaption(title: 'Enter your e-mail'), | ||||||
|                       ? TextFormView( |                     TextFormView( | ||||||
|                           name: 'E-mail Address', |                       name: 'E-mail Address', | ||||||
|                           hintText: 'Input e-mail address', |                       hintText: 'Input e-mail address', | ||||||
|                           keyboardType: TextInputType.emailAddress, |                       keyboardType: TextInputType.emailAddress, | ||||||
|                           validator: (value) { |                       validator: (value) { | ||||||
|                             if (value!.isEmpty) { |                         if (value!.isEmpty) { | ||||||
|                               return 'Filled cannot be empty'; |                           return 'Filled cannot be empty'; | ||||||
|                             } else if (!StringUtils.emailValidation(value)) { |                         } else if (!StringUtils.emailValidation(value)) { | ||||||
|                               return 'Format email wrong'; |                           return 'Format email wrong'; | ||||||
|                             } else { |                         } else { | ||||||
|                               return null; |                           return null; | ||||||
|                             } |  | ||||||
|                           }, |  | ||||||
|                           // onTap: () { |  | ||||||
|                           //   provider.submitEmail(); |  | ||||||
|                           // }, |  | ||||||
|                         ) |  | ||||||
|                       : _emailVerify(), |  | ||||||
|                   SizedBox(height: SizeConfig.height * .42), |  | ||||||
|                   ButtonView( |  | ||||||
|                     name: 'Next', |  | ||||||
|                     onPressed: () async { |  | ||||||
|                       await provider.next(context).then((value) { |  | ||||||
|                         if (value) { |  | ||||||
|                           routePush(context, page: const SubmissionParent()); |  | ||||||
|                         } |                         } | ||||||
|                       }); |                       }, | ||||||
|                     }, |                     ), | ||||||
|                   ) |                     SizedBox(height: SizeConfig.height * .43), | ||||||
|                 ], |                     ButtonView( | ||||||
|  |                       name: 'Next', | ||||||
|  |                       onPressed: () async { | ||||||
|  |                         if (provider.formKeySubmitEmail.currentState! | ||||||
|  |                             .validate()) { | ||||||
|  |                           showEmailVerify(context, provider); | ||||||
|  |                         } | ||||||
|  |                       }, | ||||||
|  |                     ) | ||||||
|  |                   ], | ||||||
|  |                 ), | ||||||
|               ), |               ), | ||||||
|             ); |             ); | ||||||
|           }); |           }); | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ import 'package:cims_apps/application/component/button/button_view.dart'; | |||||||
| import 'package:cims_apps/application/component/select_form/select_form_view.dart'; | import 'package:cims_apps/application/component/select_form/select_form_view.dart'; | ||||||
| import 'package:cims_apps/application/component/text_caption/text_caption.dart'; | import 'package:cims_apps/application/component/text_caption/text_caption.dart'; | ||||||
| import 'package:cims_apps/core/route/route.dart'; | import 'package:cims_apps/core/route/route.dart'; | ||||||
|  | import 'package:cims_apps/core/utils/size_config.dart'; | ||||||
| import 'package:cims_apps/features/auth/registration/view/submission_data/submission_parent.dart'; | import 'package:cims_apps/features/auth/registration/view/submission_data/submission_parent.dart'; | ||||||
| import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; | import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| @@ -17,12 +18,13 @@ class SubmitPersonalData extends StatelessWidget { | |||||||
|         builder: (context, child) { |         builder: (context, child) { | ||||||
|           return Consumer<SubmissionDataViewModel>( |           return Consumer<SubmissionDataViewModel>( | ||||||
|               builder: (context, provider, child) { |               builder: (context, provider, child) { | ||||||
|             return SingleChildScrollView( |             return SizedBox( | ||||||
|  |               height: SizeConfig.height * .78, | ||||||
|               child: Form( |               child: Form( | ||||||
|                 key: provider.formKeyPersonalData, |                 key: provider.formKeyPersonalData, | ||||||
|                 child: Column( |                 child: Column( | ||||||
|                   crossAxisAlignment: CrossAxisAlignment.start, |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                   mainAxisAlignment: MainAxisAlignment.spaceBetween, |                   mainAxisAlignment: MainAxisAlignment.spaceAround, | ||||||
|                   children: [ |                   children: [ | ||||||
|                     const TextCaption(title: 'Your personal details'), |                     const TextCaption(title: 'Your personal details'), | ||||||
|                     SelectFormView( |                     SelectFormView( | ||||||
| @@ -31,6 +33,12 @@ class SubmitPersonalData extends StatelessWidget { | |||||||
|                       ctrl: provider.ctrlOccupation, |                       ctrl: provider.ctrlOccupation, | ||||||
|                       listItem: provider.listOccupation, |                       listItem: provider.listOccupation, | ||||||
|                       onSelect: (value) {}, |                       onSelect: (value) {}, | ||||||
|  |                       validator: (value) { | ||||||
|  |                         if (value!.isEmpty) { | ||||||
|  |                           return 'Field must be filled'; | ||||||
|  |                         } | ||||||
|  |                         return null; | ||||||
|  |                       }, | ||||||
|                     ), |                     ), | ||||||
|                     SelectFormView( |                     SelectFormView( | ||||||
|                       name: 'Income Level (IDR)', |                       name: 'Income Level (IDR)', | ||||||
| @@ -38,6 +46,12 @@ class SubmitPersonalData extends StatelessWidget { | |||||||
|                       ctrl: provider.ctrlIncome, |                       ctrl: provider.ctrlIncome, | ||||||
|                       listItem: provider.listIncome, |                       listItem: provider.listIncome, | ||||||
|                       onSelect: (value) {}, |                       onSelect: (value) {}, | ||||||
|  |                       validator: (value) { | ||||||
|  |                         if (value!.isEmpty) { | ||||||
|  |                           return 'Field must be filled'; | ||||||
|  |                         } | ||||||
|  |                         return null; | ||||||
|  |                       }, | ||||||
|                     ), |                     ), | ||||||
|                     SelectFormView( |                     SelectFormView( | ||||||
|                       name: 'Marital Status', |                       name: 'Marital Status', | ||||||
| @@ -45,6 +59,12 @@ class SubmitPersonalData extends StatelessWidget { | |||||||
|                       ctrl: provider.ctrlMarital, |                       ctrl: provider.ctrlMarital, | ||||||
|                       listItem: provider.listMarital, |                       listItem: provider.listMarital, | ||||||
|                       onSelect: (value) {}, |                       onSelect: (value) {}, | ||||||
|  |                       validator: (value) { | ||||||
|  |                         if (value!.isEmpty) { | ||||||
|  |                           return 'Field must be filled'; | ||||||
|  |                         } | ||||||
|  |                         return null; | ||||||
|  |                       }, | ||||||
|                     ), |                     ), | ||||||
|                     SelectFormView( |                     SelectFormView( | ||||||
|                       name: 'Source of Fund', |                       name: 'Source of Fund', | ||||||
| @@ -52,20 +72,28 @@ class SubmitPersonalData extends StatelessWidget { | |||||||
|                       ctrl: provider.ctrlSourceFund, |                       ctrl: provider.ctrlSourceFund, | ||||||
|                       listItem: provider.listSourceFund, |                       listItem: provider.listSourceFund, | ||||||
|                       onSelect: (value) {}, |                       onSelect: (value) {}, | ||||||
|  |                       validator: (value) { | ||||||
|  |                         if (value!.isEmpty) { | ||||||
|  |                           return 'Field must be filled'; | ||||||
|  |                         } | ||||||
|  |                         return null; | ||||||
|  |                       }, | ||||||
|                     ), |                     ), | ||||||
|                     Align( |                     // SizedBox(height: SizeConfig.height * .18), | ||||||
|                       alignment: Alignment.bottomCenter, |                     ButtonView( | ||||||
|                       child: ButtonView( |                       marginVertical: 0, | ||||||
|                         name: 'Next', |                       name: 'Next', | ||||||
|                         onPressed: () async { |                       onPressed: () async { | ||||||
|  |                         if (provider.formKeyPersonalData.currentState! | ||||||
|  |                             .validate()) { | ||||||
|                           await provider.next(context).then((value) { |                           await provider.next(context).then((value) { | ||||||
|                             if (value) { |                             if (value) { | ||||||
|                               routePush(context, |                               routePush(context, | ||||||
|                                   page: const SubmissionParent()); |                                   page: const SubmissionParent()); | ||||||
|                             } |                             } | ||||||
|                           }); |                           }); | ||||||
|                         }, |                         } | ||||||
|                       ), |                       }, | ||||||
|                     ) |                     ) | ||||||
|                   ], |                   ], | ||||||
|                 ), |                 ), | ||||||
|   | |||||||
| @@ -24,26 +24,30 @@ class InitialSignature extends StatelessWidget { | |||||||
|         builder: (context, child) { |         builder: (context, child) { | ||||||
|           return Consumer<SubmissionDataViewModel>( |           return Consumer<SubmissionDataViewModel>( | ||||||
|               builder: (context, provider, child) { |               builder: (context, provider, child) { | ||||||
|             return Column( |             return SizedBox( | ||||||
|               crossAxisAlignment: CrossAxisAlignment.start, |               height: SizeConfig.height * .8, | ||||||
|               children: [ |               child: Column( | ||||||
|                 const TextCaption(title: 'Draw your digital sign'), |                 crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                 const ImageView(image: PathAssets.frameSignature), |                 mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                 const ListTileView( |                 children: [ | ||||||
|                     title: |                   const TextCaption(title: 'Draw your digital sign'), | ||||||
|                         'Make sure the sign you draw is match with your ID Card'), |                   const ImageView(image: PathAssets.frameSignature), | ||||||
|                 SizedBox(height: SizeConfig.height * .07), |                   const ListTileView( | ||||||
|                 ButtonView( |                       title: | ||||||
|                   name: 'Next', |                           'Make sure the sign you draw is match with your ID Card'), | ||||||
|                   onPressed: () { |                   SizedBox(height: SizeConfig.height * .1), | ||||||
|                     provider.next(context).then((value) { |                   ButtonView( | ||||||
|                       if (value) { |                     name: 'Next', | ||||||
|                         routePush(context, page: const SubmitSignature()); |                     onPressed: () { | ||||||
|                       } |                       provider.next(context).then((value) { | ||||||
|                     }); |                         if (value) { | ||||||
|                   }, |                           routePush(context, page: const SubmitSignature()); | ||||||
|                 ) |                         } | ||||||
|               ], |                       }); | ||||||
|  |                     }, | ||||||
|  |                   ) | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|             ); |             ); | ||||||
|           }); |           }); | ||||||
|         }); |         }); | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| import 'package:camera/camera.dart'; | import 'package:camera/camera.dart'; | ||||||
| import 'package:cims_apps/application/component/select_form/select_form_view.dart'; | import 'package:cims_apps/application/component/select_form/select_form_view.dart'; | ||||||
|  | import 'package:cims_apps/features/auth/registration/view/submission_data/data_bank/confirm_bank_account.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:shared_preferences/shared_preferences.dart'; | import 'package:shared_preferences/shared_preferences.dart'; | ||||||
|  |  | ||||||
| @@ -14,11 +15,16 @@ class SubmissionDataViewModel extends ChangeNotifier { | |||||||
|   bool _isEmailVerify = false; |   bool _isEmailVerify = false; | ||||||
|   bool get isEmailVerify => _isEmailVerify; |   bool get isEmailVerify => _isEmailVerify; | ||||||
|   var formKeyPersonalData = GlobalKey<FormState>(); |   var formKeyPersonalData = GlobalKey<FormState>(); | ||||||
|  |   var formKeySubmitEmail = GlobalKey<FormState>(); | ||||||
|  |   var formKeySubmitIdCard = GlobalKey<FormState>(); | ||||||
|  |   var formKeySubmitDataBank = GlobalKey<FormState>(); | ||||||
|   TextEditingController ctrlOccupation = TextEditingController(); |   TextEditingController ctrlOccupation = TextEditingController(); | ||||||
|   TextEditingController ctrlIncome = TextEditingController(); |   TextEditingController ctrlIncome = TextEditingController(); | ||||||
|   TextEditingController ctrlMarital = TextEditingController(); |   TextEditingController ctrlMarital = TextEditingController(); | ||||||
|   TextEditingController ctrlSourceFund = TextEditingController(); |   TextEditingController ctrlSourceFund = TextEditingController(); | ||||||
|   TextEditingController ctrlBankName = TextEditingController(); |   TextEditingController ctrlBankName = TextEditingController(); | ||||||
|  |   TextEditingController ctrlNameAccountBank = TextEditingController(); | ||||||
|  |   TextEditingController ctrlNoAccountBank = TextEditingController(); | ||||||
|   TextEditingController ctrlBankNameSearch = TextEditingController(); |   TextEditingController ctrlBankNameSearch = TextEditingController(); | ||||||
|   TextEditingController ctrlBirthDate = TextEditingController(); |   TextEditingController ctrlBirthDate = TextEditingController(); | ||||||
|   int step = 1; |   int step = 1; | ||||||
| @@ -120,4 +126,21 @@ class SubmissionDataViewModel extends ChangeNotifier { | |||||||
|     valueBank = value; |     valueBank = value; | ||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   List<ModelDataBank> listDataBank = []; | ||||||
|  |  | ||||||
|  |   Future<List<ModelDataBank>?> submitDataBank( | ||||||
|  |       {required String bankName, accountNumber, accountName}) async { | ||||||
|  |     List<ModelDataBank> listResponse = [ | ||||||
|  |       ModelDataBank('Bank Name', bankName), | ||||||
|  |       ModelDataBank('Account Number', accountNumber), | ||||||
|  |       ModelDataBank('Account Owner Name', accountName), | ||||||
|  |       ModelDataBank('Name on ID card', accountName), | ||||||
|  |     ]; | ||||||
|  |     if (listResponse.first.subtitle != null) { | ||||||
|  |       // listDataBank = listResponse; | ||||||
|  |       return listResponse; | ||||||
|  |     } | ||||||
|  |     return null; | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								lib/features/transaction/view/cancel_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								lib/features/transaction/view/cancel_view.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | import 'package:cims_apps/application/component/card_transaction/card_transaction_view.dart'; | ||||||
|  | import 'package:cims_apps/application/component/card_transaction/empty_card_transaction.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:provider/provider.dart'; | ||||||
|  |  | ||||||
|  | class CancelView extends StatelessWidget { | ||||||
|  |   const CancelView({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return SingleChildScrollView( | ||||||
|  |       child: Consumer<TransactionViewModel>( | ||||||
|  |         builder: (context, provider, child) => Column( | ||||||
|  |           children: [ | ||||||
|  |             if (provider.listOnProcessTransaction.isEmpty) | ||||||
|  |               EmptyCardTransaction( | ||||||
|  |                 onPressedButton: () {}, | ||||||
|  |               ), | ||||||
|  |             ...provider.listOnProcessTransaction.map((e) { | ||||||
|  |               return CardTransactionView( | ||||||
|  |                 step: 'cancel', | ||||||
|  |                 type: 'type', | ||||||
|  |                 amount: 'amount', | ||||||
|  |                 iconPath: 'iconPath', | ||||||
|  |                 subs: 'subs', | ||||||
|  |                 onTap: () {}, | ||||||
|  |               ); | ||||||
|  |             }), | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								lib/features/transaction/view/done_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								lib/features/transaction/view/done_view.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | import 'package:cims_apps/application/component/card_transaction/card_transaction_view.dart'; | ||||||
|  | import 'package:cims_apps/application/component/card_transaction/empty_card_transaction.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:provider/provider.dart'; | ||||||
|  |  | ||||||
|  | class DoneView extends StatelessWidget { | ||||||
|  |   const DoneView({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return SingleChildScrollView( | ||||||
|  |       child: Consumer<TransactionViewModel>( | ||||||
|  |         builder: (context, provider, child) { | ||||||
|  |           return Column( | ||||||
|  |             children: [ | ||||||
|  |               if (provider.listOnProcessTransaction.isEmpty) | ||||||
|  |                 EmptyCardTransaction( | ||||||
|  |                   onPressedButton: () {}, | ||||||
|  |                 ), | ||||||
|  |               ...provider.listOnProcessTransaction.map((e) { | ||||||
|  |                 return CardTransactionView( | ||||||
|  |                   step: 'done', | ||||||
|  |                   type: 'type', | ||||||
|  |                   amount: 'amount', | ||||||
|  |                   iconPath: 'iconPath', | ||||||
|  |                   subs: 'subs', | ||||||
|  |                   onTap: () {}, | ||||||
|  |                 ); | ||||||
|  |               }), | ||||||
|  |             ], | ||||||
|  |           ); | ||||||
|  |         }, | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								lib/features/transaction/view/onprocess_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								lib/features/transaction/view/onprocess_view.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | import 'package:cims_apps/application/component/card_transaction/card_transaction_view.dart'; | ||||||
|  | import 'package:cims_apps/application/component/card_transaction/empty_card_transaction.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:provider/provider.dart'; | ||||||
|  |  | ||||||
|  | class OnProcessView extends StatelessWidget { | ||||||
|  |   const OnProcessView({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return SingleChildScrollView( | ||||||
|  |       child: | ||||||
|  |           Consumer<TransactionViewModel>(builder: (context, provider, child) { | ||||||
|  |         return Column(children: [ | ||||||
|  |           if (provider.listOnProcessTransaction.isEmpty) | ||||||
|  |             EmptyCardTransaction( | ||||||
|  |               onPressedButton: () {}, | ||||||
|  |             ), | ||||||
|  |           ...provider.listOnProcessTransaction.map((e) { | ||||||
|  |             return CardTransactionView( | ||||||
|  |               step: 'on process', | ||||||
|  |               type: 'type', | ||||||
|  |               amount: 'amount', | ||||||
|  |               iconPath: 'iconPath', | ||||||
|  |               subs: 'subs', | ||||||
|  |               onTap: () {}, | ||||||
|  |             ); | ||||||
|  |           }), | ||||||
|  |         ]); | ||||||
|  |       }), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,14 +1,124 @@ | |||||||
| import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; | import 'package:cims_apps/application/assets/path_assets.dart'; | ||||||
|  | import 'package:cims_apps/application/component/image/image_view.dart'; | ||||||
|  | import 'package:cims_apps/application/theme/color_palette.dart'; | ||||||
| import 'package:cims_apps/core/utils/size_config.dart'; | import 'package:cims_apps/core/utils/size_config.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/view/cancel_view.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/view/done_view.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/view/onprocess_view.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/view/waiting_view.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:flutter_toggle_tab/flutter_toggle_tab.dart'; | ||||||
|  | import 'package:provider/provider.dart'; | ||||||
|  |  | ||||||
| class TransactionView extends StatelessWidget { | class TransactionView extends StatelessWidget { | ||||||
|   const TransactionView({Key? key}) : super(key: key); |   const TransactionView({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return Scaffold( |     List<Tab> textTabs = const [ | ||||||
|       appBar: CustomAppBar(height: SizeConfig.height * 0.08, title: 'Transaction'), |       Tab(text: 'Waiting'), | ||||||
|     ); |       Tab(text: 'On process'), | ||||||
|  |       Tab(text: 'Done'), | ||||||
|  |       Tab(text: 'Cancel'), | ||||||
|  |     ]; | ||||||
|  |     List<Widget> listTabBarView = const [ | ||||||
|  |       WaitingView(), | ||||||
|  |       OnProcessView(), | ||||||
|  |       DoneView(), | ||||||
|  |       CancelView(), | ||||||
|  |     ]; | ||||||
|  |  | ||||||
|  |     return ChangeNotifierProvider( | ||||||
|  |         create: (context) => TransactionViewModel(), | ||||||
|  |         builder: (context, child) { | ||||||
|  |           return Scaffold( | ||||||
|  |             backgroundColor: ColorPalette.primary, | ||||||
|  |             body: SizedBox( | ||||||
|  |               child: Stack( | ||||||
|  |                 children: [ | ||||||
|  |                   const ImageView(image: PathAssets.imgDashboardAccount), | ||||||
|  |                   Column( | ||||||
|  |                     children: [ | ||||||
|  |                       SizedBox( | ||||||
|  |                         height: SizeConfig.height * .05, | ||||||
|  |                       ), | ||||||
|  |                       const Center( | ||||||
|  |                         child: Text( | ||||||
|  |                           'Transaction', | ||||||
|  |                           style: TextStyle( | ||||||
|  |                               fontSize: 20, | ||||||
|  |                               fontWeight: FontWeight.w700, | ||||||
|  |                               color: Colors.white), | ||||||
|  |                         ), | ||||||
|  |                       ), | ||||||
|  |                       SizedBox( | ||||||
|  |                         height: SizeConfig.height * .04, | ||||||
|  |                       ), | ||||||
|  |                       Container( | ||||||
|  |                         margin: const EdgeInsets.symmetric(horizontal: 24), | ||||||
|  |                         child: FlutterToggleTab( | ||||||
|  |                           height: SizeConfig.height * .065, | ||||||
|  |                           width: SizeConfig.width * .2, | ||||||
|  |                           marginSelected: const EdgeInsets.all(8.0), | ||||||
|  |                           isScroll: false, | ||||||
|  |                           selectedTextStyle: const TextStyle( | ||||||
|  |                             color: ColorPalette.primary, | ||||||
|  |                             fontWeight: FontWeight.w700, | ||||||
|  |                           ), | ||||||
|  |                           unSelectedTextStyle: const TextStyle( | ||||||
|  |                             color: ColorPalette.blackFont, | ||||||
|  |                             fontWeight: FontWeight.w700, | ||||||
|  |                           ), | ||||||
|  |                           unSelectedBackgroundColors: const [ | ||||||
|  |                             ColorPalette.blue50 | ||||||
|  |                           ], | ||||||
|  |                           selectedBackgroundColors: const [ColorPalette.white], | ||||||
|  |                           labels: const ['Subscribe', 'Reedem'], | ||||||
|  |                           selectedLabelIndex: (p0) {}, | ||||||
|  |                           selectedIndex: 0, | ||||||
|  |                         ), | ||||||
|  |                       ), | ||||||
|  |                       Expanded( | ||||||
|  |                           child: DefaultTabController( | ||||||
|  |                         length: textTabs.length, | ||||||
|  |                         child: Container( | ||||||
|  |                           color: Colors.transparent, | ||||||
|  |                           padding: const EdgeInsets.only(top: 32.0), | ||||||
|  |                           child: Container( | ||||||
|  |                             margin: const EdgeInsets.only(top: 24), | ||||||
|  |                             padding: const EdgeInsets.only(top: 16.0), | ||||||
|  |                             decoration: const BoxDecoration( | ||||||
|  |                               color: Colors.white, | ||||||
|  |                               borderRadius: BorderRadius.only( | ||||||
|  |                                   topLeft: Radius.circular(24), | ||||||
|  |                                   topRight: Radius.circular(24)), | ||||||
|  |                             ), | ||||||
|  |                             child: Column( | ||||||
|  |                               children: [ | ||||||
|  |                                 TabBar( | ||||||
|  |                                   tabs: textTabs, | ||||||
|  |                                   indicatorColor: Colors.blueAccent, | ||||||
|  |                                 ), | ||||||
|  |                                 Expanded( | ||||||
|  |                                     child: Padding( | ||||||
|  |                                   padding: const EdgeInsets.symmetric( | ||||||
|  |                                     horizontal: 16.0, | ||||||
|  |                                     vertical: 4.0, | ||||||
|  |                                   ), | ||||||
|  |                                   child: TabBarView(children: listTabBarView), | ||||||
|  |                                 )) | ||||||
|  |                               ], | ||||||
|  |                             ), | ||||||
|  |                           ), | ||||||
|  |                         ), | ||||||
|  |                       )), | ||||||
|  |                     ], | ||||||
|  |                   ) | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |           ); | ||||||
|  |         }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								lib/features/transaction/view/waiting_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								lib/features/transaction/view/waiting_view.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | import 'package:cims_apps/application/assets/path_assets.dart'; | ||||||
|  | import 'package:cims_apps/application/component/card_transaction/card_transaction_view.dart'; | ||||||
|  | import 'package:cims_apps/application/component/card_transaction/empty_card_transaction.dart'; | ||||||
|  | import 'package:cims_apps/core/utils/number_formatter.dart'; | ||||||
|  | import 'package:cims_apps/core/utils/string_utils.dart'; | ||||||
|  | import 'package:cims_apps/features/transaction/viewmodel/transaction_viewmodel.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:provider/provider.dart'; | ||||||
|  |  | ||||||
|  | class WaitingView extends StatelessWidget { | ||||||
|  |   const WaitingView({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return SingleChildScrollView( | ||||||
|  |       child: | ||||||
|  |           Consumer<TransactionViewModel>(builder: (context, provider, child) { | ||||||
|  |         return Column( | ||||||
|  |           children: [ | ||||||
|  |             provider.listWaitingTransaction.isNotEmpty | ||||||
|  |                 ? CardTransactionView( | ||||||
|  |                     onTap: () {}, | ||||||
|  |                     iconPath: PathAssets.iconEducation, | ||||||
|  |                     type: 'Education', | ||||||
|  |                     amount: NumberFormatter.numberCurrency( | ||||||
|  |                       6000000, | ||||||
|  |                       'Rp ', | ||||||
|  |                       'id_ID', | ||||||
|  |                       decimalDigits: 0, | ||||||
|  |                     ), | ||||||
|  |                     timeTransaction: StringUtils.formatTime(DateTime.now()), | ||||||
|  |                     subs: '3 Subscription', | ||||||
|  |                     step: 'waiting') | ||||||
|  |                 : EmptyCardTransaction( | ||||||
|  |                     onPressedButton: () {}, | ||||||
|  |                   ), | ||||||
|  |           ], | ||||||
|  |         ); | ||||||
|  |       }), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
|  | class TransactionViewModel extends ChangeNotifier { | ||||||
|  |   List listWaitingTransaction = [1]; | ||||||
|  |   List listOnProcessTransaction = []; | ||||||
|  |   List listDoneTransaction = []; | ||||||
|  |   List listCancelTransaction = []; | ||||||
|  | } | ||||||
							
								
								
									
										114
									
								
								lib/main.dart
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								lib/main.dart
									
									
									
									
									
								
							| @@ -20,68 +20,66 @@ class MyApp extends StatelessWidget { | |||||||
|       title: 'CIMS', |       title: 'CIMS', | ||||||
|       debugShowCheckedModeBanner: false, |       debugShowCheckedModeBanner: false, | ||||||
|       theme: ThemeData( |       theme: ThemeData( | ||||||
|         appBarTheme: const AppBarTheme( |           appBarTheme: const AppBarTheme( | ||||||
|             centerTitle: true, |               centerTitle: true, | ||||||
|             backgroundColor: Colors.white, |               backgroundColor: Colors.white, | ||||||
|             elevation: 1, |               elevation: 1, | ||||||
|             foregroundColor: Colors.black, |               foregroundColor: Colors.black, | ||||||
|             titleTextStyle: TextStyle( |               titleTextStyle: TextStyle( | ||||||
|               fontSize: 20, |                 fontSize: 20, | ||||||
|               fontWeight: FontWeight.w700, |                 fontWeight: FontWeight.w700, | ||||||
|               fontFamily: 'Manrope', |                 fontFamily: 'Manrope', | ||||||
|  |                 color: ColorPalette.slate800, | ||||||
|  |               )), | ||||||
|  |           fontFamily: 'Manrope', | ||||||
|  |           scaffoldBackgroundColor: Colors.white, | ||||||
|  |           textTheme: const TextTheme( | ||||||
|  |             displaySmall: TextStyle( | ||||||
|  |               fontSize: 14, | ||||||
|  |               fontWeight: FontWeight.w500, | ||||||
|               color: ColorPalette.slate800, |               color: ColorPalette.slate800, | ||||||
|             )), |             ), | ||||||
|         fontFamily: 'Manrope', |             displayMedium: TextStyle( | ||||||
|         scaffoldBackgroundColor: Colors.white, |               fontSize: 16, | ||||||
|         textTheme: const TextTheme( |               fontWeight: FontWeight.w600, | ||||||
|           displaySmall: TextStyle( |               color: ColorPalette.slate800, | ||||||
|             fontSize: 14, |             ), | ||||||
|             fontWeight: FontWeight.w500, |             displayLarge: TextStyle( | ||||||
|             color: ColorPalette.slate800, |               fontSize: 16, | ||||||
|  |               fontWeight: FontWeight.bold, | ||||||
|  |               color: ColorPalette.slate800, | ||||||
|  |             ), | ||||||
|  |             bodyMedium: TextStyle( | ||||||
|  |               fontSize: 14, | ||||||
|  |               fontWeight: FontWeight.w600, | ||||||
|  |               color: ColorPalette.slate500, | ||||||
|  |             ), | ||||||
|  |             bodyLarge: TextStyle( | ||||||
|  |               fontSize: 16, | ||||||
|  |               fontWeight: FontWeight.bold, | ||||||
|  |               color: ColorPalette.slate500, | ||||||
|  |             ), | ||||||
|  |             headlineSmall: TextStyle( | ||||||
|  |               fontSize: 16, | ||||||
|  |               fontWeight: FontWeight.bold, | ||||||
|  |               color: ColorPalette.slate800, | ||||||
|  |             ), | ||||||
|  |             headlineLarge: TextStyle( | ||||||
|  |               fontSize: 28, | ||||||
|  |               fontWeight: FontWeight.bold, | ||||||
|  |               color: ColorPalette.slate800, | ||||||
|  |             ), | ||||||
|           ), |           ), | ||||||
|           displayMedium: TextStyle( |           colorScheme: const ColorScheme.light().copyWith( | ||||||
|             fontSize: 16, |             primary: const Color(0xff2563EB), | ||||||
|             fontWeight: FontWeight.w600, |             onPrimary: const Color(0xFFFF9130), | ||||||
|             color: ColorPalette.slate800, |             secondary: const Color(0xFFFECDA6), | ||||||
|  |             onBackground: const Color(0xFFA9A9A9), | ||||||
|           ), |           ), | ||||||
|           displayLarge: TextStyle( |           bottomSheetTheme: const BottomSheetThemeData( | ||||||
|             fontSize: 16, |               backgroundColor: Colors.white, surfaceTintColor: Colors.white) | ||||||
|             fontWeight: FontWeight.bold, |           // useMaterial3: true, | ||||||
|             color: ColorPalette.slate800, |  | ||||||
|           ), |           ), | ||||||
|           bodyMedium: TextStyle( |  | ||||||
|             fontSize: 14, |  | ||||||
|             fontWeight: FontWeight.w600, |  | ||||||
|             color: ColorPalette.slate500, |  | ||||||
|           ), |  | ||||||
|           bodyLarge: TextStyle( |  | ||||||
|             fontSize: 16, |  | ||||||
|             fontWeight: FontWeight.bold, |  | ||||||
|             color: ColorPalette.slate500, |  | ||||||
|           ), |  | ||||||
|           headlineSmall: TextStyle( |  | ||||||
|             fontSize: 16, |  | ||||||
|             fontWeight: FontWeight.bold, |  | ||||||
|             color: ColorPalette.slate800, |  | ||||||
|           ), |  | ||||||
|           headlineLarge: TextStyle( |  | ||||||
|             fontSize: 28, |  | ||||||
|             fontWeight: FontWeight.bold, |  | ||||||
|             color: ColorPalette.slate800, |  | ||||||
|           ), |  | ||||||
|         ), |  | ||||||
|         colorScheme: const ColorScheme.light().copyWith( |  | ||||||
|           primary: const Color(0xff2563EB), |  | ||||||
|           onPrimary: const Color(0xFFFF9130), |  | ||||||
|           secondary: const Color(0xFFFECDA6), |  | ||||||
|           onBackground: const Color(0xFFA9A9A9), |  | ||||||
|         ), |  | ||||||
|         bottomSheetTheme: BottomSheetThemeData( |  | ||||||
|           backgroundColor: Colors.white, |  | ||||||
|           surfaceTintColor: Colors.white |  | ||||||
|         ) |  | ||||||
|         // useMaterial3: true, |  | ||||||
|       ), |  | ||||||
|       initialRoute: initialRoute, |       initialRoute: initialRoute, | ||||||
|       onGenerateRoute: generateRoutes, |       onGenerateRoute: generateRoutes, | ||||||
|       navigatorObservers: [ |       navigatorObservers: [ | ||||||
|   | |||||||
| @@ -259,6 +259,14 @@ packages: | |||||||
|     description: flutter |     description: flutter | ||||||
|     source: sdk |     source: sdk | ||||||
|     version: "0.0.0" |     version: "0.0.0" | ||||||
|  |   flutter_toggle_tab: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: flutter_toggle_tab | ||||||
|  |       sha256: "90ad0d050f656df677998825f985637d010117a1793828cd7e6dadada4ecd2c5" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "1.4.1" | ||||||
|   flutter_web_plugins: |   flutter_web_plugins: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: flutter |     description: flutter | ||||||
|   | |||||||
| @@ -53,6 +53,7 @@ dependencies: | |||||||
|   shared_preferences: ^2.2.2 |   shared_preferences: ^2.2.2 | ||||||
|   calendar_date_picker2: ^0.5.3 |   calendar_date_picker2: ^0.5.3 | ||||||
|   google_sign_in: ^6.2.1 |   google_sign_in: ^6.2.1 | ||||||
|  |   flutter_toggle_tab: ^1.4.1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user