| 
									
										
										
										
											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_up_bloc.dart'; | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  | import 'package:app_flowy/user/domain/i_auth.dart'; | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +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-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'; | 
					
						
							|  |  |  | import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; | 
					
						
							| 
									
										
										
										
											2021-12-05 14:04:25 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; | 
					
						
							| 
									
										
										
										
											2021-10-09 16:43:56 +08:00
										 |  |  | import 'package:flowy_infra_ui/style_widget/snap_bar.dart'; | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  | class SignUpScreen extends StatelessWidget { | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |   final IAuthRouter router; | 
					
						
							|  |  |  |   const SignUpScreen({Key? key, required this.router}) : super(key: key); | 
					
						
							| 
									
										
										
										
											2021-07-13 13:14:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return BlocProvider( | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  |       create: (context) => getIt<SignUpBloc>(), | 
					
						
							|  |  |  |       child: BlocListener<SignUpBloc, SignUpState>( | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |         listener: (context, state) { | 
					
						
							|  |  |  |           state.successOrFail.fold( | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |             () => {}, | 
					
						
							|  |  |  |             (result) => _handleSuccessOrFail(context, result), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |           ); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |         child: const Scaffold(body: SignUpForm()), | 
					
						
							| 
									
										
										
										
											2021-07-13 13:14:49 +08:00
										 |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |   void _handleSuccessOrFail(BuildContext context, Either<UserProfile, UserError> result) { | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  | class SignUpForm extends StatelessWidget { | 
					
						
							|  |  |  |   const SignUpForm({ | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |     Key? key, | 
					
						
							|  |  |  |   }) : 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.signUp_title.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(), | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |           const RepeatPasswordTextField(), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |           const VSpace(30), | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  |           const SignUpButton(), | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |           const VSpace(10), | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  |           const SignUpPrompt(), | 
					
						
							|  |  |  |           if (context.read<SignUpBloc>().state.isSubmitting) ...[ | 
					
						
							| 
									
										
										
										
											2021-07-25 16:07:53 +08:00
										 |  |  |             const SizedBox(height: 8), | 
					
						
							|  |  |  |             const LinearProgressIndicator(value: null), | 
					
						
							|  |  |  |           ] | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SignUpPrompt extends StatelessWidget { | 
					
						
							|  |  |  |   const SignUpPrompt({ | 
					
						
							|  |  |  |     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 Row( | 
					
						
							|  |  |  |       children: [ | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |         Text( | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |           LocaleKeys.signUp_alreadyHaveAnAccount.tr(), | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |           style: TextStyle(color: theme.shader3, fontSize: 12), | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |         TextButton( | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |           style: TextButton.styleFrom(textStyle: const TextStyle(fontSize: 12)), | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  |           onPressed: () => Navigator.pop(context), | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |           child: Text(LocaleKeys.signIn_buttonText.tr(), style: TextStyle(color: theme.main1)), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |         ), | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  | class SignUpButton extends StatelessWidget { | 
					
						
							|  |  |  |   const SignUpButton({ | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |     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.signUp_getStartedText.tr(), | 
					
						
							| 
									
										
										
										
											2021-09-05 22:52:20 +08:00
										 |  |  |       height: 48, | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |       color: theme.main1, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |       onPressed: () { | 
					
						
							|  |  |  |         context.read<SignUpBloc>().add(const SignUpEvent.signUpWithUserEmailAndPassword()); | 
					
						
							| 
									
										
										
										
											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-09-05 22:52:20 +08:00
										 |  |  |     return BlocBuilder<SignUpBloc, SignUpState>( | 
					
						
							| 
									
										
										
										
											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-11-22 12:13:45 +00:00
										 |  |  |           obscureIcon: svg("home/hide"), | 
					
						
							|  |  |  |           obscureHideIcon: svg("home/show"), | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |           hintText: LocaleKeys.signUp_passwordHint.tr(), | 
					
						
							| 
									
										
										
										
											2021-09-05 18:02:49 +08:00
										 |  |  |           normalBorderColor: theme.shader4, | 
					
						
							|  |  |  |           highlightBorderColor: theme.red, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           cursorColor: theme.main1, | 
					
						
							|  |  |  |           errorText: context.read<SignUpBloc>().state.passwordError.fold(() => "", (error) => error), | 
					
						
							|  |  |  |           onChanged: (value) => context.read<SignUpBloc>().add(SignUpEvent.passwordChanged(value)), | 
					
						
							| 
									
										
										
										
											2021-07-25 18:04:16 +08:00
										 |  |  |         ); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  | class RepeatPasswordTextField extends StatelessWidget { | 
					
						
							|  |  |  |   const RepeatPasswordTextField({ | 
					
						
							|  |  |  |     Key? key, | 
					
						
							|  |  |  |   }) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     final theme = context.watch<AppTheme>(); | 
					
						
							|  |  |  |     return BlocBuilder<SignUpBloc, SignUpState>( | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |       buildWhen: (previous, current) => previous.repeatPasswordError != current.repeatPasswordError, | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |       builder: (context, state) { | 
					
						
							|  |  |  |         return RoundedInputField( | 
					
						
							|  |  |  |           obscureText: true, | 
					
						
							| 
									
										
										
										
											2021-11-22 12:13:45 +00:00
										 |  |  |           obscureIcon: svg("home/hide"), | 
					
						
							|  |  |  |           obscureHideIcon: svg("home/show"), | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), | 
					
						
							| 
									
										
										
										
											2021-12-07 23:01:23 +05:30
										 |  |  |           hintText: LocaleKeys.signUp_repeatPasswordHint.tr(), | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |           normalBorderColor: theme.shader4, | 
					
						
							|  |  |  |           highlightBorderColor: theme.red, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           cursorColor: theme.main1, | 
					
						
							|  |  |  |           errorText: context.read<SignUpBloc>().state.repeatPasswordError.fold(() => "", (error) => error), | 
					
						
							|  |  |  |           onChanged: (value) => context.read<SignUpBloc>().add(SignUpEvent.repeatPasswordChanged(value)), | 
					
						
							| 
									
										
										
										
											2021-09-06 16:18:34 +08:00
										 |  |  |         ); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-09-05 22:52:20 +08:00
										 |  |  |     return BlocBuilder<SignUpBloc, SignUpState>( | 
					
						
							| 
									
										
										
										
											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.signUp_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, | 
					
						
							|  |  |  |           highlightBorderColor: theme.red, | 
					
						
							| 
									
										
										
										
											2021-10-20 14:56:25 +08:00
										 |  |  |           cursorColor: theme.main1, | 
					
						
							|  |  |  |           errorText: context.read<SignUpBloc>().state.emailError.fold(() => "", (error) => error), | 
					
						
							|  |  |  |           onChanged: (value) => context.read<SignUpBloc>().add(SignUpEvent.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
										 |  |  | } |