mirror of
https://github.com/immich-app/immich.git
synced 2024-12-28 11:15:54 +02:00
a9859bc029
* Added dto, logic to insert description and web implementation * create text field and update on remote database * Update description and save changes * styling * fix web test * fix server test * preserve description on metadata extraction job run * handle exif info is null situation * pr feedback * format openapi spec * update createAssetDto * refactor logic to service * move files * only owner can update description * Render description correctly in shared album * Render description correctly in shared link * disable description edit for not owner of asset on mobile * localization and clean up * fix test * Uses providers for description text (#2244) * uses providers for description text * comments * fixes initial data setting * fixes notifier --------- Co-authored-by: martyfuhry <martyfuhry@gmail.com>
94 lines
2.4 KiB
Dart
94 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,
|
|
),
|
|
);
|
|
|
|
|