refactor: riverpod 3
This commit is contained in:
@@ -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 }
|
||||
|
||||
@@ -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',
|
||||
);
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user