From e560eaeb41f35cf9c1a6bfe8f8c3c0f5f0fd2ca0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:21:48 +0530 Subject: [PATCH] [auth] Handle duplicate signout dialog --- auth/lib/ui/account/logout_dialog.dart | 95 +++++++++++++++----------- 1 file changed, 54 insertions(+), 41 deletions(-) diff --git a/auth/lib/ui/account/logout_dialog.dart b/auth/lib/ui/account/logout_dialog.dart index 5604f0ae38..bb5defbe78 100644 --- a/auth/lib/ui/account/logout_dialog.dart +++ b/auth/lib/ui/account/logout_dialog.dart @@ -3,51 +3,64 @@ import 'package:ente_auth/l10n/l10n.dart'; import 'package:ente_auth/store/authenticator_db.dart'; import 'package:ente_auth/utils/dialog_util.dart'; import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +bool showingLogoutDialog = false; Future autoLogoutAlert(BuildContext context) async { - final l10n = context.l10n; - final AlertDialog alert = AlertDialog( - title: Text(l10n.sessionExpired), - content: Text(l10n.pleaseLoginAgain), - actions: [ - TextButton( - child: Text( - l10n.ok, - style: TextStyle( - color: Theme.of(context).colorScheme.primary, + if (showingLogoutDialog) { + debugPrint("Ignore event as already logging out"); + return; + } + try { + showingLogoutDialog = true; + final l10n = context.l10n; + final AlertDialog alert = AlertDialog( + title: Text(l10n.sessionExpired), + content: Text(l10n.pleaseLoginAgain), + actions: [ + TextButton( + child: Text( + l10n.ok, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), ), + onPressed: () async { + Navigator.of(context, rootNavigator: true).pop('dialog'); + Navigator.of(context).popUntil((route) => route.isFirst); + int pendingSyncCount = + await AuthenticatorDB.instance.getNeedSyncCount(); + if (pendingSyncCount > 0) { + // ignore: unawaited_futures + showChoiceActionSheet( + context, + title: l10n.pendingSyncs, + body: l10n.pendingSyncsWarningBody, + firstButtonLabel: context.l10n.yesLogout, + isCritical: true, + firstButtonOnTap: () async { + await _logout(context, l10n); + }, + ); + } else { + await _logout(context, l10n); + } + }, ), - onPressed: () async { - Navigator.of(context, rootNavigator: true).pop('dialog'); - Navigator.of(context).popUntil((route) => route.isFirst); - int pendingSyncCount = - await AuthenticatorDB.instance.getNeedSyncCount(); - if (pendingSyncCount > 0) { - // ignore: unawaited_futures - showChoiceActionSheet( - context, - title: l10n.pendingSyncs, - body: l10n.pendingSyncsWarningBody, - firstButtonLabel: context.l10n.yesLogout, - isCritical: true, - firstButtonOnTap: () async { - await _logout(context, l10n); - }, - ); - } else { - await _logout(context, l10n); - } - }, - ), - ], - ); - await showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return alert; - }, - ); + ], + ); + await showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return alert; + }, + ); + } catch (e) { + Logger("LogoutDialog").severe('failed to process sign out action', e); + } finally { + showingLogoutDialog = false; + } } Future _logout(BuildContext context, AppLocalizations l10n) async {