import 'package:live_recorder_mobile/core/network/api_client.dart'; import 'package:live_recorder_mobile/core/persistence/session_storage.dart'; import 'package:live_recorder_mobile/features/live_recorder/data/repositories/auth_repository.dart'; import 'package:live_recorder_mobile/features/live_recorder/data/repositories/live_rooms_repository.dart'; import 'package:live_recorder_mobile/features/live_recorder/data/repositories/logs_repository.dart'; import 'package:live_recorder_mobile/features/live_recorder/data/repositories/media_repository.dart'; import 'package:live_recorder_mobile/features/live_recorder/data/repositories/recovery_repository.dart'; import 'package:live_recorder_mobile/features/live_recorder/data/repositories/recordings_repository.dart'; import 'package:live_recorder_mobile/features/live_recorder/data/repositories/settings_repository.dart'; import 'package:live_recorder_mobile/features/live_recorder/presentation/controllers/app_session_controller.dart'; abstract interface class AppDependencyBundle { SessionControllerHandle get sessionController; void dispose(); } class AppDependencies implements AppDependencyBundle { AppDependencies._({ required this.backendBaseUrl, required this.apiClient, required this.sessionStorage, required this.authRepository, required this.liveRoomsRepository, required this.recordingsRepository, required this.recoveryRepository, required this.settingsRepository, required this.logsRepository, required this.mediaRepository, required this.sessionController, }); factory AppDependencies.create({ required String baseUrl, }) { late AppSessionController sessionController; final sessionStorage = SessionStorage(); final apiClient = ApiClient( baseUrl: baseUrl, tokenProvider: () => sessionController.token, onUnauthorized: () async => sessionController.handleUnauthorized(), ); final authRepository = AuthRepository(apiClient); sessionController = AppSessionController( authRepository: authRepository, sessionStorage: sessionStorage, ); return AppDependencies._( backendBaseUrl: baseUrl, apiClient: apiClient, sessionStorage: sessionStorage, authRepository: authRepository, liveRoomsRepository: LiveRoomsRepository(apiClient), recordingsRepository: RecordingsRepository(apiClient), recoveryRepository: RecoveryRepository(apiClient), settingsRepository: SettingsRepository(apiClient), logsRepository: LogsRepository(apiClient), mediaRepository: MediaRepository(apiClient), sessionController: sessionController, ); } final String backendBaseUrl; final ApiClient apiClient; final SessionStorage sessionStorage; final AuthRepository authRepository; final LiveRoomsRepository liveRoomsRepository; final RecordingsRepository recordingsRepository; final RecoveryRepository recoveryRepository; final SettingsRepository settingsRepository; final LogsRepository logsRepository; final MediaRepository mediaRepository; @override final AppSessionController sessionController; @override void dispose() { apiClient.dispose(); sessionController.dispose(); } }