import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import 'package:yimaru_app/ui/common/enmus.dart'; import 'package:yimaru_app/ui/widgets/login_account.dart'; import '../../../common/app_colors.dart'; import '../../../common/ui_helpers.dart'; import '../../../widgets/custom_elevated_button.dart'; import '../../../widgets/large_app_bar.dart'; import '../../../widgets/option_text_divider.dart'; import '../../../widgets/page_loading_indicator.dart'; import '../register_viewmodel.dart'; import '../register_view.form.dart'; class RegisterWithEmailScreen extends ViewModelWidget { final TextEditingController emailController; const RegisterWithEmailScreen({ super.key, required this.emailController, }); void _addUserData(RegisterViewModel viewModel) { FocusManager.instance.primaryFocus?.unfocus(); Map data = { 'email': emailController.text, }; viewModel.addUserData(data); viewModel.goTo(page: 2, type: RegistrationType.email); } Widget getPadding(context) { double half = screenHeight(context) / 2; return SizedBox( height: half + 155 - half, ); } @override Widget build(BuildContext context, RegisterViewModel viewModel) => _buildScaffoldWrapper(context: context, viewModel: viewModel); Widget _buildScaffoldWrapper( {required BuildContext context, required RegisterViewModel viewModel}) => Scaffold( backgroundColor: kcBackgroundColor, body: _buildScaffoldStack(context: context, viewModel: viewModel), ); Widget _buildScaffoldStack( {required BuildContext context, required RegisterViewModel viewModel}) => Stack( children: [ _buildScaffold(context: context, viewModel: viewModel), _buildRegisterWithGoogleState(viewModel) ], ); Widget _buildScaffold( {required BuildContext context, required RegisterViewModel viewModel}) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: _buildScaffoldChildren(context: context, viewModel: viewModel), ); List _buildScaffoldChildren( {required BuildContext context, required RegisterViewModel viewModel}) => [ _buildAppBar(viewModel), _buildExpandedBody(context: context, viewModel: viewModel) ]; Widget _buildAppBar(RegisterViewModel viewModel) => const LargeAppBar( showBackButton: false, showLanguageSelection: true, ); Widget _buildExpandedBody( {required BuildContext context, required RegisterViewModel viewModel}) => Expanded( child: _buildColumnScroller(context: context, viewModel: viewModel)); Widget _buildColumnScroller( {required BuildContext context, required RegisterViewModel viewModel}) => SingleChildScrollView( child: _buildBodyWrapper(context: context, viewModel: viewModel), ); Widget _buildBodyWrapper( {required BuildContext context, required RegisterViewModel viewModel}) => Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: _buildBody(context: context, viewModel: viewModel), ); Widget _buildBody( {required BuildContext context, required RegisterViewModel viewModel}) => Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: _buildBodyChildren(context: context, viewModel: viewModel), ); List _buildBodyChildren( {required BuildContext context, required RegisterViewModel viewModel}) => [ _buildUpperColumn(viewModel), getPadding(context), _buildLowerColumn(viewModel) ]; Widget _buildUpperColumn(RegisterViewModel viewModel) => Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: _buildUpperColumnChildren(viewModel), ); List _buildUpperColumnChildren(RegisterViewModel viewModel) => [ verticalSpaceMedium, _buildTitle(), _buildSubtitleWrapper(viewModel), verticalSpaceLarge, _buildEmailFormField(viewModel), if (viewModel.hasEmailValidationMessage && viewModel.focusEmail) verticalSpaceTiny, if (viewModel.hasEmailValidationMessage && viewModel.focusEmail) _buildEmailValidatorWrapper(viewModel), ]; Widget _buildTitle() => const Text( 'Create an Account', style: TextStyle( fontSize: 25, color: kcDarkGrey, fontWeight: FontWeight.w600, ), ); Widget _buildSubtitleWrapper(RegisterViewModel viewModel) => LoginAccount( onTap: () async => await viewModel.replaceToLogin(), ); Widget _buildEmailFormField(RegisterViewModel viewModel) => TextFormField( controller: emailController, keyboardType: TextInputType.emailAddress, onTap: viewModel.setEmailFocus, decoration: inputDecoration( hint: 'Email', focus: viewModel.focusEmail, filled: emailController.text.isNotEmpty), ); Widget _buildEmailValidatorWrapper(RegisterViewModel viewModel) => viewModel.hasEmailValidationMessage ? _buildEmailValidator(viewModel) : Container(); Widget _buildEmailValidator(RegisterViewModel viewModel) => Text( viewModel.emailValidationMessage!, style: const TextStyle( fontSize: 12, color: Colors.red, fontWeight: FontWeight.w700, ), ); Widget _buildLowerColumn(RegisterViewModel viewModel) => Column( mainAxisSize: MainAxisSize.min, children: _buildLowerColumnChildren(viewModel), ); List _buildLowerColumnChildren(RegisterViewModel viewModel) => [ _buildContinueButton(viewModel), _buildRegisterWithGoogleButton(viewModel), _buildOptionTextDivider(), _buildRegisterWithEmailButton(viewModel), verticalSpaceMedium ]; Widget _buildContinueButton(RegisterViewModel viewModel) => CustomElevatedButton( height: 55, safe: false, text: 'Continue', borderRadius: 12, foregroundColor: kcWhite, onTap: emailController.text.isNotEmpty && !viewModel.hasEmailValidationMessage ? () => _addUserData(viewModel) : null, backgroundColor: emailController.text.isNotEmpty && !viewModel.hasEmailValidationMessage ? kcPrimaryColor : kcPrimaryColor.withOpacity(0.1), ); Widget _buildRegisterWithGoogleButton(RegisterViewModel viewModel) => CustomElevatedButton( height: 55, borderRadius: 12, backgroundColor: kcWhite, text: 'Login with Google', borderColor: kcPrimaryColor, foregroundColor: kcPrimaryColor, leadingImage: 'assets/icons/google.png', onTap: () async => await viewModel.registerWithGoogle(), ); Widget _buildOptionTextDivider() => const OptionTextDivider(); Widget _buildRegisterWithEmailButton(RegisterViewModel viewModel) => CustomElevatedButton( height: 55, borderRadius: 12, backgroundColor: kcWhite, leadingIcon: Icons.phone, borderColor: kcPrimaryColor, foregroundColor: kcPrimaryColor, text: 'Register with Phone Number', onTap: () => viewModel.goTo(page: 1), ); Widget _buildRegisterWithGoogleState(RegisterViewModel viewModel) => viewModel.busy(StateObjects.registerWithEmail) ? const PageLoadingIndicator() : Container(); }