125 lines
3.5 KiB
Dart
125 lines
3.5 KiB
Dart
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<SignUpForm> {
|
|
late final SignUpFormControllers controllers;
|
|
final _formKey = GlobalKey<FormState>();
|
|
bool _autoValidateMode = false;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
controllers = SignUpFormControllers();
|
|
}
|
|
|
|
Future<String?> signUp(
|
|
BuildContext context,
|
|
VoidCallback onSignUp,
|
|
void Function(Object e) onError,
|
|
) async {
|
|
final provider = Provider.of<AccountProvider>(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<LocaleProvider>().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,
|
|
);
|
|
}
|