3 Commits

3 changed files with 39 additions and 9 deletions

1
.gitignore vendored
View File

@@ -9,3 +9,4 @@ untranslated.txt
generate_protos.sh generate_protos.sh
update_dep.sh update_dep.sh
.vscode/ .vscode/
GeneratedPluginRegistrant.swift

View File

@@ -27,6 +27,7 @@ class AccountProvider extends ChangeNotifier {
Resource<Account?> get resource => _resource; Resource<Account?> get resource => _resource;
late LocaleProvider _localeProvider; late LocaleProvider _localeProvider;
PendingLogin? _pendingLogin; PendingLogin? _pendingLogin;
Future<void>? _restoreFuture;
Account? get account => _resource.data; Account? get account => _resource.data;
PendingLogin? get pendingLogin => _pendingLogin; PendingLogin? get pendingLogin => _pendingLogin;
@@ -34,6 +35,7 @@ class AccountProvider extends ChangeNotifier {
bool get isLoading => _resource.isLoading; bool get isLoading => _resource.isLoading;
Object? get error => _resource.error; Object? get error => _resource.error;
bool get isReady => (!isLoading) && (account != null); bool get isReady => (!isLoading) && (account != null);
Future<void>? get restoreFuture => _restoreFuture;
Account? currentUser() { Account? currentUser() {
final acc = account; final acc = account;
@@ -220,4 +222,12 @@ class AccountProvider extends ChangeNotifier {
rethrow; rethrow;
} }
} }
Future<void> restoreIfPossible() {
return _restoreFuture ??= () async {
final hasAuth = await AuthorizationService.isAuthorizationStored();
if (!hasAuth) return;
await restore();
}();
}
} }

View File

@@ -17,15 +17,34 @@ class AccountLoader extends StatelessWidget {
@override @override
Widget build(BuildContext context) => Consumer<AccountProvider>(builder: (context, provider, _) { Widget build(BuildContext context) => Consumer<AccountProvider>(builder: (context, provider, _) {
if (provider.isLoading) return const Center(child: CircularProgressIndicator()); if (provider.account != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
});
return child;
}
if (provider.error != null) { if (provider.error != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
postNotifyUserOfErrorX( postNotifyUserOfErrorX(
context: context, context: context,
errorSituation: AppLocalizations.of(context)!.errorLogin, errorSituation: AppLocalizations.of(context)!.errorLogin,
exception: provider.error!, exception: provider.error!,
); );
navigateAndReplace(context, Pages.login); navigateAndReplace(context, Pages.login);
});
return const Center(child: CircularProgressIndicator());
} }
if (provider.restoreFuture == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
provider.restoreIfPossible().catchError((error, stack) {
debugPrint('Account restore failed: $error');
});
});
return const Center(child: CircularProgressIndicator());
}
if (provider.isLoading) return const Center(child: CircularProgressIndicator());
if (provider.account == null) { if (provider.account == null) {
WidgetsBinding.instance.addPostFrameCallback((_) => navigateAndReplace(context, Pages.login)); WidgetsBinding.instance.addPostFrameCallback((_) => navigateAndReplace(context, Pages.login));
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());