Files
Immich/mobile/lib/data/store/user_metadata.dart
T
Adam Gastineau 91247f1492 chore(mobile): migrate OCR, Tag, and UserMetadata to Store (#31704)
* chore(mobile): migrate OCR, Tag, and UserMetadata to Store

* Add comments to Tag HTTP repository

* Add mounted check
2026-09-22 18:29:33 +00:00

38 lines
1.6 KiB
Dart

import 'package:collection/collection.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/data/store/util/cache.dart';
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
// TODO(rewrite): Remove once the current user is a store entry of its own
import 'package:immich_mobile/providers/user.provider.dart';
/// Server held metadata about the current user; their preferences, onboarding state and license
///
/// State is stored in the local DB, and is only written by server sync
extension type const UserMetadataStore._(Provider<UserMetadataMutations> _provider)
implements Provider<UserMetadataMutations> {
static final UserMetadataStore instance = UserMetadataStore._(Provider((ref) => UserMetadataMutations._(ref)));
/// The current user's server side preferences, or `null` if they have not synced yet
///
/// **NOTE:** This is only reactive to the local DB
StreamProvider<Preferences?> preferences() => _preferencesProvider;
}
final _preferencesProvider = StreamProvider<Preferences?>((ref) {
final userId = ref.watch(currentUserProvider.select((user) => user?.id));
if (userId == null) {
return Stream.value(null);
}
final repository = driftProvider.select((db) => db.userMetadataRepository);
return ref
.watch(repository)
.watchUserMetadata(userId)
.map((metadataList) => metadataList.firstWhereOrNull((metadata) => metadata.preferences != null)?.preferences);
});
class UserMetadataMutations extends StoreMutations {
const UserMetadataMutations._(super.ref);
}