| 
									
										
										
										
											2021-07-13 13:14:49 +08:00
										 |  |  | import 'package:app_flowy/startup/startup.dart'; | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  | import 'package:app_flowy/user/application/sign_in_bloc.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-01 10:48:34 -05:00
										 |  |  | import 'package:app_flowy/user/presentation/router.dart'; | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  | import 'package:app_flowy/user/presentation/widgets/background.dart'; | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  | import 'package:easy_localization/easy_localization.dart'; | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  | import 'package:flowy_infra/size.dart'; | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  | import 'package:flowy_infra/theme.dart'; | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  | import 'package:flowy_infra_ui/widget/rounded_button.dart'; | 
					
						
							|  |  |  | import 'package:flowy_infra_ui/widget/rounded_input_field.dart'; | 
					
						
							|  |  |  | import 'package:flowy_infra_ui/widget/spacing.dart'; | 
					
						
							| 
									
										
										
										
											2021-10-09 16:43:56 +08:00
										 |  |  | import 'package:flowy_infra_ui/style_widget/snap_bar.dart'; | 
					
						
							| 
									
										
										
										
											2021-12-14 18:04:51 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; | 
					
						
							| 
									
										
										
										
											2021-12-19 21:29:33 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile; | 
					
						
							| 
									
										
										
										
											2021-07-13 13:14:49 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:flutter_bloc/flutter_bloc.dart'; | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  | import 'package:dartz/dartz.dart'; | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  | import 'package:flowy_infra/image.dart'; | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  | import 'package:app_flowy/generated/locale_keys.g.dart'; | 
					
						
							| 
									
										
										
										
											2021-07-13 13:14:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class SignInScreen extends StatelessWidget { | 
					
						
							| 
									
										
										
										
											2022-01-31 08:15:49 +08:00
										 |  |  |   final AuthRouter router; | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |   const SignInScreen({Key? key, required this.router}) : super(key: key); | 
					
						
							| 
									
										
										
										
											2021-07-13 13:14:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return BlocProvider( | 
					
						
							|  |  |  |       create: (context) => getIt<SignInBloc>(), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |       child: BlocListener<SignInBloc, SignInState>( | 
					
						
							|  |  |  |         listener: (context, state) { | 
					
						
							|  |  |  |           state.successOrFail.fold( | 
					
						
							|  |  |  |             () => null, | 
					
						
							|  |  |  |             (result) => _handleSuccessOrFail(result, context), | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         child: Scaffold( | 
					
						
							|  |  |  |           body: SignInForm(router: router), | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |         ), | 
					
						
							| 
									
										
										
										
											2021-07-13 13:14:49 +08:00
										 |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-14 18:04:51 +08:00
										 |  |  |   void _handleSuccessOrFail(Either<UserProfile, FlowyError> result, BuildContext context) { | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |     result.fold( | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |       (user) => router.pushWelcomeScreen(context, user), | 
					
						
							| 
									
										
										
										
											2021-10-09 16:43:56 +08:00
										 |  |  |       (error) => showSnapBar(context, error.msg), | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SignInForm extends StatelessWidget { | 
					
						
							| 
									
										
										
										
											2022-01-31 08:15:49 +08:00
										 |  |  |   final AuthRouter router; | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |   const SignInForm({ | 
					
						
							|  |  |  |     Key? key, | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |     required this.router, | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |   }) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return Align( | 
					
						
							|  |  |  |       alignment: Alignment.center, | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  |       child: AuthFormContainer( | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |         children: [ | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |           FlowyLogoTitle( | 
					
						
							|  |  |  |             title: LocaleKeys.signIn_loginTitle.tr(), | 
					
						
							|  |  |  |             logoSize: const Size(60, 60), | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |           ), | 
					
						
							|  |  |  |           const VSpace(30), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |           const EmailTextField(), | 
					
						
							|  |  |  |           const PasswordTextField(), | 
					
						
							|  |  |  |           ForgetPasswordButton(router: router), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |           const VSpace(30), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |           const LoginButton(), | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |           const VSpace(10), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |           SignUpPrompt(router: router), | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |           if (context.read<SignInBloc>().state.isSubmitting) ...[ | 
					
						
							|  |  |  |             const SizedBox(height: 8), | 
					
						
							|  |  |  |             const LinearProgressIndicator(value: null), | 
					
						
							|  |  |  |           ] | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SignUpPrompt extends StatelessWidget { | 
					
						
							|  |  |  |   const SignUpPrompt({ | 
					
						
							|  |  |  |     Key? key, | 
					
						
							|  |  |  |     required this.router, | 
					
						
							|  |  |  |   }) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-31 08:15:49 +08:00
										 |  |  |   final AuthRouter router; | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |     final theme = context.watch<AppTheme>(); | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |     return Row( | 
					
						
							|  |  |  |       children: [ | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |         Text(LocaleKeys.signIn_dontHaveAnAccount.tr(), style: TextStyle(color: theme.shader3, fontSize: 12)), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |         TextButton( | 
					
						
							|  |  |  |           style: TextButton.styleFrom( | 
					
						
							|  |  |  |             textStyle: const TextStyle(fontSize: 12), | 
					
						
							|  |  |  |           ), | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |           onPressed: () => router.pushSignUpScreen(context), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |           child: Text( | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |             LocaleKeys.signUp_buttonText.tr(), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |             style: TextStyle(color: theme.main1), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |           ), | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class LoginButton extends StatelessWidget { | 
					
						
							|  |  |  |   const LoginButton({ | 
					
						
							|  |  |  |     Key? key, | 
					
						
							|  |  |  |   }) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |     final theme = context.watch<AppTheme>(); | 
					
						
							| 
									
										
										
										
											2021-07-25 22:09:52 +08:00
										 |  |  |     return RoundedTextButton( | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |       title: LocaleKeys.signIn_loginButtonText.tr(), | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  |       height: 48, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |       borderRadius: Corners.s10Border, | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |       color: theme.main1, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |       onPressed: () { | 
					
						
							|  |  |  |         context.read<SignInBloc>().add(const SignInEvent.signedInWithUserEmailAndPassword()); | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ForgetPasswordButton extends StatelessWidget { | 
					
						
							|  |  |  |   const ForgetPasswordButton({ | 
					
						
							|  |  |  |     Key? key, | 
					
						
							|  |  |  |     required this.router, | 
					
						
							|  |  |  |   }) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-31 08:15:49 +08:00
										 |  |  |   final AuthRouter router; | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |     final theme = context.watch<AppTheme>(); | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |     return TextButton( | 
					
						
							|  |  |  |       style: TextButton.styleFrom( | 
					
						
							|  |  |  |         textStyle: const TextStyle(fontSize: 12), | 
					
						
							|  |  |  |       ), | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |       onPressed: () => router.pushForgetPasswordScreen(context), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |       child: Text( | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |         LocaleKeys.signIn_forgotPassword.tr(), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |         style: TextStyle(color: theme.main1), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  | class PasswordTextField extends StatelessWidget { | 
					
						
							|  |  |  |   const PasswordTextField({ | 
					
						
							|  |  |  |     Key? key, | 
					
						
							|  |  |  |   }) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |     final theme = context.watch<AppTheme>(); | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |     return BlocBuilder<SignInBloc, SignInState>( | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |       buildWhen: (previous, current) => previous.passwordError != current.passwordError, | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |       builder: (context, state) { | 
					
						
							|  |  |  |         return RoundedInputField( | 
					
						
							|  |  |  |           obscureText: true, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), | 
					
						
							| 
									
										
										
										
											2022-04-03 10:53:24 +08:00
										 |  |  |           obscureIcon: svgWidget("home/hide"), | 
					
						
							|  |  |  |           obscureHideIcon: svgWidget("home/show"), | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |           hintText: LocaleKeys.signIn_passwordHint.tr(), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |           normalBorderColor: theme.shader4, | 
					
						
							| 
									
										
										
										
											2022-03-22 20:51:15 +08:00
										 |  |  |           errorBorderColor: theme.red, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           cursorColor: theme.main1, | 
					
						
							|  |  |  |           errorText: context.read<SignInBloc>().state.passwordError.fold(() => "", (error) => error), | 
					
						
							|  |  |  |           onChanged: (value) => context.read<SignInBloc>().add(SignInEvent.passwordChanged(value)), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |         ); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class EmailTextField extends StatelessWidget { | 
					
						
							|  |  |  |   const EmailTextField({ | 
					
						
							|  |  |  |     Key? key, | 
					
						
							|  |  |  |   }) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |     final theme = context.watch<AppTheme>(); | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |     return BlocBuilder<SignInBloc, SignInState>( | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |       buildWhen: (previous, current) => previous.emailError != current.emailError, | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |       builder: (context, state) { | 
					
						
							|  |  |  |         return RoundedInputField( | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |           hintText: LocaleKeys.signIn_emailHint.tr(), | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |           normalBorderColor: theme.shader4, | 
					
						
							| 
									
										
										
										
											2022-03-22 20:51:15 +08:00
										 |  |  |           errorBorderColor: theme.red, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           cursorColor: theme.main1, | 
					
						
							|  |  |  |           errorText: context.read<SignInBloc>().state.emailError.fold(() => "", (error) => error), | 
					
						
							|  |  |  |           onChanged: (value) => context.read<SignInBloc>().add(SignInEvent.emailChanged(value)), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |         ); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-07-13 13:14:49 +08:00
										 |  |  | } |