import 'package:get_it/get_it.dart'; import 'package:immich_mobile/domain/interfaces/album.interface.dart'; import 'package:immich_mobile/domain/interfaces/album_asset.interface.dart'; import 'package:immich_mobile/domain/interfaces/album_etag.interface.dart'; import 'package:immich_mobile/domain/interfaces/asset.interface.dart'; import 'package:immich_mobile/domain/interfaces/database.interface.dart'; import 'package:immich_mobile/domain/interfaces/device_album.interface.dart'; import 'package:immich_mobile/domain/interfaces/device_asset.interface.dart'; import 'package:immich_mobile/domain/interfaces/device_asset_hash.interface.dart'; import 'package:immich_mobile/domain/interfaces/log.interface.dart'; import 'package:immich_mobile/domain/interfaces/renderlist.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/album.repository.dart'; import 'package:immich_mobile/domain/repositories/album_asset.repository.dart'; import 'package:immich_mobile/domain/repositories/album_etag.repository.dart'; import 'package:immich_mobile/domain/repositories/asset.repository.dart'; import 'package:immich_mobile/domain/repositories/database.repository.dart'; import 'package:immich_mobile/domain/repositories/device_album.repository.dart'; import 'package:immich_mobile/domain/repositories/device_asset.repository.dart'; import 'package:immich_mobile/domain/repositories/device_asset_hash.repository.dart'; import 'package:immich_mobile/domain/repositories/log.repository.dart'; import 'package:immich_mobile/domain/repositories/renderlist.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/album_sync.service.dart'; import 'package:immich_mobile/domain/services/app_setting.service.dart'; import 'package:immich_mobile/domain/services/asset_sync.service.dart'; import 'package:immich_mobile/domain/services/hash.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/domain/services/user.service.dart'; import 'package:immich_mobile/platform/messages.g.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/presentation/states/current_user.state.dart'; import 'package:immich_mobile/presentation/states/gallery_permission.state.dart'; import 'package:immich_mobile/presentation/states/server_info/server_feature_config.state.dart'; import 'package:immich_mobile/utils/immich_api_client.dart'; final di = GetIt.I; class ServiceLocator { const ServiceLocator._internal(); static void _registerFactory(T Function() factoryFun) { if (!di.isRegistered()) { di.registerFactory(factoryFun); } } static void _registerSingleton(T instance) { if (!di.isRegistered()) { di.registerSingleton(instance); } } static void _registerLazySingleton( T Function() factoryFun, ) { if (!di.isRegistered()) { di.registerLazySingleton(factoryFun); } } static void configureServices() { _registerSingleton(DriftDatabaseRepository()); _registerRepositories(); _registerPreGlobalStates(); } static void configureServicesForIsolate({ required DriftDatabaseRepository database, required ImApiClient apiClient, }) { _registerSingleton(database); _registerSingleton(apiClient); _registerRepositories(); registerPostValidationServices(); } static void _registerRepositories() { /// Repositories _registerSingleton(di()); _registerFactory(() => StoreRepository(di())); _registerFactory(() => LogRepository(di())); _registerFactory(() => AppSettingService(di())); _registerFactory(() => UserRepository(di())); _registerFactory(() => AssetRepository(di())); _registerFactory(() => AlbumRepository(di())); _registerFactory( () => const DeviceAssetRepository(), ); _registerFactory(() => RenderListRepository(di())); _registerFactory( () => DeviceAssetToHashRepository(di()), ); _registerFactory( () => const DeviceAlbumRepository(), ); _registerFactory( () => AlbumToAssetRepository(di()), ); _registerFactory(() => AlbumETagRepository(di())); /// Services _registerFactory(() => const LoginService()); _registerSingleton(ImHostService()); _registerSingleton(const AlbumSyncService()); _registerFactory(() => HashService( hostService: di(), assetToHashRepo: di(), deviceAlbumRepo: di(), deviceAssetRepo: di(), )); } static void _registerPreGlobalStates() { _registerSingleton(AppRouter()); _registerLazySingleton(() => AppThemeCubit(di())); _registerSingleton(GalleryPermissionNotifier()); } static void registerApiClient(String endpoint) { _registerSingleton(ImApiClient(endpoint: endpoint)); } static void registerPostValidationServices() { _registerFactory(() => UserService( di().getUsersApi(), )); _registerFactory(() => ServerInfoService( di().getServerApi(), )); _registerSingleton(const AssetSyncService()); } static void registerPostGlobalStates() { _registerLazySingleton( () => ServerFeatureConfigCubit(di()), ); } static void registerCurrentUser(User user) { _registerSingleton(CurrentUserCubit(user)); } }