fix: add validation submit sign in

This commit is contained in:
Dian Bayu Nugroho 2024-02-20 15:38:21 +07:00
parent e510aaefd7
commit c4c0479341
4 changed files with 190 additions and 162 deletions

View File

@ -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/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/application/theme/color_palette.dart';
import 'package:cims_apps/core/route/route.dart'; import 'package:cims_apps/core/route/route.dart';
import 'package:cims_apps/core/utils/size_config.dart'; import 'package:cims_apps/core/utils/size_config.dart';
import 'package:cims_apps/features/auth/login/view/password_view.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/phone_number_view.dart';
import 'package:cims_apps/features/auth/login/view_model/login_view_model.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:cims_apps/features/bottom_navigation_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class LoginView extends StatefulWidget { class LoginView extends StatefulWidget {
@ -90,7 +83,11 @@ class _LoginViewState extends State<LoginView> {
currentPage++; currentPage++;
pageController.jumpToPage(1); pageController.jumpToPage(1);
} else { } else {
routePush(context, page: BottomNavigationView()); routePush(
context,
page: const BottomNavigationView(),
routeType: RouteType.pushReplace,
);
} }
} }
} }

View File

@ -10,16 +10,19 @@ import 'package:provider/provider.dart';
class PasswordView extends StatelessWidget { class PasswordView extends StatelessWidget {
final void Function() nextStep; final void Function() nextStep;
final TextEditingController controller; final TextEditingController controller;
const PasswordView({super.key, required this.nextStep, required this.controller}); const PasswordView(
{super.key, required this.nextStep, required this.controller});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<LoginViewModel>( return Consumer<LoginViewModel>(builder: (context, provider, child) {
builder: (context, provider, child) {
return Container( return Container(
width: SizeConfig.width, width: SizeConfig.width,
height: SizeConfig.height, height: SizeConfig.height,
padding: const EdgeInsets.all(24), padding: const EdgeInsets.all(24),
child: Form(
key: provider.formKey,
child: SingleChildScrollView(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -32,6 +35,15 @@ class PasswordView extends StatelessWidget {
ctrl: controller, ctrl: controller,
obscureText: !provider.showPassword, obscureText: !provider.showPassword,
contentPadding: EdgeInsets.all(12), 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;
}
},
suffixIcon: GestureDetector( suffixIcon: GestureDetector(
onTap: () { onTap: () {
provider.changeShowPassword(); provider.changeShowPassword();
@ -45,19 +57,14 @@ class PasswordView extends StatelessWidget {
), ),
), ),
TextButton( TextButton(
style: TextButton.styleFrom( style: TextButton.styleFrom(padding: EdgeInsets.all(0)),
padding: EdgeInsets.all(0) onPressed: () {},
),
onPressed: () {
},
child: Text( child: Text(
'Forget the password?', 'Forget the password?',
style: TextStyle( style: TextStyle(
color: ColorPalette.primary, color: ColorPalette.primary,
), ),
) )),
),
SizedBox( SizedBox(
height: 16, height: 16,
), ),
@ -67,13 +74,19 @@ class PasswordView extends StatelessWidget {
width: SizeConfig.width, width: SizeConfig.width,
textSize: 18, textSize: 18,
marginVertical: 0, marginVertical: 0,
contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), contentPadding:
onPressed: nextStep, EdgeInsets.symmetric(horizontal: 16, vertical: 12),
onPressed: () {
if (provider.formKey.currentState!.validate()) {
nextStep();
}
},
) )
], ],
), ),
),
),
); );
} });
);
} }
} }

View File

@ -1,31 +1,42 @@
import 'package:cims_apps/application/assets/path_assets.dart'; import 'package:cims_apps/application/assets/path_assets.dart';
import 'package:cims_apps/application/component/button/button_view.dart'; import 'package:cims_apps/application/component/button/button_view.dart';
import 'package:cims_apps/application/component/image/image_view.dart'; import 'package:cims_apps/application/component/image/image_view.dart';
import 'package:cims_apps/application/component/numeric_pad/numeric_pad.dart';
import 'package:cims_apps/application/component/text_form/text_form_view.dart'; import 'package:cims_apps/application/component/text_form/text_form_view.dart';
import 'package:cims_apps/application/component/text_title/text_title.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/application/theme/color_palette.dart';
import 'package:cims_apps/core/route/route.dart'; import 'package:cims_apps/core/route/route.dart';
import 'package:cims_apps/core/utils/size_config.dart'; import 'package:cims_apps/core/utils/size_config.dart';
import 'package:cims_apps/features/auth/login/view_model/login_view_model.dart';
import 'package:cims_apps/features/auth/registration/view/registration_view.dart'; import 'package:cims_apps/features/auth/registration/view/registration_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
class PhoneNumberView extends StatelessWidget { class PhoneNumberView extends StatelessWidget {
final void Function() nextStep; final void Function() nextStep;
final TextEditingController controller; final TextEditingController controller;
const PhoneNumberView({super.key, required this.nextStep, required this.controller}); const PhoneNumberView(
{super.key, required this.nextStep, required this.controller});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => LoginViewModel(),
builder: (context, child) {
return Container( return Container(
width: SizeConfig.width, width: SizeConfig.width,
height: SizeConfig.height, height: SizeConfig.height,
padding: const EdgeInsets.all(24), padding: const EdgeInsets.all(24),
child:
Consumer<LoginViewModel>(builder: (context, provider, child) {
return Form(
key: provider.formKey,
child: SingleChildScrollView(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const TextTitle(title: 'Enter your phone number', fontSize: 24), const TextTitle(
title: 'Enter your phone number', fontSize: 24),
SizedBox( SizedBox(
height: 24, height: 24,
), ),
@ -82,8 +93,13 @@ class PhoneNumberView extends StatelessWidget {
heightWrapContent: true, heightWrapContent: true,
width: SizeConfig.width, width: SizeConfig.width,
marginVertical: 0, marginVertical: 0,
contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), contentPadding: const EdgeInsets.symmetric(
onPressed: nextStep, horizontal: 16, vertical: 12),
onPressed: () {
if (provider.formKey.currentState!.validate()) {
nextStep();
}
},
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@ -99,20 +115,21 @@ class PhoneNumberView extends StatelessWidget {
routePush(context, page: RegistrationView()); routePush(context, page: RegistrationView());
}, },
style: TextButton.styleFrom( style: TextButton.styleFrom(
padding: EdgeInsets.all(0) padding: EdgeInsets.all(0)),
),
child: Text( child: Text(
'Sign Up', 'Sign Up',
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: ColorPalette.primary color: ColorPalette.primary),
), ))
)
)
], ],
), ),
], ],
), ),
),
); );
}),
);
});
} }
} }

View File

@ -1,7 +1,8 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart';
class LoginViewModel extends ChangeNotifier { class LoginViewModel extends ChangeNotifier {
bool showPassword = false; bool showPassword = false;
var formKey = GlobalKey<FormState>();
void changeShowPassword() { void changeShowPassword() {
showPassword = !showPassword; showPassword = !showPassword;