import 'dart:async'; import 'package:awesome_extensions/awesome_extensions.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_translate/flutter_translate.dart'; import 'package:go_router/go_router.dart'; import '../../layout/default_app_bar.dart'; import '../../notifications/cubits/notifications_cubit.dart'; import '../../theme/theme.dart'; import '../../tools/tools.dart'; import '../../veilid_processor/veilid_processor.dart'; import '../account_manager.dart'; import 'edit_profile_form.dart'; class NewAccountPage extends StatefulWidget { const NewAccountPage({super.key}); @override State createState() => _NewAccountPageState(); } class _NewAccountPageState extends WindowSetupState { _NewAccountPageState() : super( titleBarStyle: TitleBarStyle.normal, orientationCapability: OrientationCapability.portraitOnly); Widget _newAccountForm( BuildContext context, ) => EditProfileForm( header: translate('new_account_page.header'), instructions: translate('new_account_page.instructions'), submitText: translate('new_account_page.create'), submitDisabledText: translate('button.waiting_for_network'), initialValue: const AccountSpec.empty(), onSubmit: _onSubmit); Future _onSubmit(AccountSpec accountSpec) async { // dismiss the keyboard by unfocusing the textfield FocusScope.of(context).unfocus(); try { setState(() { _isInAsyncCall = true; }); try { final networkReady = context .read() .state .asData ?.value .isPublicInternetReady ?? false; final canSubmit = networkReady; if (!canSubmit) { context.read().error( text: translate('new_account_page.network_is_offline'), title: translate('new_account_page.error')); return false; } final isFirstAccount = AccountRepository.instance.getLocalAccounts().isEmpty; final writableSuperIdentity = await AccountRepository.instance .createWithNewSuperIdentity(accountSpec); GoRouterHelper(context).pushReplacement('/new_account/recovery_key', extra: [writableSuperIdentity, accountSpec.name, isFirstAccount]); return true; } finally { if (mounted) { setState(() { _isInAsyncCall = false; }); } } } on Exception catch (e, st) { if (mounted) { await showErrorStacktraceModal( context: context, error: e, stackTrace: st); } } return false; } @override Widget build(BuildContext context) { final displayModalHUD = _isInAsyncCall; return StyledScaffold( appBar: DefaultAppBar( title: Text(translate('new_account_page.titlebar')), leading: GoRouterHelper(context).canPop() ? IconButton( icon: const Icon(Icons.arrow_back), onPressed: () { if (GoRouterHelper(context).canPop()) { GoRouterHelper(context).pop(); } else { GoRouterHelper(context).go('/'); } }, ) : null, actions: [ const SignalStrengthMeterWidget(), IconButton( icon: const Icon(Icons.settings), tooltip: translate('menu.settings_tooltip'), onPressed: () async { await GoRouterHelper(context).push('/settings'); }) ]), body: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), child: _newAccountForm( context, )).paddingAll(2), ).withModalHUD(context, displayModalHUD); } //////////////////////////////////////////////////////////////////////////// bool _isInAsyncCall = false; }