Compare commits
	
		
			27 Commits
		
	
	
		
			d79959c47f
			...
			bayu/dev
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 4f2380fcdf | |||
| c23075304a | |||
| 17c7559158 | |||
| 711e5f3f52 | |||
| a99365fb0a | |||
| 41f0bb7a68 | |||
| c97130239d | |||
| 1b867227c7 | |||
| 4b07219928 | |||
| 9cdda42b8b | |||
| 6f5d3ccca8 | |||
| ff515e2621 | |||
| f057a346c2 | |||
| f84fe1017d | |||
| 27ba55314b | |||
| 59e046bd92 | |||
| 4461b78565 | |||
| f2f688f9f3 | |||
| d1adfd2ab0 | |||
| 33b2ab85e3 | |||
| 6a43a3dcaf | |||
| db1280b272 | |||
| ae4f9c25c4 | |||
| a87afe16cb | |||
| 1904e9a4a3 | |||
| 506480d812 | |||
| a6ea9a2314 | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-card.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-chat.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-education.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-fund.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-gadget-outline.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-home.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-logout.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-profile.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-setting.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-shop.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/bg-profile.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.0 MiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/img-cat-outlined.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 14 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/img-empty-transaction.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 70 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/images/img-expand-purchase.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 32 KiB | 
| @@ -49,12 +49,28 @@ 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 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 iconCard = 'assets/icons/icon-card.png'; | ||||||
|  |   static const String iconChat = 'assets/icons/icon-chat.png'; | ||||||
|  |   static const String iconLogout = 'assets/icons/icon-logout.png'; | ||||||
|  |   static const String iconProfile = 'assets/icons/icon-profile.png'; | ||||||
|  |   static const String iconSetting = 'assets/icons/icon-setting.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'; | ||||||
| @@ -83,15 +99,22 @@ class PathAssets { | |||||||
|   static const String imgMoneyIncome = 'assets/images/img-money-income.png'; |   static const String imgMoneyIncome = 'assets/images/img-money-income.png'; | ||||||
|   static const String imgGrowing = 'assets/images/img-growing.png'; |   static const String imgGrowing = 'assets/images/img-growing.png'; | ||||||
|   static const String imgCat = 'assets/images/img-cat.png'; |   static const String imgCat = 'assets/images/img-cat.png'; | ||||||
|  |   static const String imgCatOutlined = 'assets/images/img-cat-outlined.png'; | ||||||
|   static const String imgDeer = 'assets/images/img-deer.png'; |   static const String imgDeer = 'assets/images/img-deer.png'; | ||||||
|   static const String imgLion = 'assets/images/img-lion.png'; |   static const String imgLion = 'assets/images/img-lion.png'; | ||||||
|   static const String imgGuideBank = 'assets/images/img-guide-bank.png'; |   static const String imgGuideBank = 'assets/images/img-guide-bank.png'; | ||||||
|   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 imgExpandPurchase = | ||||||
|  |       'assets/images/img-expand-purchase.png'; | ||||||
|  |   static const String imgEmptyTransaction = | ||||||
|  |       'assets/images/img-empty-transaction.png'; | ||||||
|  |   static const String bgProfile = 'assets/images/bg-profile.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, | ||||||
|  |             ), | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -8,22 +8,26 @@ class ListTileView extends StatelessWidget { | |||||||
|   final String title; |   final String title; | ||||||
|   final VoidCallback? onPressed; |   final VoidCallback? onPressed; | ||||||
|   final Widget? prefixIcon, suffixIcon; |   final Widget? prefixIcon, suffixIcon; | ||||||
|   final Color? colorTitle; |   final EdgeInsetsGeometry? padding, margin; | ||||||
|  |   final TextStyle? textStyle; | ||||||
|   const ListTileView( |   const ListTileView( | ||||||
|       {Key? key, |       {Key? key, | ||||||
|       required this.title, |       required this.title, | ||||||
|       this.onPressed, |       this.onPressed, | ||||||
|       this.prefixIcon, |       this.prefixIcon, | ||||||
|       this.suffixIcon, |       this.suffixIcon, | ||||||
|       this.colorTitle}) |       this.padding, | ||||||
|  |       this.textStyle, | ||||||
|  |       this.margin}) | ||||||
|       : super(key: key); |       : super(key: key); | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return Container( |     return Container( | ||||||
|       width: SizeConfig.width, |       width: SizeConfig.width, | ||||||
|       padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0), |       padding: padding ?? | ||||||
|       margin: const EdgeInsets.symmetric(vertical: 16.0), |           const EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0), | ||||||
|  |       margin: margin ?? const EdgeInsets.symmetric(vertical: 16.0), | ||||||
|       decoration: BoxDecoration( |       decoration: BoxDecoration( | ||||||
|         color: ColorPalette.blue50, |         color: ColorPalette.blue50, | ||||||
|         borderRadius: BorderRadius.circular(10), |         borderRadius: BorderRadius.circular(10), | ||||||
| @@ -47,22 +51,23 @@ class ListTileView extends StatelessWidget { | |||||||
|           Expanded( |           Expanded( | ||||||
|             child: Text( |             child: Text( | ||||||
|               title, |               title, | ||||||
|               style: TextStyle( |               style: textStyle ?? | ||||||
|  |                   const TextStyle( | ||||||
|                     fontWeight: FontWeight.w600, |                     fontWeight: FontWeight.w600, | ||||||
|                 color: colorTitle ?? ColorPalette.slate500, |                     color: ColorPalette.slate500, | ||||||
|                   ), |                   ), | ||||||
|             ), |             ), | ||||||
|           ), |           ), | ||||||
|           suffixIcon != null |           suffixIcon ?? | ||||||
|               ? IconButton( |               IconButton( | ||||||
|                 onPressed: onPressed, |                 onPressed: onPressed, | ||||||
|                 icon: const Icon( |                 icon: const Icon( | ||||||
|                   Icons.arrow_forward_ios, |                   Icons.arrow_forward_ios, | ||||||
|                   color: ColorPalette.primary, |                   color: ColorPalette.primary, | ||||||
|                   size: 20, |                   size: 20, | ||||||
|                 ), |                 ), | ||||||
|                 ) |               ), | ||||||
|               : const SizedBox(), |           // : const SizedBox(), | ||||||
|         ], |         ], | ||||||
|       ), |       ), | ||||||
|     ); |     ); | ||||||
|   | |||||||
| @@ -47,6 +47,7 @@ class SelectFormView extends StatelessWidget { | |||||||
|     bottomSheet() { |     bottomSheet() { | ||||||
|       showModalBottomSheet<void>( |       showModalBottomSheet<void>( | ||||||
|         context: context, |         context: context, | ||||||
|  |         isDismissible: false, | ||||||
|         shape: RoundedRectangleBorder( |         shape: RoundedRectangleBorder( | ||||||
|           borderRadius: BorderRadius.only( |           borderRadius: BorderRadius.only( | ||||||
|             topLeft: _borderRadius, |             topLeft: _borderRadius, | ||||||
| @@ -82,7 +83,10 @@ class SelectFormView extends StatelessWidget { | |||||||
|                         ), |                         ), | ||||||
|                       ), |                       ), | ||||||
|                       IconButton( |                       IconButton( | ||||||
|                           onPressed: () => Navigator.pop(context), |                           onPressed: () { | ||||||
|  |                             ctrl?.clear(); | ||||||
|  |                             Navigator.pop(context); | ||||||
|  |                           }, | ||||||
|                           icon: const Icon( |                           icon: const Icon( | ||||||
|                             Icons.clear, |                             Icons.clear, | ||||||
|                             size: 26, |                             size: 26, | ||||||
| @@ -134,7 +138,7 @@ class SelectFormView extends StatelessWidget { | |||||||
|                                 onTap: () { |                                 onTap: () { | ||||||
|                                   stateSetter(() { |                                   stateSetter(() { | ||||||
|                                     ctrl?.text = e.text; |                                     ctrl?.text = e.text; | ||||||
|                                     onSelect(e.key); |                                     onSelect(e.text); | ||||||
|                                   }); |                                   }); | ||||||
|                                 }, |                                 }, | ||||||
|                               ), |                               ), | ||||||
| @@ -148,7 +152,9 @@ class SelectFormView extends StatelessWidget { | |||||||
|                     name: 'Select', |                     name: 'Select', | ||||||
|                     marginVertical: 4.0, |                     marginVertical: 4.0, | ||||||
|                     onPressed: () { |                     onPressed: () { | ||||||
|  |                       if (ctrl!.text.isNotEmpty) { | ||||||
|                         Navigator.pop(context); |                         Navigator.pop(context); | ||||||
|  |                       } | ||||||
|                     }, |                     }, | ||||||
|                   ) |                   ) | ||||||
|                 ], |                 ], | ||||||
|   | |||||||
| @@ -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,8 @@ | |||||||
|  | import 'package:cims_apps/application/theme/color_palette.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:flutter/services.dart'; | ||||||
|  | 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 +18,24 @@ 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 '--:--:--'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static void iCopyToClipboard(BuildContext context, | ||||||
|  |       {String? desc, required String text}) { | ||||||
|  |     Clipboard.setData(ClipboardData(text: text)); | ||||||
|  |     ScaffoldMessenger.of(context) | ||||||
|  |         .showSnackBar(SnackBar( | ||||||
|  |           backgroundColor: ColorPalette.primary, | ||||||
|  |           content: Text(desc ?? "Text copied to clipboard"), | ||||||
|  |         )) | ||||||
|  |         .closed | ||||||
|  |         .then((value) => ScaffoldMessenger.of(context).removeCurrentSnackBar()); | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -31,10 +31,11 @@ class RegistrationView extends StatelessWidget { | |||||||
|           ), |           ), | ||||||
|         ), |         ), | ||||||
|         builder: (BuildContext context) { |         builder: (BuildContext context) { | ||||||
|  |           var flutterView = View.of(context); | ||||||
|           return Padding( |           return Padding( | ||||||
|             padding: EdgeInsets.only( |             padding: EdgeInsets.only( | ||||||
|               top: MediaQueryData.fromView( |               top: MediaQueryData.fromView( | ||||||
|                 WidgetsBinding.instance.window, |                 flutterView, | ||||||
|               ).padding.top, |               ).padding.top, | ||||||
|             ), |             ), | ||||||
|             child: const OtpView( |             child: const OtpView( | ||||||
|   | |||||||
| @@ -6,19 +6,26 @@ 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, | ||||||
| @@ -42,7 +49,9 @@ class ConfirmBankAccount extends StatelessWidget { | |||||||
|               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>( | ||||||
|  |                     builder: (context, provider, child) { | ||||||
|  |                   return Column( | ||||||
|                     mainAxisAlignment: MainAxisAlignment.spaceBetween, |                     mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                     crossAxisAlignment: CrossAxisAlignment.start, |                     crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                     children: [ |                     children: [ | ||||||
| @@ -53,7 +62,7 @@ class ConfirmBankAccount extends StatelessWidget { | |||||||
|                           mainAxisAlignment: MainAxisAlignment.start, |                           mainAxisAlignment: MainAxisAlignment.start, | ||||||
|                           crossAxisAlignment: CrossAxisAlignment.start, |                           crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                           children: [ |                           children: [ | ||||||
|                     ...listData.map((e) { |                             ...listDataBank.map((e) { | ||||||
|                               return Padding( |                               return Padding( | ||||||
|                                 padding: const EdgeInsets.only(bottom: 16.0), |                                 padding: const EdgeInsets.only(bottom: 16.0), | ||||||
|                                 child: Column( |                                 child: Column( | ||||||
| @@ -61,12 +70,13 @@ class ConfirmBankAccount extends StatelessWidget { | |||||||
|                                   crossAxisAlignment: CrossAxisAlignment.start, |                                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                                   children: [ |                                   children: [ | ||||||
|                                     Text( |                                     Text( | ||||||
|                               e['title'], |                                       e.title!, | ||||||
|                                       style: const TextStyle( |                                       style: const TextStyle( | ||||||
|                                   color: ColorPalette.slate400, fontSize: 16), |                                           color: ColorPalette.slate400, | ||||||
|  |                                           fontSize: 16), | ||||||
|                                     ), |                                     ), | ||||||
|                                     Text( |                                     Text( | ||||||
|                               e['subtitle'], |                                       e.subtitle!, | ||||||
|                                       style: const TextStyle( |                                       style: const TextStyle( | ||||||
|                                           fontSize: 16, |                                           fontSize: 16, | ||||||
|                                           color: ColorPalette.slate800, |                                           color: ColorPalette.slate800, | ||||||
| @@ -98,15 +108,18 @@ class ConfirmBankAccount extends StatelessWidget { | |||||||
|                             name: 'Confirm', |                             name: 'Confirm', | ||||||
|                             width: SizeConfig.width * .42, |                             width: SizeConfig.width * .42, | ||||||
|                             onPressed: () { |                             onPressed: () { | ||||||
|                       routePush(context, page: const SubmissionParent()); |                               routePush(context, | ||||||
|  |                                   page: const SubmissionParent()); | ||||||
|                             }, |                             }, | ||||||
|                           ), |                           ), | ||||||
|                         ], |                         ], | ||||||
|                       ) |                       ) | ||||||
|                     ], |                     ], | ||||||
|           ), |                   ); | ||||||
|  |                 }), | ||||||
|               ), |               ), | ||||||
|             ), |             ), | ||||||
|           ); |           ); | ||||||
|  |         }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,108 @@ | |||||||
|  | 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/custom_app_bar/custom_app_bar.dart'; | ||||||
|  | import 'package:cims_apps/application/component/image/image_view.dart'; | ||||||
|  | import 'package:cims_apps/application/component/text_form/text_form_view.dart'; | ||||||
|  | import 'package:cims_apps/application/theme/color_palette.dart'; | ||||||
|  | import 'package:cims_apps/core/utils/size_config.dart'; | ||||||
|  | import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:provider/provider.dart'; | ||||||
|  |  | ||||||
|  | class ListBankView extends StatelessWidget { | ||||||
|  |   final ValueChanged<String> onSelect; | ||||||
|  |   const ListBankView({Key? key, required this.onSelect}) : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     var textTheme = Theme.of(context).textTheme; | ||||||
|  |  | ||||||
|  |     return ChangeNotifierProvider( | ||||||
|  |         create: (context) => SubmissionDataViewModel(), | ||||||
|  |         builder: (context, child) { | ||||||
|  |           return Scaffold( | ||||||
|  |             appBar: CustomAppBar( | ||||||
|  |                 height: SizeConfig.height * .1, title: 'Select Bank'), | ||||||
|  |             body: Container( | ||||||
|  |               padding: const EdgeInsets.symmetric(horizontal: 16.0), | ||||||
|  |               child: Consumer<SubmissionDataViewModel>( | ||||||
|  |                   builder: (context, provider, child) { | ||||||
|  |                 return Column( | ||||||
|  |                   children: [ | ||||||
|  |                     Row( | ||||||
|  |                       mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |                       children: [ | ||||||
|  |                         ImageView( | ||||||
|  |                           image: PathAssets.imgGuideBank, | ||||||
|  |                           width: SizeConfig.width * .35, | ||||||
|  |                         ), | ||||||
|  |                         Expanded( | ||||||
|  |                           child: Text( | ||||||
|  |                             'Make sure the bank you choose is a bank account in your own name ', | ||||||
|  |                             style: textTheme.bodyLarge, | ||||||
|  |                           ), | ||||||
|  |                         ) | ||||||
|  |                       ], | ||||||
|  |                     ), | ||||||
|  |                     TextFormView( | ||||||
|  |                       name: '', | ||||||
|  |                       hintText: 'Search bank', | ||||||
|  |                       ctrl: provider.ctrlBankNameSearch, | ||||||
|  |                       contentPadding: const EdgeInsets.symmetric(vertical: 0), | ||||||
|  |                       prefixIcon: const Icon( | ||||||
|  |                         Icons.search, | ||||||
|  |                         color: ColorPalette.slate500, | ||||||
|  |                       ), | ||||||
|  |                     ), | ||||||
|  |                     Expanded( | ||||||
|  |                       child: SingleChildScrollView( | ||||||
|  |                         child: Column( | ||||||
|  |                           children: provider.listBank.asMap().entries.map((e) { | ||||||
|  |                             bool selectedBank = | ||||||
|  |                                 e.key.toString() == provider.idx; | ||||||
|  |                             return Card( | ||||||
|  |                               elevation: 0, | ||||||
|  |                               color: selectedBank | ||||||
|  |                                   ? ColorPalette.blue50 | ||||||
|  |                                   : Colors.white, | ||||||
|  |                               shape: const RoundedRectangleBorder( | ||||||
|  |                                 borderRadius: | ||||||
|  |                                     BorderRadius.all(Radius.circular(12)), | ||||||
|  |                               ), | ||||||
|  |                               child: ListTile( | ||||||
|  |                                 title: Text( | ||||||
|  |                                   e.value.text, | ||||||
|  |                                   style: TextStyle( | ||||||
|  |                                     fontSize: 16, | ||||||
|  |                                     fontWeight: FontWeight.w600, | ||||||
|  |                                     color: selectedBank | ||||||
|  |                                         ? ColorPalette.primary | ||||||
|  |                                         : ColorPalette.slate500, | ||||||
|  |                                   ), | ||||||
|  |                                 ), | ||||||
|  |                                 onTap: () { | ||||||
|  |                                   provider.changeBank(e.key.toString()); | ||||||
|  |                                   provider.selectBank(e.value.text); | ||||||
|  |                                 }, | ||||||
|  |                               ), | ||||||
|  |                             ); | ||||||
|  |                           }).toList(), | ||||||
|  |                         ), | ||||||
|  |                       ), | ||||||
|  |                     ), | ||||||
|  |                     ButtonView( | ||||||
|  |                       name: 'Select', | ||||||
|  |                       marginVertical: 8.0, | ||||||
|  |                       onPressed: () { | ||||||
|  |                         onSelect(provider.valueBank); | ||||||
|  |                         Navigator.pop(context); | ||||||
|  |                       }, | ||||||
|  |                     ), | ||||||
|  |                   ], | ||||||
|  |                 ); | ||||||
|  |               }), | ||||||
|  |             ), | ||||||
|  |           ); | ||||||
|  |         }); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,13 +1,13 @@ | |||||||
| 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/image/image_view.dart'; | import 'package:cims_apps/application/component/image/image_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/application/component/text_form/text_form_view.dart'; | import 'package:cims_apps/application/component/text_form/text_form_view.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'; | ||||||
| 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/data_bank/guide_screen.dart'; | import 'package:cims_apps/features/auth/registration/view/submission_data/data_bank/guide_screen.dart'; | ||||||
|  | import 'package:cims_apps/features/auth/registration/view/submission_data/data_bank/list_bank_view.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'; | ||||||
| import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||||
| @@ -19,6 +19,40 @@ class SubmitBankAccount extends StatelessWidget { | |||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|  |     showSearchBank(TextEditingController valueCtrl) { | ||||||
|  |       showModalBottomSheet( | ||||||
|  |         context: context, | ||||||
|  |         isScrollControlled: true, | ||||||
|  |         enableDrag: false, | ||||||
|  |         shape: const RoundedRectangleBorder( | ||||||
|  |           borderRadius: BorderRadius.vertical( | ||||||
|  |             top: Radius.zero, | ||||||
|  |           ), | ||||||
|  |         ), | ||||||
|  |         builder: (BuildContext context) { | ||||||
|  |           return StatefulBuilder( | ||||||
|  |             builder: (context, setState) { | ||||||
|  |               var flutterView = View.of(context); | ||||||
|  |               return Padding( | ||||||
|  |                 padding: EdgeInsets.only( | ||||||
|  |                   top: MediaQueryData.fromView( | ||||||
|  |                     flutterView, | ||||||
|  |                   ).padding.top, | ||||||
|  |                 ), | ||||||
|  |                 child: ListBankView( | ||||||
|  |                   onSelect: (value) { | ||||||
|  |                     setState(() { | ||||||
|  |                       valueCtrl.text = value; | ||||||
|  |                     }); | ||||||
|  |                   }, | ||||||
|  |                 ), | ||||||
|  |               ); | ||||||
|  |             }, | ||||||
|  |           ); | ||||||
|  |         }, | ||||||
|  |       ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return MultiProvider( |     return MultiProvider( | ||||||
|         providers: [ |         providers: [ | ||||||
|           ChangeNotifierProvider( |           ChangeNotifierProvider( | ||||||
| @@ -29,22 +63,44 @@ 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( | ||||||
|  |                 height: SizeConfig.height * .8, | ||||||
|  |                 child: Form( | ||||||
|  |                   key: provider.formKeySubmitDataBank, | ||||||
|                   child: Column( |                   child: Column( | ||||||
|                     crossAxisAlignment: CrossAxisAlignment.start, |                     crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                     mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                     children: [ |                     children: [ | ||||||
|                       const TextCaption(title: 'Input your bank account data'), |                       const TextCaption(title: 'Input your bank account data'), | ||||||
|                     SelectFormView( |                       TextFormView( | ||||||
|                         name: 'Bank Name', |                         name: 'Bank Name', | ||||||
|                       hintText: 'Select Bank', |                         hintText: 'Select bank', | ||||||
|                       listItem: provider.listBank, |                         readOnly: true, | ||||||
|                         ctrl: provider.ctrlBankName, |                         ctrl: provider.ctrlBankName, | ||||||
|                       onSelect: (value) {}, |                         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, | ||||||
|  |                         validator: (value) { | ||||||
|  |                           if (value!.isEmpty) { | ||||||
|  |                             return 'Field must be filled'; | ||||||
|  |                           } | ||||||
|  |                           return null; | ||||||
|  |                         }, | ||||||
|                         trailingTitleWidget: SizedBox( |                         trailingTitleWidget: SizedBox( | ||||||
|                           width: 24, |                           width: 24, | ||||||
|                           child: GestureDetector( |                           child: GestureDetector( | ||||||
| @@ -59,6 +115,13 @@ class SubmitBankAccount extends StatelessWidget { | |||||||
|                       TextFormView( |                       TextFormView( | ||||||
|                         name: 'Account Owner Name', |                         name: 'Account Owner Name', | ||||||
|                         hintText: 'Input Account Name', |                         hintText: 'Input Account Name', | ||||||
|  |                         ctrl: provider.ctrlNameAccountBank, | ||||||
|  |                         validator: (value) { | ||||||
|  |                           if (value!.isEmpty) { | ||||||
|  |                             return 'Field must be filled'; | ||||||
|  |                           } | ||||||
|  |                           return null; | ||||||
|  |                         }, | ||||||
|                       ), |                       ), | ||||||
|                       const Text( |                       const Text( | ||||||
|                         "Make sure the account you use is in your name, not someone else's", |                         "Make sure the account you use is in your name, not someone else's", | ||||||
| @@ -70,16 +133,29 @@ class SubmitBankAccount extends StatelessWidget { | |||||||
|                       ButtonView( |                       ButtonView( | ||||||
|                         name: 'Next', |                         name: 'Next', | ||||||
|                         onPressed: () { |                         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) { |                               provider.next(context).then((value) { | ||||||
|                                 if (value) { |                                 if (value) { | ||||||
|                                   routePush(context, |                                   routePush(context, | ||||||
|                                 page: const ConfirmBankAccount()); |                                       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,21 +67,33 @@ 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', | ||||||
|                   children: [ |                   leading: BackButtonView( | ||||||
|                     Column( |                     onPress: () { | ||||||
|  |                       routePush( | ||||||
|  |                         context, | ||||||
|  |                         page: const BottomNavigationView(), | ||||||
|  |                         routeType: RouteType.pushReplace, | ||||||
|  |                       ); | ||||||
|  |                     }, | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |                 body: Column( | ||||||
|                   crossAxisAlignment: CrossAxisAlignment.start, |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                   mainAxisAlignment: MainAxisAlignment.spaceBetween, |                   mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                   children: [ |                   children: [ | ||||||
| @@ -89,8 +102,7 @@ class _SubmissionParentState extends State<SubmissionParent> { | |||||||
|                           horizontal: 16.0, vertical: 16.0), |                           horizontal: 16.0, vertical: 16.0), | ||||||
|                       child: Row( |                       child: Row( | ||||||
|                         mainAxisAlignment: MainAxisAlignment.spaceBetween, |                         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                             children: |                         children: List.generate(provider.stepAmount, (index) { | ||||||
|                                 List.generate(provider.stepAmount, (index) { |  | ||||||
|                           return _stepItem( |                           return _stepItem( | ||||||
|                             isCurrentStep: |                             isCurrentStep: | ||||||
|                                 provider.getCurrentStep == index + 1 || |                                 provider.getCurrentStep == index + 1 || | ||||||
| @@ -100,16 +112,13 @@ class _SubmissionParentState extends State<SubmissionParent> { | |||||||
|                       ), |                       ), | ||||||
|                     ), |                     ), | ||||||
|                     Expanded( |                     Expanded( | ||||||
|                           child: Container( |                       child: SingleChildScrollView( | ||||||
|                             padding: |                         padding: const EdgeInsets.symmetric(horizontal: 16.0), | ||||||
|                                 const EdgeInsets.symmetric(horizontal: 16.0), |  | ||||||
|                         child: _content(provider.getCurrentStep), |                         child: _content(provider.getCurrentStep), | ||||||
|                       ), |                       ), | ||||||
|                     ), |                     ), | ||||||
|                   ], |                   ], | ||||||
|                 ), |                 ), | ||||||
|                   ], |  | ||||||
|                 ), |  | ||||||
|               ); |               ); | ||||||
|             }), |             }), | ||||||
|           ); |           ); | ||||||
|   | |||||||
| @@ -176,7 +176,9 @@ 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( | ||||||
|  |                 key: provider.formKeySubmitIdCard, | ||||||
|  |                 child: Column( | ||||||
|                   crossAxisAlignment: CrossAxisAlignment.start, |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                   children: [ |                   children: [ | ||||||
|                     const TextCaption( |                     const TextCaption( | ||||||
| @@ -184,14 +186,35 @@ class SubmitDataIdCard extends StatelessWidget { | |||||||
|                     TextFormView( |                     TextFormView( | ||||||
|                       name: 'NIK', |                       name: 'NIK', | ||||||
|                       keyboardType: TextInputType.number, |                       keyboardType: TextInputType.number, | ||||||
|  |                       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; | ||||||
|  |                       }, | ||||||
|                     ), |                     ), | ||||||
|                   TextFormView(name: 'Full Name'), |  | ||||||
|                     DatePickerView( |                     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, | ||||||
|  |                       validatorDate: (value) { | ||||||
|  |                         if (value!.isEmpty) { | ||||||
|  |                           return 'Field must be filled'; | ||||||
|  |                         } | ||||||
|  |                         return null; | ||||||
|  |                       }, | ||||||
|  |                     ), | ||||||
|                     photoDocument(provider), |                     photoDocument(provider), | ||||||
|                     Container( |                     Container( | ||||||
|                       width: SizeConfig.width, |                       width: SizeConfig.width, | ||||||
| @@ -241,14 +264,19 @@ class SubmitDataIdCard extends StatelessWidget { | |||||||
|                     ButtonView( |                     ButtonView( | ||||||
|                       name: 'Next', |                       name: 'Next', | ||||||
|                       onPressed: () async { |                       onPressed: () async { | ||||||
|  |                         if (provider.formKeySubmitIdCard.currentState! | ||||||
|  |                             .validate()) { | ||||||
|                           await provider.next(context).then((value) { |                           await provider.next(context).then((value) { | ||||||
|                             if (value) { |                             if (value) { | ||||||
|                           routePush(context, page: const SubmissionParent()); |                               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; | ||||||
|  |     return Padding( | ||||||
|  |       padding: const EdgeInsets.all(24.0), | ||||||
|  |       child: Column( | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|         children: [ |         children: [ | ||||||
|  |           const TextCaption(title: 'Check your e-mail'), | ||||||
|           const ImageView(image: PathAssets.imgEmail), |           const ImageView(image: PathAssets.imgEmail), | ||||||
|           Align( |           Align( | ||||||
|             alignment: Alignment.center, |             alignment: Alignment.center, | ||||||
|             child: RichText( |             child: RichText( | ||||||
|               textAlign: TextAlign.center, |               textAlign: TextAlign.center, | ||||||
|               text: TextSpan(children: [ |               text: TextSpan(children: [ | ||||||
|               const TextSpan( |                 TextSpan( | ||||||
|                   text: |                   text: | ||||||
|                       'We have sent a verification link to your e-mail. \nPlease check your email for ', |                       'We have sent a verification link to your e-mail. \nPlease check your email for ', | ||||||
|                 style: TextStyle( |                   style: textTheme.displayMedium, | ||||||
|                   color: Colors.black, |  | ||||||
|                   decoration: TextDecoration.none, |  | ||||||
|                 ), |  | ||||||
|                 ), |                 ), | ||||||
|                 TextSpan( |                 TextSpan( | ||||||
|                 recognizer: TapGestureRecognizer()..onTap = () {}, |                   recognizer: TapGestureRecognizer() | ||||||
|  |                     ..onTap = () async { | ||||||
|  |                       await provider.next(context).then((value) { | ||||||
|  |                         if (value) { | ||||||
|  |                           routePush(context, page: const SubmissionParent()); | ||||||
|  |                         } | ||||||
|  |                       }); | ||||||
|  |                     }, | ||||||
|                   text: 'verification', |                   text: 'verification', | ||||||
|                   style: const TextStyle( |                   style: const TextStyle( | ||||||
|                     color: Colors.blue, |                     color: Colors.blue, | ||||||
|                   ), |                   ), | ||||||
|                 ), |                 ), | ||||||
|               const TextSpan( |                 TextSpan( | ||||||
|                   text: ' to \ncontinue registration.', |                   text: ' to \ncontinue registration.', | ||||||
|                 style: TextStyle( |                   style: textTheme.displayMedium, | ||||||
|                   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,16 +89,16 @@ 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( | ||||||
|  |               height: SizeConfig.height * .78, | ||||||
|  |               child: Form( | ||||||
|  |                 key: provider.formKeySubmitEmail, | ||||||
|                 child: Column( |                 child: Column( | ||||||
|                   crossAxisAlignment: CrossAxisAlignment.start, |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                 // mainAxisAlignment: MainAxisAlignment.spaceBetween, |                   mainAxisAlignment: MainAxisAlignment.spaceAround, | ||||||
|                   children: [ |                   children: [ | ||||||
|                   !provider.isEmailVerify |                     const TextCaption(title: 'Enter your e-mail'), | ||||||
|                       ? const TextCaption(title: 'Enter your e-mail') |                     TextFormView( | ||||||
|                       : const TextCaption(title: 'Check your e-mail '), |  | ||||||
|                   !provider.isEmailVerify |  | ||||||
|                       ? 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, | ||||||
| @@ -82,24 +111,20 @@ class SubmitEmail extends StatelessWidget { | |||||||
|                           return null; |                           return null; | ||||||
|                         } |                         } | ||||||
|                       }, |                       }, | ||||||
|                           // onTap: () { |                     ), | ||||||
|                           //   provider.submitEmail(); |                     SizedBox(height: SizeConfig.height * .43), | ||||||
|                           // }, |  | ||||||
|                         ) |  | ||||||
|                       : _emailVerify(), |  | ||||||
|                   SizedBox(height: SizeConfig.height * .42), |  | ||||||
|                     ButtonView( |                     ButtonView( | ||||||
|                       name: 'Next', |                       name: 'Next', | ||||||
|                       onPressed: () async { |                       onPressed: () async { | ||||||
|                       await provider.next(context).then((value) { |                         if (provider.formKeySubmitEmail.currentState! | ||||||
|                         if (value) { |                             .validate()) { | ||||||
|                           routePush(context, page: const SubmissionParent()); |                           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,15 +24,18 @@ 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( | ||||||
|  |               height: SizeConfig.height * .8, | ||||||
|  |               child: Column( | ||||||
|                 crossAxisAlignment: CrossAxisAlignment.start, |                 crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                 mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                 children: [ |                 children: [ | ||||||
|                   const TextCaption(title: 'Draw your digital sign'), |                   const TextCaption(title: 'Draw your digital sign'), | ||||||
|                   const ImageView(image: PathAssets.frameSignature), |                   const ImageView(image: PathAssets.frameSignature), | ||||||
|                   const ListTileView( |                   const ListTileView( | ||||||
|                       title: |                       title: | ||||||
|                           'Make sure the sign you draw is match with your ID Card'), |                           'Make sure the sign you draw is match with your ID Card'), | ||||||
|                 SizedBox(height: SizeConfig.height * .07), |                   SizedBox(height: SizeConfig.height * .1), | ||||||
|                   ButtonView( |                   ButtonView( | ||||||
|                     name: 'Next', |                     name: 'Next', | ||||||
|                     onPressed: () { |                     onPressed: () { | ||||||
| @@ -44,6 +47,7 @@ class InitialSignature extends StatelessWidget { | |||||||
|                     }, |                     }, | ||||||
|                   ) |                   ) | ||||||
|                 ], |                 ], | ||||||
|  |               ), | ||||||
|             ); |             ); | ||||||
|           }); |           }); | ||||||
|         }); |         }); | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ import 'package:cims_apps/application/component/button/button_view.dart'; | |||||||
| import 'package:cims_apps/application/component/set_pin_view/set_pin_view.dart'; | import 'package:cims_apps/application/component/set_pin_view/set_pin_view.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'; | ||||||
|  | import 'package:cims_apps/core/utils/size_config.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'; | ||||||
| import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||||
| @@ -60,15 +61,11 @@ class TermsAndConditionView extends StatelessWidget { | |||||||
|                         ], |                         ], | ||||||
|                       ), |                       ), | ||||||
|                     ); |                     ); | ||||||
|                   }) |                   }), | ||||||
|                 ], |                   Consumer<SubmissionDataViewModel>( | ||||||
|               ), |  | ||||||
|             ), |  | ||||||
|             bottomNavigationBar: Consumer<SubmissionDataViewModel>( |  | ||||||
|                       builder: (context, provider, child) { |                       builder: (context, provider, child) { | ||||||
|               return Container( |                     return Padding( | ||||||
|                 height: 84, |                       padding: const EdgeInsets.only(top: 24.0), | ||||||
|                 padding: const EdgeInsets.symmetric(horizontal: 24), |  | ||||||
|                       child: Row( |                       child: Row( | ||||||
|                         children: [ |                         children: [ | ||||||
|                           Expanded( |                           Expanded( | ||||||
| @@ -77,7 +74,8 @@ class TermsAndConditionView extends StatelessWidget { | |||||||
|                             onPressed: () { |                             onPressed: () { | ||||||
|                               Navigator.pop(context); |                               Navigator.pop(context); | ||||||
|                             }, |                             }, | ||||||
|                       marginVertical: 16, |                             height: SizeConfig.height * .06, | ||||||
|  |                             marginVertical: 0, | ||||||
|                             backgroundColor: ColorPalette.white, |                             backgroundColor: ColorPalette.white, | ||||||
|                             textColor: ColorPalette.primary, |                             textColor: ColorPalette.primary, | ||||||
|                             isOutlined: true, |                             isOutlined: true, | ||||||
| @@ -96,11 +94,15 @@ class TermsAndConditionView extends StatelessWidget { | |||||||
|                                           submitPin: (context, pin) {}, |                                           submitPin: (context, pin) {}, | ||||||
|                                         )); |                                         )); | ||||||
|                                   }, |                                   }, | ||||||
|                             marginVertical: 16)) |                                   height: SizeConfig.height * .06, | ||||||
|  |                                   marginVertical: 0)) | ||||||
|                         ], |                         ], | ||||||
|                       ), |                       ), | ||||||
|                     ); |                     ); | ||||||
|                   }), |                   }), | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|           ); |           ); | ||||||
|         }); |         }); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -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,13 +15,21 @@ 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 ctrlBirthDate = TextEditingController(); |   TextEditingController ctrlBirthDate = TextEditingController(); | ||||||
|   int step = 1; |   int step = 1; | ||||||
|  |   String? idx; | ||||||
|  |   String valueBank = ''; | ||||||
|  |  | ||||||
|   List<ItemSelectForm> listOccupation = [ |   List<ItemSelectForm> listOccupation = [ | ||||||
|     ItemSelectForm('key1', 'Student'), |     ItemSelectForm('key1', 'Student'), | ||||||
| @@ -44,11 +53,13 @@ class SubmissionDataViewModel extends ChangeNotifier { | |||||||
|   ]; |   ]; | ||||||
|  |  | ||||||
|   List<ItemSelectForm> listBank = [ |   List<ItemSelectForm> listBank = [ | ||||||
|     ItemSelectForm('key1', 'BCA'), |     ItemSelectForm('0', 'BCA'), | ||||||
|     ItemSelectForm('key2', 'BRI'), |     ItemSelectForm('1', 'BRI'), | ||||||
|     ItemSelectForm('key3', 'BNI'), |     ItemSelectForm('2', 'BNI'), | ||||||
|     ItemSelectForm('key4', 'BANK MANDIRI'), |     ItemSelectForm('3', 'BANK MANDIRI'), | ||||||
|     ItemSelectForm('key5', 'CIMB NIAGA'), |     ItemSelectForm('4', 'CIMB NIAGA'), | ||||||
|  |     ItemSelectForm('5', 'PERMATA'), | ||||||
|  |     ItemSelectForm('6', 'BANK JATENG'), | ||||||
|   ]; |   ]; | ||||||
|  |  | ||||||
|   List<ItemSelectForm> listImg = [ |   List<ItemSelectForm> listImg = [ | ||||||
| @@ -105,4 +116,31 @@ class SubmissionDataViewModel extends ChangeNotifier { | |||||||
|     } |     } | ||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   changeBank(String key) { | ||||||
|  |     idx = key; | ||||||
|  |     notifyListeners(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   selectBank(String value) { | ||||||
|  |     valueBank = value; | ||||||
|  |     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; | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -44,7 +44,6 @@ class DashboardPublicView extends StatelessWidget { | |||||||
|           return Scaffold( |           return Scaffold( | ||||||
|             body: SingleChildScrollView( |             body: SingleChildScrollView( | ||||||
|               padding: const EdgeInsets.only( |               padding: const EdgeInsets.only( | ||||||
|                 top: 36.0, |  | ||||||
|                 bottom: 8.0, |                 bottom: 8.0, | ||||||
|                 left: 24.0, |                 left: 24.0, | ||||||
|                 right: 24.0, |                 right: 24.0, | ||||||
| @@ -55,11 +54,11 @@ class DashboardPublicView extends StatelessWidget { | |||||||
|                   crossAxisAlignment: CrossAxisAlignment.start, |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|                   mainAxisAlignment: MainAxisAlignment.spaceBetween, |                   mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                   children: [ |                   children: [ | ||||||
|  |                     SizedBox(height: SizeConfig.height * .06), | ||||||
|                     ImageView( |                     ImageView( | ||||||
|                       image: PathAssets.icon1, |                       image: PathAssets.icon1, | ||||||
|                       width: SizeConfig.width * .35, |                       width: SizeConfig.width * .35, | ||||||
|                     ), |                     ), | ||||||
|                     SizedBox(height: SizeConfig.height * .03), |  | ||||||
|                     Align( |                     Align( | ||||||
|                         alignment: Alignment.center, |                         alignment: Alignment.center, | ||||||
|                         heightFactor: 1, |                         heightFactor: 1, | ||||||
| @@ -68,7 +67,7 @@ class DashboardPublicView extends StatelessWidget { | |||||||
|                       alignment: Alignment.center, |                       alignment: Alignment.center, | ||||||
|                       child: ImageView( |                       child: ImageView( | ||||||
|                         image: PathAssets.imgDashboard, |                         image: PathAssets.imgDashboard, | ||||||
|                         width: SizeConfig.width * .7, |                         width: SizeConfig.width * .8, | ||||||
|                       ), |                       ), | ||||||
|                     ), |                     ), | ||||||
|                     Row( |                     Row( | ||||||
| @@ -106,7 +105,7 @@ class DashboardPublicView extends StatelessWidget { | |||||||
|                         provider.loginGoogle(context); |                         provider.loginGoogle(context); | ||||||
|                       }, |                       }, | ||||||
|                     ), |                     ), | ||||||
|                     SizedBox(height: SizeConfig.height * .07), |                     SizedBox(height: SizeConfig.height * .1), | ||||||
|                     Row( |                     Row( | ||||||
|                       mainAxisAlignment: MainAxisAlignment.spaceBetween, |                       mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                       children: [ |                       children: [ | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								lib/features/profile/model/list_menu_model.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,8 @@ | |||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
|  | class ListMenuModel { | ||||||
|  |   final String title, pathAsset; | ||||||
|  |   final Widget page; | ||||||
|  |   ListMenuModel( | ||||||
|  |       {required this.title, required this.pathAsset, required this.page}); | ||||||
|  | } | ||||||
| @@ -1,5 +1,8 @@ | |||||||
| 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/profile/model/list_menu_model.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
| class ProfileView extends StatelessWidget { | class ProfileView extends StatelessWidget { | ||||||
| @@ -7,8 +10,110 @@ class ProfileView extends StatelessWidget { | |||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|  |     List<ListMenuModel> listMenuGeneral = [ | ||||||
|  |       ListMenuModel( | ||||||
|  |           title: 'Personal Data', | ||||||
|  |           pathAsset: PathAssets.iconProfile, | ||||||
|  |           page: Container()), | ||||||
|  |       ListMenuModel( | ||||||
|  |           title: 'Change Password', | ||||||
|  |           pathAsset: PathAssets.iconLock, | ||||||
|  |           page: Container()), | ||||||
|  |       ListMenuModel( | ||||||
|  |           title: 'Add Card', pathAsset: PathAssets.iconCard, page: Container()), | ||||||
|  |       ListMenuModel( | ||||||
|  |           title: 'Settings', | ||||||
|  |           pathAsset: PathAssets.iconSetting, | ||||||
|  |           page: Container()), | ||||||
|  |     ]; | ||||||
|  |  | ||||||
|  |     List<ListMenuModel> listMenuPreferences = [ | ||||||
|  |       ListMenuModel( | ||||||
|  |           title: 'FAQs', pathAsset: PathAssets.iconChat, page: Container()), | ||||||
|  |       ListMenuModel( | ||||||
|  |           title: 'Log Out', | ||||||
|  |           pathAsset: PathAssets.iconLogout, | ||||||
|  |           page: Container()), | ||||||
|  |     ]; | ||||||
|  |     TextStyle textStyle = const TextStyle( | ||||||
|  |       fontSize: 20, | ||||||
|  |       fontWeight: FontWeight.bold, | ||||||
|  |       color: Colors.white, | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     Widget cardContent( | ||||||
|  |         {required String title, required List<ListMenuModel> listMenu}) { | ||||||
|  |       return Container( | ||||||
|  |         width: SizeConfig.width, | ||||||
|  |         padding: const EdgeInsets.all(16.0), | ||||||
|  |         decoration: const BoxDecoration( | ||||||
|  |             color: Colors.white, | ||||||
|  |             borderRadius: BorderRadius.all(Radius.circular(12))), | ||||||
|  |         child: Column( | ||||||
|  |           crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |           children: [ | ||||||
|  |             Text(title), | ||||||
|  |             ...listMenu.map((e) { | ||||||
|  |               return Padding( | ||||||
|  |                 padding: const EdgeInsets.only(top: 8.0), | ||||||
|  |                 child: ListTile( | ||||||
|  |                   title: Text(e.title), | ||||||
|  |                   contentPadding: EdgeInsets.zero, | ||||||
|  |                   leading: ImageView( | ||||||
|  |                       image: e.pathAsset, width: SizeConfig.width * .08), | ||||||
|  |                   trailing: const Icon(Icons.arrow_forward_ios, | ||||||
|  |                       color: ColorPalette.slate400), | ||||||
|  |                   onTap: () { | ||||||
|  |                     // routePush(context, page: e.page); | ||||||
|  |                   }, | ||||||
|  |                 ), | ||||||
|  |               ); | ||||||
|  |             }), | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return Scaffold( |     return Scaffold( | ||||||
|       appBar: CustomAppBar(height: SizeConfig.height * .08, title: 'Profile'), |       appBar: null, | ||||||
|  |       body: Stack( | ||||||
|  |         children: [ | ||||||
|  |           ImageView(image: PathAssets.bgProfile, width: SizeConfig.width), | ||||||
|  |           Container( | ||||||
|  |             width: SizeConfig.width, | ||||||
|  |             padding: const EdgeInsets.only(top: 40.0, left: 16.0, right: 16.0), | ||||||
|  |             child: SingleChildScrollView( | ||||||
|  |               padding: const EdgeInsets.only(bottom: 60.0), | ||||||
|  |               child: Column( | ||||||
|  |                 crossAxisAlignment: CrossAxisAlignment.center, | ||||||
|  |                 children: [ | ||||||
|  |                   Text('Profile', style: textStyle), | ||||||
|  |                   Padding( | ||||||
|  |                     padding: const EdgeInsets.only(top: 40.0, bottom: 8.0), | ||||||
|  |                     child: ImageView( | ||||||
|  |                       image: PathAssets.imgCatOutlined, | ||||||
|  |                       width: SizeConfig.width * .28, | ||||||
|  |                     ), | ||||||
|  |                   ), | ||||||
|  |                   Text('Muhamad Rosyidin', | ||||||
|  |                       style: textStyle.copyWith(fontSize: 24)), | ||||||
|  |                   Text('Investor Conservative', | ||||||
|  |                       style: textStyle.copyWith( | ||||||
|  |                         fontSize: 16, | ||||||
|  |                         fontWeight: FontWeight.normal, | ||||||
|  |                         color: ColorPalette.green400, | ||||||
|  |                       )), | ||||||
|  |                   SizedBox(height: SizeConfig.height * .02), | ||||||
|  |                   cardContent(title: 'General', listMenu: listMenuGeneral), | ||||||
|  |                   SizedBox(height: SizeConfig.height * .03), | ||||||
|  |                   cardContent( | ||||||
|  |                       title: 'Preference', listMenu: listMenuPreferences), | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										51
									
								
								lib/features/transaction/view/cancel_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,51 @@ | |||||||
|  | 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/route/route.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/view/subscribe_detail_view.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.listCancelTransaction.isEmpty) | ||||||
|  |               EmptyCardTransaction( | ||||||
|  |                 onPressedButton: () {}, | ||||||
|  |               ), | ||||||
|  |             ...provider.listCancelTransaction.map((e) { | ||||||
|  |               return CardTransactionView( | ||||||
|  |                 onTap: () { | ||||||
|  |                   routePush(context, | ||||||
|  |                       page: const SubscribeDetailView( | ||||||
|  |                         type: 'virtual', | ||||||
|  |                       )); | ||||||
|  |                 }, | ||||||
|  |                 iconPath: PathAssets.iconEducation, | ||||||
|  |                 type: 'Education', | ||||||
|  |                 amount: NumberFormatter.numberCurrency( | ||||||
|  |                   6000000, | ||||||
|  |                   'Rp ', | ||||||
|  |                   'id_ID', | ||||||
|  |                   decimalDigits: 0, | ||||||
|  |                 ), | ||||||
|  |                 timeTransaction: StringUtils.formatTime(DateTime.now()), | ||||||
|  |                 subs: '3 Subscription', | ||||||
|  |                 step: 'cancel', | ||||||
|  |               ); | ||||||
|  |             }), | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										53
									
								
								lib/features/transaction/view/done_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,53 @@ | |||||||
|  | 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/route/route.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/view/subscribe_detail_view.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.listDoneTransaction.isEmpty) | ||||||
|  |                 EmptyCardTransaction( | ||||||
|  |                   onPressedButton: () {}, | ||||||
|  |                 ), | ||||||
|  |               ...provider.listDoneTransaction.map((e) { | ||||||
|  |                 return CardTransactionView( | ||||||
|  |                   onTap: () { | ||||||
|  |                     routePush(context, | ||||||
|  |                         page: const SubscribeDetailView( | ||||||
|  |                           type: 'virtual', | ||||||
|  |                         )); | ||||||
|  |                   }, | ||||||
|  |                   iconPath: PathAssets.iconEducation, | ||||||
|  |                   type: 'Education', | ||||||
|  |                   amount: NumberFormatter.numberCurrency( | ||||||
|  |                     6000000, | ||||||
|  |                     'Rp ', | ||||||
|  |                     'id_ID', | ||||||
|  |                     decimalDigits: 0, | ||||||
|  |                   ), | ||||||
|  |                   timeTransaction: StringUtils.formatTime(DateTime.now()), | ||||||
|  |                   subs: '3 Subscription', | ||||||
|  |                   step: 'done', | ||||||
|  |                 ); | ||||||
|  |               }), | ||||||
|  |             ], | ||||||
|  |           ); | ||||||
|  |         }, | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										50
									
								
								lib/features/transaction/view/onprocess_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,50 @@ | |||||||
|  | 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/route/route.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/view/subscribe_detail_view.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( | ||||||
|  |               onTap: () { | ||||||
|  |                 routePush(context, | ||||||
|  |                     page: const SubscribeDetailView( | ||||||
|  |                       type: 'virtual', | ||||||
|  |                     )); | ||||||
|  |               }, | ||||||
|  |               iconPath: PathAssets.iconHome, | ||||||
|  |               type: 'Home', | ||||||
|  |               amount: NumberFormatter.numberCurrency( | ||||||
|  |                 6000000, | ||||||
|  |                 'Rp ', | ||||||
|  |                 'id_ID', | ||||||
|  |                 decimalDigits: 0, | ||||||
|  |               ), | ||||||
|  |               timeTransaction: StringUtils.formatTime(DateTime.now()), | ||||||
|  |               subs: '3 Subscription', | ||||||
|  |               step: 'on process', | ||||||
|  |             ); | ||||||
|  |           }), | ||||||
|  |         ]); | ||||||
|  |       }), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										516
									
								
								lib/features/transaction/view/subscribe_detail_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,516 @@ | |||||||
|  | import 'package:cims_apps/application/assets/path_assets.dart'; | ||||||
|  | import 'package:cims_apps/application/component/button/back_button_view.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/application/component/list_tile/list_tile_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/string_utils.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
|  | class SubscribeDetailView extends StatelessWidget { | ||||||
|  |   final String type; | ||||||
|  |   const SubscribeDetailView({Key? key, required this.type}) : super(key: key); | ||||||
|  |  | ||||||
|  |   Widget _stepper( | ||||||
|  |     TextTheme textTheme, { | ||||||
|  |     required String description, | ||||||
|  |     String? date, | ||||||
|  |     time, | ||||||
|  |     bool isActive = false, | ||||||
|  |     bool isDone = false, | ||||||
|  |     bool isLast = false, | ||||||
|  |   }) { | ||||||
|  |     return Container( | ||||||
|  |       padding: const EdgeInsets.only(top: 8.0, left: 16.0), | ||||||
|  |       child: Row( | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |         children: [ | ||||||
|  |           Column( | ||||||
|  |             children: [ | ||||||
|  |               Padding( | ||||||
|  |                 padding: const EdgeInsets.only(left: 2.0, top: 8.0), | ||||||
|  |                 child: Icon( | ||||||
|  |                   Icons.circle_rounded, | ||||||
|  |                   size: 10, | ||||||
|  |                   color: isDone | ||||||
|  |                       ? ColorPalette.primary | ||||||
|  |                       : isActive | ||||||
|  |                           ? ColorPalette.primary | ||||||
|  |                           : ColorPalette.slate400, | ||||||
|  |                 ), | ||||||
|  |               ), | ||||||
|  |               if (!isLast) | ||||||
|  |                 ConstrainedBox( | ||||||
|  |                   constraints: BoxConstraints.expand( | ||||||
|  |                       height: SizeConfig.width * .2, width: 0.0), | ||||||
|  |                   child: Padding( | ||||||
|  |                     padding: const EdgeInsets.symmetric(vertical: 4.0), | ||||||
|  |                     child: VerticalDivider( | ||||||
|  |                       color: | ||||||
|  |                           isDone ? ColorPalette.primary : ColorPalette.slate400, | ||||||
|  |                       thickness: 2.0, | ||||||
|  |                     ), | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |             ], | ||||||
|  |           ), | ||||||
|  |           Padding( | ||||||
|  |             padding: const EdgeInsets.only(left: 16.0), | ||||||
|  |             child: Column( | ||||||
|  |               crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |               children: [ | ||||||
|  |                 Padding( | ||||||
|  |                   padding: const EdgeInsets.only(bottom: 8.0), | ||||||
|  |                   child: Text( | ||||||
|  |                     description, | ||||||
|  |                     style: TextStyle( | ||||||
|  |                       fontSize: 16, | ||||||
|  |                       fontWeight: FontWeight.w600, | ||||||
|  |                       color: isDone | ||||||
|  |                           ? Colors.black87 | ||||||
|  |                           : isActive | ||||||
|  |                               ? ColorPalette.primary | ||||||
|  |                               : ColorPalette.slate400, | ||||||
|  |                     ), | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |                 isDone | ||||||
|  |                     ? Row( | ||||||
|  |                         children: [ | ||||||
|  |                           Text(date ?? ''), | ||||||
|  |                           const Padding( | ||||||
|  |                             padding: EdgeInsets.symmetric(horizontal: 4.0), | ||||||
|  |                             child: Icon( | ||||||
|  |                               Icons.circle, | ||||||
|  |                               size: 6, | ||||||
|  |                               color: ColorPalette.slate400, | ||||||
|  |                             ), | ||||||
|  |                           ), | ||||||
|  |                           Text(time ?? ''), | ||||||
|  |                         ], | ||||||
|  |                       ) | ||||||
|  |                     : const SizedBox(), | ||||||
|  |               ], | ||||||
|  |             ), | ||||||
|  |           ) | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   Widget _listProduct(BuildContext context) { | ||||||
|  |     TextTheme textTheme = Theme.of(context).textTheme; | ||||||
|  |     return Padding( | ||||||
|  |       padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), | ||||||
|  |       child: Column( | ||||||
|  |         children: [ | ||||||
|  |           Row( | ||||||
|  |             children: [ | ||||||
|  |               ImageView( | ||||||
|  |                 image: PathAssets.imgProduct, | ||||||
|  |                 width: SizeConfig.width * .1, | ||||||
|  |               ), | ||||||
|  |               Padding( | ||||||
|  |                 padding: const EdgeInsets.only(left: 8.0), | ||||||
|  |                 child: Column( | ||||||
|  |                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                   children: [ | ||||||
|  |                     Text( | ||||||
|  |                       'Gemilang Dana Kas Maxima', | ||||||
|  |                       style: textTheme.headlineSmall, | ||||||
|  |                     ), | ||||||
|  |                     Container( | ||||||
|  |                         padding: const EdgeInsets.symmetric( | ||||||
|  |                             horizontal: 8.0, vertical: 2.0), | ||||||
|  |                         decoration: BoxDecoration( | ||||||
|  |                           color: ColorPalette.purple100, | ||||||
|  |                           border: Border.all( | ||||||
|  |                             width: 1, | ||||||
|  |                             color: ColorPalette.purple, | ||||||
|  |                           ), | ||||||
|  |                           borderRadius: | ||||||
|  |                               const BorderRadius.all(Radius.circular(24)), | ||||||
|  |                         ), | ||||||
|  |                         child: const Text( | ||||||
|  |                           'Money Market', | ||||||
|  |                           style: TextStyle( | ||||||
|  |                             color: ColorPalette.purple500, | ||||||
|  |                           ), | ||||||
|  |                         )), | ||||||
|  |                   ], | ||||||
|  |                 ), | ||||||
|  |               ), | ||||||
|  |             ], | ||||||
|  |           ), | ||||||
|  |           Padding( | ||||||
|  |             padding: const EdgeInsets.symmetric(vertical: 8.0), | ||||||
|  |             child: Row( | ||||||
|  |               mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |               children: [ | ||||||
|  |                 const Text('Investment Amount'), | ||||||
|  |                 Text( | ||||||
|  |                   'Rp 2.000.000', | ||||||
|  |                   style: textTheme.headlineSmall, | ||||||
|  |                 ), | ||||||
|  |               ], | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |           const Divider( | ||||||
|  |             color: ColorPalette.slate200, | ||||||
|  |           ), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   Widget _cardVA(BuildContext context) { | ||||||
|  |     return Container( | ||||||
|  |       margin: const EdgeInsets.only(top: 16.0, bottom: 8.0), | ||||||
|  |       padding: const EdgeInsets.only(bottom: 16.0), | ||||||
|  |       decoration: BoxDecoration( | ||||||
|  |         color: Colors.white, | ||||||
|  |         border: Border.all(width: 1, color: ColorPalette.slate200), | ||||||
|  |         borderRadius: const BorderRadius.all(Radius.circular(12)), | ||||||
|  |       ), | ||||||
|  |       child: Padding( | ||||||
|  |         padding: const EdgeInsets.symmetric(horizontal: 16.0), | ||||||
|  |         child: Column( | ||||||
|  |           crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |           children: [ | ||||||
|  |             SizedBox(height: SizeConfig.height * .02), | ||||||
|  |             RichText( | ||||||
|  |                 text: const TextSpan(children: [ | ||||||
|  |               TextSpan( | ||||||
|  |                 text: 'Transfer to  ', | ||||||
|  |                 style: TextStyle( | ||||||
|  |                   color: ColorPalette.slate400, | ||||||
|  |                   fontWeight: FontWeight.normal, | ||||||
|  |                 ), | ||||||
|  |               ), | ||||||
|  |               TextSpan( | ||||||
|  |                 text: 'ABC Virtual Account', | ||||||
|  |                 style: TextStyle( | ||||||
|  |                   color: ColorPalette.slate800, | ||||||
|  |                   fontWeight: FontWeight.bold, | ||||||
|  |                 ), | ||||||
|  |               ), | ||||||
|  |             ])), | ||||||
|  |             SizedBox(height: SizeConfig.height * .01), | ||||||
|  |             const Text( | ||||||
|  |               'Ferdy Maulana', | ||||||
|  |               style: TextStyle( | ||||||
|  |                 color: Colors.black87, | ||||||
|  |                 fontSize: 16, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |             ListTileView( | ||||||
|  |               title: '8785 0000 3165 5512', | ||||||
|  |               prefixIcon: const SizedBox(), | ||||||
|  |               padding: const EdgeInsets.only(right: 16.0), | ||||||
|  |               margin: const EdgeInsets.only(top: 8.0, bottom: 8.0), | ||||||
|  |               textStyle: const TextStyle( | ||||||
|  |                   fontWeight: FontWeight.bold, color: ColorPalette.primary), | ||||||
|  |               suffixIcon: ButtonView( | ||||||
|  |                 name: 'Copy', | ||||||
|  |                 width: SizeConfig.width * .3, | ||||||
|  |                 height: SizeConfig.height * .052, | ||||||
|  |                 sizeBorderRadius: 8.0, | ||||||
|  |                 widthPrefix: 8.0, | ||||||
|  |                 marginVertical: 10.0, | ||||||
|  |                 prefixIcon: const Icon( | ||||||
|  |                   Icons.file_copy_outlined, | ||||||
|  |                   color: Colors.white, | ||||||
|  |                   size: 20, | ||||||
|  |                 ), | ||||||
|  |                 onPressed: () { | ||||||
|  |                   StringUtils.iCopyToClipboard( | ||||||
|  |                     context, | ||||||
|  |                     text: '8785 0000 3165 5512', | ||||||
|  |                   ); | ||||||
|  |                 }, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |             const Divider(color: ColorPalette.slate200), | ||||||
|  |             const Text( | ||||||
|  |               'Amount to be transferred', | ||||||
|  |               style: TextStyle( | ||||||
|  |                 color: Colors.black87, | ||||||
|  |                 fontSize: 16, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |             ListTileView( | ||||||
|  |               title: 'Rp 10.000.000', | ||||||
|  |               prefixIcon: const SizedBox(), | ||||||
|  |               padding: const EdgeInsets.only(right: 16.0), | ||||||
|  |               margin: const EdgeInsets.only(top: 8.0), | ||||||
|  |               textStyle: const TextStyle( | ||||||
|  |                   fontWeight: FontWeight.bold, color: ColorPalette.primary), | ||||||
|  |               suffixIcon: ButtonView( | ||||||
|  |                 name: 'Copy', | ||||||
|  |                 width: SizeConfig.width * .3, | ||||||
|  |                 height: SizeConfig.height * .052, | ||||||
|  |                 sizeBorderRadius: 8.0, | ||||||
|  |                 widthPrefix: 8.0, | ||||||
|  |                 marginVertical: 10.0, | ||||||
|  |                 prefixIcon: const Icon( | ||||||
|  |                   Icons.file_copy_outlined, | ||||||
|  |                   color: Colors.white, | ||||||
|  |                   size: 20, | ||||||
|  |                 ), | ||||||
|  |                 onPressed: () { | ||||||
|  |                   StringUtils.iCopyToClipboard( | ||||||
|  |                     context, | ||||||
|  |                     text: '10.000.000', | ||||||
|  |                   ); | ||||||
|  |                 }, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   Widget _cardContent(BuildContext context) { | ||||||
|  |     TextTheme textTheme = Theme.of(context).textTheme; | ||||||
|  |     List mySteps = const [ | ||||||
|  |       { | ||||||
|  |         'desc': 'Payment Being Verified', | ||||||
|  |         'date': '07 Feb 2024 ', | ||||||
|  |         'time': '21:01', | ||||||
|  |         'isActive': false, | ||||||
|  |         'isDone': true, | ||||||
|  |         'isLast': false, | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         'desc': 'Successful Payment', | ||||||
|  |         'date': '07 Feb 2024 ', | ||||||
|  |         'time': '21:01', | ||||||
|  |         'isActive': true, | ||||||
|  |         'isDone': false, | ||||||
|  |         'isLast': false, | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         'desc': 'Investment Manager Verification', | ||||||
|  |         'date': '07 Feb 2024 ', | ||||||
|  |         'time': '21:01', | ||||||
|  |         'isActive': false, | ||||||
|  |         'isDone': false, | ||||||
|  |         'isLast': false, | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         'desc': 'Successful Purchase', | ||||||
|  |         'date': '07 Feb 2024 ', | ||||||
|  |         'time': '21:01', | ||||||
|  |         'isActive': false, | ||||||
|  |         'isDone': false, | ||||||
|  |         'isLast': true, | ||||||
|  |       }, | ||||||
|  |     ]; | ||||||
|  |  | ||||||
|  |     return SingleChildScrollView( | ||||||
|  |       padding: const EdgeInsets.symmetric(horizontal: 16.0), | ||||||
|  |       child: Column( | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |         children: [ | ||||||
|  |           Row( | ||||||
|  |             mainAxisAlignment: MainAxisAlignment.center, | ||||||
|  |             children: [ | ||||||
|  |               const Icon(Icons.access_time, color: ColorPalette.slate400), | ||||||
|  |               const Padding( | ||||||
|  |                 padding: EdgeInsets.symmetric(horizontal: 8.0), | ||||||
|  |                 child: Text('Waiting for Payment'), | ||||||
|  |               ), | ||||||
|  |               Text('23:56:42', style: textTheme.headlineSmall), | ||||||
|  |             ], | ||||||
|  |           ), | ||||||
|  |           type == 'virtual' ? _cardVA(context) : const SizedBox(), | ||||||
|  |           Padding( | ||||||
|  |             padding: const EdgeInsets.symmetric(vertical: 16.0), | ||||||
|  |             child: Text('Purchase Details', style: textTheme.headlineSmall), | ||||||
|  |           ), | ||||||
|  |           Container( | ||||||
|  |             margin: const EdgeInsets.symmetric(vertical: 8.0), | ||||||
|  |             padding: const EdgeInsets.only(bottom: 16.0), | ||||||
|  |             decoration: BoxDecoration( | ||||||
|  |               color: Colors.white, | ||||||
|  |               border: Border.all(width: 1, color: ColorPalette.slate200), | ||||||
|  |               borderRadius: const BorderRadius.all(Radius.circular(12)), | ||||||
|  |             ), | ||||||
|  |             child: ExpansionTile( | ||||||
|  |               shape: ShapeBorder.lerp( | ||||||
|  |                   const StadiumBorder(side: BorderSide.none), | ||||||
|  |                   InputBorder.none, | ||||||
|  |                   0), | ||||||
|  |               title: Row( | ||||||
|  |                 children: [ | ||||||
|  |                   ImageView( | ||||||
|  |                     image: PathAssets.iconEducation, | ||||||
|  |                     width: SizeConfig.width * .08, | ||||||
|  |                   ), | ||||||
|  |                   const Padding( | ||||||
|  |                     padding: EdgeInsets.only(left: 8.0), | ||||||
|  |                     child: Text('Education'), | ||||||
|  |                   ), | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|  |               subtitle: Padding( | ||||||
|  |                 padding: const EdgeInsets.only(left: 40.0), | ||||||
|  |                 child: Text('3 Subscriptions', style: textTheme.bodyMedium), | ||||||
|  |               ), | ||||||
|  |               children: [ | ||||||
|  |                 _listProduct(context), | ||||||
|  |                 _listProduct(context), | ||||||
|  |               ], | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |           ...mySteps.map((e) { | ||||||
|  |             return _stepper( | ||||||
|  |               textTheme, | ||||||
|  |               description: '${e['desc']}', | ||||||
|  |               date: e['date'], | ||||||
|  |               time: e['time'], | ||||||
|  |               isActive: e['isActive'], | ||||||
|  |               isDone: e['isDone'], | ||||||
|  |               isLast: e['isLast'], | ||||||
|  |             ); | ||||||
|  |           }), | ||||||
|  |           Container( | ||||||
|  |               margin: const EdgeInsets.symmetric(vertical: 8.0), | ||||||
|  |               // padding: const EdgeInsets.only(bottom: 16.0), | ||||||
|  |               decoration: BoxDecoration( | ||||||
|  |                 color: Colors.white, | ||||||
|  |                 border: Border.all(width: 1, color: ColorPalette.slate200), | ||||||
|  |                 borderRadius: const BorderRadius.all(Radius.circular(12)), | ||||||
|  |               ), | ||||||
|  |               child: ExpansionTile( | ||||||
|  |                   shape: ShapeBorder.lerp( | ||||||
|  |                       const StadiumBorder(side: BorderSide.none), | ||||||
|  |                       InputBorder.none, | ||||||
|  |                       0), | ||||||
|  |                   title: Row( | ||||||
|  |                     children: [ | ||||||
|  |                       const Expanded( | ||||||
|  |                           child: Text('When Is My Purchase Complete?')), | ||||||
|  |                       ImageView( | ||||||
|  |                         image: PathAssets.imgExpandPurchase, | ||||||
|  |                         width: SizeConfig.width * .15, | ||||||
|  |                       ), | ||||||
|  |                     ], | ||||||
|  |                   ))), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return Scaffold( | ||||||
|  |       body: SizedBox( | ||||||
|  |         child: Stack( | ||||||
|  |           children: [ | ||||||
|  |             const ImageView(image: PathAssets.imgDashboardAccount), | ||||||
|  |             Column( | ||||||
|  |               children: [ | ||||||
|  |                 SizedBox(height: SizeConfig.height * .05), | ||||||
|  |                 Padding( | ||||||
|  |                   padding: const EdgeInsets.all(16.0), | ||||||
|  |                   child: Row( | ||||||
|  |                     mainAxisAlignment: MainAxisAlignment.start, | ||||||
|  |                     children: [ | ||||||
|  |                       BackButtonView( | ||||||
|  |                         onPress: () => Navigator.pop(context), | ||||||
|  |                       ), | ||||||
|  |                       const Padding( | ||||||
|  |                         padding: EdgeInsets.symmetric(horizontal: 80.0), | ||||||
|  |                         child: Text( | ||||||
|  |                           'Subscribe Detail', | ||||||
|  |                           style: TextStyle( | ||||||
|  |                             fontSize: 18, | ||||||
|  |                             color: Colors.white, | ||||||
|  |                             fontWeight: FontWeight.bold, | ||||||
|  |                           ), | ||||||
|  |                         ), | ||||||
|  |                       ), | ||||||
|  |                     ], | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |                 type == 'virtual' | ||||||
|  |                     ? const Padding( | ||||||
|  |                         padding: EdgeInsets.only(bottom: 8.0), | ||||||
|  |                         child: Text( | ||||||
|  |                           'Virtual Account', | ||||||
|  |                           style: TextStyle( | ||||||
|  |                             color: Colors.white, | ||||||
|  |                             fontSize: 16, | ||||||
|  |                           ), | ||||||
|  |                         ), | ||||||
|  |                       ) | ||||||
|  |                     : const SizedBox(), | ||||||
|  |                 Row( | ||||||
|  |                   mainAxisAlignment: MainAxisAlignment.center, | ||||||
|  |                   children: [ | ||||||
|  |                     ImageView( | ||||||
|  |                       image: PathAssets.imgProduct, | ||||||
|  |                       width: SizeConfig.width * .08, | ||||||
|  |                     ), | ||||||
|  |                     Padding( | ||||||
|  |                       padding: const EdgeInsets.only(left: 8.0), | ||||||
|  |                       child: Text( | ||||||
|  |                         type == 'virtual' ? 'ABC' : 'Shopping Pay', | ||||||
|  |                         style: const TextStyle( | ||||||
|  |                           fontWeight: FontWeight.bold, | ||||||
|  |                           color: Colors.white, | ||||||
|  |                         ), | ||||||
|  |                       ), | ||||||
|  |                     ), | ||||||
|  |                   ], | ||||||
|  |                 ), | ||||||
|  |                 const Padding( | ||||||
|  |                   padding: EdgeInsets.only(top: 8.0), | ||||||
|  |                   child: Row( | ||||||
|  |                     mainAxisAlignment: MainAxisAlignment.center, | ||||||
|  |                     children: [ | ||||||
|  |                       Text( | ||||||
|  |                         'No.Subscribe : ', | ||||||
|  |                         style: TextStyle( | ||||||
|  |                           fontWeight: FontWeight.normal, | ||||||
|  |                           color: Colors.white, | ||||||
|  |                         ), | ||||||
|  |                       ), | ||||||
|  |                       Text( | ||||||
|  |                         'PI9393084SDMI1', | ||||||
|  |                         style: TextStyle( | ||||||
|  |                           fontWeight: FontWeight.bold, | ||||||
|  |                           color: Colors.white, | ||||||
|  |                         ), | ||||||
|  |                       ), | ||||||
|  |                     ], | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |                 Expanded( | ||||||
|  |                   child: Container( | ||||||
|  |                     color: Colors.transparent, | ||||||
|  |                     width: SizeConfig.width, | ||||||
|  |                     padding: const EdgeInsets.only(top: 16.0), | ||||||
|  |                     child: Container( | ||||||
|  |                         margin: const EdgeInsets.only(top: 32.0), | ||||||
|  |                         padding: const EdgeInsets.only(top: 32.0), | ||||||
|  |                         decoration: const BoxDecoration( | ||||||
|  |                           color: Colors.white, | ||||||
|  |                           borderRadius: BorderRadius.only( | ||||||
|  |                               topLeft: Radius.circular(24), | ||||||
|  |                               topRight: Radius.circular(24)), | ||||||
|  |                         ), | ||||||
|  |                         child: _cardContent(context)), | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |               ], | ||||||
|  |             ) | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -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) { | ||||||
|  |     List<Tab> textTabs = const [ | ||||||
|  |       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( |           return Scaffold( | ||||||
|       appBar: CustomAppBar(height: SizeConfig.height * 0.08, title: 'Transaction'), |             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), | ||||||
|  |                                 )) | ||||||
|  |                               ], | ||||||
|  |                             ), | ||||||
|  |                           ), | ||||||
|  |                         ), | ||||||
|  |                       )), | ||||||
|  |                     ], | ||||||
|  |                   ) | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|           ); |           ); | ||||||
|  |         }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										49
									
								
								lib/features/transaction/view/waiting_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,49 @@ | |||||||
|  | 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/route/route.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/view/subscribe_detail_view.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: () { | ||||||
|  |                       routePush(context, | ||||||
|  |                           page: const SubscribeDetailView( | ||||||
|  |                             type: 'normal', | ||||||
|  |                           )); | ||||||
|  |                     }, | ||||||
|  |                     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 = [1]; | ||||||
|  |   List listDoneTransaction = []; | ||||||
|  |   List listCancelTransaction = []; | ||||||
|  | } | ||||||
| @@ -76,10 +76,8 @@ class MyApp extends StatelessWidget { | |||||||
|             secondary: const Color(0xFFFECDA6), |             secondary: const Color(0xFFFECDA6), | ||||||
|             onBackground: const Color(0xFFA9A9A9), |             onBackground: const Color(0xFFA9A9A9), | ||||||
|           ), |           ), | ||||||
|         bottomSheetTheme: BottomSheetThemeData( |           bottomSheetTheme: const BottomSheetThemeData( | ||||||
|           backgroundColor: Colors.white, |               backgroundColor: Colors.white, surfaceTintColor: Colors.white) | ||||||
|           surfaceTintColor: Colors.white |  | ||||||
|         ) |  | ||||||
|           // useMaterial3: true, |           // useMaterial3: true, | ||||||
|           ), |           ), | ||||||
|       initialRoute: initialRoute, |       initialRoute: initialRoute, | ||||||
|   | |||||||
| @@ -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 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||