refactor: riverpod 3

This commit is contained in:
cogwheel0
2025-09-28 23:18:24 +05:30
parent d2aeafc773
commit 0ba48030c8
12 changed files with 633 additions and 360 deletions

View File

@@ -18,13 +18,10 @@ class AuthActions {
String password, {
bool rememberCredentials = false,
}) {
// Defer mutation to a microtask to avoid provider-build side-effects
return Future(
() => _auth.login(
username,
password,
rememberCredentials: rememberCredentials,
),
return _auth.login(
username,
password,
rememberCredentials: rememberCredentials,
);
}
@@ -32,24 +29,22 @@ class AuthActions {
String apiKey, {
bool rememberCredentials = false,
}) {
return Future(
() => _auth.loginWithApiKey(
apiKey,
rememberCredentials: rememberCredentials,
),
return _auth.loginWithApiKey(
apiKey,
rememberCredentials: rememberCredentials,
);
}
Future<bool> silentLogin() {
return Future(() => _auth.silentLogin());
return _auth.silentLogin();
}
Future<void> logout() {
return Future(() => _auth.logout());
return _auth.logout();
}
Future<void> refresh() {
return Future(() => _auth.refresh());
return _auth.refresh();
}
}
@@ -67,29 +62,43 @@ final hasSavedCredentialsProvider2 = FutureProvider<bool>((ref) async {
/// These automatically update when auth state changes
final isAuthenticatedProvider2 = Provider<bool>((ref) {
return ref.watch(
authStateManagerProvider.select((state) => state.isAuthenticated),
final authState = ref.watch(authStateManagerProvider);
return authState.maybeWhen(
data: (state) => state.isAuthenticated,
orElse: () => false,
);
});
final authTokenProvider3 = Provider<String?>((ref) {
return ref.watch(authStateManagerProvider.select((state) => state.token));
final authState = ref.watch(authStateManagerProvider);
return authState.maybeWhen(data: (state) => state.token, orElse: () => null);
});
final currentUserProvider2 = Provider<User?>((ref) {
return ref.watch(authStateManagerProvider.select((state) => state.user));
final authState = ref.watch(authStateManagerProvider);
return authState.maybeWhen(data: (state) => state.user, orElse: () => null);
});
final authErrorProvider3 = Provider<String?>((ref) {
return ref.watch(authStateManagerProvider.select((state) => state.error));
final authState = ref.watch(authStateManagerProvider);
return authState.maybeWhen(data: (state) => state.error, orElse: () => null);
});
final isAuthLoadingProvider2 = Provider<bool>((ref) {
return ref.watch(authStateManagerProvider.select((state) => state.isLoading));
final authState = ref.watch(authStateManagerProvider);
if (authState.isLoading) return true;
return authState.maybeWhen(
data: (state) => state.isLoading,
orElse: () => false,
);
});
final authStatusProvider = Provider<AuthStatus>((ref) {
return ref.watch(authStateManagerProvider.select((state) => state.status));
final authState = ref.watch(authStateManagerProvider);
return authState.maybeWhen(
data: (state) => state.status,
orElse: () => AuthStatus.loading,
);
});
// Use `ref.read(authActionsProvider).refresh()` instead of refresh providers
@@ -107,19 +116,24 @@ final authApiIntegrationProvider = Provider<void>((ref) {
/// Navigation helper provider - determines where user should go
final authNavigationStateProvider = Provider<AuthNavigationState>((ref) {
final authState = ref.watch(authStateManagerProvider);
switch (authState.status) {
case AuthStatus.initial:
case AuthStatus.loading:
return AuthNavigationState.loading;
case AuthStatus.authenticated:
return AuthNavigationState.authenticated;
case AuthStatus.unauthenticated:
case AuthStatus.tokenExpired:
return AuthNavigationState.needsLogin;
case AuthStatus.error:
return AuthNavigationState.error;
}
return authState.when(
data: (state) {
switch (state.status) {
case AuthStatus.initial:
case AuthStatus.loading:
return AuthNavigationState.loading;
case AuthStatus.authenticated:
return AuthNavigationState.authenticated;
case AuthStatus.unauthenticated:
case AuthStatus.tokenExpired:
return AuthNavigationState.needsLogin;
case AuthStatus.error:
return AuthNavigationState.error;
}
},
loading: () => AuthNavigationState.loading,
error: (_, stack) => AuthNavigationState.error,
);
});
enum AuthNavigationState { loading, authenticated, needsLogin, error }

View File

@@ -124,10 +124,15 @@ class _AuthenticationPageState extends ConsumerState<AuthenticationPage> {
@override
Widget build(BuildContext context) {
// Listen for auth state changes to navigate on successful login
ref.listen<AuthState>(authStateManagerProvider, (previous, next) {
ref.listen<AsyncValue<AuthState>>(authStateManagerProvider, (
previous,
next,
) {
final nextState = next.asData?.value;
final prevState = previous?.asData?.value;
if (mounted &&
next.isAuthenticated &&
previous?.isAuthenticated != true) {
nextState?.isAuthenticated == true &&
prevState?.isAuthenticated != true) {
DebugLogger.auth(
'Authentication successful, initializing background resources',
);

View File

@@ -10,11 +10,11 @@ import 'package:flutter_animate/flutter_animate.dart';
import 'dart:io' show Platform;
import 'dart:async';
import '../../../core/providers/app_providers.dart';
import '../../../core/auth/auth_state_manager.dart';
import '../providers/chat_providers.dart';
import '../../../core/utils/debug_logger.dart';
import '../../../core/utils/user_display_name.dart';
import '../../../core/utils/model_icon_utils.dart';
import '../../auth/providers/unified_auth_providers.dart';
import '../widgets/modern_chat_input.dart';
import '../widgets/user_message_bubble.dart';
@@ -901,7 +901,7 @@ class _ChatPageState extends ConsumerState<ChatPage> {
data: (user) => user,
orElse: () => null,
);
final authUser = ref.watch(authUserProvider);
final authUser = ref.watch(currentUserProvider2);
final user = userFromProfile ?? authUser;
final greetingName = deriveUserDisplayName(user);
return LayoutBuilder(

View File

@@ -14,10 +14,10 @@ import '../../chat/providers/chat_providers.dart' as chat;
import '../../../shared/utils/ui_utils.dart';
import '../../../core/services/navigation_service.dart';
import '../../../shared/widgets/themed_dialogs.dart';
import '../../../core/auth/auth_state_manager.dart';
import 'package:conduit/l10n/app_localizations.dart';
import '../../../core/utils/user_display_name.dart';
import '../../../core/utils/model_icon_utils.dart';
import '../../auth/providers/unified_auth_providers.dart';
import '../../../core/utils/user_avatar_utils.dart';
import '../../../shared/utils/conversation_context_menu.dart';
import '../../../shared/widgets/user_avatar.dart';
@@ -1218,7 +1218,7 @@ class _ChatsDrawerState extends ConsumerState<ChatsDrawer> {
data: (u) => u,
orElse: () => null,
);
final authUser = ref.watch(authUserProvider);
final authUser = ref.watch(currentUserProvider2);
final user = userFromProfile ?? authUser;
final api = ref.watch(apiServiceProvider);

View File

@@ -4,11 +4,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:conduit/l10n/app_localizations.dart';
import '../../../core/auth/auth_state_manager.dart';
import '../../../core/providers/app_providers.dart';
import '../../../core/utils/user_display_name.dart';
import '../../../shared/theme/theme_extensions.dart';
import '../../../shared/widgets/sheet_handle.dart';
import '../../auth/providers/unified_auth_providers.dart';
class OnboardingSheet extends ConsumerStatefulWidget {
const OnboardingSheet({super.key});
@@ -73,7 +73,7 @@ class _OnboardingSheetState extends ConsumerState<OnboardingSheet> {
data: (user) => user,
orElse: () => null,
);
final authUser = ref.watch(authUserProvider);
final authUser = ref.watch(currentUserProvider2);
final user = userFromProfile ?? authUser;
final greetingName = deriveUserDisplayName(user);
final pages = _buildPages(l10n, greetingName);