Compare commits
	
		
			5 Commits
		
	
	
		
			f407eca735
			...
			d82d427bcc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d82d427bcc | |||
| e63e5588fb | |||
| ff1886cec1 | |||
| 1616f22925 | |||
| 0b754bf939 | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/icon-shield.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/icons/icon-shield.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.6 KiB | 
| @@ -14,6 +14,7 @@ class PathAssets { | |||||||
|   static const String iconPortofolioShares = 'assets/icons/icon-portofolio-shares.png'; |   static const String iconPortofolioShares = 'assets/icons/icon-portofolio-shares.png'; | ||||||
|   static const String iconPortofolioSharia = 'assets/icons/icon-portofolio-sharia.png'; |   static const String iconPortofolioSharia = 'assets/icons/icon-portofolio-sharia.png'; | ||||||
|   static const String iconPortofolioMoneyMarket = 'assets/icons/icon-portofolio-moneymarket.png'; |   static const String iconPortofolioMoneyMarket = 'assets/icons/icon-portofolio-moneymarket.png'; | ||||||
|  |   static const String iconShield = 'assets/icons/icon-shield.png'; | ||||||
|  |  | ||||||
|   /// IMAGE |   /// IMAGE | ||||||
|   static const String imgSplashLogo = 'assets/images/splash-logo.png'; |   static const String imgSplashLogo = 'assets/images/splash-logo.png'; | ||||||
|   | |||||||
							
								
								
									
										176
									
								
								lib/application/component/select_form/select_form_view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								lib/application/component/select_form/select_form_view.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | |||||||
|  | import 'package:cims_apps/application/component/button/button_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:flutter/material.dart'; | ||||||
|  |  | ||||||
|  | class ItemSelectForm { | ||||||
|  |   final String key; | ||||||
|  |   final String text; | ||||||
|  |   final String? description; | ||||||
|  |   final bool isOther; | ||||||
|  |   final String image; | ||||||
|  |  | ||||||
|  |   ItemSelectForm( | ||||||
|  |     this.key, | ||||||
|  |     this.text, { | ||||||
|  |     this.isOther = false, | ||||||
|  |     this.image = "", | ||||||
|  |     this.description, | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class SelectFormView extends StatelessWidget { | ||||||
|  |   final String name; | ||||||
|  |   final String? hintText; | ||||||
|  |   final TextStyle? hintTextStyle; | ||||||
|  |   final TextEditingController? ctrl; | ||||||
|  |   final Widget? bottomSheetTitle; | ||||||
|  |   final List<ItemSelectForm> listItem; | ||||||
|  |   final ValueChanged<String> onSelect; | ||||||
|  |   final FormFieldValidator<String>? validator; | ||||||
|  |   final _borderRadius = const Radius.circular(24); | ||||||
|  |   final bool? enabled; | ||||||
|  |   const SelectFormView( | ||||||
|  |       {Key? key, | ||||||
|  |       required this.name, | ||||||
|  |       this.hintText, | ||||||
|  |       this.hintTextStyle, | ||||||
|  |       this.ctrl, | ||||||
|  |       this.bottomSheetTitle, | ||||||
|  |       required this.listItem, | ||||||
|  |       required this.onSelect, | ||||||
|  |       this.validator, | ||||||
|  |       this.enabled}) | ||||||
|  |       : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     bottomSheet() { | ||||||
|  |       showModalBottomSheet<void>( | ||||||
|  |         context: context, | ||||||
|  |         shape: RoundedRectangleBorder( | ||||||
|  |           borderRadius: BorderRadius.only( | ||||||
|  |             topLeft: _borderRadius, | ||||||
|  |             topRight: _borderRadius, | ||||||
|  |           ), | ||||||
|  |         ), | ||||||
|  |         builder: (BuildContext context) { | ||||||
|  |           ItemSelectForm? selectedForm; | ||||||
|  |           String? selectedKey; | ||||||
|  |           if (listItem.isNotEmpty) { | ||||||
|  |             var res = listItem.where((element) => element.key == selectedKey); | ||||||
|  |             if (res.isNotEmpty) { | ||||||
|  |               selectedForm = res.first; | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |           return StatefulBuilder(builder: ( | ||||||
|  |             BuildContext context, | ||||||
|  |             StateSetter stateSetter, | ||||||
|  |           ) { | ||||||
|  |             return Container( | ||||||
|  |               height: SizeConfig.height * .45, | ||||||
|  |               padding: const EdgeInsets.all(16), | ||||||
|  |               child: Column( | ||||||
|  |                 crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                 children: [ | ||||||
|  |                   bottomSheetTitle ?? Container(), | ||||||
|  |                   // const SizedBox(height: 16), | ||||||
|  |                   Expanded( | ||||||
|  |                     child: SingleChildScrollView( | ||||||
|  |                       scrollDirection: Axis.vertical, | ||||||
|  |                       child: Column( | ||||||
|  |                         children: [ | ||||||
|  |                           ...listItem.map( | ||||||
|  |                             (e) => Card( | ||||||
|  |                               elevation: 0, | ||||||
|  |                               color: Colors.transparent, | ||||||
|  |                               shape: const RoundedRectangleBorder( | ||||||
|  |                                 side: BorderSide( | ||||||
|  |                                   color: ColorPalette.greyBorder, | ||||||
|  |                                 ), | ||||||
|  |                                 borderRadius: | ||||||
|  |                                     BorderRadius.all(Radius.circular(12)), | ||||||
|  |                               ), | ||||||
|  |                               child: ListTile( | ||||||
|  |                                 title: Text( | ||||||
|  |                                   e.text, | ||||||
|  |                                   style: const TextStyle( | ||||||
|  |                                     fontSize: 14, | ||||||
|  |                                   ), | ||||||
|  |                                 ), | ||||||
|  |                                 subtitle: e.description != null | ||||||
|  |                                     ? Text( | ||||||
|  |                                         e.description!, | ||||||
|  |                                         maxLines: 2, | ||||||
|  |                                         overflow: TextOverflow.ellipsis, | ||||||
|  |                                       ) | ||||||
|  |                                     : null, | ||||||
|  |                                 // trailing: const Icon( | ||||||
|  |                                 //   Icons.check_circle, | ||||||
|  |                                 //   color: ColorPalette.primary, | ||||||
|  |                                 // ), | ||||||
|  |                                 trailing: Radio( | ||||||
|  |                                   focusColor: ColorPalette.primary, | ||||||
|  |                                   activeColor: ColorPalette.primary, | ||||||
|  |                                   visualDensity: const VisualDensity( | ||||||
|  |                                     horizontal: VisualDensity.minimumDensity, | ||||||
|  |                                     vertical: VisualDensity.minimumDensity, | ||||||
|  |                                   ), | ||||||
|  |                                   materialTapTargetSize: | ||||||
|  |                                       MaterialTapTargetSize.shrinkWrap, | ||||||
|  |                                   value: e.key, | ||||||
|  |                                   groupValue: selectedKey, | ||||||
|  |                                   onChanged: (value) { | ||||||
|  |                                     // selectedForm = | ||||||
|  |                                     //     ItemSelectForm(e.key, e.text); | ||||||
|  |                                     // stateSetter(() { | ||||||
|  |                                     //   selectedKey = selectedForm!.key; | ||||||
|  |                                     // }); | ||||||
|  |                                   }, | ||||||
|  |                                 ), | ||||||
|  |                                 onTap: () { | ||||||
|  |                                   ctrl?.text = e.text; | ||||||
|  |                                   onSelect(e.key); | ||||||
|  |                                   Navigator.of(context).pop(); | ||||||
|  |                                 }, | ||||||
|  |                               ), | ||||||
|  |                             ), | ||||||
|  |                           ), | ||||||
|  |                         ], | ||||||
|  |                       ), | ||||||
|  |                     ), | ||||||
|  |                   ), | ||||||
|  |                   ButtonView( | ||||||
|  |                     name: 'Select', | ||||||
|  |                     marginVertical: 4.0, | ||||||
|  |                     onPressed: () { | ||||||
|  |                       // print('object $') | ||||||
|  |                     }, | ||||||
|  |                   ) | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|  |             ); | ||||||
|  |           }); | ||||||
|  |         }, | ||||||
|  |       ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return TextFormView( | ||||||
|  |       name: name, | ||||||
|  |       readOnly: true, | ||||||
|  |       enabled: enabled ?? true, | ||||||
|  |       onTap: () { | ||||||
|  |         if (listItem.isNotEmpty) bottomSheet(); | ||||||
|  |       }, | ||||||
|  |       validator: validator, | ||||||
|  |       hintText: hintText, | ||||||
|  |       hintTextStyle: hintTextStyle, | ||||||
|  |       ctrl: ctrl, | ||||||
|  |       suffixIcon: Icon( | ||||||
|  |         Icons.keyboard_arrow_down, | ||||||
|  |         size: SizeConfig.width * .07, | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -155,7 +155,7 @@ class TextFormView extends StatelessWidget { | |||||||
|             hintStyle: hintTextStyle ?? |             hintStyle: hintTextStyle ?? | ||||||
|                 const TextStyle( |                 const TextStyle( | ||||||
|                   fontSize: 14, |                   fontSize: 14, | ||||||
|                   color: Colors.grey, |                   color: ColorPalette.greyFont, | ||||||
|                   fontWeight: FontWeight.normal, |                   fontWeight: FontWeight.normal, | ||||||
|                 ), |                 ), | ||||||
|             isDense: true, |             isDense: true, | ||||||
| @@ -167,19 +167,19 @@ class TextFormView extends StatelessWidget { | |||||||
|             disabledBorder: OutlineInputBorder( |             disabledBorder: OutlineInputBorder( | ||||||
|               borderRadius: _borderRadius, |               borderRadius: _borderRadius, | ||||||
|               borderSide: BorderSide( |               borderSide: BorderSide( | ||||||
|                 color: disabledborderColor ?? ColorPalette.greyFont, |                 color: disabledborderColor ?? ColorPalette.greyBorder, | ||||||
|               ), |               ), | ||||||
|             ), |             ), | ||||||
|             enabledBorder: OutlineInputBorder( |             enabledBorder: OutlineInputBorder( | ||||||
|               borderRadius: _borderRadius, |               borderRadius: _borderRadius, | ||||||
|               borderSide: BorderSide( |               borderSide: BorderSide( | ||||||
|                 color: enabledborderColor ?? ColorPalette.greyBase, |                 color: enabledborderColor ?? ColorPalette.greyBorder, | ||||||
|               ), |               ), | ||||||
|             ), |             ), | ||||||
|             focusedBorder: OutlineInputBorder( |             focusedBorder: OutlineInputBorder( | ||||||
|               borderRadius: _borderRadius, |               borderRadius: _borderRadius, | ||||||
|               borderSide: BorderSide( |               borderSide: BorderSide( | ||||||
|                 color: focusedBorderColor ?? ColorPalette.greyBase, |                 color: focusedBorderColor ?? ColorPalette.greyBorder, | ||||||
|               ), |               ), | ||||||
|             ), |             ), | ||||||
|             border: OutlineInputBorder(borderRadius: _borderRadius), |             border: OutlineInputBorder(borderRadius: _borderRadius), | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ 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/core/route/route.dart'; | import 'package:cims_apps/core/route/route.dart'; | ||||||
| import 'package:cims_apps/features/auth/registration/view/initial_registration_step.dart'; | import 'package:cims_apps/features/auth/registration/view/initial_registration_step.dart'; | ||||||
| import 'package:cims_apps/features/bottom_navigation_view.dart'; |  | ||||||
| import 'package:flutter/gestures.dart'; | import 'package:flutter/gestures.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
| @@ -42,7 +41,7 @@ class RegistrationView extends StatelessWidget { | |||||||
|                     text: 'Already have an account? ', |                     text: 'Already have an account? ', | ||||||
|                     style: TextStyle( |                     style: TextStyle( | ||||||
|                       color: Colors.black, |                       color: Colors.black, | ||||||
|                       decoration: TextDecoration.underline, |                       decoration: TextDecoration.none, | ||||||
|                     ), |                     ), | ||||||
|                   ), |                   ), | ||||||
|                   TextSpan( |                   TextSpan( | ||||||
|   | |||||||
| @@ -0,0 +1,91 @@ | |||||||
|  | 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/application/component/text_caption/text_caption.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 InitialTakePhoto extends StatelessWidget { | ||||||
|  |   const InitialTakePhoto({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     List listImg = [ | ||||||
|  |       {'urlImg': PathAssets.imgKtpBlur, 'tag': 'Blurry Photo'}, | ||||||
|  |       {'urlImg': PathAssets.imgKtpLight, 'tag': 'Light Reflection'}, | ||||||
|  |       {'urlImg': PathAssets.imgKtpCropped, 'tag': 'Cropped Photo'}, | ||||||
|  |       {'urlImg': PathAssets.imgKtpClear, 'tag': 'Clear Photo'}, | ||||||
|  |     ]; | ||||||
|  |     return SizedBox( | ||||||
|  |       height: SizeConfig.height * .75, | ||||||
|  |       child: Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |         children: [ | ||||||
|  |           const TextCaption( | ||||||
|  |             title: 'Take a photo your ID card', | ||||||
|  |             subtitle: | ||||||
|  |                 'Make sure your photo is clearly legible for identity verification purposes', | ||||||
|  |           ), | ||||||
|  |           SizedBox( | ||||||
|  |             width: SizeConfig.height, | ||||||
|  |             child: Wrap( | ||||||
|  |               alignment: WrapAlignment.spaceBetween, | ||||||
|  |               spacing: 10, | ||||||
|  |               runSpacing: 10, | ||||||
|  |               children: List.generate(listImg.length, (index) { | ||||||
|  |                 final urlList = listImg[index]['urlImg']; | ||||||
|  |                 final tag = listImg[index]['tag']; | ||||||
|  |                 return Column( | ||||||
|  |                   children: [ | ||||||
|  |                     ImageView( | ||||||
|  |                       image: urlList, | ||||||
|  |                       width: SizeConfig.width * .42, | ||||||
|  |                     ), | ||||||
|  |                     const SizedBox( | ||||||
|  |                       height: 8, | ||||||
|  |                     ), | ||||||
|  |                     Text( | ||||||
|  |                       tag, | ||||||
|  |                       style: const TextStyle( | ||||||
|  |                           color: ColorPalette.slate800, | ||||||
|  |                           fontWeight: FontWeight.w600), | ||||||
|  |                     ), | ||||||
|  |                   ], | ||||||
|  |                 ); | ||||||
|  |               }), | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |           // const Spacer(), | ||||||
|  |           const Row( | ||||||
|  |             mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |             children: [ | ||||||
|  |               ImageView( | ||||||
|  |                 image: PathAssets.iconShield, | ||||||
|  |                 width: 20, | ||||||
|  |                 height: 22, | ||||||
|  |               ), | ||||||
|  |               SizedBox( | ||||||
|  |                 width: 8, | ||||||
|  |               ), | ||||||
|  |               Expanded( | ||||||
|  |                 child: Text( | ||||||
|  |                   'In accordance with OJK regulations, an ID card is required to purchase mutual funds.', | ||||||
|  |                   style: TextStyle( | ||||||
|  |                     fontWeight: FontWeight.w600, | ||||||
|  |                     color: ColorPalette.primary, | ||||||
|  |                   ), | ||||||
|  |                 ), | ||||||
|  |               ) | ||||||
|  |             ], | ||||||
|  |           ), | ||||||
|  |           ButtonView( | ||||||
|  |             name: 'Take a Photo', | ||||||
|  |             marginVertical: 16.0, | ||||||
|  |             onPressed: () {}, | ||||||
|  |           ) | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,9 +1,12 @@ | |||||||
| 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/theme/color_palette.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/auth/registration/view/submission_data/initial_take_photo.dart'; | ||||||
| import 'package:cims_apps/features/auth/registration/view/submission_data/submit_email.dart'; | import 'package:cims_apps/features/auth/registration/view/submission_data/submit_email.dart'; | ||||||
| import 'package:cims_apps/features/auth/registration/view/submission_data/submit_personal_data.dart'; | import 'package:cims_apps/features/auth/registration/view/submission_data/submit_personal_data.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 SubmissionParent extends StatefulWidget { | class SubmissionParent extends StatefulWidget { | ||||||
|   static const routeName = '/SubmissionParent'; |   static const routeName = '/SubmissionParent'; | ||||||
| @@ -14,20 +17,8 @@ class SubmissionParent extends StatefulWidget { | |||||||
| } | } | ||||||
|  |  | ||||||
| class _SubmissionParentState extends State<SubmissionParent> { | class _SubmissionParentState extends State<SubmissionParent> { | ||||||
|   int _currentStep = 1; |  | ||||||
|   final int _stepAmount = 9; |  | ||||||
|   Widget _stepItem({bool isCurrentStep = false, bool isDone = false}) { |   Widget _stepItem({bool isCurrentStep = false, bool isDone = false}) { | ||||||
|     return GestureDetector( |     return Container( | ||||||
|       onTap: () { |  | ||||||
|         setState(() { |  | ||||||
|           if (_currentStep > 1) { |  | ||||||
|             _currentStep--; |  | ||||||
|           } else if (_currentStep == 1) { |  | ||||||
|             _currentStep++; |  | ||||||
|           } |  | ||||||
|         }); |  | ||||||
|       }, |  | ||||||
|       child: Container( |  | ||||||
|       margin: const EdgeInsets.only(right: 4.0, left: 4.0), |       margin: const EdgeInsets.only(right: 4.0, left: 4.0), | ||||||
|       height: 6, |       height: 6, | ||||||
|       width: SizeConfig.width * .08, |       width: SizeConfig.width * .08, | ||||||
| @@ -37,7 +28,6 @@ class _SubmissionParentState extends State<SubmissionParent> { | |||||||
|             : ColorPalette.greyBorderNeutrals, |             : ColorPalette.greyBorderNeutrals, | ||||||
|         borderRadius: BorderRadius.circular(50), |         borderRadius: BorderRadius.circular(50), | ||||||
|       ), |       ), | ||||||
|       ), |  | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -48,9 +38,7 @@ class _SubmissionParentState extends State<SubmissionParent> { | |||||||
|       case 2: |       case 2: | ||||||
|         return const SubmitEmail(); |         return const SubmitEmail(); | ||||||
|       case 3: |       case 3: | ||||||
|         return Container( |         return const InitialTakePhoto(); | ||||||
|           child: Text("Step 3"), |  | ||||||
|         ); |  | ||||||
|       case 4: |       case 4: | ||||||
|         return Container( |         return Container( | ||||||
|           child: Text("Step 4"), |           child: Text("Step 4"), | ||||||
| @@ -80,14 +68,20 @@ class _SubmissionParentState extends State<SubmissionParent> { | |||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|  |     return ChangeNotifierProvider( | ||||||
|  |         create: (context) => SubmissionDataViewModel(), | ||||||
|  |         builder: (context, child) { | ||||||
|           return Scaffold( |           return Scaffold( | ||||||
|             appBar: AppBar( |             appBar: AppBar( | ||||||
|               title: const Text('Registration'), |               title: const Text('Registration'), | ||||||
|             ), |             ), | ||||||
|             body: Stack( |             body: Stack( | ||||||
|               children: [ |               children: [ | ||||||
|           Column( |                 Consumer<SubmissionDataViewModel>( | ||||||
|  |                     builder: (context, provider, child) { | ||||||
|  |                   return Column( | ||||||
|                     crossAxisAlignment: CrossAxisAlignment.start, |                     crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                     mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                     children: [ |                     children: [ | ||||||
|                       Padding( |                       Padding( | ||||||
|                         padding: const EdgeInsets.symmetric( |                         padding: const EdgeInsets.symmetric( | ||||||
| @@ -95,33 +89,37 @@ class _SubmissionParentState extends State<SubmissionParent> { | |||||||
|                         child: Row( |                         child: Row( | ||||||
|                           mainAxisAlignment: MainAxisAlignment.spaceBetween, |                           mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                           children: List.generate( |                           children: List.generate( | ||||||
|                     _stepAmount, |                             provider.stepAmount, | ||||||
|                             (index) => _stepItem( |                             (index) => _stepItem( | ||||||
|                       isCurrentStep: _currentStep == index + 1, |                               isCurrentStep: provider.currentStep == index + 1, | ||||||
|                             ), |                             ), | ||||||
|                           ), |                           ), | ||||||
|                         ), |                         ), | ||||||
|                       ), |                       ), | ||||||
|               Container( |                       Expanded( | ||||||
|  |                         child: Container( | ||||||
|                           padding: const EdgeInsets.symmetric(horizontal: 16.0), |                           padding: const EdgeInsets.symmetric(horizontal: 16.0), | ||||||
|                 child: _content(_currentStep), |                           child: _content(provider.currentStep), | ||||||
|               ) |  | ||||||
|             ], |  | ||||||
|                         ), |                         ), | ||||||
|           Align( |                       ), | ||||||
|  |                       provider.currentStep == 3 | ||||||
|  |                           ? const SizedBox() | ||||||
|  |                           : Align( | ||||||
|                               alignment: Alignment.bottomCenter, |                               alignment: Alignment.bottomCenter, | ||||||
|                               child: ButtonView( |                               child: ButtonView( | ||||||
|                                 name: 'Next', |                                 name: 'Next', | ||||||
|                                 marginVertical: 16.0, |                                 marginVertical: 16.0, | ||||||
|                                 onPressed: () { |                                 onPressed: () { | ||||||
|                 setState(() { |                                   provider.nextSubmission(context); | ||||||
|                   _currentStep++; |  | ||||||
|                 }); |  | ||||||
|                                 }, |                                 }, | ||||||
|                               ), |                               ), | ||||||
|                             ) |                             ) | ||||||
|                     ], |                     ], | ||||||
|  |                   ); | ||||||
|  |                 }), | ||||||
|  |               ], | ||||||
|             ), |             ), | ||||||
|           ); |           ); | ||||||
|  |         }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,21 +1,81 @@ | |||||||
|  | import 'package:cims_apps/application/assets/path_assets.dart'; | ||||||
|  | import 'package:cims_apps/application/component/image/image_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/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; | ||||||
|  | import 'package:flutter/gestures.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  | 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); | ||||||
|  |  | ||||||
|   @override |   Widget _emailVerify() { | ||||||
|   Widget build(BuildContext context) { |  | ||||||
|     return Column( |     return Column( | ||||||
|       crossAxisAlignment: CrossAxisAlignment.start, |  | ||||||
|       children: [ |       children: [ | ||||||
|         const TextCaption(title: 'Enter your e-mail'), |         const ImageView(image: PathAssets.imgEmail), | ||||||
|         TextFormView( |         Align( | ||||||
|           name: 'E-mail Address', |           alignment: Alignment.center, | ||||||
|           hintText: 'Input e-mail address', |           child: RichText( | ||||||
|  |             textAlign: TextAlign.center, | ||||||
|  |             text: TextSpan(children: [ | ||||||
|  |               const TextSpan( | ||||||
|  |                 text: | ||||||
|  |                     'We have sent a verification link to your e-mail. \nPlease check your email for ', | ||||||
|  |                 style: TextStyle( | ||||||
|  |                   color: Colors.black, | ||||||
|  |                   decoration: TextDecoration.none, | ||||||
|  |                 ), | ||||||
|  |               ), | ||||||
|  |               TextSpan( | ||||||
|  |                 recognizer: TapGestureRecognizer() | ||||||
|  |                   ..onTap = () { | ||||||
|  |                     print('object'); | ||||||
|  |                   }, | ||||||
|  |                 text: 'verification', | ||||||
|  |                 style: const TextStyle( | ||||||
|  |                   color: Colors.blue, | ||||||
|  |                 ), | ||||||
|  |               ), | ||||||
|  |               const TextSpan( | ||||||
|  |                 text: ' to \ncontinue registration.', | ||||||
|  |                 style: TextStyle( | ||||||
|  |                   color: Colors.black, | ||||||
|  |                   decoration: TextDecoration.none, | ||||||
|  |                 ), | ||||||
|  |               ), | ||||||
|  |             ]), | ||||||
|  |           ), | ||||||
|         ), |         ), | ||||||
|       ], |       ], | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return ChangeNotifierProvider( | ||||||
|  |         create: (context) => SubmissionDataViewModel(), | ||||||
|  |         builder: (context, child) { | ||||||
|  |           return Consumer<SubmissionDataViewModel>( | ||||||
|  |               builder: (context, provider, child) { | ||||||
|  |             return Column( | ||||||
|  |               crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |               children: [ | ||||||
|  |                 !provider.isEmailVerify | ||||||
|  |                     ? const TextCaption(title: 'Enter your e-mail') | ||||||
|  |                     : const TextCaption(title: 'Check your e-mail '), | ||||||
|  |                 !provider.isEmailVerify | ||||||
|  |                     ? TextFormView( | ||||||
|  |                         name: 'E-mail Address', | ||||||
|  |                         hintText: 'Input e-mail address', | ||||||
|  |                         onTap: () { | ||||||
|  |                           provider.submitEmail(); | ||||||
|  |                         }, | ||||||
|  |                       ) | ||||||
|  |                     : _emailVerify(), | ||||||
|  |               ], | ||||||
|  |             ); | ||||||
|  |           }); | ||||||
|  |         }); | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,16 +1,56 @@ | |||||||
|  | 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/theme/color_palette.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 SubmitPersonalData extends StatelessWidget { | class SubmitPersonalData extends StatelessWidget { | ||||||
|   const SubmitPersonalData({Key? key}) : super(key: key); |   const SubmitPersonalData({Key? key}) : super(key: key); | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return Column( |     List<ItemSelectForm> listForm = [ | ||||||
|  |       ItemSelectForm('key1', 'text'), | ||||||
|  |       ItemSelectForm('key2', 'text'), | ||||||
|  |       ItemSelectForm('key3', 'text'), | ||||||
|  |       ItemSelectForm('key4', 'text'), | ||||||
|  |       ItemSelectForm('key5', 'text'), | ||||||
|  |     ]; | ||||||
|  |     return ChangeNotifierProvider( | ||||||
|  |         create: (context) => SubmissionDataViewModel(), | ||||||
|  |         builder: (context, child) { | ||||||
|  |           return Consumer<SubmissionDataViewModel>( | ||||||
|  |               builder: (context, provider, child) { | ||||||
|  |             return SingleChildScrollView( | ||||||
|  |               child: Column( | ||||||
|                 crossAxisAlignment: CrossAxisAlignment.start, |                 crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                 // mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                 children: [ |                 children: [ | ||||||
|         TextCaption(title: 'Your personal details'), |                   const TextCaption(title: 'Your personal details'), | ||||||
|  |                   SelectFormView( | ||||||
|  |                     name: 'Occupation', | ||||||
|  |                     hintText: 'Select occupation ', | ||||||
|  |                     bottomSheetTitle: Row( | ||||||
|  |                       mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |                       children: [ | ||||||
|  |                         const Text('Occupation'), | ||||||
|  |                         IconButton( | ||||||
|  |                             onPressed: () => Navigator.pop(context), | ||||||
|  |                             icon: const Icon( | ||||||
|  |                               Icons.clear, | ||||||
|  |                               size: 20, | ||||||
|  |                               color: ColorPalette.greyBase, | ||||||
|  |                             )), | ||||||
|                       ], |                       ], | ||||||
|  |                     ), | ||||||
|  |                     listItem: listForm, | ||||||
|  |                     onSelect: (value) {}, | ||||||
|  |                   ), | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|             ); |             ); | ||||||
|  |           }); | ||||||
|  |         }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,31 @@ | |||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
|  | class SubmissionDataViewModel extends ChangeNotifier { | ||||||
|  |   int currentStep = 1; | ||||||
|  |   int stepAmount = 9; | ||||||
|  |   bool _isEmailVerify = false; | ||||||
|  |   bool get isEmailVerify => _isEmailVerify; | ||||||
|  |  | ||||||
|  |   submitEmail() { | ||||||
|  |     _isEmailVerify = !_isEmailVerify; | ||||||
|  |     notifyListeners(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   onWillPopSubmission(BuildContext context) { | ||||||
|  |     if (currentStep != 1) { | ||||||
|  |       currentStep--; | ||||||
|  |       notifyListeners(); | ||||||
|  |     } else { | ||||||
|  |       Navigator.of(context).pop(true); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   nextSubmission(BuildContext context) { | ||||||
|  |     if (currentStep < stepAmount) { | ||||||
|  |       currentStep++; | ||||||
|  |     } else { | ||||||
|  |       //ToDo : Go To next step after completing the submission | ||||||
|  |     } | ||||||
|  |     notifyListeners(); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -259,6 +259,14 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.10.0" |     version: "1.10.0" | ||||||
|  |   nested: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: nested | ||||||
|  |       sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "1.0.0" | ||||||
|   octo_image: |   octo_image: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -371,6 +379,14 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.7.4" |     version: "3.7.4" | ||||||
|  |   provider: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: provider | ||||||
|  |       sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "6.1.1" | ||||||
|   remove_emoji_input_formatter: |   remove_emoji_input_formatter: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|   | |||||||
| @@ -42,6 +42,8 @@ dependencies: | |||||||
|   fl_chart: ^0.65.0 |   fl_chart: ^0.65.0 | ||||||
|   intl: ^0.19.0 |   intl: ^0.19.0 | ||||||
|   carousel_slider: ^4.2.1 |   carousel_slider: ^4.2.1 | ||||||
|  |   provider: ^6.1.1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| dev_dependencies: | dev_dependencies: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user