fill
This commit is contained in:
126
lib/features/auth/di/auth_dependency_injection.dart
Normal file
126
lib/features/auth/di/auth_dependency_injection.dart
Normal file
@@ -0,0 +1,126 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../../core/network/api_client.dart';
|
||||
import '../../../core/storage/secure_storage.dart';
|
||||
import '../data/datasources/auth_remote_datasource.dart';
|
||||
import '../data/repositories/auth_repository_impl.dart';
|
||||
import '../domain/repositories/auth_repository.dart';
|
||||
import '../domain/usecases/login_usecase.dart';
|
||||
import '../presentation/providers/auth_provider.dart';
|
||||
|
||||
/// Dependency injection setup for authentication feature
|
||||
///
|
||||
/// This file contains all Riverpod providers for the auth feature
|
||||
/// following clean architecture principles
|
||||
|
||||
// ==================== Data Layer ====================
|
||||
|
||||
/// Provider for AuthRemoteDataSource
|
||||
///
|
||||
/// Depends on ApiClient from core
|
||||
final authRemoteDataSourceProvider = Provider<AuthRemoteDataSource>((ref) {
|
||||
// TODO: Replace with actual ApiClient provider when available
|
||||
final apiClient = ApiClient(SecureStorage());
|
||||
return AuthRemoteDataSourceImpl(apiClient);
|
||||
});
|
||||
|
||||
/// Provider for SecureStorage
|
||||
///
|
||||
/// Singleton instance
|
||||
final secureStorageProvider = Provider<SecureStorage>((ref) {
|
||||
return SecureStorage();
|
||||
});
|
||||
|
||||
// ==================== Domain Layer ====================
|
||||
|
||||
/// Provider for AuthRepository
|
||||
///
|
||||
/// Depends on AuthRemoteDataSource and SecureStorage
|
||||
final authRepositoryProvider = Provider<AuthRepository>((ref) {
|
||||
final remoteDataSource = ref.watch(authRemoteDataSourceProvider);
|
||||
final secureStorage = ref.watch(secureStorageProvider);
|
||||
|
||||
return AuthRepositoryImpl(
|
||||
remoteDataSource: remoteDataSource,
|
||||
secureStorage: secureStorage,
|
||||
);
|
||||
});
|
||||
|
||||
/// Provider for LoginUseCase
|
||||
final loginUseCaseProvider = Provider<LoginUseCase>((ref) {
|
||||
final repository = ref.watch(authRepositoryProvider);
|
||||
return LoginUseCase(repository);
|
||||
});
|
||||
|
||||
/// Provider for LogoutUseCase
|
||||
final logoutUseCaseProvider = Provider<LogoutUseCase>((ref) {
|
||||
final repository = ref.watch(authRepositoryProvider);
|
||||
return LogoutUseCase(repository);
|
||||
});
|
||||
|
||||
/// Provider for CheckAuthStatusUseCase
|
||||
final checkAuthStatusUseCaseProvider = Provider<CheckAuthStatusUseCase>((ref) {
|
||||
final repository = ref.watch(authRepositoryProvider);
|
||||
return CheckAuthStatusUseCase(repository);
|
||||
});
|
||||
|
||||
/// Provider for GetCurrentUserUseCase
|
||||
final getCurrentUserUseCaseProvider = Provider<GetCurrentUserUseCase>((ref) {
|
||||
final repository = ref.watch(authRepositoryProvider);
|
||||
return GetCurrentUserUseCase(repository);
|
||||
});
|
||||
|
||||
/// Provider for RefreshTokenUseCase
|
||||
final refreshTokenUseCaseProvider = Provider<RefreshTokenUseCase>((ref) {
|
||||
final repository = ref.watch(authRepositoryProvider);
|
||||
return RefreshTokenUseCase(repository);
|
||||
});
|
||||
|
||||
// ==================== Presentation Layer ====================
|
||||
|
||||
/// Provider for AuthNotifier (State Management)
|
||||
///
|
||||
/// This is the main provider that UI will interact with
|
||||
final authProvider = StateNotifierProvider<AuthNotifier, AuthState>((ref) {
|
||||
final loginUseCase = ref.watch(loginUseCaseProvider);
|
||||
final logoutUseCase = ref.watch(logoutUseCaseProvider);
|
||||
final checkAuthStatusUseCase = ref.watch(checkAuthStatusUseCaseProvider);
|
||||
final getCurrentUserUseCase = ref.watch(getCurrentUserUseCaseProvider);
|
||||
|
||||
return AuthNotifier(
|
||||
loginUseCase: loginUseCase,
|
||||
logoutUseCase: logoutUseCase,
|
||||
checkAuthStatusUseCase: checkAuthStatusUseCase,
|
||||
getCurrentUserUseCase: getCurrentUserUseCase,
|
||||
);
|
||||
});
|
||||
|
||||
// ==================== Convenience Providers ====================
|
||||
|
||||
/// Provider to check if user is authenticated
|
||||
///
|
||||
/// Returns boolean indicating authentication status
|
||||
final isAuthenticatedProvider = Provider<bool>((ref) {
|
||||
final authState = ref.watch(authProvider);
|
||||
return authState.isAuthenticated;
|
||||
});
|
||||
|
||||
/// Provider to get current user
|
||||
///
|
||||
/// Returns UserEntity if authenticated, null otherwise
|
||||
final currentUserProvider = Provider((ref) {
|
||||
final authState = ref.watch(authProvider);
|
||||
return authState.user;
|
||||
});
|
||||
|
||||
/// Provider to check if auth operation is loading
|
||||
final isAuthLoadingProvider = Provider<bool>((ref) {
|
||||
final authState = ref.watch(authProvider);
|
||||
return authState.isLoading;
|
||||
});
|
||||
|
||||
/// Provider to get auth error message
|
||||
final authErrorProvider = Provider<String?>((ref) {
|
||||
final authState = ref.watch(authProvider);
|
||||
return authState.error;
|
||||
});
|
||||
Reference in New Issue
Block a user