From afc2bd3cc98063dd1359cb8acb5f839e4e516f31 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Mon, 19 Feb 2024 13:04:28 +0700 Subject: [PATCH 1/6] feat: set pin page --- assets/icons/icon-lock.png | Bin 0 -> 4555 bytes lib/application/assets/path_assets.dart | 1 + .../component/set_pin_view/set_pin_view.dart | 135 ++++++++++++++++++ .../set_pin_view/set_pin_viewmodel.dart | 9 ++ .../terms_and_condition_view.dart | 7 +- lib/main.dart | 32 +++++ 6 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 assets/icons/icon-lock.png create mode 100644 lib/application/component/set_pin_view/set_pin_view.dart create mode 100644 lib/application/component/set_pin_view/set_pin_viewmodel.dart diff --git a/assets/icons/icon-lock.png b/assets/icons/icon-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..6690e356b13549a11a259fced152a5757f863962 GIT binary patch literal 4555 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 SetPinViewModel(), + builder: (context, child) { + return Scaffold( + appBar: CustomAppBar( + height: SizeConfig.height * .1, title: 'Registration'), + body: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Consumer( + builder: (context, provider, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + children: List.generate( + 9, + (index) => _stepItem(isCurrentStep: true, isDone: true), + ), + ), + ImageView( + image: PathAssets.iconLock, + width: SizeConfig.width * .15, + ), + Text( + !provider.isPinCompleted + ? 'Set your PIN' + : 'Confirm your PIN', + style: textTheme.headlineLarge, + ), + Pinput( + onCompleted: (pin) { + if (!provider.isPinCompleted) { + provider.changePin(); + pinInputController.clear(); + } else { + routePush(context, + routeType: RouteType.pushReplace, + page: const RegistrationSuccessView()); + } + }, + keyboardType: TextInputType.number, + obscureText: true, + autofocus: true, + isCursorAnimationEnabled: false, + length: pinInputLength, + controller: pinInputController, + defaultPinTheme: defaultPinTheme, + focusNode: pInputFocusNode, + focusedPinTheme: focusedPinTheme, + submittedPinTheme: submittedPinTheme, + followingPinTheme: followingPinTheme, + ), + ], + ); + }), + ), + ); + }); + } +} diff --git a/lib/application/component/set_pin_view/set_pin_viewmodel.dart b/lib/application/component/set_pin_view/set_pin_viewmodel.dart new file mode 100644 index 0000000..d1142a0 --- /dev/null +++ b/lib/application/component/set_pin_view/set_pin_viewmodel.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; + +class SetPinViewModel extends ChangeNotifier { + bool isPinCompleted = false; + void changePin() { + isPinCompleted = !isPinCompleted; + notifyListeners(); + } +} diff --git a/lib/features/auth/registration/view/submission_data/terms_and_condition/terms_and_condition_view.dart b/lib/features/auth/registration/view/submission_data/terms_and_condition/terms_and_condition_view.dart index 88524b6..abe5406 100644 --- a/lib/features/auth/registration/view/submission_data/terms_and_condition/terms_and_condition_view.dart +++ b/lib/features/auth/registration/view/submission_data/terms_and_condition/terms_and_condition_view.dart @@ -1,8 +1,8 @@ import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; 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/theme/color_palette.dart'; import 'package:cims_apps/core/route/route.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:provider/provider.dart'; @@ -90,7 +90,10 @@ class TermsAndConditionView extends StatelessWidget { onPressed: () { provider.nextSubmission(context); routePush(context, - page: const SubmissionParent()); + page: SetPinView( + currentPin: '', + submitPin: (context, pin) {}, + )); }, marginVertical: 16)) ], diff --git a/lib/main.dart b/lib/main.dart index 2755a41..4d24d24 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -33,6 +33,38 @@ class MyApp extends StatelessWidget { )), fontFamily: 'Manrope', scaffoldBackgroundColor: Colors.white, + textTheme: const TextTheme( + headlineSmall: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: ColorPalette.slate800, + ), + headlineLarge: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: ColorPalette.slate800, + ), + displayMedium: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: ColorPalette.slate800, + ), + displayLarge: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: ColorPalette.slate800, + ), + bodyMedium: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: ColorPalette.slate500, + ), + bodyLarge: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: ColorPalette.slate500, + ), + ), colorScheme: const ColorScheme.light().copyWith( primary: const Color(0xff2563EB), onPrimary: const Color(0xFFFF9130), From 8e04b4e77eb2f9d19e1be718af5405f9be41e7bf Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Mon, 19 Feb 2024 13:28:42 +0700 Subject: [PATCH 2/6] fix: change app bar in initial sign up --- lib/application/component/otp/otp_view.dart | 7 +++---- .../view/registration_password_view.dart | 6 +++--- .../auth/registration/view/registration_view.dart | 14 ++++++++++---- .../view/dashboard_public_view.dart | 2 +- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/lib/application/component/otp/otp_view.dart b/lib/application/component/otp/otp_view.dart index 1ab57b0..8538e79 100644 --- a/lib/application/component/otp/otp_view.dart +++ b/lib/application/component/otp/otp_view.dart @@ -1,3 +1,4 @@ +import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; import 'package:cims_apps/application/component/otp/otp_viewmodel.dart'; import 'package:cims_apps/application/component/text_caption/text_caption.dart'; import 'package:cims_apps/application/theme/color_palette.dart'; @@ -112,10 +113,8 @@ class OtpView extends StatelessWidget { create: (context) => OtpViewModel(), builder: (context, child) { return Scaffold( - appBar: AppBar( - title: Text(title), - ), - body: Container( + appBar: CustomAppBar(height: SizeConfig.height * .1, title: title), + body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), child: Consumer(builder: (context, provider, child) { diff --git a/lib/features/auth/registration/view/registration_password_view.dart b/lib/features/auth/registration/view/registration_password_view.dart index 4210406..ce8d3ac 100644 --- a/lib/features/auth/registration/view/registration_password_view.dart +++ b/lib/features/auth/registration/view/registration_password_view.dart @@ -1,5 +1,6 @@ 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_caption/text_caption.dart'; import 'package:cims_apps/application/component/text_form/text_form_view.dart'; @@ -20,9 +21,8 @@ class RegistrationPasswordView extends StatelessWidget { create: (context) => RegistrationViewModel(), builder: (context, child) { return Scaffold( - appBar: AppBar( - title: const Text('Sign Up'), - ), + appBar: + CustomAppBar(height: SizeConfig.height * .1, title: 'Sign Up'), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), child: Consumer( diff --git a/lib/features/auth/registration/view/registration_view.dart b/lib/features/auth/registration/view/registration_view.dart index 04cdf85..4d7b29c 100644 --- a/lib/features/auth/registration/view/registration_view.dart +++ b/lib/features/auth/registration/view/registration_view.dart @@ -1,5 +1,6 @@ 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/otp/otp_view.dart'; import 'package:cims_apps/application/component/text_caption/text_caption.dart'; @@ -24,6 +25,11 @@ class RegistrationView extends StatelessWidget { context: context, isScrollControlled: true, enableDrag: false, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.zero, + ), + ), builder: (BuildContext context) { return Padding( padding: EdgeInsets.only( @@ -46,10 +52,9 @@ class RegistrationView extends StatelessWidget { create: (context) => RegistrationViewModel(), builder: (context, child) { return Scaffold( - appBar: AppBar( - title: const Text('Sign Up'), - ), - body: Container( + appBar: + CustomAppBar(height: SizeConfig.height * .1, title: 'Sign Up'), + body: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: Consumer( builder: (context, provider, child) { @@ -68,6 +73,7 @@ class RegistrationView extends StatelessWidget { inputFormatters: [ FilteringTextInputFormatter.deny(RegExp(r'^0')) ], + contentPadding: EdgeInsets.zero, prefixIcon: Container( width: SizeConfig.width * .23, padding: diff --git a/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart b/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart index 93bed19..8645822 100644 --- a/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart +++ b/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart @@ -38,7 +38,7 @@ class DashboardPublicView extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - body: Container( + body: SingleChildScrollView( padding: const EdgeInsets.only( top: 32.0, bottom: 8.0, From d66a9e34357b1e332f3d047dd18b7098d4972fc6 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Mon, 19 Feb 2024 13:40:38 +0700 Subject: [PATCH 3/6] fix: add validator password --- .../view/initial_registration_step.dart | 42 +++++++++++++------ .../view/registration_password_view.dart | 6 ++- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/lib/features/auth/registration/view/initial_registration_step.dart b/lib/features/auth/registration/view/initial_registration_step.dart index 7c0492c..c36cafe 100644 --- a/lib/features/auth/registration/view/initial_registration_step.dart +++ b/lib/features/auth/registration/view/initial_registration_step.dart @@ -1,10 +1,12 @@ 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/theme/color_palette.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/dashboard/dashboard_public/view/dashboard_public_view.dart'; import 'package:flutter/material.dart'; class InitialRegistrationStep extends StatelessWidget { @@ -92,12 +94,12 @@ class InitialRegistrationStep extends StatelessWidget { { 'desc': 'Personal Data', 'isActive': true, - 'isDone': true, + 'isDone': false, 'isLast': false, }, { 'desc': 'Email', - 'isActive': true, + 'isActive': false, 'isDone': false, 'isLast': false, }, @@ -146,9 +148,8 @@ class InitialRegistrationStep extends StatelessWidget { ]; return Scaffold( - appBar: AppBar( - title: const Text('Registration'), - ), + appBar: + CustomAppBar(height: SizeConfig.height * .1, title: 'Registration'), body: Container( padding: const EdgeInsets.symmetric(horizontal: 24.0), child: Column( @@ -175,7 +176,7 @@ class InitialRegistrationStep extends StatelessWidget { ], ), SizedBox( - height: SizeConfig.height * .6, + height: SizeConfig.height * .55, child: SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( @@ -192,12 +193,29 @@ class InitialRegistrationStep extends StatelessWidget { ), ), ), - ButtonView( - name: 'Let’s Start', - marginVertical: 8.0, - onPressed: () { - routePush(context, page: const SubmissionParent()); - }, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ButtonView( + name: 'Home Page', + marginVertical: 8.0, + width: SizeConfig.width * .42, + isOutlined: true, + onPressed: () { + routePush(context, + page: const DashboardPublicView(), + routeType: RouteType.pushReplace); + }, + ), + ButtonView( + name: 'Let’s Start', + marginVertical: 8.0, + width: SizeConfig.width * .42, + onPressed: () { + routePush(context, page: const SubmissionParent()); + }, + ), + ], ) ], ), diff --git a/lib/features/auth/registration/view/registration_password_view.dart b/lib/features/auth/registration/view/registration_password_view.dart index ce8d3ac..d614e6c 100644 --- a/lib/features/auth/registration/view/registration_password_view.dart +++ b/lib/features/auth/registration/view/registration_password_view.dart @@ -7,7 +7,7 @@ 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/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/initial_registration_step.dart'; import 'package:cims_apps/features/auth/registration/viewmodel/registration_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -45,6 +45,8 @@ class RegistrationPasswordView extends StatelessWidget { validator: (value) { if (value!.isEmpty) { return 'Password must filled'; + } else if (value.length <= 8) { + return 'Minimum password 8 Character'; } else { return null; } @@ -139,7 +141,7 @@ class DialogSuccess extends StatelessWidget { marginVertical: 8.0, onPressed: () { routePush(context, - page: const SubmissionParent(), + page: const InitialRegistrationStep(), routeType: RouteType.pushReplace); }, ) From 4f50dc951a8a98ee093c1836b1f2016d31eb22a4 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Mon, 19 Feb 2024 15:24:36 +0700 Subject: [PATCH 4/6] fix: component select form --- .../select_form/select_form_view.dart | 94 +++++++++---------- .../submission_data/submit_personal_data.dart | 67 ++++++------- .../viewmodel/submission_data_viewmodel.dart | 27 ++++++ 3 files changed, 107 insertions(+), 81 deletions(-) diff --git a/lib/application/component/select_form/select_form_view.dart b/lib/application/component/select_form/select_form_view.dart index 5e2fa4d..6e6f0f2 100644 --- a/lib/application/component/select_form/select_form_view.dart +++ b/lib/application/component/select_form/select_form_view.dart @@ -25,7 +25,6 @@ class SelectFormView extends StatelessWidget { final String? hintText; final TextStyle? hintTextStyle; final TextEditingController? ctrl; - final Widget? bottomSheetTitle; final List listItem; final ValueChanged onSelect; final FormFieldValidator? validator; @@ -37,7 +36,6 @@ class SelectFormView extends StatelessWidget { this.hintText, this.hintTextStyle, this.ctrl, - this.bottomSheetTitle, required this.listItem, required this.onSelect, this.validator, @@ -56,14 +54,6 @@ class SelectFormView extends StatelessWidget { ), ), 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, @@ -74,30 +64,54 @@ class SelectFormView extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - bottomSheetTitle ?? Container(), - // const SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + name, + style: const TextStyle( + color: ColorPalette.slate800, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + IconButton( + onPressed: () => Navigator.pop(context), + icon: const Icon( + Icons.clear, + size: 26, + color: ColorPalette.greyBase, + )), + ], + ), + const SizedBox(height: 16), Expanded( child: SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( children: [ - ...listItem.map( - (e) => Card( + ...listItem.map((e) { + bool selected = e.text == ctrl?.text; + return Card( elevation: 0, color: Colors.transparent, - shape: const RoundedRectangleBorder( + shape: RoundedRectangleBorder( side: BorderSide( - color: ColorPalette.greyBorder, + color: selected + ? ColorPalette.primary + : ColorPalette.greyBorder, ), borderRadius: - BorderRadius.all(Radius.circular(12)), + const BorderRadius.all(Radius.circular(12)), ), child: ListTile( title: Text( e.text, - style: const TextStyle( - fontSize: 14, - ), + style: TextStyle( + fontSize: 14, + color: selected + ? ColorPalette.primary + : ColorPalette.slate500), ), subtitle: e.description != null ? Text( @@ -106,37 +120,19 @@ class SelectFormView extends StatelessWidget { 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; - // }); - }, - ), + trailing: selected + ? const Icon(Icons.check_circle_rounded, + color: ColorPalette.primary) + : null, onTap: () { - ctrl?.text = e.text; - onSelect(e.key); - Navigator.of(context).pop(); + stateSetter(() { + ctrl?.text = e.text; + onSelect(e.key); + }); }, ), - ), - ), + ); + }), ], ), ), @@ -145,7 +141,7 @@ class SelectFormView extends StatelessWidget { name: 'Select', marginVertical: 4.0, onPressed: () { - // print('object $') + Navigator.pop(context); }, ) ], diff --git a/lib/features/auth/registration/view/submission_data/submit_personal_data.dart b/lib/features/auth/registration/view/submission_data/submit_personal_data.dart index 1b8b389..583d4e4 100644 --- a/lib/features/auth/registration/view/submission_data/submit_personal_data.dart +++ b/lib/features/auth/registration/view/submission_data/submit_personal_data.dart @@ -1,6 +1,5 @@ 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/theme/color_palette.dart'; import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -10,44 +9,48 @@ class SubmitPersonalData extends StatelessWidget { @override Widget build(BuildContext context) { - List 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( builder: (context, provider, child) { return SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - 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, - )), - ], + child: Form( + key: provider.formKeyPersonalData, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption(title: 'Your personal details'), + SelectFormView( + name: 'Occupation', + hintText: 'Select occupation ', + ctrl: provider.ctrlOccupation, + listItem: provider.listOccupation, + onSelect: (value) {}, ), - listItem: listForm, - onSelect: (value) {}, - ), - ], + SelectFormView( + name: 'Income Level (IDR)', + hintText: 'Select Income ', + ctrl: provider.ctrlIncome, + listItem: provider.listIncome, + onSelect: (value) {}, + ), + SelectFormView( + name: 'Marital Status', + hintText: 'Select Marital Status ', + ctrl: provider.ctrlMarital, + listItem: provider.listMarital, + onSelect: (value) {}, + ), + SelectFormView( + name: 'Source of Fund', + hintText: 'Select Source of Fund ', + ctrl: provider.ctrlSourceFund, + listItem: provider.listSourceFund, + onSelect: (value) {}, + ), + ], + ), ), ); }); diff --git a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart index ceaad54..51e70de 100644 --- a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart +++ b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart @@ -1,4 +1,5 @@ import 'package:camera/camera.dart'; +import 'package:cims_apps/application/component/select_form/select_form_view.dart'; import 'package:flutter/material.dart'; class SubmissionDataViewModel extends ChangeNotifier { @@ -7,6 +8,32 @@ class SubmissionDataViewModel extends ChangeNotifier { int stepAmount = 9; bool _isEmailVerify = false; bool get isEmailVerify => _isEmailVerify; + var formKeyPersonalData = GlobalKey(); + TextEditingController ctrlOccupation = TextEditingController(); + TextEditingController ctrlIncome = TextEditingController(); + TextEditingController ctrlMarital = TextEditingController(); + TextEditingController ctrlSourceFund = TextEditingController(); + + List listOccupation = [ + ItemSelectForm('key1', 'Student'), + ItemSelectForm('key2', 'Entrepreneur'), + ItemSelectForm('key3', 'Civil Servant'), + ]; + List listIncome = [ + ItemSelectForm('key1', '< 10 million/year'), + ItemSelectForm('key2', '10 – 50 million/year'), + ItemSelectForm('key3', '50 – 100 million/year'), + ]; + List listMarital = [ + ItemSelectForm('key1', 'Single'), + ItemSelectForm('key2', 'Married'), + ItemSelectForm('key3', 'Divorced'), + ]; + List listSourceFund = [ + ItemSelectForm('key1', 'Revenue'), + ItemSelectForm('key2', 'Business Profit'), + ItemSelectForm('key3', 'Saving interest'), + ]; Future> initCamera() async { final cameras = await availableCameras(); From 9ba8b791123ee6ca0b6b337dc1ba30f8d720469c Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Mon, 19 Feb 2024 18:24:20 +0700 Subject: [PATCH 5/6] fix: registration step --- .../select_form/select_form_view.dart | 11 +- .../component/text_form/text_form_view.dart | 4 +- .../view/registration_success_view.dart | 6 +- .../data_bank/submit_bank_account.dart | 32 ++-- .../risk_profile/results_view.dart | 6 +- .../submission_data/submission_parent.dart | 75 ++------- .../submission_data/submit_data_id_card.dart | 148 ++++++++++-------- .../view/submission_data/submit_email.dart | 16 ++ .../submission_data/submit_personal_data.dart | 18 +++ .../submit_signature/initial_signature.dart | 38 +++-- .../terms_and_condition_view.dart | 1 + .../viewmodel/submission_data_viewmodel.dart | 19 +++ lib/main.dart | 23 +-- 13 files changed, 243 insertions(+), 154 deletions(-) diff --git a/lib/application/component/select_form/select_form_view.dart b/lib/application/component/select_form/select_form_view.dart index 6e6f0f2..87c9854 100644 --- a/lib/application/component/select_form/select_form_view.dart +++ b/lib/application/component/select_form/select_form_view.dart @@ -60,6 +60,12 @@ class SelectFormView extends StatelessWidget { ) { return Container( height: SizeConfig.height * .45, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical( + top: Radius.circular(20), + ), + ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -94,7 +100,7 @@ class SelectFormView extends StatelessWidget { bool selected = e.text == ctrl?.text; return Card( elevation: 0, - color: Colors.transparent, + color: Colors.white, shape: RoundedRectangleBorder( side: BorderSide( color: selected @@ -108,7 +114,8 @@ class SelectFormView extends StatelessWidget { title: Text( e.text, style: TextStyle( - fontSize: 14, + fontSize: 16, + fontWeight: FontWeight.w500, color: selected ? ColorPalette.primary : ColorPalette.slate500), diff --git a/lib/application/component/text_form/text_form_view.dart b/lib/application/component/text_form/text_form_view.dart index 6bf6db6..2c0eb1e 100644 --- a/lib/application/component/text_form/text_form_view.dart +++ b/lib/application/component/text_form/text_form_view.dart @@ -137,9 +137,9 @@ class TextFormView extends StatelessWidget { onTap: onTap, onEditingComplete: onSubmit, style: TextStyle( - fontWeight: FontWeight.bold, + fontWeight: FontWeight.w500, fontSize: 14, - color: fontColorDisabled ?? Colors.black, + color: fontColorDisabled ?? ColorPalette.slate500, ), readOnly: readOnly, validator: validator, diff --git a/lib/features/auth/registration/view/registration_success_view.dart b/lib/features/auth/registration/view/registration_success_view.dart index ae97d6d..302608e 100644 --- a/lib/features/auth/registration/view/registration_success_view.dart +++ b/lib/features/auth/registration/view/registration_success_view.dart @@ -29,7 +29,11 @@ class RegistrationSuccessView extends StatelessWidget { name: 'Next', marginVertical: 0.0, onPressed: () { - routePush(context, page: const BottomNavigationView()); + routePush( + context, + page: const BottomNavigationView(), + routeType: RouteType.pushReplace, + ); }, ) ], diff --git a/lib/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart b/lib/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart index 384cd43..d625392 100644 --- a/lib/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart +++ b/lib/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart @@ -1,27 +1,24 @@ 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/select_form/select_form_view.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/theme/color_palette.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/data_bank/guide_screen.dart'; import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'confirm_bank_account.dart'; + class SubmitBankAccount extends StatelessWidget { const SubmitBankAccount({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - List listForm = [ - ItemSelectForm('key1', 'BCA'), - ItemSelectForm('key2', 'BRI'), - ItemSelectForm('key3', 'BNI'), - ItemSelectForm('key4', 'BANK MANDIRI'), - ItemSelectForm('key5', 'CIMB NIAGA'), - ]; return MultiProvider( providers: [ ChangeNotifierProvider( @@ -38,11 +35,14 @@ class SubmitBankAccount extends StatelessWidget { const TextCaption(title: 'Input your bank account data'), SelectFormView( name: 'Bank Name', - listItem: listForm, + hintText: 'Select Bank', + listItem: provider.listBank, + ctrl: provider.ctrlBankName, onSelect: (value) {}, ), TextFormView( name: 'Account Number', + hintText: 'Input Account Number', trailingTitleWidget: SizedBox( width: 24, child: GestureDetector( @@ -53,13 +53,27 @@ class SubmitBankAccount extends StatelessWidget { ), ), ), - TextFormView(name: 'Account Owner Name'), + TextFormView( + name: 'Account Owner Name', + hintText: 'Input Account Name', + ), const Text( "Make sure the account you use is in your name, not someone else's", style: TextStyle( color: ColorPalette.slate400, ), ), + SizedBox(height: SizeConfig.height * .08), + ButtonView( + name: 'Next', + onPressed: () { + provider.next(context).then((value) { + if (value) { + routePush(context, page: const ConfirmBankAccount()); + } + }); + }, + ) ], ); }), diff --git a/lib/features/auth/registration/view/submission_data/risk_profile/results_view.dart b/lib/features/auth/registration/view/submission_data/risk_profile/results_view.dart index 674913c..80d7595 100644 --- a/lib/features/auth/registration/view/submission_data/risk_profile/results_view.dart +++ b/lib/features/auth/registration/view/submission_data/risk_profile/results_view.dart @@ -162,7 +162,11 @@ class ResultsView extends StatelessWidget { ButtonView( name: 'Confirm', onPressed: () { - routePush(context, page: const TermsAndConditionView()); + routePush( + context, + page: const TermsAndConditionView(), + routeType: RouteType.pushReplace, + ); }, marginVertical: 0, textSize: 16, diff --git a/lib/features/auth/registration/view/submission_data/submission_parent.dart b/lib/features/auth/registration/view/submission_data/submission_parent.dart index 44ef918..310c4a3 100644 --- a/lib/features/auth/registration/view/submission_data/submission_parent.dart +++ b/lib/features/auth/registration/view/submission_data/submission_parent.dart @@ -1,9 +1,7 @@ -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/custom_app_bar/custom_app_bar.dart'; import 'package:cims_apps/application/theme/color_palette.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/data_bank/confirm_bank_account.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/data_bank/submit_bank_account.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/risk_profile/risk_profile_view.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/submit_data_id_card.dart'; @@ -12,7 +10,6 @@ import 'package:cims_apps/features/auth/registration/view/submission_data/submit 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_photo_selfie.dart'; import 'package:cims_apps/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart'; -import 'package:cims_apps/features/auth/registration/view/submission_data/submit_signature/submit_signature.dart'; import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; import 'package:cims_apps/features/bottom_navigation_view.dart'; import 'package:flutter/material.dart'; @@ -64,21 +61,6 @@ class _SubmissionParentState extends State { } } - _contentPush(int index) { - switch (index) { - case 6: - routePush(context, page: const ConfirmBankAccount()); - case 7: - routePush(context, page: const SubmitSignature()); - // case 8: - // return const RiskProfileView(); - // case 9: - // return Container( - // child: Text("Step 9"), - // ); - } - } - @override Widget build(BuildContext context) { return ChangeNotifierProvider( @@ -94,24 +76,8 @@ class _SubmissionParentState extends State { child: Consumer( builder: (context, provider, child) { return Scaffold( - appBar: AppBar( - toolbarHeight: 70, - backgroundColor: Colors.white, - surfaceTintColor: Colors.white, - automaticallyImplyLeading: false, - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const BackButtonView(), - const Text('Registration'), - SizedBox( - width: SizeConfig.width * 0.1, - ) - ], - ), - shape: const RoundedRectangleBorder( - side: BorderSide(color: ColorPalette.slate200)), - ), + appBar: CustomAppBar( + height: SizeConfig.height * .1, title: 'Registration'), body: Stack( children: [ Column( @@ -123,13 +89,19 @@ class _SubmissionParentState extends State { horizontal: 16.0, vertical: 16.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: List.generate( - provider.stepAmount, - (index) => _stepItem( - isCurrentStep: - provider.getCurrentStep == index + 1, - ), - ), + children: + List.generate(provider.stepAmount, (index) { + // print('indd $index'); + // print( + // 'getCurrentStep ${provider.getCurrentStep}'); + return _stepItem( + isCurrentStep: provider.getCurrentStep == + index + 1 || + provider.getCurrentStep - 1 == index + 1, + // isDone: + // index + 1 != provider.getCurrentStep + 1, + ); + }), ), ), Expanded( @@ -139,21 +111,6 @@ class _SubmissionParentState extends State { child: _content(provider.getCurrentStep), ), ), - provider.getCurrentStep == 3 || - provider.getCurrentStep == 4 || - provider.getCurrentStep == 8 - ? const SizedBox() - : Align( - alignment: Alignment.bottomCenter, - child: ButtonView( - name: 'Next', - marginVertical: 16.0, - onPressed: () { - _contentPush(provider.getCurrentStep); - provider.nextSubmission(context); - }, - ), - ) ], ), ], diff --git a/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart b/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart index b7364ba..2b42515 100644 --- a/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart +++ b/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart @@ -4,8 +4,12 @@ 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_form/text_form_view.dart'; import 'package:cims_apps/application/theme/color_palette.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/viewmodel/submission_data_viewmodel.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class SubmitDataIdCard extends StatelessWidget { const SubmitDataIdCard({Key? key}) : super(key: key); @@ -151,68 +155,90 @@ class SubmitDataIdCard extends StatelessWidget { ); } - return SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextCaption(title: 'Check your ID card data for accuracy'), - TextFormView(name: 'NIK'), - TextFormView(name: 'Full Name'), - TextFormView( - name: 'Birth Date', - suffixIcon: const Icon( - Icons.calendar_today_rounded, - color: ColorPalette.slate400, - ), - ), - photoDocument(), - Container( - width: SizeConfig.width, - padding: const EdgeInsets.symmetric(horizontal: 16.0), - margin: const EdgeInsets.symmetric(vertical: 16.0), - decoration: BoxDecoration( - color: ColorPalette.blue50, - borderRadius: BorderRadius.circular(10), - border: Border.all( - color: ColorPalette.greyLights, - width: 1, - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const ImageView( - image: PathAssets.iconShield, - width: 20, - height: 22, - ), - const SizedBox( - width: 8, - ), - const Expanded( - child: Text( - 'Will my data be safe?', - style: TextStyle( - fontWeight: FontWeight.w600, - color: ColorPalette.primary, - ), - ), - ), - IconButton( - onPressed: () { - bottomSheet(); - }, - icon: const Icon( - Icons.arrow_forward_ios, - color: ColorPalette.primary, - size: 20, - ), - ) - ], - ), + return MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => SubmissionDataViewModel(), ) ], - ), - ); + builder: (context, child) { + return SingleChildScrollView( + child: Consumer( + builder: (context, provider, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption( + title: 'Check your ID card data for accuracy'), + TextFormView(name: 'NIK'), + TextFormView(name: 'Full Name'), + TextFormView( + name: 'Birth Date', + suffixIcon: const Icon( + Icons.calendar_today_rounded, + color: ColorPalette.slate400, + ), + ), + photoDocument(), + Container( + width: SizeConfig.width, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + margin: const EdgeInsets.symmetric(vertical: 16.0), + decoration: BoxDecoration( + color: ColorPalette.blue50, + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: ColorPalette.greyLights, + width: 1, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const ImageView( + image: PathAssets.iconShield, + width: 20, + height: 22, + ), + const SizedBox( + width: 8, + ), + const Expanded( + child: Text( + 'Will my data be safe?', + style: TextStyle( + fontWeight: FontWeight.w600, + color: ColorPalette.primary, + ), + ), + ), + IconButton( + onPressed: () { + bottomSheet(); + }, + icon: const Icon( + Icons.arrow_forward_ios, + color: ColorPalette.primary, + size: 20, + ), + ) + ], + ), + ), + ButtonView( + name: 'Next', + onPressed: () async { + await provider.next(context).then((value) { + if (value) { + routePush(context, page: const SubmissionParent()); + } + }); + }, + ) + ], + ); + }), + ); + }); } } diff --git a/lib/features/auth/registration/view/submission_data/submit_email.dart b/lib/features/auth/registration/view/submission_data/submit_email.dart index a1c6de1..f4ff54f 100644 --- a/lib/features/auth/registration/view/submission_data/submit_email.dart +++ b/lib/features/auth/registration/view/submission_data/submit_email.dart @@ -1,7 +1,11 @@ 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/component/text_form/text_form_view.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/viewmodel/submission_data_viewmodel.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -60,6 +64,7 @@ class SubmitEmail extends StatelessWidget { builder: (context, provider, child) { return Column( crossAxisAlignment: CrossAxisAlignment.start, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ !provider.isEmailVerify ? const TextCaption(title: 'Enter your e-mail') @@ -73,6 +78,17 @@ class SubmitEmail extends StatelessWidget { }, ) : _emailVerify(), + SizedBox(height: SizeConfig.height * .42), + ButtonView( + name: 'Next', + onPressed: () async { + await provider.next(context).then((value) { + if (value) { + routePush(context, page: const SubmissionParent()); + } + }); + }, + ) ], ); }); diff --git a/lib/features/auth/registration/view/submission_data/submit_personal_data.dart b/lib/features/auth/registration/view/submission_data/submit_personal_data.dart index 583d4e4..65e8607 100644 --- a/lib/features/auth/registration/view/submission_data/submit_personal_data.dart +++ b/lib/features/auth/registration/view/submission_data/submit_personal_data.dart @@ -1,5 +1,8 @@ +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/text_caption/text_caption.dart'; +import 'package:cims_apps/core/route/route.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:provider/provider.dart'; @@ -19,6 +22,7 @@ class SubmitPersonalData extends StatelessWidget { key: provider.formKeyPersonalData, child: Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const TextCaption(title: 'Your personal details'), SelectFormView( @@ -49,6 +53,20 @@ class SubmitPersonalData extends StatelessWidget { listItem: provider.listSourceFund, onSelect: (value) {}, ), + Align( + alignment: Alignment.bottomCenter, + child: ButtonView( + name: 'Next', + onPressed: () async { + await provider.next(context).then((value) { + if (value) { + routePush(context, + page: const SubmissionParent()); + } + }); + }, + ), + ) ], ), ), diff --git a/lib/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart b/lib/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart index 50214e2..1811e35 100644 --- a/lib/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart +++ b/lib/features/auth/registration/view/submission_data/submit_signature/initial_signature.dart @@ -1,7 +1,11 @@ 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/list_tile/list_tile_view.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/utils/size_config.dart'; +import 'package:cims_apps/features/auth/registration/view/submission_data/submit_signature/submit_signature.dart'; import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -18,16 +22,30 @@ class InitialSignature extends StatelessWidget { ) ], builder: (context, child) { - return const Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextCaption(title: 'Draw your digital sign'), - ImageView(image: PathAssets.frameSignature), - ListTileView( - title: - 'Make sure the sign you draw is match with your ID Card'), - ], - ); + return Consumer( + builder: (context, provider, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption(title: 'Draw your digital sign'), + const ImageView(image: PathAssets.frameSignature), + const ListTileView( + title: + 'Make sure the sign you draw is match with your ID Card'), + SizedBox(height: SizeConfig.height * .07), + ButtonView( + name: 'Next', + onPressed: () { + provider.next(context).then((value) { + if (value) { + routePush(context, page: const SubmitSignature()); + } + }); + }, + ) + ], + ); + }); }); } } diff --git a/lib/features/auth/registration/view/submission_data/terms_and_condition/terms_and_condition_view.dart b/lib/features/auth/registration/view/submission_data/terms_and_condition/terms_and_condition_view.dart index abe5406..dad3e2f 100644 --- a/lib/features/auth/registration/view/submission_data/terms_and_condition/terms_and_condition_view.dart +++ b/lib/features/auth/registration/view/submission_data/terms_and_condition/terms_and_condition_view.dart @@ -90,6 +90,7 @@ class TermsAndConditionView extends StatelessWidget { onPressed: () { provider.nextSubmission(context); routePush(context, + routeType: RouteType.pushReplace, page: SetPinView( currentPin: '', submitPin: (context, pin) {}, diff --git a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart index 51e70de..1835e0d 100644 --- a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart +++ b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart @@ -13,6 +13,8 @@ class SubmissionDataViewModel extends ChangeNotifier { TextEditingController ctrlIncome = TextEditingController(); TextEditingController ctrlMarital = TextEditingController(); TextEditingController ctrlSourceFund = TextEditingController(); + TextEditingController ctrlBankName = TextEditingController(); + int step = 1; List listOccupation = [ ItemSelectForm('key1', 'Student'), @@ -35,6 +37,14 @@ class SubmissionDataViewModel extends ChangeNotifier { ItemSelectForm('key3', 'Saving interest'), ]; + List listBank = [ + ItemSelectForm('key1', 'BCA'), + ItemSelectForm('key2', 'BRI'), + ItemSelectForm('key3', 'BNI'), + ItemSelectForm('key4', 'BANK MANDIRI'), + ItemSelectForm('key5', 'CIMB NIAGA'), + ]; + Future> initCamera() async { final cameras = await availableCameras(); final camerasDesc = cameras; @@ -64,4 +74,13 @@ class SubmissionDataViewModel extends ChangeNotifier { notifyListeners(); } + + Future next(BuildContext context) async { + if (getCurrentStep < stepAmount) { + _currentStep++; + notifyListeners(); + return true; + } + return false; + } } diff --git a/lib/main.dart b/lib/main.dart index 4d24d24..c94e8a0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -34,18 +34,13 @@ class MyApp extends StatelessWidget { fontFamily: 'Manrope', scaffoldBackgroundColor: Colors.white, textTheme: const TextTheme( - headlineSmall: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: ColorPalette.slate800, - ), - headlineLarge: TextStyle( - fontSize: 28, - fontWeight: FontWeight.bold, + displaySmall: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, color: ColorPalette.slate800, ), displayMedium: TextStyle( - fontSize: 14, + fontSize: 16, fontWeight: FontWeight.w600, color: ColorPalette.slate800, ), @@ -64,6 +59,16 @@ class MyApp extends StatelessWidget { fontWeight: FontWeight.bold, color: ColorPalette.slate500, ), + headlineSmall: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: ColorPalette.slate800, + ), + headlineLarge: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: ColorPalette.slate800, + ), ), colorScheme: const ColorScheme.light().copyWith( primary: const Color(0xff2563EB), From 466d49312da846cf19ca5e5672e4958e9bc20033 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Mon, 19 Feb 2024 19:41:36 +0700 Subject: [PATCH 6/6] fix: submit data id card --- .../select_form/select_form_view.dart | 2 +- .../display_picture_screen.dart | 32 ++++++++-- .../submission_data/submit_data_id_card.dart | 28 ++++----- .../view/submission_data/submit_email.dart | 58 ++++++++++--------- .../viewmodel/submission_data_viewmodel.dart | 21 +++++++ pubspec.lock | 58 ++++++++++++++++++- pubspec.yaml | 1 + 7 files changed, 152 insertions(+), 48 deletions(-) diff --git a/lib/application/component/select_form/select_form_view.dart b/lib/application/component/select_form/select_form_view.dart index 87c9854..0eb826b 100644 --- a/lib/application/component/select_form/select_form_view.dart +++ b/lib/application/component/select_form/select_form_view.dart @@ -9,7 +9,7 @@ class ItemSelectForm { final String text; final String? description; final bool isOther; - final String image; + String image; ItemSelectForm( this.key, diff --git a/lib/application/component/take_picture_screen/display_picture_screen.dart b/lib/application/component/take_picture_screen/display_picture_screen.dart index eee0650..8e43e81 100644 --- a/lib/application/component/take_picture_screen/display_picture_screen.dart +++ b/lib/application/component/take_picture_screen/display_picture_screen.dart @@ -11,13 +11,34 @@ import 'package:cims_apps/features/auth/registration/view/submission_data/submis import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; -class DisplayPictureScreen extends StatelessWidget { +class DisplayPictureScreen extends StatefulWidget { final String imagePath, content; const DisplayPictureScreen( {super.key, required this.imagePath, required this.content}); + @override + State createState() => _DisplayPictureScreenState(); +} + +class _DisplayPictureScreenState extends State { + Future saveData() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + if (widget.content == 'ktp') { + prefs.setString('imagePath', widget.imagePath); + } else { + prefs.setString('imagePathSelfie', widget.imagePath); + } + } + + @override + void initState() { + saveData(); + super.initState(); + } + @override Widget build(BuildContext context) { List listIcons = [ @@ -85,7 +106,7 @@ class DisplayPictureScreen extends StatelessWidget { SizedBox( width: SizeConfig.width, height: SizeConfig.height * .4, - child: Image.file(File(imagePath))), + child: Image.file(File(widget.imagePath))), const Padding( padding: EdgeInsets.symmetric(vertical: 16.0), child: Text( @@ -103,7 +124,8 @@ class DisplayPictureScreen extends StatelessWidget { runSpacing: 8, children: List.generate(4, (index) { List filteredList = listIcons - .where((element) => element['key'] == content) + .where( + (element) => element['key'] == widget.content) .toList(); final urlImg = filteredList[index]['urlImg']; final tag = filteredList[index]['tag']; @@ -162,10 +184,10 @@ class DisplayPictureScreen extends StatelessWidget { provider.initCamera().then((cameras) { routePush(context, page: TakePictureScreen( - camera: content == 'ktp' + camera: widget.content == 'ktp' ? cameras[0] : cameras[1], - takeContent: content, + takeContent: widget.content, )); }); }, diff --git a/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart b/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart index 2b42515..0ff833f 100644 --- a/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart +++ b/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + 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'; @@ -16,11 +18,6 @@ class SubmitDataIdCard extends StatelessWidget { @override Widget build(BuildContext context) { - List listImg = [ - {'urlImg': PathAssets.imgKtpClear, 'tag': 'ID Card'}, - {'urlImg': PathAssets.imgSelfieClear, 'tag': 'Selfie with ID Card'}, - ]; - bottomSheet() { showModalBottomSheet( context: context, @@ -87,7 +84,7 @@ class SubmitDataIdCard extends StatelessWidget { ); } - Widget photoDocument() { + Widget photoDocument(SubmissionDataViewModel provider) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -104,16 +101,21 @@ class SubmitDataIdCard extends StatelessWidget { ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: listImg.map((e) { + children: provider.listImg.map((e) { return Column( children: [ SizedBox( height: SizeConfig.height * .18, width: SizeConfig.width * .45, - child: ImageView( - image: e['urlImg'], - fit: BoxFit.fill, - borderRadius: 12, + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.file( + File(e.image), + fit: BoxFit.fill, + errorBuilder: (context, error, stackTrace) { + return const Icon(Icons.image_not_supported_outlined); + }, + ), ), ), SizedBox( @@ -122,7 +124,7 @@ class SubmitDataIdCard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - e['tag'], + e.text, overflow: TextOverflow.ellipsis, maxLines: 1, style: const TextStyle( @@ -179,7 +181,7 @@ class SubmitDataIdCard extends StatelessWidget { color: ColorPalette.slate400, ), ), - photoDocument(), + photoDocument(provider), Container( width: SizeConfig.width, padding: const EdgeInsets.symmetric(horizontal: 16.0), diff --git a/lib/features/auth/registration/view/submission_data/submit_email.dart b/lib/features/auth/registration/view/submission_data/submit_email.dart index f4ff54f..f980bc5 100644 --- a/lib/features/auth/registration/view/submission_data/submit_email.dart +++ b/lib/features/auth/registration/view/submission_data/submit_email.dart @@ -62,34 +62,36 @@ class SubmitEmail extends StatelessWidget { builder: (context, child) { return Consumer( builder: (context, provider, child) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - 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(), - SizedBox(height: SizeConfig.height * .42), - ButtonView( - name: 'Next', - onPressed: () async { - await provider.next(context).then((value) { - if (value) { - routePush(context, page: const SubmissionParent()); - } - }); - }, - ) - ], + return SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + 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(), + SizedBox(height: SizeConfig.height * .42), + ButtonView( + name: 'Next', + onPressed: () async { + await provider.next(context).then((value) { + if (value) { + routePush(context, page: const SubmissionParent()); + } + }); + }, + ) + ], + ), ); }); }); diff --git a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart index 1835e0d..04b9f52 100644 --- a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart +++ b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart @@ -1,8 +1,13 @@ import 'package:camera/camera.dart'; import 'package:cims_apps/application/component/select_form/select_form_view.dart'; import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class SubmissionDataViewModel extends ChangeNotifier { + SubmissionDataViewModel() { + _getData(); + } + static int _currentStep = 1; int get getCurrentStep => _currentStep; int stepAmount = 9; @@ -45,6 +50,11 @@ class SubmissionDataViewModel extends ChangeNotifier { ItemSelectForm('key5', 'CIMB NIAGA'), ]; + List listImg = [ + ItemSelectForm('', 'ID Card', image: ''), + ItemSelectForm('', 'Selfie with ID Card', image: ''), + ]; + Future> initCamera() async { final cameras = await availableCameras(); final camerasDesc = cameras; @@ -83,4 +93,15 @@ class SubmissionDataViewModel extends ChangeNotifier { } return false; } + + Future _getData() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? imagePath = prefs.getString('imagePath'); + String? imagePathSelfie = prefs.getString('imagePathSelfie'); + if (imagePath != null && imagePathSelfie != null) { + listImg[0].image = imagePath; + listImg[1].image = imagePathSelfie; + } + notifyListeners(); + } } diff --git a/pubspec.lock b/pubspec.lock index a030f5f..c5fcec3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -488,6 +488,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" sky_engine: dependency: transitive description: flutter @@ -671,4 +727,4 @@ packages: version: "6.5.0" sdks: dart: ">=3.2.3 <4.0.0" - flutter: ">=3.13.0" + flutter: ">=3.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index e80d052..bda08a0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -50,6 +50,7 @@ dependencies: path: ^1.8.3 syncfusion_flutter_signaturepad: ^24.2.4 dotted_border: ^2.1.0 + shared_preferences: ^2.2.2