Yimaru-Mobile/lib/ui/views/register/screens/register_with_email_screen.dart

241 lines
7.7 KiB
Dart

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<RegisterViewModel> {
final TextEditingController emailController;
const RegisterWithEmailScreen({
super.key,
required this.emailController,
});
void _addUserData(RegisterViewModel viewModel) {
FocusManager.instance.primaryFocus?.unfocus();
Map<String, dynamic> 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<Widget> _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<Widget> _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<Widget> _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<Widget> _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();
}