diff --git a/lib/providers/user_profile_provider.dart b/lib/providers/user_profile_provider.dart index 3a58505a..6e9cec3f 100644 --- a/lib/providers/user_profile_provider.dart +++ b/lib/providers/user_profile_provider.dart @@ -318,8 +318,12 @@ class UserProfileProvider extends ChangeNotifier { try { await _storageService!.clearUserData(); + + // Clear user-specific provider state but keep services for future sign-ins _home = null; _currentUser = null; + _onDataInvalidationRequested = null; + _clearError(); notifyListeners(); diff --git a/lib/screens/discover_screen.dart b/lib/screens/discover_screen.dart index 6b46fee2..ab71929d 100644 --- a/lib/screens/discover_screen.dart +++ b/lib/screens/discover_screen.dart @@ -210,8 +210,13 @@ class _DiscoverScreenState extends State ); if (confirm == true && mounted) { - final storage = await StorageService.getInstance(); - await storage.clearCredentials(); + // Use comprehensive logout through UserProfileProvider + final userProfileProvider = Provider.of(context, listen: false); + final plexClientProvider = Provider.of(context, listen: false); + + // Clear all user data and provider states + await userProfileProvider.logout(); + plexClientProvider.clearClient(); if (mounted) { Navigator.of(context).pushAndRemoveUntil( diff --git a/lib/screens/main_screen.dart b/lib/screens/main_screen.dart index b2d03bfd..86921688 100644 --- a/lib/screens/main_screen.dart +++ b/lib/screens/main_screen.dart @@ -45,11 +45,13 @@ class _MainScreenState extends State with RouteAware { ]; // Set up data invalidation callback for profile switching - WidgetsBinding.instance.addPostFrameCallback((_) { - context.userProfile.setDataInvalidationCallback(_invalidateAllScreens); + WidgetsBinding.instance.addPostFrameCallback((_) async { + // Initialize UserProfileProvider to ensure it's ready after sign-in + final userProfileProvider = context.userProfile; + await userProfileProvider.initialize(); - // Set the client in the provider so profile switching can update its token - context.plexClient.setClient(widget.client); + // Set up data invalidation callback for profile switching + userProfileProvider.setDataInvalidationCallback(_invalidateAllScreens); }); } diff --git a/lib/screens/server_selection_screen.dart b/lib/screens/server_selection_screen.dart index c8d8f905..c42ac967 100644 --- a/lib/screens/server_selection_screen.dart +++ b/lib/screens/server_selection_screen.dart @@ -5,6 +5,7 @@ import '../services/server_connection_service.dart'; import '../widgets/server_list_tile.dart'; import '../widgets/desktop_app_bar.dart'; import '../utils/app_logger.dart'; +import '../utils/provider_extensions.dart'; import 'main_screen.dart'; class ServerSelectionScreen extends StatefulWidget { @@ -139,8 +140,11 @@ class _ServerSelectionScreenState extends State { // Handle result if (result.isSuccess) { - // Navigate to main app and clear navigation stack + // Set client in provider before navigation (same pattern as auto-login) if (mounted) { + context.plexClient.setClient(result.client!); + + // Navigate to main app and clear navigation stack Navigator.pushAndRemoveUntil( context, MaterialPageRoute( diff --git a/lib/services/storage_service.dart b/lib/services/storage_service.dart index c8811e2b..0e6b676e 100644 --- a/lib/services/storage_service.dart +++ b/lib/services/storage_service.dart @@ -120,6 +120,9 @@ class StorageService { _prefs.remove(_keyServerData), _prefs.remove(_keyClientId), _prefs.remove(_keyUserProfile), + _prefs.remove(_keyCurrentUserUUID), + _prefs.remove(_keyHomeUsersCache), + _prefs.remove(_keyHomeUsersCacheExpiry), ]); } @@ -240,9 +243,6 @@ class StorageService { await Future.wait([ clearCredentials(), clearLibraryPreferences(), - _prefs.remove(_keyUserProfile), - _prefs.remove(_keyCurrentUserUUID), - clearHomeUsersCache(), ]); } diff --git a/lib/theme/mono_theme.dart b/lib/theme/mono_theme.dart index d4f2185a..78710145 100644 --- a/lib/theme/mono_theme.dart +++ b/lib/theme/mono_theme.dart @@ -111,9 +111,7 @@ ThemeData monoTheme({required bool dark}) { elevation: const WidgetStatePropertyAll(0), backgroundColor: WidgetStatePropertyAll(c.text), foregroundColor: WidgetStatePropertyAll(dark ? c.bg : Colors.white), - shape: WidgetStatePropertyAll( - RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), - ), + shape: const WidgetStatePropertyAll(StadiumBorder()), ), ), filledButtonTheme: FilledButtonThemeData( @@ -124,9 +122,7 @@ ThemeData monoTheme({required bool dark}) { elevation: const WidgetStatePropertyAll(0), backgroundColor: WidgetStatePropertyAll(c.text), foregroundColor: WidgetStatePropertyAll(dark ? c.bg : Colors.white), - shape: WidgetStatePropertyAll( - RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), - ), + shape: const WidgetStatePropertyAll(StadiumBorder()), ), ), dividerTheme: DividerThemeData(space: 0, thickness: 1, color: c.outline),