From 4e582ddceb0e9e67436cf5f91338e92accf37d8a Mon Sep 17 00:00:00 2001 From: johnstef99 Date: Tue, 12 Nov 2024 19:52:57 +0200 Subject: [PATCH 1/6] fix(mobile): add timeout to logout --- mobile/lib/providers/authentication.provider.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mobile/lib/providers/authentication.provider.dart b/mobile/lib/providers/authentication.provider.dart index 1fe7db5d46f42..a1d3555eb4d7e 100644 --- a/mobile/lib/providers/authentication.provider.dart +++ b/mobile/lib/providers/authentication.provider.dart @@ -41,6 +41,8 @@ class AuthenticationNotifier extends StateNotifier { _ref; final _log = Logger("AuthenticationNotifier"); + static const Duration _timeoutDuration = Duration(seconds: 7); + Future login( String email, String password, @@ -102,12 +104,15 @@ class AuthenticationNotifier extends StateNotifier { await _apiService.authenticationApi .logout() + .timeout(_timeoutDuration) .then((_) => log.info("Logout was successful for $userEmail")) .onError( (error, stackTrace) => log.severe("Logout failed for $userEmail", error, stackTrace), ); - + } catch (e, stack) { + log.severe('Logout failed', e, stack); + } finally { await Future.wait([ clearAssetsAndAlbums(_db), Store.delete(StoreKey.currentUser), @@ -125,8 +130,6 @@ class AuthenticationNotifier extends StateNotifier { shouldChangePassword: false, isAuthenticated: false, ); - } catch (e, stack) { - log.severe('Logout failed', e, stack); } } From d02c0e6095b4388cb8cfd42e3e9f3bfb02f7e4f5 Mon Sep 17 00:00:00 2001 From: johnstef99 Date: Tue, 12 Nov 2024 19:53:20 +0200 Subject: [PATCH 2/6] chore(mobile): refactor timeout durations --- mobile/lib/providers/authentication.provider.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/providers/authentication.provider.dart b/mobile/lib/providers/authentication.provider.dart index a1d3555eb4d7e..79e036ae2e374 100644 --- a/mobile/lib/providers/authentication.provider.dart +++ b/mobile/lib/providers/authentication.provider.dart @@ -171,10 +171,10 @@ class AuthenticationNotifier extends StateNotifier { UserPreferencesResponseDto? userPreferences; try { final responses = await Future.wait([ - _apiService.usersApi.getMyUser().timeout(const Duration(seconds: 7)), + _apiService.usersApi.getMyUser().timeout(_timeoutDuration), _apiService.usersApi .getMyPreferences() - .timeout(const Duration(seconds: 7)), + .timeout(_timeoutDuration), ]); userResponse = responses[0] as UserAdminResponseDto; userPreferences = responses[1] as UserPreferencesResponseDto; From fdcc796eaa1aac4c1bf7c5e0692eb07e0b6f12e6 Mon Sep 17 00:00:00 2001 From: johnstef99 Date: Tue, 12 Nov 2024 19:54:08 +0200 Subject: [PATCH 3/6] feat(mobile): add loading state to logout button --- .../common/app_bar_dialog/app_bar_dialog.dart | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart b/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart index cd694336bc5af..1875b8696f831 100644 --- a/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart +++ b/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart @@ -28,6 +28,7 @@ class ImmichAppBarDialog extends HookConsumerWidget { bool isHorizontal = !context.isMobile; final horizontalPadding = isHorizontal ? 100.0 : 20.0; final user = ref.watch(currentUserProvider); + final isLoggingOut = useState(false); useEffect( () { @@ -63,11 +64,16 @@ class ImmichAppBarDialog extends HookConsumerWidget { ); } - buildActionButton(IconData icon, String text, Function() onTap) { + buildActionButton( + IconData icon, + String text, + Function() onTap, { + Widget? trailing, + }) { return ListTile( dense: true, visualDensity: VisualDensity.standard, - contentPadding: const EdgeInsets.only(left: 30), + contentPadding: const EdgeInsets.only(left: 30, right: 30), minLeadingWidth: 40, leading: SizedBox( child: Icon( @@ -83,6 +89,7 @@ class ImmichAppBarDialog extends HookConsumerWidget { ), ).tr(), onTap: onTap, + trailing: trailing, ); } @@ -107,6 +114,7 @@ class ImmichAppBarDialog extends HookConsumerWidget { Icons.logout_rounded, "profile_drawer_sign_out", () async { + if (isLoggingOut.value) return; showDialog( context: context, builder: (BuildContext ctx) { @@ -115,7 +123,11 @@ class ImmichAppBarDialog extends HookConsumerWidget { content: "app_bar_signout_dialog_content", ok: "app_bar_signout_dialog_ok", onOk: () async { - await ref.read(authenticationProvider.notifier).logout(); + isLoggingOut.value = true; + await ref + .read(authenticationProvider.notifier) + .logout() + .whenComplete(() => isLoggingOut.value = false); ref.read(manualUploadProvider.notifier).cancelBackup(); ref.read(backupProvider.notifier).cancelBackup(); @@ -127,6 +139,12 @@ class ImmichAppBarDialog extends HookConsumerWidget { }, ); }, + trailing: isLoggingOut.value + ? SizedBox.square( + dimension: 20, + child: const CircularProgressIndicator(strokeWidth: 2), + ) + : null, ); } From 5a37065ad70a4b64ab30de63ba3be6ebf3371cd7 Mon Sep 17 00:00:00 2001 From: johnstef99 Date: Tue, 12 Nov 2024 20:07:03 +0200 Subject: [PATCH 4/6] chore(mobile): format authentication.provider.dart --- mobile/lib/providers/authentication.provider.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mobile/lib/providers/authentication.provider.dart b/mobile/lib/providers/authentication.provider.dart index 79e036ae2e374..60e31d707e6aa 100644 --- a/mobile/lib/providers/authentication.provider.dart +++ b/mobile/lib/providers/authentication.provider.dart @@ -172,9 +172,7 @@ class AuthenticationNotifier extends StateNotifier { try { final responses = await Future.wait([ _apiService.usersApi.getMyUser().timeout(_timeoutDuration), - _apiService.usersApi - .getMyPreferences() - .timeout(_timeoutDuration), + _apiService.usersApi.getMyPreferences().timeout(_timeoutDuration), ]); userResponse = responses[0] as UserAdminResponseDto; userPreferences = responses[1] as UserPreferencesResponseDto; From 680c163bcbdfad046bf969c938f0cdedaf58a281 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 13 Nov 2024 11:18:22 -0600 Subject: [PATCH 5/6] chore: format --- .vscode/settings.json | 3 ++- mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a8661326a0998..b3019574735bf 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,5 +40,6 @@ "explorer.fileNesting.enabled": true, "explorer.fileNesting.patterns": { "*.ts": "${capture}.spec.ts,${capture}.mock.ts" - } + }, + "vitest.disableWorkspaceWarning": true } diff --git a/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart b/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart index 1875b8696f831..38d161f8521fa 100644 --- a/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart +++ b/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart @@ -114,7 +114,10 @@ class ImmichAppBarDialog extends HookConsumerWidget { Icons.logout_rounded, "profile_drawer_sign_out", () async { - if (isLoggingOut.value) return; + if (isLoggingOut.value) { + return; + } + showDialog( context: context, builder: (BuildContext ctx) { From b9fe8c711e08489abdcc7d80f22104fd98ec7d1f Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 13 Nov 2024 11:24:37 -0600 Subject: [PATCH 6/6] chore: revert settings.json change --- .vscode/settings.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b3019574735bf..49dbf3944cfca 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,6 +40,5 @@ "explorer.fileNesting.enabled": true, "explorer.fileNesting.patterns": { "*.ts": "${capture}.spec.ts,${capture}.mock.ts" - }, - "vitest.disableWorkspaceWarning": true -} + } +} \ No newline at end of file