From ad6195061d5743eb68c4f1c7f2cf456c3e9a92df Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 20 Feb 2024 10:24:32 +0700 Subject: [PATCH 1/8] fix: widget overflow --- .../component/text_form/text_form_view.dart | 4 +- .../view/registration_password_view.dart | 2 +- .../data_bank/submit_bank_account.dart | 91 ++++++++++--------- .../submission_data/submit_data_id_card.dart | 8 +- 4 files changed, 57 insertions(+), 48 deletions(-) diff --git a/lib/application/component/text_form/text_form_view.dart b/lib/application/component/text_form/text_form_view.dart index 2c0eb1e..d52d093 100644 --- a/lib/application/component/text_form/text_form_view.dart +++ b/lib/application/component/text_form/text_form_view.dart @@ -139,7 +139,7 @@ class TextFormView extends StatelessWidget { style: TextStyle( fontWeight: FontWeight.w500, fontSize: 14, - color: fontColorDisabled ?? ColorPalette.slate500, + color: fontColorDisabled ?? ColorPalette.slate800, ), readOnly: readOnly, validator: validator, @@ -161,7 +161,7 @@ class TextFormView extends StatelessWidget { hintStyle: hintTextStyle ?? const TextStyle( fontSize: 14, - color: ColorPalette.greyFont, + color: ColorPalette.slate400, fontWeight: FontWeight.normal, ), isDense: true, diff --git a/lib/features/auth/registration/view/registration_password_view.dart b/lib/features/auth/registration/view/registration_password_view.dart index d614e6c..47c1a3f 100644 --- a/lib/features/auth/registration/view/registration_password_view.dart +++ b/lib/features/auth/registration/view/registration_password_view.dart @@ -45,7 +45,7 @@ class RegistrationPasswordView extends StatelessWidget { validator: (value) { if (value!.isEmpty) { return 'Password must filled'; - } else if (value.length <= 8) { + } else if (value.length < 8) { return 'Minimum password 8 Character'; } else { return null; 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 d625392..fb7197a 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 @@ -29,52 +29,57 @@ class SubmitBankAccount extends StatelessWidget { return SizedBox( child: Consumer( builder: (context, provider, child) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextCaption(title: 'Input your bank account data'), - SelectFormView( - name: 'Bank Name', - 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( - onTap: () { - routePush(context, page: const GuideScreen()); - }, - child: const ImageView(image: PathAssets.iconQuestion), + return SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextCaption(title: 'Input your bank account data'), + SelectFormView( + name: 'Bank Name', + hintText: 'Select Bank', + listItem: provider.listBank, + ctrl: provider.ctrlBankName, + onSelect: (value) {}, + ), + TextFormView( + name: 'Account Number', + hintText: 'Input Account Number', + keyboardType: TextInputType.number, + trailingTitleWidget: SizedBox( + width: 24, + child: GestureDetector( + onTap: () { + routePush(context, page: const GuideScreen()); + }, + child: + const ImageView(image: PathAssets.iconQuestion), + ), ), ), - ), - 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, + TextFormView( + name: 'Account Owner Name', + hintText: 'Input Account Name', ), - ), - SizedBox(height: SizeConfig.height * .08), - ButtonView( - name: 'Next', - onPressed: () { - provider.next(context).then((value) { - if (value) { - routePush(context, page: const ConfirmBankAccount()); - } - }); - }, - ) - ], + 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/submit_data_id_card.dart b/lib/features/auth/registration/view/submission_data/submit_data_id_card.dart index 24c096b..a7445cb 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 @@ -30,7 +30,7 @@ class SubmitDataIdCard extends StatelessWidget { color: Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(18))), - height: SizeConfig.height * .32, + height: SizeConfig.height * .35, padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -173,11 +173,15 @@ class SubmitDataIdCard extends StatelessWidget { children: [ const TextCaption( title: 'Check your ID card data for accuracy'), - TextFormView(name: 'NIK'), + TextFormView( + name: 'NIK', + keyboardType: TextInputType.number, + ), TextFormView(name: 'Full Name'), DatePickerView( name: 'Birth Date', ctrl: provider.ctrlBirthDate, + maxDate: DateTime.now(), isMultipleSelection: false, enabled: true), photoDocument(provider), -- 2.45.2 From 9e2304990c8206235bff44db1a935b41372f71d8 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 20 Feb 2024 14:43:43 +0700 Subject: [PATCH 2/8] feat: login gmail --- .../model/login_gmail_model.dart | 14 ++ .../view/dashboard_public_view.dart | 172 +++++++++--------- .../viewmodel/dashboard_public_viewmodel.dart | 50 +++++ pubspec.lock | 48 +++++ pubspec.yaml | 1 + 5 files changed, 203 insertions(+), 82 deletions(-) create mode 100644 lib/features/dashboard/dashboard_public/model/login_gmail_model.dart create mode 100644 lib/features/dashboard/dashboard_public/viewmodel/dashboard_public_viewmodel.dart diff --git a/lib/features/dashboard/dashboard_public/model/login_gmail_model.dart b/lib/features/dashboard/dashboard_public/model/login_gmail_model.dart new file mode 100644 index 0000000..805d352 --- /dev/null +++ b/lib/features/dashboard/dashboard_public/model/login_gmail_model.dart @@ -0,0 +1,14 @@ +class LoginGmailModel { + String idToken; + String accessToken; + + LoginGmailModel({ + required this.idToken, + required this.accessToken, + }); + + Map toJson() => { + "idToken": idToken, + "accessToken": accessToken, + }; +} 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 8645822..aa9d85c 100644 --- a/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart +++ b/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart @@ -5,9 +5,10 @@ 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/login/view/login_view.dart'; -import 'package:cims_apps/features/auth/registration/view/initial_registration_step.dart'; import 'package:cims_apps/features/auth/registration/view/registration_view.dart'; +import 'package:cims_apps/features/dashboard/dashboard_public/viewmodel/dashboard_public_viewmodel.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class DashboardPublicView extends StatelessWidget { static const routeName = '/DashboardPublicView'; @@ -37,88 +38,95 @@ class DashboardPublicView extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - body: SingleChildScrollView( - padding: const EdgeInsets.only( - top: 32.0, - bottom: 8.0, - left: 24.0, - right: 24.0, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ImageView( - image: PathAssets.icon1, - width: SizeConfig.width * .35, - ), - Align( - alignment: Alignment.center, - heightFactor: 1, - child: _caption()), - Align( - alignment: Alignment.center, - child: ImageView( - image: PathAssets.imgDashboard, - width: SizeConfig.width * .7, + return ChangeNotifierProvider( + create: (context) => DashboardPublicViewModel(), + builder: (context, child) { + return Scaffold( + body: SingleChildScrollView( + padding: const EdgeInsets.only( + top: 32.0, + bottom: 8.0, + left: 24.0, + right: 24.0, ), + child: Consumer( + builder: (context, provider, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ImageView( + image: PathAssets.icon1, + width: SizeConfig.width * .35, + ), + Align( + alignment: Alignment.center, + heightFactor: 1, + child: _caption()), + Align( + alignment: Alignment.center, + child: ImageView( + image: PathAssets.imgDashboard, + width: SizeConfig.width * .7, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ButtonView( + name: 'Sign in', + isOutlined: true, + width: SizeConfig.width * .43, + height: SizeConfig.height * .06, + onPressed: () { + routePush(context, page: const LoginView()); + }, + ), + ButtonView( + name: 'Sign Up', + width: SizeConfig.width * .43, + height: SizeConfig.height * .06, + onPressed: () { + routePush(context, page: const RegistrationView()); + }, + ), + ], + ), + const ImageView(image: PathAssets.iconConnect), + ButtonView( + name: 'Google', + isSecondaryColor: true, + isOutlined: true, + prefixIcon: const ImageView( + image: PathAssets.iconGoogle, + width: 26, + ), + onPressed: () { + provider.loginGoogle(context); + }, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ImageView( + image: PathAssets.iconOjk, + width: SizeConfig.width * .20, + ), + ImageView( + image: PathAssets.iconInklusi, + width: SizeConfig.width * .20, + ), + ImageView( + image: PathAssets.iconReksadana, + width: SizeConfig.width * .20, + ), + ], + ) + ], + ); + }), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ButtonView( - name: 'Sign in', - isOutlined: true, - width: SizeConfig.width * .43, - height: SizeConfig.height * .06, - onPressed: () { - routePush(context, page: const LoginView()); - }, - ), - ButtonView( - name: 'Sign Up', - width: SizeConfig.width * .43, - height: SizeConfig.height * .06, - onPressed: () { - routePush(context, page: const RegistrationView()); - }, - ), - ], - ), - const ImageView(image: PathAssets.iconConnect), - ButtonView( - name: 'Google', - isSecondaryColor: true, - isOutlined: true, - prefixIcon: const ImageView( - image: PathAssets.iconGoogle, - width: 26, - ), - onPressed: () { - routePush(context, page: const InitialRegistrationStep()); - }, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ImageView( - image: PathAssets.iconOjk, - width: SizeConfig.width * .20, - ), - ImageView( - image: PathAssets.iconInklusi, - width: SizeConfig.width * .20, - ), - ImageView( - image: PathAssets.iconReksadana, - width: SizeConfig.width * .20, - ), - ], - ) - ], - ), - ), - ); + ); + }); } } diff --git a/lib/features/dashboard/dashboard_public/viewmodel/dashboard_public_viewmodel.dart b/lib/features/dashboard/dashboard_public/viewmodel/dashboard_public_viewmodel.dart new file mode 100644 index 0000000..89ebd5a --- /dev/null +++ b/lib/features/dashboard/dashboard_public/viewmodel/dashboard_public_viewmodel.dart @@ -0,0 +1,50 @@ +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/dashboard/dashboard_public/model/login_gmail_model.dart'; +import 'package:flutter/material.dart'; +import 'package:google_sign_in/google_sign_in.dart'; + +class DashboardPublicViewModel extends ChangeNotifier { + String emailGoogle = ''; + final GoogleSignIn googleSignIn = GoogleSignIn( + scopes: [ + 'email', + 'https://www.googleapis.com/auth/contacts.readonly', + ], + ); + Future _getGmail() async { + LoginGmailModel? loginGmailModel; + try { + final signInResult = await googleSignIn.signIn(); + if (signInResult != null) { + emailGoogle = signInResult.email; + final signInAuth = await signInResult.authentication; + final accessToken = signInAuth.accessToken; + final idToken = signInAuth.idToken; + if (idToken != null && accessToken != null) { + loginGmailModel = LoginGmailModel( + accessToken: accessToken, + idToken: idToken, + ); + } + } + } catch (e) { + debugPrint('catch error $e'); + } + return loginGmailModel; + } + + Future loginGoogle(BuildContext context) async { + bool loginSuccess = false; + loginSuccess = await _getGmail().then((payload) async { + bool result = false; + if (payload != null) { + debugPrint('objectzz ${payload.toJson()}'); + routePush(context, page: InitialRegistrationStep()); + googleSignIn.disconnect(); + } + return result; + }); + return loginSuccess; + } +} diff --git a/pubspec.lock b/pubspec.lock index 6fd9b82..f811a80 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -264,6 +264,54 @@ packages: description: flutter source: sdk version: "0.0.0" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "0c56c2c5d60d6dfaf9725f5ad4699f04749fb196ee5a70487a46ef184837ccf6" + url: "https://pub.dev" + source: hosted + version: "0.3.0+2" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: "0b8787cb9c1a68ad398e8010e8c8766bfa33556d2ab97c439fb4137756d7308f" + url: "https://pub.dev" + source: hosted + version: "6.2.1" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: bfd42c81c30c6faba16e0f62968d5505a87504aaa672b3155ee931461abb0a49 + url: "https://pub.dev" + source: hosted + version: "6.1.21" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: f3336d9e44d4d28063ac90271f6db5caf99f0480cb07281330e7a432edb95226 + url: "https://pub.dev" + source: hosted + version: "5.7.3" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "1f6e5787d7a120cc0359ddf315c92309069171306242e181c09472d1b00a2971" + url: "https://pub.dev" + source: hosted + version: "2.4.5" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: a278ea2d01013faf341cbb093da880d0f2a552bbd1cb6ee90b5bebac9ba69d77 + url: "https://pub.dev" + source: hosted + version: "0.12.3+2" group_button: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 2ce93d1..cb05aa4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,6 +52,7 @@ dependencies: dotted_border: ^2.1.0 shared_preferences: ^2.2.2 calendar_date_picker2: ^0.5.3 + google_sign_in: ^6.2.1 -- 2.45.2 From 9761dc369ce326d1c7102d365044ab028b5c8df3 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 20 Feb 2024 14:53:30 +0700 Subject: [PATCH 3/8] feat: profile and transaction page --- lib/features/bottom_navigation_view.dart | 11 +++++------ lib/features/profile/view/profile_view.dart | 14 ++++++++++++++ .../transaction/view/transaction_view.dart | 15 +++++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 lib/features/profile/view/profile_view.dart create mode 100644 lib/features/transaction/view/transaction_view.dart diff --git a/lib/features/bottom_navigation_view.dart b/lib/features/bottom_navigation_view.dart index fdd1da2..99e24c8 100644 --- a/lib/features/bottom_navigation_view.dart +++ b/lib/features/bottom_navigation_view.dart @@ -1,10 +1,10 @@ import 'package:cims_apps/application/theme/color_palette.dart'; import 'package:cims_apps/features/dashboard/dashboard_account/view/homepage/homepage_view.dart'; import 'package:cims_apps/features/dashboard/dashboard_account/view/plan/view/plan_view.dart'; -import 'package:cims_apps/features/dashboard/dashboard_account/view/plan/view_model/plan_view_model.dart'; import 'package:cims_apps/features/dashboard/dashboard_account/view/portfolio/portfolio_view.dart'; +import 'package:cims_apps/features/profile/view/profile_view.dart'; +import 'package:cims_apps/features/transaction/view/transaction_view.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class BottomNavigationView extends StatefulWidget { const BottomNavigationView({Key? key}) : super(key: key); @@ -18,13 +18,12 @@ class _BottomNavigationViewState extends State { @override Widget build(BuildContext context) { - ///TODO: masukan pagenya dilistWidget ini - List listWidget = [ + List listWidget = const [ HomeView(), PlanView(), - Container(), + TransactionView(), PortofolioView(), - Container(), + ProfileView(), ]; List listNavigation = const [ diff --git a/lib/features/profile/view/profile_view.dart b/lib/features/profile/view/profile_view.dart new file mode 100644 index 0000000..a62fc59 --- /dev/null +++ b/lib/features/profile/view/profile_view.dart @@ -0,0 +1,14 @@ +import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; +import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:flutter/material.dart'; + +class ProfileView extends StatelessWidget { + const ProfileView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar(height: SizeConfig.height * .1, title: 'Profile'), + ); + } +} diff --git a/lib/features/transaction/view/transaction_view.dart b/lib/features/transaction/view/transaction_view.dart new file mode 100644 index 0000000..1059f1d --- /dev/null +++ b/lib/features/transaction/view/transaction_view.dart @@ -0,0 +1,15 @@ +import 'package:cims_apps/application/component/custom_app_bar/custom_app_bar.dart'; +import 'package:cims_apps/core/utils/size_config.dart'; +import 'package:flutter/material.dart'; + +class TransactionView extends StatelessWidget { + const TransactionView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: + CustomAppBar(height: SizeConfig.height * .1, title: 'Transaction'), + ); + } +} -- 2.45.2 From dfb947dce59bbac91e6c1635311473ff7862c20c Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 20 Feb 2024 15:14:25 +0700 Subject: [PATCH 4/8] fix: widget overflow --- .../subscribe/total_payment_view.dart | 347 +++++++++--------- .../view/invest_type/invest_type_view.dart | 240 +++++++----- .../view/dashboard_public_view.dart | 4 +- 3 files changed, 323 insertions(+), 268 deletions(-) diff --git a/lib/application/component/subscribe/total_payment_view.dart b/lib/application/component/subscribe/total_payment_view.dart index 634be7f..0befdd5 100644 --- a/lib/application/component/subscribe/total_payment_view.dart +++ b/lib/application/component/subscribe/total_payment_view.dart @@ -24,160 +24,163 @@ class _TotalPaymentViewState extends State { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16) - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.all(24.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text('Your Investment Today', - style: TextStyle( - color: ColorPalette.slate800, - fontWeight: FontWeight.w600, - fontSize: 16 - ), - ), - GestureDetector( - onTap: () => Navigator.pop(context), - child: const Icon(Icons.close_rounded) - ) - ], - ), - ), - ...widget.listProduct.asMap().entries.map((e) { - return Container( - padding: const EdgeInsets.only(left: 16, right: 24, bottom: 16, top: 16), - decoration: BoxDecoration( - border: Border( - left: BorderSide( - width: 8, - color: ColorPalette.investTypeColor[e.value.type]! - ) - ) - ), + return SingleChildScrollView( + child: Container( + decoration: BoxDecoration( + color: Colors.white, borderRadius: BorderRadius.circular(16)), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(24.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - flex: 5, - child: Text(e.value.name ?? '', - style: const TextStyle( - color: ColorPalette.slate400, - fontWeight: FontWeight.w600, - fontSize: 16 - ), - ) + const Text( + 'Your Investment Today', + style: TextStyle( + color: ColorPalette.slate800, + fontWeight: FontWeight.w600, + fontSize: 16), ), - Expanded( - flex: 7, - child: Text( - NumberFormatter.numberCurrency(widget.totalInvest * e.value.totalPercent!, 'Rp ', 'id_ID'), - textAlign: TextAlign.end, - style: const TextStyle( - fontWeight: FontWeight.w700, - fontSize: 18, - color: ColorPalette.slate800 - ), - ) + GestureDetector( + onTap: () => Navigator.pop(context), + child: const Icon(Icons.close_rounded)) + ], + ), + ), + ...widget.listProduct.asMap().entries.map((e) { + return Container( + padding: const EdgeInsets.only( + left: 16, right: 24, bottom: 16, top: 16), + decoration: BoxDecoration( + border: Border( + left: BorderSide( + width: 8, + color: + ColorPalette.investTypeColor[e.value.type]!))), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 5, + child: Text( + e.value.name ?? '', + style: const TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.w600, + fontSize: 16), + )), + Expanded( + flex: 7, + child: Text( + NumberFormatter.numberCurrency( + widget.totalInvest * e.value.totalPercent!, + 'Rp ', + 'id_ID'), + textAlign: TextAlign.end, + style: const TextStyle( + fontWeight: FontWeight.w700, + fontSize: 18, + color: ColorPalette.slate800), + )) + ], + ), + ); + }).toList(), + const SizedBox(height: 16), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Purchase Commission', + style: TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.w600, + fontSize: 16), + ), + Text( + 'Free', + style: TextStyle( + color: ColorPalette.primary, + fontSize: 18, + fontWeight: FontWeight.w700), ) ], ), - ); - }).toList(), - const SizedBox(height: 16), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 24), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('Purchase Commission', - style: TextStyle( - color: ColorPalette.slate400, - fontWeight: FontWeight.w600, - fontSize: 16 - ), - ), - Text('Free', - style: TextStyle( - color: ColorPalette.primary, - fontSize: 18, - fontWeight: FontWeight.w700 - ), - ) - ], ), - ), - const SizedBox(height: 16,), - Container( - color: ColorPalette.slate200.withOpacity(0.5), - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text('Total', - style: TextStyle( - color: ColorPalette.slate400, - fontWeight: FontWeight.w600, - fontSize: 16 - ), - ), - Text(NumberFormatter.numberCurrency(widget.totalInvest, 'Rp ', 'id_ID'), - textAlign: TextAlign.end, - style: const TextStyle( - fontWeight: FontWeight.w700, - fontSize: 18, - color: ColorPalette.slate800 - ), - ) - ], + const SizedBox( + height: 16, ), - ), - buttonAgreement(), - Container( - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text('Total Payment', - style: TextStyle( - color: ColorPalette.slate400, - fontWeight: FontWeight.w600, - fontSize: 16 + Container( + color: ColorPalette.slate200.withOpacity(0.5), + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Total', + style: TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.w600, + fontSize: 16), ), - ), - Text(NumberFormatter.numberCurrency(widget.totalInvest, 'Rp ', 'id_ID'), - textAlign: TextAlign.end, - style: const TextStyle( - fontWeight: FontWeight.w700, - fontSize: 18, - color: ColorPalette.slate800 - ), - ) - ], + Text( + NumberFormatter.numberCurrency( + widget.totalInvest, 'Rp ', 'id_ID'), + textAlign: TextAlign.end, + style: const TextStyle( + fontWeight: FontWeight.w700, + fontSize: 18, + color: ColorPalette.slate800), + ) + ], + ), ), - ), - ButtonView( - disabled: !isAgreement, - name: 'Subscribe Now', - onPressed: () { - routePush(context, page: PaymentMethodView( - totalInvest: widget.totalInvest, - )); - }, - disabledBgColor: ColorPalette.slate200.withOpacity(0.5), - textColor: isAgreement ? Colors.white : ColorPalette.slate400, - textWeight: FontWeight.w700, - textSize: 20, - backgroundColor: ColorPalette.primary, - ) - ], + buttonAgreement(), + Container( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Total Payment', + style: TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.w600, + fontSize: 16), + ), + Text( + NumberFormatter.numberCurrency( + widget.totalInvest, 'Rp ', 'id_ID'), + textAlign: TextAlign.end, + style: const TextStyle( + fontWeight: FontWeight.w700, + fontSize: 18, + color: ColorPalette.slate800), + ) + ], + ), + ), + ButtonView( + disabled: !isAgreement, + name: 'Subscribe Now', + onPressed: () { + routePush(context, + page: PaymentMethodView( + totalInvest: widget.totalInvest, + )); + }, + disabledBgColor: ColorPalette.slate200.withOpacity(0.5), + textColor: isAgreement ? Colors.white : ColorPalette.slate400, + textWeight: FontWeight.w700, + textSize: 20, + backgroundColor: ColorPalette.primary, + ) + ], + ), ), ); } @@ -205,50 +208,48 @@ class _TotalPaymentViewState extends State { decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( - color: isAgree ? ColorPalette.primary : ColorPalette.slate200 - ) - ), + color: isAgree + ? ColorPalette.primary + : ColorPalette.slate200)), child: AnimatedContainer( duration: const Duration(milliseconds: 200), child: Container( decoration: BoxDecoration( - color: isAgree ? ColorPalette.primary : ColorPalette.white, - shape: BoxShape.circle - ), + color: + isAgree ? ColorPalette.primary : ColorPalette.white, + shape: BoxShape.circle), ), ), ), ), - const SizedBox(width: 12,), + const SizedBox( + width: 12, + ), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text('I agree to buy the mutual fund on this page and have read and agreed to all the contents of the Prospectus and summary information and understand the risks of my investment decision.', + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'I agree to buy the mutual fund on this page and have read and agreed to all the contents of the Prospectus and summary information and understand the risks of my investment decision.', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: ColorPalette.slate400), + ), + GestureDetector( + onTap: () {}, + child: const Text( + 'Read More', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w600, - color: ColorPalette.slate400 - ), - ), - GestureDetector( - onTap: () { - - }, - child: const Text('Read More', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - decoration: TextDecoration.underline, - color: ColorPalette.primary - ), - ) - ) - ], - ) - ) + decoration: TextDecoration.underline, + color: ColorPalette.primary), + )) + ], + )) ], ), ); } -} \ No newline at end of file +} diff --git a/lib/features/dashboard/dashboard_account/view/invest_type/invest_type_view.dart b/lib/features/dashboard/dashboard_account/view/invest_type/invest_type_view.dart index ea362ab..a33a7ac 100644 --- a/lib/features/dashboard/dashboard_account/view/invest_type/invest_type_view.dart +++ b/lib/features/dashboard/dashboard_account/view/invest_type/invest_type_view.dart @@ -20,11 +20,25 @@ class InvestTypeView extends StatefulWidget { } class _InvestTypeViewState extends State { - List listProduct = [ - Product(name: 'Gemilang Dana Kas Maxima', type: '', yield: 8.17, priceUnit: 2600.79, funds: 6300000), - Product(name: 'Gemilang Dana Likuid', type: '', yield: 6.42, priceUnit: 1600.79, funds: 2340000), - Product(name: 'Gemilang Income Fund', type: '', yield: 8.17, priceUnit: 2600.79, funds: 6300000) + Product( + name: 'Gemilang Dana Kas Maxima', + type: '', + yield: 8.17, + priceUnit: 2600.79, + funds: 6300000), + Product( + name: 'Gemilang Dana Likuid', + type: '', + yield: 6.42, + priceUnit: 1600.79, + funds: 2340000), + Product( + name: 'Gemilang Income Fund', + type: '', + yield: 8.17, + priceUnit: 2600.79, + funds: 6300000) ]; @override @@ -36,76 +50,80 @@ class _InvestTypeViewState extends State { return e; }).toList(); } - + @override Widget build(BuildContext context) { return ChangeNotifierProvider( create: (context) => ProductViewModel(), - child: Consumer( - builder: (context, provider, child) { - return Scaffold( - body: SizedBox( - width: SizeConfig.width, - height: SizeConfig.height, - child: Stack( - children: [ - const ImageView(image: PathAssets.imgDashboardAccount), - Column( - children: [ - const SizedBox( - height: 50, + child: Consumer(builder: (context, provider, child) { + return Scaffold( + body: SizedBox( + width: SizeConfig.width, + height: SizeConfig.height, + child: Stack( + children: [ + const ImageView(image: PathAssets.imgDashboardAccount), + Column( + children: [ + SizedBox( + height: SizeConfig.height * .1, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const BackButtonView(), + TextTitle(title: widget.title, color: Colors.white), + SizedBox( + width: SizeConfig.width * 0.1, + ) + ], ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const BackButtonView(), - TextTitle(title: widget.title, color: Colors.white), - SizedBox( - width: SizeConfig.width * 0.1, - ) - ], - ), - ), - const SizedBox( - height: 24, - ), - Container( + ), + const SizedBox( + height: 24, + ), + Expanded( + child: Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16), - color: Colors.white - ), - child: Column( - children: [ - filters(), - ListView( - shrinkWrap: true, - children: listProduct.asMap().entries.map((e) { - return GestureDetector( - onTap: () { - provider.setSelectedProduct(e.value); - routePush(context, page: ProductView(widget.title)); - }, - child: Padding( - padding: EdgeInsets.only(top: e.key != 0 ? 24 : 0), - child: cardProduct(e.value), - ), - ); - }).toList(), - ) - ], + borderRadius: BorderRadius.circular(16), + color: Colors.white), + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + filters(), + ListView( + shrinkWrap: true, + children: listProduct.asMap().entries.map((e) { + return GestureDetector( + onTap: () { + provider.setSelectedProduct(e.value); + routePush(context, + page: ProductView(widget.title)); + }, + child: Padding( + padding: EdgeInsets.only( + top: e.key != 0 ? 24 : 0), + child: cardProduct(e.value), + ), + ); + }).toList(), + ) + ], + ), ), ), - ], - ) - ], - ), + ), + ], + ) + ], ), - ); - } - ), + ), + ); + }), ); } @@ -115,9 +133,25 @@ class _InvestTypeViewState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - segmentFilter(const Icon(Icons.filter_alt_outlined, color: ColorPalette.slate400,), 'Filter', () { }), - segmentFilter(const RotatedBox(quarterTurns: 1, child: Icon(Icons.compare_arrows, color: ColorPalette.slate400)), 'Sort', () { }), - segmentFilter(const Icon(Icons.dashboard_outlined, color: ColorPalette.slate400), 'Compare', () { }), + segmentFilter( + const Icon( + Icons.filter_alt_outlined, + color: ColorPalette.slate400, + ), + 'Filter', + () {}), + segmentFilter( + const RotatedBox( + quarterTurns: 1, + child: + Icon(Icons.compare_arrows, color: ColorPalette.slate400)), + 'Sort', + () {}), + segmentFilter( + const Icon(Icons.dashboard_outlined, + color: ColorPalette.slate400), + 'Compare', + () {}), ], ), ); @@ -126,12 +160,11 @@ class _InvestTypeViewState extends State { Widget segmentFilter(Widget leading, String text, void Function()? onTap) { return GestureDetector( onTap: onTap, - child: Container( + child: Container( padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), decoration: BoxDecoration( border: Border.all(color: ColorPalette.slate200), - borderRadius: BorderRadius.circular(56) - ), + borderRadius: BorderRadius.circular(56)), child: Row( children: [ leading, @@ -142,9 +175,7 @@ class _InvestTypeViewState extends State { text, overflow: TextOverflow.ellipsis, style: const TextStyle( - color: ColorPalette.slate500, - fontWeight: FontWeight.w700 - ), + color: ColorPalette.slate500, fontWeight: FontWeight.w700), ) ], ), @@ -163,7 +194,10 @@ class _InvestTypeViewState extends State { children: [ Row( children: [ - ImageView(image: PathAssets.imgProduct, width: SizeConfig.width * .12,), + ImageView( + image: PathAssets.imgProduct, + width: SizeConfig.width * .12, + ), const SizedBox( width: 8, ), @@ -171,9 +205,7 @@ class _InvestTypeViewState extends State { child: Text( product.name ?? '', style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18 - ), + fontWeight: FontWeight.bold, fontSize: 18), ), ) ], @@ -187,36 +219,53 @@ class _InvestTypeViewState extends State { children: [ Column( children: [ - const Text('Yield', style: TextStyle(color: ColorPalette.slate400, fontWeight: FontWeight.w600),), + const Text( + 'Yield', + style: TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.w600), + ), Row( children: [ Text( '${product.yield.toString()}%', style: const TextStyle( - color: ColorPalette.green400, - fontWeight: FontWeight.w600 - ), + color: ColorPalette.green400, + fontWeight: FontWeight.w600), ), const Text('/'), - const Text('3year', style: TextStyle(color: ColorPalette.slate400, fontWeight: FontWeight.w600),) + const Text( + '3year', + style: TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.w600), + ) ], ) ], ), Column( children: [ - const Text('Price/unit', style: TextStyle(color: ColorPalette.slate400, fontWeight: FontWeight.w600),), + const Text( + 'Price/unit', + style: TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.w600), + ), Row( children: [ - const Icon(Icons.trending_up_outlined, size: 18, color: ColorPalette.green400,), + const Icon( + Icons.trending_up_outlined, + size: 18, + color: ColorPalette.green400, + ), const SizedBox( width: 2, ), Text( - NumberFormatter.numberCurrency(product.priceUnit, 'Rp', 'id_ID'), - style: const TextStyle( - fontWeight: FontWeight.w600 - ), + NumberFormatter.numberCurrency( + product.priceUnit, 'Rp', 'id_ID'), + style: const TextStyle(fontWeight: FontWeight.w600), ), ], ) @@ -224,14 +273,18 @@ class _InvestTypeViewState extends State { ), Column( children: [ - const Text('Managed funds', style: TextStyle(color: ColorPalette.slate400, fontWeight: FontWeight.w600),), + const Text( + 'Managed funds', + style: TextStyle( + color: ColorPalette.slate400, + fontWeight: FontWeight.w600), + ), Row( children: [ Text( - NumberFormatter.compactCurrency(product.funds, 'Rp ', 'id_ID'), - style: const TextStyle( - fontWeight: FontWeight.w600 - ), + NumberFormatter.compactCurrency( + product.funds, 'Rp ', 'id_ID'), + style: const TextStyle(fontWeight: FontWeight.w600), ), ], ) @@ -243,5 +296,4 @@ class _InvestTypeViewState extends State { ), ); } - } 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 aa9d85c..1283bcd 100644 --- a/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart +++ b/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart @@ -6,6 +6,7 @@ import 'package:cims_apps/core/route/route.dart'; import 'package:cims_apps/core/utils/size_config.dart'; import 'package:cims_apps/features/auth/login/view/login_view.dart'; import 'package:cims_apps/features/auth/registration/view/registration_view.dart'; +import 'package:cims_apps/features/bottom_navigation_view.dart'; import 'package:cims_apps/features/dashboard/dashboard_public/viewmodel/dashboard_public_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -102,7 +103,8 @@ class DashboardPublicView extends StatelessWidget { width: 26, ), onPressed: () { - provider.loginGoogle(context); + // provider.loginGoogle(context); + routePush(context, page: const BottomNavigationView()); }, ), Row( -- 2.45.2 From e510aaefd79bcc6691ada28f13b3713ae7418eb9 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 20 Feb 2024 15:22:05 +0700 Subject: [PATCH 5/8] fix: widget overflow --- .../view/homepage/homepage_view.dart | 276 ++++++++++-------- .../view/portfolio/portfolio_view.dart | 51 ++-- .../view/dashboard_public_view.dart | 4 +- 3 files changed, 184 insertions(+), 147 deletions(-) diff --git a/lib/features/dashboard/dashboard_account/view/homepage/homepage_view.dart b/lib/features/dashboard/dashboard_account/view/homepage/homepage_view.dart index 463669b..1cc6339 100644 --- a/lib/features/dashboard/dashboard_account/view/homepage/homepage_view.dart +++ b/lib/features/dashboard/dashboard_account/view/homepage/homepage_view.dart @@ -7,7 +7,6 @@ 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/initial_registration_step.dart'; -import 'package:cims_apps/features/auth/registration/view/registration_view.dart'; import 'package:cims_apps/features/dashboard/dashboard_account/view/invest_type/invest_type_view.dart'; import 'package:flutter/material.dart'; @@ -50,14 +49,22 @@ class _HomeViewState extends State { InvestType('Sharia', PathAssets.iconPortofolioSharia) ]; - StepVerification listStepVerification = StepVerification(0, [ - 'Registration', 'Verification', 'Complete' - ]); + StepVerification listStepVerification = + StepVerification(0, ['Registration', 'Verification', 'Complete']); List
listArticle = [ - Article('Education', 'Menggali Potensi Pasar: Analisis Sebelum Memulai Investasi', PathAssets.imgArticles), - Article('News', 'Tren Investasi 2024: Peluang dan Risiko yang Perlu Diketahui', PathAssets.imgArticles), - Article('Education', 'Investasi Berkelanjutan: Mengenal Portofolio Hijau untuk Masa Depan', PathAssets.imgArticles), + Article( + 'Education', + 'Menggali Potensi Pasar: Analisis Sebelum Memulai Investasi', + PathAssets.imgArticles), + Article( + 'News', + 'Tren Investasi 2024: Peluang dan Risiko yang Perlu Diketahui', + PathAssets.imgArticles), + Article( + 'Education', + 'Investasi Berkelanjutan: Mengenal Portofolio Hijau untuk Masa Depan', + PathAssets.imgArticles), ]; @override @@ -85,22 +92,17 @@ class _HomeViewState extends State { style: TextStyle( color: Colors.white, fontSize: 20, - fontWeight: FontWeight.w700 - ), + fontWeight: FontWeight.w700), ), ElevatedButton( - onPressed: () { - - }, + onPressed: () {}, style: ElevatedButton.styleFrom( padding: const EdgeInsets.all(0), backgroundColor: Colors.white, foregroundColor: const Color(0xff2563EB), elevation: 0, - shape: const CircleBorder() - ), - child: const Icon(Icons.notifications_outlined) - ) + shape: const CircleBorder()), + child: const Icon(Icons.notifications_outlined)) ], ), ), @@ -148,7 +150,8 @@ class _HomeViewState extends State { children: [ Row( children: [ - const Text('Portofolio Value', style: TextStyle(color: Colors.white)), + const Text('Portofolio Value', + style: TextStyle(color: Colors.white)), const SizedBox( width: 12, ), @@ -158,8 +161,11 @@ class _HomeViewState extends State { seePortofolioValue = !seePortofolioValue; }); }, - child: const Icon(Icons.visibility_outlined, color: Color(0xff93C5FD)) - ) + child: Icon( + seePortofolioValue + ? Icons.visibility_off_outlined + : Icons.visibility_outlined, + color: const Color(0xff93C5FD))) ], ), const SizedBox( @@ -170,24 +176,28 @@ class _HomeViewState extends State { AnimatedCrossFade( duration: const Duration(milliseconds: 300), alignment: Alignment.center, - crossFadeState: seePortofolioValue ? CrossFadeState.showSecond : CrossFadeState.showFirst, + crossFadeState: seePortofolioValue + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, firstChild: RichText( text: const TextSpan( text: 'Rp ', - style: TextStyle(fontSize: 32, color: Color(0xff93C5FD), fontFamily: 'Manrope',), + style: TextStyle( + fontSize: 32, + color: Color(0xff93C5FD), + fontFamily: 'Manrope', + ), children: [ - TextSpan( - text: '22.500.000', - style: TextStyle( - fontSize: 32, - fontWeight: FontWeight.bold, - color: Colors.white, - fontFamily: 'Manrope', - ), - ) - ] - ) - ), + TextSpan( + text: '22.500.000', + style: TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: Colors.white, + fontFamily: 'Manrope', + ), + ) + ])), secondChild: Padding( padding: const EdgeInsets.symmetric(vertical: 16), child: Wrap( @@ -197,7 +207,8 @@ class _HomeViewState extends State { Container( width: 12, height: 12, - decoration: const BoxDecoration(color: Colors.white, shape: BoxShape.circle), + decoration: const BoxDecoration( + color: Colors.white, shape: BoxShape.circle), ), ], ), @@ -219,14 +230,12 @@ class _HomeViewState extends State { BoxShadow( spreadRadius: 2, blurRadius: 4, - color: const Color(0xff1E293B).withOpacity(0.04) - ) - ] - ), + color: const Color(0xff1E293B).withOpacity(0.04)) + ]), child: Wrap( spacing: 10, children: listPortofolioType.asMap().entries.map((e) { - return GestureDetector( + return GestureDetector( onTap: () { routePush(context, page: InvestTypeView(title: e.value.name)); }, @@ -235,7 +244,11 @@ class _HomeViewState extends State { width: SizeConfig.width * .18, child: Column( children: [ - ImageView(image: e.value.iconImage, height: SizeConfig.width * .12, width: SizeConfig.width * .12,), + ImageView( + image: e.value.iconImage, + height: SizeConfig.width * .12, + width: SizeConfig.width * .12, + ), const SizedBox( height: 8, ), @@ -244,9 +257,7 @@ class _HomeViewState extends State { overflow: TextOverflow.ellipsis, textAlign: TextAlign.center, style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600 - ), + fontSize: 12, fontWeight: FontWeight.w600), ) ], ), @@ -271,21 +282,22 @@ class _HomeViewState extends State { const SizedBox( height: 24, ), - if(listStepVerification.currentStep == 1)...[ + if (listStepVerification.currentStep == 1) ...[ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Row( children: [ - Icon(Icons.verified, size: 18,), + Icon( + Icons.verified, + size: 18, + ), SizedBox( width: 12, ), Text( 'Verified by PT Gemilang', - style: TextStyle( - color: ColorPalette.slate500 - ), + style: TextStyle(color: ColorPalette.slate500), ) ], ), @@ -294,9 +306,9 @@ class _HomeViewState extends State { height: 16, decoration: BoxDecoration( color: Colors.white, - border: Border.all(color: const Color(0xffCBD5E1), width: 1.5), - shape: BoxShape.circle - ), + border: Border.all( + color: const Color(0xffCBD5E1), width: 1.5), + shape: BoxShape.circle), ) ], ), @@ -309,15 +321,16 @@ class _HomeViewState extends State { const Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Icon(Icons.verified, size: 18,), + Icon( + Icons.verified, + size: 18, + ), SizedBox( width: 12, ), Text( 'Verified by KSEI', - style: TextStyle( - color: ColorPalette.slate500 - ), + style: TextStyle(color: ColorPalette.slate500), ) ], ), @@ -326,9 +339,9 @@ class _HomeViewState extends State { height: 16, decoration: BoxDecoration( color: Colors.white, - border: Border.all(color: const Color(0xffCBD5E1), width: 1.5), - shape: BoxShape.circle - ), + border: Border.all( + color: const Color(0xffCBD5E1), width: 1.5), + shape: BoxShape.circle), ) ], ), @@ -339,15 +352,12 @@ class _HomeViewState extends State { padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: ColorPalette.blue50, - borderRadius: BorderRadius.circular(12) - ), + borderRadius: BorderRadius.circular(12)), child: const Column( children: [ Text( 'Your registration is currently being verified by PT Gemilang', - style: TextStyle( - color: ColorPalette.slate500 - ), + style: TextStyle(color: ColorPalette.slate500), ), SizedBox( height: 16, @@ -355,37 +365,32 @@ class _HomeViewState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('Estimated:', - style: TextStyle( - color: ColorPalette.slate500 - ), + Text( + 'Estimated:', + style: TextStyle(color: ColorPalette.slate500), ), Text( 'January 30 2024', style: TextStyle( fontWeight: FontWeight.w600, - color: Color(0xff1E293B) - ), + color: Color(0xff1E293B)), ) ], ) ], ), ) - ]else if(listStepVerification.currentStep == 0)...[ + ] else if (listStepVerification.currentStep == 0) ...[ Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: ColorPalette.blue50, - borderRadius: BorderRadius.circular(12) - ), + borderRadius: BorderRadius.circular(12)), child: Column( children: [ Text( "Let's start registering your data to start mutual fund investment at PT Gemilang Indonesia", - style: TextStyle( - color: ColorPalette.slate500 - ), + style: TextStyle(color: ColorPalette.slate500), ), SizedBox( height: 16, @@ -416,11 +421,15 @@ class _HomeViewState extends State { return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if(e.key != 0) + if (e.key != 0) SizedBox( width: 30, height: 30, - child: Divider(color: listStepVerification.currentStep >= e.key ? const Color(0xff2563EB) : const Color(0xffCBD5E1),), + child: Divider( + color: listStepVerification.currentStep >= e.key + ? const Color(0xff2563EB) + : const Color(0xffCBD5E1), + ), ), Column( children: [ @@ -429,18 +438,31 @@ class _HomeViewState extends State { height: 30, decoration: BoxDecoration( shape: BoxShape.circle, - color: listStepVerification.currentStep <= e.key ? Colors.white : const Color(0xff2563EB), + color: listStepVerification.currentStep <= e.key + ? Colors.white + : const Color(0xff2563EB), border: Border.all( - color: listStepVerification.currentStep < e.key ? const Color(0xffCBD5E1) : const Color(0xff2563EB), - width: 2 - ) - ), - child: listStepVerification.currentStep <= e.key ? const SizedBox() : const Icon(Icons.done_rounded, color: Colors.white,), + color: listStepVerification.currentStep < e.key + ? const Color(0xffCBD5E1) + : const Color(0xff2563EB), + width: 2)), + child: listStepVerification.currentStep <= e.key + ? const SizedBox() + : const Icon( + Icons.done_rounded, + color: Colors.white, + ), ), const SizedBox( height: 8, ), - Text(e.value, style: TextStyle(color: listStepVerification.currentStep == e.key ? const Color(0xff2563EB) : Colors.black),) + Text( + e.value, + style: TextStyle( + color: listStepVerification.currentStep == e.key + ? const Color(0xff2563EB) + : Colors.black), + ) ], ), ], @@ -455,15 +477,22 @@ class _HomeViewState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const TextTitle(title: 'Info and Special Promo', color: ColorPalette.slate800,), + const TextTitle( + title: 'Info and Special Promo', + color: ColorPalette.slate800, + ), const SizedBox( height: 16, ), CarouselSlider( - items: [1,2,3].map((e) { + items: [1, 2, 3].map((e) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 8), - child: ImageView(image: PathAssets.imgCarousel, height: 150, width: SizeConfig.width * .9,), + child: ImageView( + image: PathAssets.imgCarousel, + height: 150, + width: SizeConfig.width * .9, + ), ); }).toList(), options: CarouselOptions( @@ -493,14 +522,13 @@ class _HomeViewState extends State { children: [ const TextTitle(title: 'Article', color: ColorPalette.slate800), GestureDetector( - onTap: () { - - }, - child: const Text('See More', + onTap: () {}, + child: const Text( + 'See More', style: TextStyle( - color: ColorPalette.primary, - fontWeight: FontWeight.bold - ),), + color: ColorPalette.primary, + fontWeight: FontWeight.bold), + ), ) ], ), @@ -511,10 +539,12 @@ class _HomeViewState extends State { ...listArticle.asMap().entries.map((e) { return Column( children: [ - if(e.key != 0)...[ + if (e.key != 0) ...[ const Padding( padding: EdgeInsets.symmetric(vertical: 12), - child: Divider(color: ColorPalette.slate200,), + child: Divider( + color: ColorPalette.slate200, + ), ) ], cardArticle(e.value), @@ -531,39 +561,43 @@ class _HomeViewState extends State { padding: const EdgeInsets.symmetric(horizontal: 24), child: Row( children: [ - ImageView(image: PathAssets.imgArticles, width: SizeConfig.width * .17, height: SizeConfig.height * .08, borderRadius: 8,), + ImageView( + image: PathAssets.imgArticles, + width: SizeConfig.width * .17, + height: SizeConfig.height * .08, + borderRadius: 8, + ), const SizedBox( width: 16, ), Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(article.title, - style: const TextStyle( - fontWeight: FontWeight.bold, - ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + article.title, + style: const TextStyle( + fontWeight: FontWeight.bold, ), - const SizedBox( - height: 8, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 12), - decoration: BoxDecoration( + ), + const SizedBox( + height: 8, + ), + Container( + padding: + const EdgeInsets.symmetric(vertical: 4, horizontal: 12), + decoration: BoxDecoration( borderRadius: BorderRadius.circular(30), - color: ColorPalette.green100 - ), - child: Text( - article.type, - style: TextStyle( + color: ColorPalette.green100), + child: Text( + article.type, + style: TextStyle( fontWeight: FontWeight.w600, - color: ColorPalette.green500 - ), - ), + color: ColorPalette.green500), ), - ], - ) - ) + ), + ], + )) ], ), ); diff --git a/lib/features/dashboard/dashboard_account/view/portfolio/portfolio_view.dart b/lib/features/dashboard/dashboard_account/view/portfolio/portfolio_view.dart index 8ce0621..ab4915c 100644 --- a/lib/features/dashboard/dashboard_account/view/portfolio/portfolio_view.dart +++ b/lib/features/dashboard/dashboard_account/view/portfolio/portfolio_view.dart @@ -1,5 +1,3 @@ -import 'dart:math'; - import 'package:cims_apps/application/assets/path_assets.dart'; import 'package:cims_apps/application/component/image/image_view.dart'; import 'package:cims_apps/application/theme/color_palette.dart'; @@ -70,7 +68,7 @@ class _PortofolioViewState extends State { ), const Center( child: Text( - 'Portofolio', + 'Portfolio', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w700, @@ -125,20 +123,22 @@ class _PortofolioViewState extends State { ), Column( children: [ - const Text('Total Mutual Fund', + const Text( + 'Total Mutual Fund', style: TextStyle( - fontWeight: FontWeight.w600, - fontSize: 18, - color: ColorPalette.slate400 - ), + fontWeight: FontWeight.w600, + fontSize: 18, + color: ColorPalette.slate400), ), - Text(listInvestmentType.map((e) => e.mutualFunds).reduce((value, element) => value + element).toString(), - style: const TextStyle( - fontSize: 44, - fontWeight: FontWeight.w700 - ) - ) - , + Text( + listInvestmentType + .map((e) => e.mutualFunds) + .reduce( + (value, element) => value + element) + .toString(), + style: const TextStyle( + fontSize: 44, + fontWeight: FontWeight.w700)), ], ) ]), @@ -168,7 +168,7 @@ class _PortofolioViewState extends State { children: [ Row( children: [ - const Text('Portofolio Value', + const Text('Portfolio Value', style: TextStyle(color: Colors.white)), const SizedBox( width: 8, @@ -179,8 +179,11 @@ class _PortofolioViewState extends State { seePortofolioValue = !seePortofolioValue; }); }, - child: const Icon(Icons.visibility_outlined, - color: Color(0xff93C5FD))) + child: Icon( + seePortofolioValue + ? Icons.visibility_off_outlined + : Icons.visibility_outlined, + color: const Color(0xff93C5FD))) ], ), const SizedBox( @@ -197,7 +200,10 @@ class _PortofolioViewState extends State { firstChild: RichText( text: const TextSpan( text: 'Rp ', - style: TextStyle(fontSize: 32, color: Color(0xff93C5FD), fontFamily: 'Manrope'), + style: TextStyle( + fontSize: 32, + color: Color(0xff93C5FD), + fontFamily: 'Manrope'), children: [ TextSpan( text: '22.500.000', @@ -205,8 +211,7 @@ class _PortofolioViewState extends State { fontSize: 32, fontFamily: 'Manrope', fontWeight: FontWeight.bold, - color: Colors.white - ), + color: Colors.white), ) ])), secondChild: Padding( @@ -276,8 +281,8 @@ class _PortofolioViewState extends State { width: 58, alignment: Alignment.center, decoration: BoxDecoration( - shape: BoxShape.circle, - color: bgContentColor[e.key], + shape: BoxShape.circle, + color: bgContentColor[e.key], ), child: Text( '${e.value.value}%', 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 1283bcd..aa9d85c 100644 --- a/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart +++ b/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart @@ -6,7 +6,6 @@ import 'package:cims_apps/core/route/route.dart'; import 'package:cims_apps/core/utils/size_config.dart'; import 'package:cims_apps/features/auth/login/view/login_view.dart'; import 'package:cims_apps/features/auth/registration/view/registration_view.dart'; -import 'package:cims_apps/features/bottom_navigation_view.dart'; import 'package:cims_apps/features/dashboard/dashboard_public/viewmodel/dashboard_public_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -103,8 +102,7 @@ class DashboardPublicView extends StatelessWidget { width: 26, ), onPressed: () { - // provider.loginGoogle(context); - routePush(context, page: const BottomNavigationView()); + provider.loginGoogle(context); }, ), Row( -- 2.45.2 From c4c04793412d2136db33693f6fb43c8ad9177317 Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 20 Feb 2024 15:38:21 +0700 Subject: [PATCH 6/8] fix: add validation submit sign in --- lib/features/auth/login/view/login_view.dart | 13 +- .../auth/login/view/password_view.dart | 125 ++++++----- .../auth/login/view/phone_number_view.dart | 209 ++++++++++-------- .../login/view_model/login_view_model.dart | 5 +- 4 files changed, 190 insertions(+), 162 deletions(-) diff --git a/lib/features/auth/login/view/login_view.dart b/lib/features/auth/login/view/login_view.dart index 4903c43..00468dd 100644 --- a/lib/features/auth/login/view/login_view.dart +++ b/lib/features/auth/login/view/login_view.dart @@ -1,19 +1,12 @@ -import 'package:cims_apps/application/assets/path_assets.dart'; import 'package:cims_apps/application/component/button/back_button_view.dart'; -import 'package:cims_apps/application/component/button/button_view.dart'; -import 'package:cims_apps/application/component/image/image_view.dart'; -import 'package:cims_apps/application/component/text_form/text_form_view.dart'; -import 'package:cims_apps/application/component/text_title/text_title.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/login/view/password_view.dart'; import 'package:cims_apps/features/auth/login/view/phone_number_view.dart'; import 'package:cims_apps/features/auth/login/view_model/login_view_model.dart'; -import 'package:cims_apps/features/auth/registration/view/submission_data/risk_profile/risk_profile_view.dart'; import 'package:cims_apps/features/bottom_navigation_view.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; class LoginView extends StatefulWidget { @@ -90,7 +83,11 @@ class _LoginViewState extends State { currentPage++; pageController.jumpToPage(1); } else { - routePush(context, page: BottomNavigationView()); + routePush( + context, + page: const BottomNavigationView(), + routeType: RouteType.pushReplace, + ); } } } diff --git a/lib/features/auth/login/view/password_view.dart b/lib/features/auth/login/view/password_view.dart index 5f6906a..660027a 100644 --- a/lib/features/auth/login/view/password_view.dart +++ b/lib/features/auth/login/view/password_view.dart @@ -10,70 +10,83 @@ import 'package:provider/provider.dart'; class PasswordView extends StatelessWidget { final void Function() nextStep; final TextEditingController controller; - const PasswordView({super.key, required this.nextStep, required this.controller}); + const PasswordView( + {super.key, required this.nextStep, required this.controller}); @override Widget build(BuildContext context) { - return Consumer( - builder: (context, provider, child) { - return Container( - width: SizeConfig.width, - height: SizeConfig.height, - padding: const EdgeInsets.all(24), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextTitle(title: 'Enter your password', fontSize: 24), - SizedBox( - height: 24, - ), - TextFormView( - name: 'Password', - ctrl: controller, - obscureText: !provider.showPassword, - contentPadding: EdgeInsets.all(12), - suffixIcon: GestureDetector( - onTap: () { - provider.changeShowPassword(); + return Consumer(builder: (context, provider, child) { + return Container( + width: SizeConfig.width, + height: SizeConfig.height, + padding: const EdgeInsets.all(24), + child: Form( + key: provider.formKey, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextTitle(title: 'Enter your password', fontSize: 24), + SizedBox( + height: 24, + ), + TextFormView( + name: 'Password', + ctrl: controller, + obscureText: !provider.showPassword, + contentPadding: EdgeInsets.all(12), + validator: (value) { + if (value!.isEmpty) { + return 'Password must filled'; + } else if (value.length < 8) { + return 'Minimum password 8 Character'; + } else { + return null; + } }, - child: Icon( - provider.showPassword - ? Icons.visibility_outlined - : Icons.visibility_off_outlined, - color: ColorPalette.greyDarker, + suffixIcon: GestureDetector( + onTap: () { + provider.changeShowPassword(); + }, + child: Icon( + provider.showPassword + ? Icons.visibility_outlined + : Icons.visibility_off_outlined, + color: ColorPalette.greyDarker, + ), ), ), - ), - TextButton( - style: TextButton.styleFrom( - padding: EdgeInsets.all(0) + TextButton( + style: TextButton.styleFrom(padding: EdgeInsets.all(0)), + onPressed: () {}, + child: Text( + 'Forget the password?', + style: TextStyle( + color: ColorPalette.primary, + ), + )), + SizedBox( + height: 16, ), - onPressed: () { - - }, - child: Text( - 'Forget the password?', - style: TextStyle( - color: ColorPalette.primary, - ), + ButtonView( + name: 'Confirm', + heightWrapContent: true, + width: SizeConfig.width, + textSize: 18, + marginVertical: 0, + contentPadding: + EdgeInsets.symmetric(horizontal: 16, vertical: 12), + onPressed: () { + if (provider.formKey.currentState!.validate()) { + nextStep(); + } + }, ) - ), - SizedBox( - height: 16, - ), - ButtonView( - name: 'Confirm', - heightWrapContent: true, - width: SizeConfig.width, - textSize: 18, - marginVertical: 0, - contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), - onPressed: nextStep, - ) - ], + ], + ), ), - ); - } - ); + ), + ); + }); } } diff --git a/lib/features/auth/login/view/phone_number_view.dart b/lib/features/auth/login/view/phone_number_view.dart index cfd3b32..118baae 100644 --- a/lib/features/auth/login/view/phone_number_view.dart +++ b/lib/features/auth/login/view/phone_number_view.dart @@ -1,118 +1,135 @@ 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/numeric_pad/numeric_pad.dart'; import 'package:cims_apps/application/component/text_form/text_form_view.dart'; import 'package:cims_apps/application/component/text_title/text_title.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/login/view_model/login_view_model.dart'; import 'package:cims_apps/features/auth/registration/view/registration_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; class PhoneNumberView extends StatelessWidget { final void Function() nextStep; final TextEditingController controller; - const PhoneNumberView({super.key, required this.nextStep, required this.controller}); + const PhoneNumberView( + {super.key, required this.nextStep, required this.controller}); @override Widget build(BuildContext context) { - return Container( - width: SizeConfig.width, - height: SizeConfig.height, - padding: const EdgeInsets.all(24), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextTitle(title: 'Enter your phone number', fontSize: 24), - SizedBox( - height: 24, - ), - TextFormView( - name: 'Phone Number', - keyboardType: TextInputType.number, - ctrl: controller, - inputFormatters: [ - FilteringTextInputFormatter.deny(RegExp(r'^0')) - ], - contentPadding: EdgeInsets.all(1), - prefixIcon: Container( - width: SizeConfig.width * .23, - padding: - const EdgeInsets.symmetric(horizontal: 16.0), - margin: const EdgeInsets.only(right: 16), - decoration: const BoxDecoration( - color: ColorPalette.grey, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(8), - bottomLeft: Radius.circular(8), - )), - child: const Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ImageView( - image: PathAssets.iconFlag, - fit: BoxFit.contain, - width: 24, - height: 24, - ), - Text( - '+62', - style: TextStyle( - fontWeight: FontWeight.w600, - color: ColorPalette.slate800, - ), - ) - ], - )), - validator: (value) { - if (value!.isEmpty) { - return 'Phone number must be filled'; - } else { - return null; - } - }, - ), - SizedBox( - height: 32, - ), - ButtonView( - name: 'Next', - heightWrapContent: true, + return ChangeNotifierProvider( + create: (context) => LoginViewModel(), + builder: (context, child) { + return Container( width: SizeConfig.width, - marginVertical: 0, - contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), - onPressed: nextStep, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Don't have an account yet?", - style: TextStyle( - color: ColorPalette.slate500, - ), - ), - TextButton( - onPressed: () { - routePush(context, page: RegistrationView()); - }, - style: TextButton.styleFrom( - padding: EdgeInsets.all(0) + height: SizeConfig.height, + padding: const EdgeInsets.all(24), + child: + Consumer(builder: (context, provider, child) { + return Form( + key: provider.formKey, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TextTitle( + title: 'Enter your phone number', fontSize: 24), + SizedBox( + height: 24, + ), + TextFormView( + name: 'Phone Number', + keyboardType: TextInputType.number, + ctrl: controller, + inputFormatters: [ + FilteringTextInputFormatter.deny(RegExp(r'^0')) + ], + contentPadding: EdgeInsets.all(1), + prefixIcon: Container( + width: SizeConfig.width * .23, + padding: + const EdgeInsets.symmetric(horizontal: 16.0), + margin: const EdgeInsets.only(right: 16), + decoration: const BoxDecoration( + color: ColorPalette.grey, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + )), + child: const Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ImageView( + image: PathAssets.iconFlag, + fit: BoxFit.contain, + width: 24, + height: 24, + ), + Text( + '+62', + style: TextStyle( + fontWeight: FontWeight.w600, + color: ColorPalette.slate800, + ), + ) + ], + )), + validator: (value) { + if (value!.isEmpty) { + return 'Phone number must be filled'; + } else { + return null; + } + }, + ), + SizedBox( + height: 32, + ), + ButtonView( + name: 'Next', + heightWrapContent: true, + width: SizeConfig.width, + marginVertical: 0, + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 12), + onPressed: () { + if (provider.formKey.currentState!.validate()) { + nextStep(); + } + }, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Don't have an account yet?", + style: TextStyle( + color: ColorPalette.slate500, + ), + ), + TextButton( + onPressed: () { + routePush(context, page: RegistrationView()); + }, + style: TextButton.styleFrom( + padding: EdgeInsets.all(0)), + child: Text( + 'Sign Up', + style: TextStyle( + fontWeight: FontWeight.w600, + color: ColorPalette.primary), + )) + ], + ), + ], ), - child: Text( - 'Sign Up', - style: TextStyle( - fontWeight: FontWeight.w600, - color: ColorPalette.primary - ), - ) - ) - ], - ), - ], - ), - ); + ), + ); + }), + ); + }); } } diff --git a/lib/features/auth/login/view_model/login_view_model.dart b/lib/features/auth/login/view_model/login_view_model.dart index df7a02d..23949b3 100644 --- a/lib/features/auth/login/view_model/login_view_model.dart +++ b/lib/features/auth/login/view_model/login_view_model.dart @@ -1,10 +1,11 @@ -import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; class LoginViewModel extends ChangeNotifier { bool showPassword = false; + var formKey = GlobalKey(); void changeShowPassword() { showPassword = !showPassword; notifyListeners(); } -} \ No newline at end of file +} -- 2.45.2 From 2e98c1a234de41afd3159988fa7b4953b0efd13c Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 20 Feb 2024 18:21:04 +0700 Subject: [PATCH 7/8] fix: rotate photo selfie --- .../display_picture_screen.dart | 10 +++++++- .../submission_data/submit_data_id_card.dart | 24 ++++++++++++------- .../viewmodel/submission_data_viewmodel.dart | 4 ++-- pubspec.lock | 8 +++---- 4 files changed, 31 insertions(+), 15 deletions(-) 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 8e43e81..9d7038e 100644 --- a/lib/application/component/take_picture_screen/display_picture_screen.dart +++ b/lib/application/component/take_picture_screen/display_picture_screen.dart @@ -12,6 +12,7 @@ import 'package:cims_apps/features/auth/registration/viewmodel/submission_data_v import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'dart:math' as math; class DisplayPictureScreen extends StatefulWidget { final String imagePath, content; @@ -106,7 +107,14 @@ class _DisplayPictureScreenState extends State { SizedBox( width: SizeConfig.width, height: SizeConfig.height * .4, - child: Image.file(File(widget.imagePath))), + child: Transform( + alignment: Alignment.center, + transform: widget.content == 'selfie' + ? Matrix4.rotationY(math.pi) + : Matrix4.rotationY(0), + child: Image.file( + File(widget.imagePath), + ))), const Padding( padding: EdgeInsets.symmetric(vertical: 16.0), child: Text( 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 a7445cb..94b84f2 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 @@ -13,6 +13,7 @@ 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 'dart:math' as math; class SubmitDataIdCard extends StatelessWidget { const SubmitDataIdCard({Key? key}) : super(key: key); @@ -108,14 +109,21 @@ class SubmitDataIdCard extends StatelessWidget { SizedBox( height: SizeConfig.height * .18, width: SizeConfig.width * .45, - 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); - }, + child: Transform( + alignment: Alignment.center, + transform: e.key == 'selfie' + ? Matrix4.rotationY(math.pi) + : Matrix4.rotationY(0), + 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); + }, + ), ), ), ), diff --git a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart index 16eaeaa..bd63eed 100644 --- a/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart +++ b/lib/features/auth/registration/viewmodel/submission_data_viewmodel.dart @@ -52,8 +52,8 @@ class SubmissionDataViewModel extends ChangeNotifier { ]; List listImg = [ - ItemSelectForm('', 'ID Card', image: ''), - ItemSelectForm('', 'Selfie with ID Card', image: ''), + ItemSelectForm('ktp', 'ID Card', image: ''), + ItemSelectForm('selfie', 'Selfie with ID Card', image: ''), ]; Future> initCamera() async { diff --git a/pubspec.lock b/pubspec.lock index f811a80..446b2ba 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -681,18 +681,18 @@ packages: dependency: transitive description: name: syncfusion_flutter_core - sha256: "4eed0d3ae50c16b5e8e4957f3c1917e9bd0315a08dfb49a104ca8fc10244bef3" + sha256: "9f98e2726af42967497eaef68f3373261700bbfcd33bd97da4ec85cb56fcdaf7" url: "https://pub.dev" source: hosted - version: "24.2.6" + version: "24.2.7" syncfusion_flutter_signaturepad: dependency: "direct main" description: name: syncfusion_flutter_signaturepad - sha256: da55bd7d796f2c9b4707f3e063e443f67c355c6098002e446bbf43672952916e + sha256: d51d5e346c70b938a8e1f2318a073213172aea7b99e33073c379657b1066c001 url: "https://pub.dev" source: hosted - version: "24.2.6" + version: "24.2.7" synchronized: dependency: transitive description: -- 2.45.2 From ff135dd47bcb9063c5fc47bd3198d96dd860fe8f Mon Sep 17 00:00:00 2001 From: Dian Bayu Nugroho Date: Tue, 20 Feb 2024 18:49:14 +0700 Subject: [PATCH 8/8] fix: styling --- .../auth/registration/view/initial_registration_step.dart | 4 ++-- .../dashboard_public/view/dashboard_public_view.dart | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/features/auth/registration/view/initial_registration_step.dart b/lib/features/auth/registration/view/initial_registration_step.dart index c36cafe..4ea7af2 100644 --- a/lib/features/auth/registration/view/initial_registration_step.dart +++ b/lib/features/auth/registration/view/initial_registration_step.dart @@ -6,7 +6,7 @@ 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:cims_apps/features/bottom_navigation_view.dart'; import 'package:flutter/material.dart'; class InitialRegistrationStep extends StatelessWidget { @@ -203,7 +203,7 @@ class InitialRegistrationStep extends StatelessWidget { isOutlined: true, onPressed: () { routePush(context, - page: const DashboardPublicView(), + page: const BottomNavigationView(), routeType: RouteType.pushReplace); }, ), 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 aa9d85c..c0d7346 100644 --- a/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart +++ b/lib/features/dashboard/dashboard_public/view/dashboard_public_view.dart @@ -105,6 +105,7 @@ class DashboardPublicView extends StatelessWidget { provider.loginGoogle(context); }, ), + SizedBox(height: SizeConfig.height * .15), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ -- 2.45.2