diff --git a/mobile-v2/lib/domain/entities/asset.entity.dart b/mobile-v2/lib/domain/entities/asset.entity.dart index 564f458b6e..5f97680ec6 100644 --- a/mobile-v2/lib/domain/entities/asset.entity.dart +++ b/mobile-v2/lib/domain/entities/asset.entity.dart @@ -9,7 +9,7 @@ class Asset extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get name => text()(); - TextColumn get checksum => text().unique()(); + TextColumn get hash => text().unique()(); IntColumn get height => integer().nullable()(); IntColumn get width => integer().nullable()(); IntColumn get type => intEnum()(); diff --git a/mobile-v2/lib/domain/interfaces/asset.interface.dart b/mobile-v2/lib/domain/interfaces/asset.interface.dart index 4ce51b1382..911ef48f69 100644 --- a/mobile-v2/lib/domain/interfaces/asset.interface.dart +++ b/mobile-v2/lib/domain/interfaces/asset.interface.dart @@ -1,27 +1,23 @@ import 'dart:async'; import 'package:immich_mobile/domain/models/asset.model.dart'; -import 'package:immich_mobile/domain/models/render_list.model.dart'; -abstract class IAssetRepository { - /// Batch insert asset - FutureOr addAll(Iterable assets); +abstract interface class IAssetRepository { + /// Batch upsert asset + FutureOr upsertAll(Iterable assets); /// Removes assets with the [localIds] - FutureOr> fetchLocalAssetsForIds(List localIds); + FutureOr> getForLocalIds(List localIds); /// Removes assets with the [remoteIds] - FutureOr> fetchRemoteAssetsForIds(List remoteIds); - - /// Removes assets with the given [ids] - FutureOr deleteAssetsForIds(List ids); - - /// Removes all assets - FutureOr clearAll(); + FutureOr> getForRemoteIds(List remoteIds); /// Fetch assets from the [offset] with the [limit] - FutureOr> fetchAssets({int? offset, int? limit}); + FutureOr> getAll({int? offset, int? limit}); - /// Streams assets as groups grouped by the group type passed - Stream watchRenderList(); + /// Removes assets with the given [ids] + FutureOr deleteIds(List ids); + + /// Removes all assets + FutureOr deleteAll(); } diff --git a/mobile-v2/lib/domain/interfaces/log.interface.dart b/mobile-v2/lib/domain/interfaces/log.interface.dart index 5fc8e858a2..711e910c38 100644 --- a/mobile-v2/lib/domain/interfaces/log.interface.dart +++ b/mobile-v2/lib/domain/interfaces/log.interface.dart @@ -2,19 +2,19 @@ import 'dart:async'; import 'package:immich_mobile/domain/models/log.model.dart'; -abstract class ILogRepository { - /// Fetches all logs - FutureOr> fetchAll(); - +abstract interface class ILogRepository { /// Inserts a new log into the DB - FutureOr add(LogMessage log); + FutureOr create(LogMessage log); /// Bulk insert logs into DB - FutureOr addAll(List log); + FutureOr createAll(List log); + + /// Fetches all logs + FutureOr> getAll(); /// Clears all logs - FutureOr clear(); + FutureOr deleteAll(); /// Truncates the logs to the most recent [limit]. Defaults to recent 250 logs - FutureOr truncateLogs({int limit = 250}); + FutureOr truncate({int limit = 250}); } diff --git a/mobile-v2/lib/domain/interfaces/renderlist.interface.dart b/mobile-v2/lib/domain/interfaces/renderlist.interface.dart new file mode 100644 index 0000000000..eebee3cd8e --- /dev/null +++ b/mobile-v2/lib/domain/interfaces/renderlist.interface.dart @@ -0,0 +1,6 @@ +import 'package:immich_mobile/domain/models/render_list.model.dart'; + +abstract interface class IRenderListRepository { + /// Streams the [RenderList] for the main timeline + Stream watchAll(); +} diff --git a/mobile-v2/lib/domain/interfaces/store.interface.dart b/mobile-v2/lib/domain/interfaces/store.interface.dart index 348eabf507..7408be68fc 100644 --- a/mobile-v2/lib/domain/interfaces/store.interface.dart +++ b/mobile-v2/lib/domain/interfaces/store.interface.dart @@ -12,16 +12,16 @@ abstract class IStoreConverter { FutureOr fromPrimitive(U value); } -abstract class IStoreRepository { - FutureOr tryGet(StoreKey key); +abstract interface class IStoreRepository { + FutureOr upsert(StoreKey key, T value); FutureOr get(StoreKey key); - FutureOr set(StoreKey key, T value); - - FutureOr delete(StoreKey key); + FutureOr tryGet(StoreKey key); Stream watch(StoreKey key); - FutureOr clearStore(); + FutureOr delete(StoreKey key); + + FutureOr deleteAll(); } diff --git a/mobile-v2/lib/domain/interfaces/user.interface.dart b/mobile-v2/lib/domain/interfaces/user.interface.dart index 9f133b2200..ffc7025ffb 100644 --- a/mobile-v2/lib/domain/interfaces/user.interface.dart +++ b/mobile-v2/lib/domain/interfaces/user.interface.dart @@ -2,10 +2,10 @@ import 'dart:async'; import 'package:immich_mobile/domain/models/user.model.dart'; -abstract class IUserRepository { - /// Fetches user - FutureOr fetch(String userId); - +abstract interface class IUserRepository { /// Insert user - FutureOr add(User user); + FutureOr upsert(User user); + + /// Fetches user + FutureOr getForId(String userId); } diff --git a/mobile-v2/lib/domain/models/asset.model.dart b/mobile-v2/lib/domain/models/asset.model.dart index 7efdb62dc9..62147a24fa 100644 --- a/mobile-v2/lib/domain/models/asset.model.dart +++ b/mobile-v2/lib/domain/models/asset.model.dart @@ -14,7 +14,7 @@ enum AssetType { class Asset { final int id; final String name; - final String checksum; + final String hash; final int? height; final int? width; final AssetType type; @@ -36,7 +36,7 @@ class Asset { const Asset({ required this.id, required this.name, - required this.checksum, + required this.hash, this.height, this.width, required this.type, @@ -55,7 +55,7 @@ class Asset { duration: dto.duration.tryParseInt() ?? 0, height: dto.exifInfo?.exifImageHeight?.toInt(), width: dto.exifInfo?.exifImageWidth?.toInt(), - checksum: dto.checksum, + hash: dto.checksum, name: dto.originalFileName, livePhotoVideoId: dto.livePhotoVideoId, modifiedTime: dto.fileModifiedAt, @@ -65,7 +65,7 @@ class Asset { Asset copyWith({ int? id, String? name, - String? checksum, + String? hash, int? height, int? width, AssetType? type, @@ -79,7 +79,7 @@ class Asset { return Asset( id: id ?? this.id, name: name ?? this.name, - checksum: checksum ?? this.checksum, + hash: hash ?? this.hash, height: height ?? this.height, width: width ?? this.width, type: type ?? this.type, @@ -119,7 +119,7 @@ class Asset { "remoteId": "${remoteId ?? "-"}", "localId": "${localId ?? "-"}", "name": "$name", - "checksum": "$checksum", + "hash": "$hash", "height": ${height ?? "-"}, "width": ${width ?? "-"}, "type": "$type", @@ -135,7 +135,7 @@ class Asset { return other.id == id && other.name == name && - other.checksum == checksum && + other.hash == hash && other.height == height && other.width == width && other.type == type && @@ -151,7 +151,7 @@ class Asset { int get hashCode { return id.hashCode ^ name.hashCode ^ - checksum.hashCode ^ + hash.hashCode ^ height.hashCode ^ width.hashCode ^ type.hashCode ^ diff --git a/mobile-v2/lib/domain/repositories/asset.repository.dart b/mobile-v2/lib/domain/repositories/asset.repository.dart index 0dc1b2c58d..396e0f30a1 100644 --- a/mobile-v2/lib/domain/repositories/asset.repository.dart +++ b/mobile-v2/lib/domain/repositories/asset.repository.dart @@ -4,19 +4,16 @@ import 'package:drift/drift.dart'; import 'package:immich_mobile/domain/entities/asset.entity.drift.dart'; import 'package:immich_mobile/domain/interfaces/asset.interface.dart'; import 'package:immich_mobile/domain/models/asset.model.dart'; -import 'package:immich_mobile/domain/models/render_list.model.dart'; -import 'package:immich_mobile/domain/models/render_list_element.model.dart'; import 'package:immich_mobile/domain/repositories/database.repository.dart'; -import 'package:immich_mobile/utils/extensions/drift.extension.dart'; import 'package:immich_mobile/utils/mixins/log.mixin.dart'; -class RemoteAssetDriftRepository with LogMixin implements IAssetRepository { +class AssetDriftRepository with LogMixin implements IAssetRepository { final DriftDatabaseRepository _db; - const RemoteAssetDriftRepository(this._db); + const AssetDriftRepository(this._db); @override - Future addAll(Iterable assets) async { + Future upsertAll(Iterable assets) async { try { await _db.batch((batch) => batch.insertAllOnConflictUpdate( _db.asset, @@ -31,7 +28,7 @@ class RemoteAssetDriftRepository with LogMixin implements IAssetRepository { } @override - Future clearAll() async { + Future deleteAll() async { try { await _db.asset.deleteAll(); return true; @@ -42,7 +39,7 @@ class RemoteAssetDriftRepository with LogMixin implements IAssetRepository { } @override - Future> fetchAssets({int? offset, int? limit}) async { + Future> getAll({int? offset, int? limit}) async { final query = _db.asset.select() ..orderBy([(asset) => OrderingTerm.desc(asset.createdTime)]); @@ -54,40 +51,7 @@ class RemoteAssetDriftRepository with LogMixin implements IAssetRepository { } @override - Stream watchRenderList() { - final assetCountExp = _db.asset.id.count(); - final createdTimeExp = _db.asset.createdTime; - final monthYearExp = _db.asset.createdTime.strftime('%m-%Y'); - - final query = _db.asset.selectOnly() - ..addColumns([assetCountExp, createdTimeExp]) - ..groupBy([monthYearExp]) - ..orderBy([OrderingTerm.desc(createdTimeExp)]); - - int lastAssetOffset = 0; - - return query - .expand((row) { - final createdTime = row.read(createdTimeExp)!; - final assetCount = row.read(assetCountExp)!; - final assetOffset = lastAssetOffset; - lastAssetOffset += assetCount; - - return [ - RenderListMonthHeaderElement(date: createdTime), - RenderListAssetElement( - date: createdTime, - assetCount: assetCount, - assetOffset: assetOffset, - ), - ]; - }) - .watch() - .map((elements) => RenderList(elements: elements)); - } - - @override - Future> fetchLocalAssetsForIds(List localIds) async { + Future> getForLocalIds(List localIds) async { final query = _db.asset.select() ..where((row) => row.localId.isIn(localIds)) ..orderBy([(asset) => OrderingTerm.asc(asset.localId)]); @@ -96,7 +60,7 @@ class RemoteAssetDriftRepository with LogMixin implements IAssetRepository { } @override - Future> fetchRemoteAssetsForIds(List remoteIds) async { + Future> getForRemoteIds(List remoteIds) async { final query = _db.asset.select() ..where((row) => row.remoteId.isIn(remoteIds)) ..orderBy([(asset) => OrderingTerm.asc(asset.remoteId)]); @@ -105,7 +69,7 @@ class RemoteAssetDriftRepository with LogMixin implements IAssetRepository { } @override - FutureOr deleteAssetsForIds(List ids) async { + FutureOr deleteIds(List ids) async { await _db.asset.deleteWhere((row) => row.id.isIn(ids)); } } @@ -115,7 +79,7 @@ AssetCompanion _toEntity(Asset asset) { localId: Value(asset.localId), remoteId: Value(asset.remoteId), name: asset.name, - checksum: asset.checksum, + hash: asset.hash, height: Value(asset.height), width: Value(asset.width), type: asset.type, @@ -133,7 +97,7 @@ Asset _toModel(AssetData asset) { remoteId: asset.remoteId, name: asset.name, type: asset.type, - checksum: asset.checksum, + hash: asset.hash, createdTime: asset.createdTime, modifiedTime: asset.modifiedTime, height: asset.height, diff --git a/mobile-v2/lib/domain/repositories/log.repository.dart b/mobile-v2/lib/domain/repositories/log.repository.dart index f4975c98e4..5d2b896714 100644 --- a/mobile-v2/lib/domain/repositories/log.repository.dart +++ b/mobile-v2/lib/domain/repositories/log.repository.dart @@ -13,12 +13,12 @@ class LogDriftRepository implements ILogRepository { const LogDriftRepository(this._db); @override - Future> fetchAll() async { + Future> getAll() async { return await _db.managers.logs.map(_toModel).get(); } @override - Future truncateLogs({int limit = 250}) async { + Future truncate({int limit = 250}) async { final totalCount = await _db.managers.logs.count(); if (totalCount > limit) { final rowsToDelete = totalCount - limit; @@ -30,7 +30,7 @@ class LogDriftRepository implements ILogRepository { } @override - FutureOr add(LogMessage log) async { + FutureOr create(LogMessage log) async { try { await _db.into(_db.logs).insert(LogsCompanion.insert( content: log.content, @@ -48,7 +48,7 @@ class LogDriftRepository implements ILogRepository { } @override - FutureOr addAll(List logs) async { + FutureOr createAll(List logs) async { try { await _db.batch((b) { b.insertAll( @@ -71,7 +71,7 @@ class LogDriftRepository implements ILogRepository { } @override - FutureOr clear() async { + FutureOr deleteAll() async { try { await _db.managers.logs.delete(); return true; diff --git a/mobile-v2/lib/domain/repositories/renderlist.repository.dart b/mobile-v2/lib/domain/repositories/renderlist.repository.dart new file mode 100644 index 0000000000..51cc637147 --- /dev/null +++ b/mobile-v2/lib/domain/repositories/renderlist.repository.dart @@ -0,0 +1,46 @@ +import 'package:drift/drift.dart'; +import 'package:immich_mobile/domain/interfaces/renderlist.interface.dart'; +import 'package:immich_mobile/domain/models/render_list.model.dart'; +import 'package:immich_mobile/domain/models/render_list_element.model.dart'; +import 'package:immich_mobile/domain/repositories/database.repository.dart'; +import 'package:immich_mobile/utils/extensions/drift.extension.dart'; +import 'package:immich_mobile/utils/mixins/log.mixin.dart'; + +class RenderListDriftRepository with LogMixin implements IRenderListRepository { + final DriftDatabaseRepository _db; + + const RenderListDriftRepository(this._db); + + @override + Stream watchAll() { + final assetCountExp = _db.asset.id.count(); + final createdTimeExp = _db.asset.createdTime; + final monthYearExp = _db.asset.createdTime.strftime('%m-%Y'); + + final query = _db.asset.selectOnly() + ..addColumns([assetCountExp, createdTimeExp]) + ..groupBy([monthYearExp]) + ..orderBy([OrderingTerm.desc(createdTimeExp)]); + + int lastAssetOffset = 0; + + return query + .expand((row) { + final createdTime = row.read(createdTimeExp)!; + final assetCount = row.read(assetCountExp)!; + final assetOffset = lastAssetOffset; + lastAssetOffset += assetCount; + + return [ + RenderListMonthHeaderElement(date: createdTime), + RenderListAssetElement( + date: createdTime, + assetCount: assetCount, + assetOffset: assetOffset, + ), + ]; + }) + .watch() + .map((elements) => RenderList(elements: elements)); + } +} diff --git a/mobile-v2/lib/domain/repositories/store.repository.dart b/mobile-v2/lib/domain/repositories/store.repository.dart index 5d1b80af9a..27d0a5bb1c 100644 --- a/mobile-v2/lib/domain/repositories/store.repository.dart +++ b/mobile-v2/lib/domain/repositories/store.repository.dart @@ -30,7 +30,7 @@ class StoreDriftRepository with LogMixin implements IStoreRepository { } @override - FutureOr set(StoreKey key, T value) async { + FutureOr upsert(StoreKey key, T value) async { try { final storeValue = key.converter.toPrimitive(value); final intValue = (key.type == int) ? storeValue as int : null; @@ -61,7 +61,7 @@ class StoreDriftRepository with LogMixin implements IStoreRepository { } @override - FutureOr clearStore() async { + FutureOr deleteAll() async { await _db.managers.store.delete(); } diff --git a/mobile-v2/lib/domain/repositories/user.repository.dart b/mobile-v2/lib/domain/repositories/user.repository.dart index 8fa3c17046..3eef6ecb80 100644 --- a/mobile-v2/lib/domain/repositories/user.repository.dart +++ b/mobile-v2/lib/domain/repositories/user.repository.dart @@ -13,7 +13,7 @@ class UserDriftRepository with LogMixin implements IUserRepository { const UserDriftRepository(this._db); @override - FutureOr fetch(String userId) async { + FutureOr getForId(String userId) async { return await _db.managers.user .filter((f) => f.id.equals(userId)) .map(_toModel) @@ -21,7 +21,7 @@ class UserDriftRepository with LogMixin implements IUserRepository { } @override - FutureOr add(User user) async { + FutureOr upsert(User user) async { try { await _db.into(_db.user).insertOnConflictUpdate( UserCompanion.insert( diff --git a/mobile-v2/lib/domain/services/app_setting.service.dart b/mobile-v2/lib/domain/services/app_setting.service.dart index 641b75c755..d7720a93ff 100644 --- a/mobile-v2/lib/domain/services/app_setting.service.dart +++ b/mobile-v2/lib/domain/services/app_setting.service.dart @@ -6,16 +6,16 @@ class AppSettingService { const AppSettingService(this._store); - Future getSetting(AppSetting setting) async { + Future get(AppSetting setting) async { final value = await _store.tryGet(setting.storeKey); return value ?? setting.defaultValue; } - Future setSetting(AppSetting setting, T value) async { - return await _store.set(setting.storeKey, value); + Future upsert(AppSetting setting, T value) async { + return await _store.upsert(setting.storeKey, value); } - Stream watchSetting(AppSetting setting) { + Stream watch(AppSetting setting) { return _store .watch(setting.storeKey) .map((value) => value ?? setting.defaultValue); diff --git a/mobile-v2/lib/domain/services/asset_sync.service.dart b/mobile-v2/lib/domain/services/asset_sync.service.dart index 7a9001b0b1..5886fca4af 100644 --- a/mobile-v2/lib/domain/services/asset_sync.service.dart +++ b/mobile-v2/lib/domain/services/asset_sync.service.dart @@ -16,7 +16,7 @@ import 'package:openapi/api.dart'; class AssetSyncService with LogMixin { const AssetSyncService(); - Future doFullRemoteSyncForUserDrift( + Future performFullRemoteSyncForUser( User user, { DateTime? updatedUtil, int? limit, @@ -49,12 +49,11 @@ class AssetSyncService with LogMixin { final assetsFromServer = assets.map(Asset.remote).sorted(Asset.compareByRemoteId); - final assetsInDb = - await di().fetchRemoteAssetsForIds( + final assetsInDb = await di().getForRemoteIds( assetsFromServer.map((a) => a.remoteId!).toList(), ); - await _syncAssetsToDbDrift( + await _syncAssetsToDb( assetsFromServer, assetsInDb, Asset.compareByRemoteId, @@ -73,7 +72,7 @@ class AssetSyncService with LogMixin { }); } - Future _syncAssetsToDbDrift( + Future _syncAssetsToDb( List newAssets, List existingAssets, Comparator compare, { @@ -88,9 +87,9 @@ class AssetSyncService with LogMixin { final assetsToAdd = toAdd.followedBy(toUpdate); - await di().addAll(assetsToAdd); + await di().upsertAll(assetsToAdd); await di() - .deleteAssetsForIds(assetsToRemove.map((a) => a.id).toList()); + .deleteIds(assetsToRemove.map((a) => a.id).toList()); } /// Returns a triple (toAdd, toUpdate, toRemove) diff --git a/mobile-v2/lib/domain/services/login.service.dart b/mobile-v2/lib/domain/services/login.service.dart index 2984967ca4..543ba16246 100644 --- a/mobile-v2/lib/domain/services/login.service.dart +++ b/mobile-v2/lib/domain/services/login.service.dart @@ -107,7 +107,7 @@ class LoginService with LogMixin { return null; } - Future tryLoginFromSplash() async { + Future tryAutoLogin() async { final serverEndpoint = await di().tryGet(StoreKey.serverEndpoint); if (serverEndpoint == null) { diff --git a/mobile-v2/lib/domain/utils/store_converters.dart b/mobile-v2/lib/domain/utils/store_converters.dart index b527a76c39..eb8b8d309f 100644 --- a/mobile-v2/lib/domain/utils/store_converters.dart +++ b/mobile-v2/lib/domain/utils/store_converters.dart @@ -50,7 +50,7 @@ class StoreUserConverter extends IStoreConverter { @override Future fromPrimitive(String value) async { - return await di().fetch(value); + return await di().getForId(value); } @override diff --git a/mobile-v2/lib/presentation/components/input/switch_list.widget.dart b/mobile-v2/lib/presentation/components/input/switch_list.widget.dart index e7bfbbe15f..a686f8fd1b 100644 --- a/mobile-v2/lib/presentation/components/input/switch_list.widget.dart +++ b/mobile-v2/lib/presentation/components/input/switch_list.widget.dart @@ -37,7 +37,7 @@ class _ImSwitchListTileState extends State> { final value = T != bool ? widget.toAppSetting!(enabled) : enabled as T; if (value != null && - await _appSettingService.setSetting(widget.setting, value) && + await _appSettingService.upsert(widget.setting, value) && context.mounted) { setState(() { isEnabled = enabled; @@ -48,7 +48,7 @@ class _ImSwitchListTileState extends State> { @override void initState() { super.initState(); - _appSettingService.getSetting(widget.setting).then((value) { + _appSettingService.get(widget.setting).then((value) { if (context.mounted) { setState(() { isEnabled = T != bool ? widget.fromAppSetting!(value) : value as bool; diff --git a/mobile-v2/lib/presentation/modules/home/pages/home.page.dart b/mobile-v2/lib/presentation/modules/home/pages/home.page.dart index 6c473feb4c..b3b07f3391 100644 --- a/mobile-v2/lib/presentation/modules/home/pages/home.page.dart +++ b/mobile-v2/lib/presentation/modules/home/pages/home.page.dart @@ -2,6 +2,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:immich_mobile/domain/interfaces/asset.interface.dart'; +import 'package:immich_mobile/domain/interfaces/renderlist.interface.dart'; import 'package:immich_mobile/presentation/components/grid/immich_asset_grid.state.dart'; import 'package:immich_mobile/presentation/components/grid/immich_asset_grid.widget.dart'; import 'package:immich_mobile/service_locator.dart'; @@ -15,8 +16,8 @@ class HomePage extends StatelessWidget { return Scaffold( body: BlocProvider( create: (_) => ImmichAssetGridCubit( - renderStream: di().watchRenderList(), - assetProvider: di().fetchAssets, + renderStream: di().watchAll(), + assetProvider: di().getAll, ), child: const ImAssetGrid(), ), diff --git a/mobile-v2/lib/presentation/modules/login/states/login_page.state.dart b/mobile-v2/lib/presentation/modules/login/states/login_page.state.dart index a979e7a4f1..c57d982ab4 100644 --- a/mobile-v2/lib/presentation/modules/login/states/login_page.state.dart +++ b/mobile-v2/lib/presentation/modules/login/states/login_page.state.dart @@ -65,7 +65,7 @@ class LoginPageCubit extends Cubit with LogMixin { // Check for /.well-known/immich url = await loginService.resolveEndpoint(uri); - di().set(StoreKey.serverEndpoint, url); + di().upsert(StoreKey.serverEndpoint, url); ServiceLocator.registerApiClient(url); ServiceLocator.registerPostValidationServices(); ServiceLocator.registerPostGlobalStates(); @@ -123,7 +123,7 @@ class LoginPageCubit extends Cubit with LogMixin { } Future _postLogin(String accessToken) async { - await di().set(StoreKey.accessToken, accessToken); + await di().upsert(StoreKey.accessToken, accessToken); /// Set token to interceptor await di().init(accessToken: accessToken); @@ -136,10 +136,10 @@ class LoginPageCubit extends Cubit with LogMixin { // Register user ServiceLocator.registerCurrentUser(user); - await di().add(user); + await di().upsert(user); // Remove and Sync assets in background - await di().clearAll(); - unawaited(di().doFullRemoteSyncForUserDrift(user)); + await di().deleteAll(); + unawaited(di().performFullRemoteSyncForUser(user)); emit(state.copyWith( isValidationInProgress: false, diff --git a/mobile-v2/lib/presentation/modules/theme/states/app_theme.state.dart b/mobile-v2/lib/presentation/modules/theme/states/app_theme.state.dart index f1cfc03b1e..7bdadf938d 100644 --- a/mobile-v2/lib/presentation/modules/theme/states/app_theme.state.dart +++ b/mobile-v2/lib/presentation/modules/theme/states/app_theme.state.dart @@ -10,9 +10,8 @@ class AppThemeCubit extends Cubit { late final StreamSubscription _appSettingSubscription; AppThemeCubit(this._appSettings) : super(AppTheme.blue) { - _appSettingSubscription = _appSettings - .watchSetting(AppSetting.appTheme) - .listen((theme) => emit(theme)); + _appSettingSubscription = + _appSettings.watch(AppSetting.appTheme).listen((theme) => emit(theme)); } @override diff --git a/mobile-v2/lib/presentation/router/pages/splash_screen.page.dart b/mobile-v2/lib/presentation/router/pages/splash_screen.page.dart index 337b1b6959..9469cfd0ba 100644 --- a/mobile-v2/lib/presentation/router/pages/splash_screen.page.dart +++ b/mobile-v2/lib/presentation/router/pages/splash_screen.page.dart @@ -3,8 +3,10 @@ import 'dart:async'; import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:immich_mobile/domain/services/asset_sync.service.dart'; import 'package:immich_mobile/domain/services/login.service.dart'; import 'package:immich_mobile/presentation/components/image/immich_logo.widget.dart'; +import 'package:immich_mobile/presentation/modules/common/states/current_user.state.dart'; import 'package:immich_mobile/presentation/modules/login/states/login_page.state.dart'; import 'package:immich_mobile/presentation/router/router.dart'; import 'package:immich_mobile/service_locator.dart'; @@ -49,7 +51,9 @@ class _SplashScreenState extends State } Future _tryLogin() async { - if (await di().tryLoginFromSplash() && mounted) { + if (await di().tryAutoLogin() && mounted) { + unawaited(di() + .performFullRemoteSyncForUser(di().state)); unawaited(context.replaceRoute(const TabControllerRoute())); } else { unawaited(context.replaceRoute(const LoginRoute())); diff --git a/mobile-v2/lib/service_locator.dart b/mobile-v2/lib/service_locator.dart index e5a21de986..adc52c4816 100644 --- a/mobile-v2/lib/service_locator.dart +++ b/mobile-v2/lib/service_locator.dart @@ -69,7 +69,7 @@ class ServiceLocator { _registerFactory(() => AppSettingService(di())); _registerFactory(() => UserDriftRepository(di())); _registerFactory( - () => RemoteAssetDriftRepository(di()), + () => AssetDriftRepository(di()), ); /// Services diff --git a/mobile-v2/lib/utils/log_manager.dart b/mobile-v2/lib/utils/log_manager.dart index aab06e535d..dffbf7dcbc 100644 --- a/mobile-v2/lib/utils/log_manager.dart +++ b/mobile-v2/lib/utils/log_manager.dart @@ -53,7 +53,7 @@ class LogManager { _timer = null; final buffer = _msgBuffer; _msgBuffer = []; - di().addAll(buffer); + di().createAll(buffer); } void init() { @@ -78,7 +78,7 @@ class LogManager { _timer?.cancel(); _timer = null; _msgBuffer.clear(); - di().clear(); + di().deleteAll(); } static void setGlobalErrorCallbacks() {