mirror of
https://github.com/immich-app/immich.git
synced 2024-12-21 01:39:59 +02:00
27488ceb67
* dep(mobile): update flutter and deps * chore: dart analyzer * chore: update flutter workflow version * chore: dart format * fix: gallery_viewer PopScope --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
88 lines
2.4 KiB
Dart
88 lines
2.4 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:immich_mobile/modules/asset_viewer/services/asset_description.service.dart';
|
|
import 'package:immich_mobile/shared/models/asset.dart';
|
|
import 'package:immich_mobile/shared/models/exif_info.dart';
|
|
import 'package:immich_mobile/shared/providers/db.provider.dart';
|
|
import 'package:isar/isar.dart';
|
|
|
|
class AssetDescriptionNotifier extends StateNotifier<String> {
|
|
final Isar _db;
|
|
final AssetDescriptionService _service;
|
|
final Asset _asset;
|
|
|
|
AssetDescriptionNotifier(
|
|
this._db,
|
|
this._service,
|
|
this._asset,
|
|
) : super('') {
|
|
_fetchLocalDescription();
|
|
_fetchRemoteDescription();
|
|
}
|
|
|
|
String get description => state;
|
|
|
|
/// Fetches the local database value for description
|
|
/// and writes it to [state]
|
|
void _fetchLocalDescription() async {
|
|
final localExifId = _asset.exifInfo?.id;
|
|
|
|
// Guard [localExifId] null
|
|
if (localExifId == null) {
|
|
return;
|
|
}
|
|
|
|
// Subscribe to local changes
|
|
final exifInfo = await _db.exifInfos.get(localExifId);
|
|
|
|
// Guard
|
|
if (exifInfo?.description == null) {
|
|
return;
|
|
}
|
|
|
|
state = exifInfo!.description!;
|
|
}
|
|
|
|
/// Fetches the remote value and sets the state
|
|
void _fetchRemoteDescription() async {
|
|
final remoteAssetId = _asset.remoteId;
|
|
final localExifId = _asset.exifInfo?.id;
|
|
|
|
// Guard [remoteAssetId] and [localExifId] null
|
|
if (remoteAssetId == null || localExifId == null) {
|
|
return;
|
|
}
|
|
|
|
// Reads the latest from the remote and writes it to DB in the service
|
|
final latest = await _service.readLatest(remoteAssetId, localExifId);
|
|
|
|
state = latest;
|
|
}
|
|
|
|
/// Sets the description to [description]
|
|
/// Uses the service to set the asset value
|
|
Future<void> setDescription(String description) async {
|
|
state = description;
|
|
|
|
final remoteAssetId = _asset.remoteId;
|
|
final localExifId = _asset.exifInfo?.id;
|
|
|
|
// Guard [remoteAssetId] and [localExifId] null
|
|
if (remoteAssetId == null || localExifId == null) {
|
|
return;
|
|
}
|
|
|
|
return _service.setDescription(description, remoteAssetId, localExifId);
|
|
}
|
|
}
|
|
|
|
final assetDescriptionProvider = StateNotifierProvider.autoDispose
|
|
.family<AssetDescriptionNotifier, String, Asset>(
|
|
(ref, asset) => AssetDescriptionNotifier(
|
|
ref.watch(dbProvider),
|
|
ref.watch(assetDescriptionServiceProvider),
|
|
asset,
|
|
),
|
|
);
|