diff --git a/moneymgr_mobile/lib/providers/auth_state.dart b/moneymgr_mobile/lib/providers/auth_state.dart index 25aee1e..e3aff8a 100644 --- a/moneymgr_mobile/lib/providers/auth_state.dart +++ b/moneymgr_mobile/lib/providers/auth_state.dart @@ -42,9 +42,14 @@ class CurrentAuthState extends _$CurrentAuthState { /// Logs out, deletes the saved token and profile info from storage, and invalidates /// the state. Future logout() async { + final prefs = ref.read(prefsProvider).requireValue; + final secureStorage = ref.read(secureStorageProvider).requireValue; await secureStorage.removeToken(); + prefs.clearServerConfig(); + prefs.clearAuthInfo(); + ref // Invalidate the state so the auth state will be updated to authenticated. .invalidateSelf(); diff --git a/moneymgr_mobile/lib/routes/profile/profile_screen.dart b/moneymgr_mobile/lib/routes/profile/profile_screen.dart index d2fb989..722ea8d 100644 --- a/moneymgr_mobile/lib/routes/profile/profile_screen.dart +++ b/moneymgr_mobile/lib/routes/profile/profile_screen.dart @@ -1,6 +1,12 @@ +import 'package:alert_dialog/alert_dialog.dart'; +import 'package:confirm_dialog/confirm_dialog.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:logging/logging.dart'; +import 'package:moneymgr_mobile/providers/auth_state.dart'; import 'package:moneymgr_mobile/services/api/api_client.dart'; +import 'package:moneymgr_mobile/services/router/routes_list.dart'; import 'package:moneymgr_mobile/services/storage/prefs.dart'; class ProfileScreen extends HookConsumerWidget { @@ -14,8 +20,37 @@ class ProfileScreen extends HookConsumerWidget { final profile = data.value?.authInfo(); + void onSettingsPressed() => context.push(settingsPage); + + handleSignOut() async { + try { + if (!await confirm( + context, + content: Text("Do you really want to sign out of your account?"), + )) { + return; + } + + await ref.read(currentAuthStateProvider.notifier).logout(); + } catch (e, s) { + Logger.root.warning("Failed to sign out! $e $s"); + + if (context.mounted) { + await alert(context, content: Text("Failed to sign you out! $e")); + } + } + } + return Scaffold( - appBar: AppBar(title: Text("Profile")), + appBar: AppBar( + title: Text("Profile"), + actions: [ + IconButton( + onPressed: onSettingsPressed, + icon: const Icon(Icons.settings), + ), + ], + ), body: ListView( children: [ ListEntry( @@ -39,6 +74,12 @@ class ProfileScreen extends HookConsumerWidget { icon: Icons.person, ), ListEntry(title: "User mail", value: profile?.mail, icon: Icons.mail), + Divider(), + ListEntry( + title: "Sign out", + icon: Icons.logout, + onTap: handleSignOut, + ), ], ), ); @@ -49,20 +90,23 @@ class ListEntry extends StatelessWidget { final String title; final String? value; final IconData icon; + final Function()? onTap; const ListEntry({ super.key, required this.title, - required this.value, + this.value, required this.icon, + this.onTap, }); @override Widget build(BuildContext context) { return ListTile( title: Text(title), - subtitle: Text(value ?? ""), + subtitle: value != null ? Text(value!) : null, leading: Icon(icon), + onTap: onTap, ); } } diff --git a/moneymgr_mobile/pubspec.lock b/moneymgr_mobile/pubspec.lock index 5cb086d..7f386fb 100644 --- a/moneymgr_mobile/pubspec.lock +++ b/moneymgr_mobile/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + alert_dialog: + dependency: "direct main" + description: + name: alert_dialog + sha256: "6f63afeaad3006a489fa5fda92a795219aa3e52dc2991178e99577ceabcf2036" + url: "https://pub.dev" + source: hosted + version: "1.0.2" analyzer: dependency: transitive description: @@ -185,6 +193,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + confirm_dialog: + dependency: "direct main" + description: + name: confirm_dialog + sha256: "99b431d2f13bf64a6056fc8f1b2b85a1fc7be572da3f28a17f8a009438542327" + url: "https://pub.dev" + source: hosted + version: "1.0.4" convert: dependency: transitive description: diff --git a/moneymgr_mobile/pubspec.yaml b/moneymgr_mobile/pubspec.yaml index c5f2614..3613805 100644 --- a/moneymgr_mobile/pubspec.yaml +++ b/moneymgr_mobile/pubspec.yaml @@ -76,6 +76,10 @@ dependencies: # Qr Code library mobile_scanner: ^7.0.1 + # Show dialogs + confirm_dialog: ^1.0.4 + alert_dialog: ^1.0.2 + dev_dependencies: flutter_test: sdk: flutter