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/api/authentication_api.interface.dart'; import 'package:immich_mobile/domain/interfaces/api/server_api.interface.dart'; import 'package:immich_mobile/domain/interfaces/api/sync_api.interface.dart'; import 'package:immich_mobile/domain/interfaces/api/user_api.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/api/authentication_api.repository.dart'; import 'package:immich_mobile/domain/repositories/api/server_api.repository.dart'; import 'package:immich_mobile/domain/repositories/api/sync_api.repository.dart'; import 'package:immich_mobile/domain/repositories/api/user_api.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/platform/messages.g.dart'; import 'package:immich_mobile/presentation/router/router.dart'; import 'package:immich_mobile/presentation/states/app_info.state.dart'; import 'package:immich_mobile/presentation/states/app_theme.state.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.state.dart'; import 'package:immich_mobile/utils/immich_api_client.dart'; final di = GetIt.I; abstract final 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(); _registerServices(); } static void configureServicesForIsolate({ required DriftDatabaseRepository database, required ImApiClient apiClient, }) { _registerSingleton(database); _registerSingleton(apiClient); _registerRepositories(); _registerServices(); } static void _registerRepositories() { // Used for transactions _registerSingleton(di()); _registerSingleton(ImApiClient(endpoint: '')); _registerFactory(() => StoreRepository(db: di())); _registerFactory(() => LogRepository(db: di())); _registerFactory(() => AppSettingService(store: di())); _registerFactory(() => UserRepository(db: di())); _registerFactory(() => AssetRepository(db: di())); _registerFactory(() => AlbumRepository(db: di())); _registerFactory( () => const DeviceAssetRepository(), ); _registerFactory( () => RenderListRepository(db: di()), ); _registerFactory( () => DeviceAssetToHashRepository(db: di()), ); _registerFactory( () => const DeviceAlbumRepository(), ); _registerFactory( () => AlbumToAssetRepository(db: di()), ); /// API Repos _registerFactory(() => AlbumETagRepository(db: di())); _registerFactory( () => SyncApiRepository(syncApi: di().syncApi), ); _registerFactory( () => ServerApiRepository(serverApi: di().serverApi), ); _registerFactory( () => AuthenticationApiRepository( authenticationApi: di().authenticationApi, oAuthApi: di().oAuthApi, ), ); _registerFactory( () => UserApiRepository(usersApi: di().usersApi), ); } static void _registerServices() { /// Special services. So they are initiated as singletons _registerSingleton(ImHostService()); _registerSingleton(AlbumSyncService()); _registerSingleton(AssetSyncService()); /// _registerFactory(() => const LoginService()); _registerFactory(() => HashService( hostService: di(), deviceAssetRepo: di(), deviceAlbumRepo: di(), assetToHashRepo: di(), )); } static void _registerPreGlobalStates() { _registerSingleton(AppRouter()); _registerLazySingleton( () => AppThemeProvider(settingsService: di()), ); _registerSingleton(GalleryPermissionProvider()); _registerSingleton(AppInfoProvider()); } static void registerPostGlobalStates() { _registerLazySingleton( () => ServerInfoProvider(serverApiRepo: di()), ); } static Future registerApiClient(String endpoint) async { await di.unregister(); _registerSingleton(ImApiClient(endpoint: endpoint)); } static void registerCurrentUser(User user) { _registerSingleton(CurrentUserProvider(user)); } }