diff --git a/apps/lib/core/config/env.dart b/apps/lib/core/config/env.dart new file mode 100644 index 0000000..8267e2f --- /dev/null +++ b/apps/lib/core/config/env.dart @@ -0,0 +1,6 @@ +class Env { + static String get apiUrl { + const url = String.fromEnvironment('API_URL'); + return url.isNotEmpty ? url : 'http://localhost:8000'; + } +} diff --git a/apps/lib/core/di/injection.dart b/apps/lib/core/di/injection.dart new file mode 100644 index 0000000..6fb9452 --- /dev/null +++ b/apps/lib/core/di/injection.dart @@ -0,0 +1,52 @@ +import 'package:dio/dio.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:get_it/get_it.dart'; +import '../api/api_client.dart'; +import '../storage/token_storage.dart'; +import '../config/env.dart'; +import '../../features/auth/data/auth_api.dart'; +import '../../features/auth/data/auth_repository.dart'; +import '../../features/auth/data/auth_repository_impl.dart'; +import '../../features/auth/presentation/bloc/auth_bloc.dart'; + +final sl = GetIt.instance; + +Future configureDependencies() async { + final dio = Dio(BaseOptions(baseUrl: Env.apiUrl)); + final secureStorage = const FlutterSecureStorage(); + final tokenStorage = SecureTokenStorage(secureStorage); + + sl.registerSingleton(dio); + sl.registerSingleton(secureStorage); + sl.registerSingleton(tokenStorage); + + final authApi = AuthApi( + ApiClient(baseUrl: Env.apiUrl, tokenStorage: tokenStorage, dio: dio), + ); + sl.registerSingleton(authApi); + + final authRepository = AuthRepositoryImpl( + api: authApi, + tokenStorage: tokenStorage, + ); + sl.registerSingleton(authRepository); + + sl.unregister(); + sl.registerSingleton( + ApiClient( + baseUrl: Env.apiUrl, + tokenStorage: tokenStorage, + dio: dio, + refreshToken: (token) async { + try { + await authRepository.refresh(token); + return true; + } catch (_) { + return false; + } + }, + ), + ); + + sl.registerSingleton(AuthBloc(authRepository)); +}