diff --git a/mobile/lib/domain/models/config/app_config.dart b/mobile/lib/domain/models/config/app_config.dart index dc1bf96679..d881f67cf8 100644 --- a/mobile/lib/domain/models/config/app_config.dart +++ b/mobile/lib/domain/models/config/app_config.dart @@ -143,13 +143,8 @@ class AppConfig { }) as T; - factory AppConfig.fromEntries(Map, Object> entries) { - var config = const AppConfig(); - for (final MapEntry(key: key, value: value) in entries.entries) { - config = config.write(key, value); - } - return config; - } + factory AppConfig.fromEntries(Map, Object> overrides) => + overrides.entries.fold(const AppConfig(), (config, entry) => config.write(entry.key, entry.value)); AppConfig write(MetadataKey key, T value) { return switch (key) { diff --git a/mobile/lib/domain/models/metadata_key.dart b/mobile/lib/domain/models/metadata_key.dart index f68af0be84..c8822c28e9 100644 --- a/mobile/lib/domain/models/metadata_key.dart +++ b/mobile/lib/domain/models/metadata_key.dart @@ -7,13 +7,6 @@ import 'package:immich_mobile/domain/models/log.model.dart'; import 'package:immich_mobile/domain/models/timeline.model.dart'; import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart'; -enum MetadataScope { - user, // keys with this scope are deleted on logout - system; - - const MetadataScope(); -} - enum MetadataKey { // Theme themePrimaryColor(codec: _EnumCodec(ImmichColorPreset.values)), @@ -32,14 +25,11 @@ enum MetadataKey { viewerTapToNavigate(), // Network - networkAutoEndpointSwitching(scope: .system), - networkPreferredWifiName(scope: .system), - networkLocalEndpoint(scope: .system), - networkExternalEndpointList>(scope: .system, codec: _ListCodec(_PrimitiveCodec.string)), - networkCustomHeaders>( - scope: .system, - codec: _MapCodec(_PrimitiveCodec.string, _PrimitiveCodec.string), - ), + networkAutoEndpointSwitching(), + networkPreferredWifiName(), + networkLocalEndpoint(), + networkExternalEndpointList>(codec: _ListCodec(_PrimitiveCodec.string)), + networkCustomHeaders>(codec: _MapCodec(_PrimitiveCodec.string, _PrimitiveCodec.string)), // Album albumSortMode(codec: _EnumCodec(AlbumSortMode.values)), @@ -60,7 +50,7 @@ enum MetadataKey { timelineStorageIndicator(), // Log - logLevel(scope: .system, codec: _EnumCodec(LogLevel.values)), + logLevel(codec: _EnumCodec(LogLevel.values)), // Map mapShowFavoriteOnly(), @@ -83,10 +73,9 @@ enum MetadataKey { slideshowLook(codec: _EnumCodec(SlideshowLook.values)), slideshowDirection(codec: _EnumCodec(SlideshowDirection.values)); - final MetadataScope scope; final _MetadataCodec? _codecOverride; - const MetadataKey({this.scope = .user, _MetadataCodec? codec}) : _codecOverride = codec; + const MetadataKey({_MetadataCodec? codec}) : _codecOverride = codec; _MetadataCodec get _codec => _codecOverride ?? _MetadataCodec.forType(T); diff --git a/mobile/lib/infrastructure/repositories/metadata.repository.dart b/mobile/lib/infrastructure/repositories/metadata.repository.dart index d43f67fe87..1300376464 100644 --- a/mobile/lib/infrastructure/repositories/metadata.repository.dart +++ b/mobile/lib/infrastructure/repositories/metadata.repository.dart @@ -34,21 +34,33 @@ class MetadataRepository extends DriftDatabaseRepository { Future refresh() async => _applyOverrides(await _db.select(_db.metadataEntity).get()); + Future clear(Iterable keys) async { + if (keys.isEmpty) { + return; + } + + final names = keys.map((key) => key.name).toList(); + await (_db.delete(_db.metadataEntity)..where((row) => row.key.isIn(names))).go(); + + for (final key in keys) { + _appConfig = _appConfig.write(key, defaultConfig.read(key)); + } + } + Future write(MetadataKey key, U value) async { if (value == _appConfig.read(key)) { return; } if (value == defaultConfig.read(key)) { - await (_db.delete(_db.metadataEntity)..where((t) => t.key.equals(key.name))).go(); - } else { - await _db - .into(_db.metadataEntity) - .insertOnConflictUpdate( - MetadataEntityCompanion.insert(key: key.name, value: key.encode(value), updatedAt: Value(DateTime.now())), - ); + return clear([key]); } + await _db + .into(_db.metadataEntity) + .insertOnConflictUpdate( + MetadataEntityCompanion.insert(key: key.name, value: key.encode(value), updatedAt: Value(DateTime.now())), + ); _appConfig = _appConfig.write(key, value); } diff --git a/mobile/lib/services/auth.service.dart b/mobile/lib/services/auth.service.dart index 7d470ecd7a..fff72a710e 100644 --- a/mobile/lib/services/auth.service.dart +++ b/mobile/lib/services/auth.service.dart @@ -110,7 +110,7 @@ class AuthService { /// - Authentication repository data /// - Current user information /// - Access token - /// - Asset ETag + /// - Server-specific endpoint configuration /// /// All deletions are executed in parallel using [Future.wait]. Future clearLocalData() async { @@ -120,6 +120,12 @@ class AuthService { _authRepository.clearLocalData(), Store.delete(StoreKey.currentUser), Store.delete(StoreKey.accessToken), + MetadataRepository.instance.clear(const [ + .networkAutoEndpointSwitching, + .networkPreferredWifiName, + .networkLocalEndpoint, + .networkExternalEndpointList, + ]), ]); }