import 'package:flutter/material.dart'; import 'package:flutter_timezone/flutter_timezone.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:pshared/api/requests/login_data.dart'; import 'package:pshared/models/describable.dart'; import 'package:pshared/provider/locale.dart'; import 'package:pshared/provider/account.dart'; import 'package:pweb/app/router/pages.dart'; import 'package:pweb/pages/signup/form/content.dart'; import 'package:pweb/pages/signup/form/controllers.dart'; import 'package:pweb/pages/signup/form/form.dart'; import 'package:pweb/utils/snackbar.dart'; import 'package:pweb/widgets/error/snackbar.dart'; import 'package:pweb/generated/i18n/app_localizations.dart'; class SignUpFormState extends State { late final SignUpFormControllers controllers; final _formKey = GlobalKey(); bool _autoValidateMode = false; @override void initState() { super.initState(); controllers = SignUpFormControllers(); } Future signUp( BuildContext context, VoidCallback onSignUp, void Function(Object e) onError, ) async { final provider = Provider.of(context, listen: false); setState(() { _autoValidateMode = true; }); if (!(_formKey.currentState?.validate() ?? false)) { return null; } try { final orgDescription = controllers.description.text.trim(); final locs = AppLocalizations.of(context)!; final locale = context.read().locale; final timezone = await FlutterTimezone.getLocalTimezone(locale.toString()); await provider.signup( account: AccountData.build( login: LoginData.build( login: controllers.email.text.trim(), password: controllers.password.text, locale: locale.toLanguageTag(), ), name: controllers.firstName.text.trim(), lastName: controllers.lastName.text.trim(), ), organization: newDescribable( name: controllers.companyName.text.trim(), description: orgDescription.isEmpty ? null : orgDescription, ), timezone: timezone.identifier, ownerRole: newDescribable( name: locs.ownerRole, description: locs.ownerRoleDescription, ), cryptoWallet: newDescribable( name: locs.cryptoWallet, description: locs.cryptoWalletDesc, ), ledgerWallet: newDescribable( name: locs.ledgerWallet, description: locs.ledgerWalletDesc, ), ); onSignUp(); return 'ok'; } catch (e) { onError(provider.error ?? e); } return null; } void handleSignUp() => signUp( context, () { final locs = AppLocalizations.of(context)!; notifyUser( context, locs.signupSuccess(controllers.email.text.trim()), ); context.goNamed(Pages.login.name); }, (e) => postNotifyUserOfErrorX( context: context, errorSituation: AppLocalizations.of(context)!.errorSignUp, exception: e, ), ); void handleLogin() => navigate(context, Pages.login); @override void dispose() { controllers.dispose(); super.dispose(); } @override Widget build(BuildContext context) => SignUpFormContent( formKey: _formKey, controllers: controllers, autoValidateMode: _autoValidateMode, onSignUp: handleSignUp, onLogin: handleLogin, ); }