mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	feat: Add description (#2237)
* 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>
This commit is contained in:
		@@ -0,0 +1,93 @@
 | 
			
		||||
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,
 | 
			
		||||
  ),
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user