import 'dart:async'; import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:dio/dio.dart'; import 'package:get_it/get_it.dart'; import 'package:immich_mobile/domain/interfaces/log.interface.dart'; import 'package:immich_mobile/domain/interfaces/store.interface.dart'; import 'package:immich_mobile/domain/interfaces/user.interface.dart'; import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/repositories/database.repository.dart'; import 'package:immich_mobile/domain/repositories/log.repository.dart'; import 'package:immich_mobile/domain/repositories/store.repository.dart'; import 'package:immich_mobile/domain/repositories/user.repository.dart'; import 'package:immich_mobile/domain/services/app_setting.service.dart'; import 'package:immich_mobile/domain/services/login.service.dart'; import 'package:immich_mobile/domain/services/server_info.service.dart'; import 'package:immich_mobile/presentation/modules/common/states/current_user.state.dart'; import 'package:immich_mobile/presentation/modules/common/states/server_info/server_feature_config.state.dart'; import 'package:immich_mobile/presentation/modules/theme/states/app_theme.state.dart'; import 'package:immich_mobile/presentation/router/router.dart'; import 'package:immich_mobile/utils/immich_auth_interceptor.dart'; import 'package:openapi/openapi.dart'; final di = GetIt.I; class ServiceLocator { const ServiceLocator._internal(); static void configureServices() { // Register DB di.registerSingleton(DriftDatabaseRepository()); _registerPreValidationServices(); } static void _registerPreValidationServices() { // ====== DOMAIN // Init store di.registerFactory(() => StoreDriftRepository(di())); // Logs di.registerFactory(() => LogDriftRepository(di())); // App Settings di.registerFactory(() => AppSettingService(di())); // User Repo di.registerFactory(() => UserDriftRepository(di())); // Login Service di.registerFactory(() => const LoginService()); // ====== PRESENTATION // App router di.registerSingleton(AppRouter()); // Global states di.registerLazySingleton(() => AppThemeCubit(di())); } static FutureOr registerPostValidationServices(String endpoint) async { if (di.isRegistered()) { return; } final deviceInfo = DeviceInfoPlugin(); final String deviceModel; if (Platform.isIOS) { deviceModel = (await deviceInfo.iosInfo).utsname.machine; } else { deviceModel = (await deviceInfo.androidInfo).model; } // ====== DOMAIN di.registerSingleton( Openapi( dio: Dio( BaseOptions( baseUrl: endpoint, connectTimeout: const Duration(milliseconds: 5000), receiveTimeout: const Duration(milliseconds: 3000), headers: { 'deviceModel': deviceModel, 'deviceType': Platform.operatingSystem, }, ), ), interceptors: [ImmichAuthInterceptor()], ), ); di.registerFactory(() => ServerInfoService(di())); // ====== PRESENTATION di.registerLazySingleton( () => ServerFeatureConfigCubit(di()), ); } static void registerCurrentUser(User user) { di.registerSingleton(CurrentUserCubit(user)); } }