Browse Source

fix(mobile) add and delete asset in album doesn' (#1474)

t update count in list
Alex 2 years ago
parent
commit
91114e5aa0

+ 6 - 6
mobile/lib/modules/album/providers/shared_album.provider.dart

@@ -6,10 +6,10 @@ import 'package:immich_mobile/shared/models/asset.dart';
 import 'package:openapi/api.dart';
 
 class SharedAlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
-  SharedAlbumNotifier(this._sharedAlbumService, this._sharedAlbumCacheService)
+  SharedAlbumNotifier(this._albumService, this._sharedAlbumCacheService)
       : super([]);
 
-  final AlbumService _sharedAlbumService;
+  final AlbumService _albumService;
   final SharedAlbumCacheService _sharedAlbumCacheService;
 
   _cacheState() {
@@ -22,7 +22,7 @@ class SharedAlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
     List<String> sharedUserIds,
   ) async {
     try {
-      var newAlbum = await _sharedAlbumService.createAlbum(
+      var newAlbum = await _albumService.createAlbum(
         albumName,
         assets,
         sharedUserIds,
@@ -47,7 +47,7 @@ class SharedAlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
     }
 
     List<AlbumResponseDto>? sharedAlbums =
-        await _sharedAlbumService.getAlbums(isShared: true);
+        await _albumService.getAlbums(isShared: true);
 
     if (sharedAlbums != null) {
       state = sharedAlbums;
@@ -61,7 +61,7 @@ class SharedAlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
   }
 
   Future<bool> leaveAlbum(String albumId) async {
-    var res = await _sharedAlbumService.leaveAlbum(albumId);
+    var res = await _albumService.leaveAlbum(albumId);
 
     if (res) {
       state = state.where((album) => album.id != albumId).toList();
@@ -76,7 +76,7 @@ class SharedAlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
     String albumId,
     List<String> assetIds,
   ) async {
-    var res = await _sharedAlbumService.removeAssetFromAlbum(albumId, assetIds);
+    var res = await _albumService.removeAssetFromAlbum(albumId, assetIds);
 
     if (res) {
       return true;

+ 1 - 0
mobile/lib/modules/album/ui/album_viewer_appbar.dart

@@ -96,6 +96,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
       if (isSuccess) {
         Navigator.pop(context);
         ref.watch(assetSelectionProvider.notifier).disableMultiselection();
+        ref.watch(albumProvider.notifier).getAllAlbums();
         ref.invalidate(sharedAlbumDetailProvider(albumId));
       } else {
         Navigator.pop(context);

+ 2 - 0
mobile/lib/modules/album/views/album_viewer_page.dart

@@ -3,6 +3,7 @@ import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:immich_mobile/modules/album/providers/album.provider.dart';
 import 'package:immich_mobile/modules/home/ui/draggable_scrollbar.dart';
 import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 import 'package:immich_mobile/modules/album/models/asset_selection_page_result.model.dart';
@@ -62,6 +63,7 @@ class AlbumViewerPage extends HookConsumerWidget {
 
           if (addAssetsResult != null &&
               addAssetsResult.successfullyAdded > 0) {
+            ref.watch(albumProvider.notifier).getAllAlbums();
             ref.invalidate(sharedAlbumDetailProvider(albumId));
           }
 

+ 53 - 41
mobile/openapi/lib/model/album_response_dto.dart

@@ -43,48 +43,51 @@ class AlbumResponseDto {
   List<AssetResponseDto> assets;
 
   @override
-  bool operator ==(Object other) => identical(this, other) || other is AlbumResponseDto &&
-     other.assetCount == assetCount &&
-     other.id == id &&
-     other.ownerId == ownerId &&
-     other.albumName == albumName &&
-     other.createdAt == createdAt &&
-     other.albumThumbnailAssetId == albumThumbnailAssetId &&
-     other.shared == shared &&
-     other.sharedUsers == sharedUsers &&
-     other.assets == assets;
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      other is AlbumResponseDto &&
+          other.assetCount == assetCount &&
+          other.id == id &&
+          other.ownerId == ownerId &&
+          other.albumName == albumName &&
+          other.createdAt == createdAt &&
+          other.albumThumbnailAssetId == albumThumbnailAssetId &&
+          other.shared == shared &&
+          other.sharedUsers == sharedUsers &&
+          other.assets == assets;
 
   @override
   int get hashCode =>
-    // ignore: unnecessary_parenthesis
-    (assetCount.hashCode) +
-    (id.hashCode) +
-    (ownerId.hashCode) +
-    (albumName.hashCode) +
-    (createdAt.hashCode) +
-    (albumThumbnailAssetId == null ? 0 : albumThumbnailAssetId!.hashCode) +
-    (shared.hashCode) +
-    (sharedUsers.hashCode) +
-    (assets.hashCode);
+      // ignore: unnecessary_parenthesis
+      (assetCount.hashCode) +
+      (id.hashCode) +
+      (ownerId.hashCode) +
+      (albumName.hashCode) +
+      (createdAt.hashCode) +
+      (albumThumbnailAssetId == null ? 0 : albumThumbnailAssetId!.hashCode) +
+      (shared.hashCode) +
+      (sharedUsers.hashCode) +
+      (assets.hashCode);
 
   @override
-  String toString() => 'AlbumResponseDto[assetCount=$assetCount, id=$id, ownerId=$ownerId, albumName=$albumName, createdAt=$createdAt, albumThumbnailAssetId=$albumThumbnailAssetId, shared=$shared, sharedUsers=$sharedUsers, assets=$assets]';
+  String toString() =>
+      'AlbumResponseDto[assetCount=$assetCount, id=$id, ownerId=$ownerId, albumName=$albumName, createdAt=$createdAt, albumThumbnailAssetId=$albumThumbnailAssetId, shared=$shared, sharedUsers=$sharedUsers, assets=$assets]';
 
   Map<String, dynamic> toJson() {
     final json = <String, dynamic>{};
-      json[r'assetCount'] = this.assetCount;
-      json[r'id'] = this.id;
-      json[r'ownerId'] = this.ownerId;
-      json[r'albumName'] = this.albumName;
-      json[r'createdAt'] = this.createdAt;
+    json[r'assetCount'] = this.assetCount;
+    json[r'id'] = this.id;
+    json[r'ownerId'] = this.ownerId;
+    json[r'albumName'] = this.albumName;
+    json[r'createdAt'] = this.createdAt;
     if (this.albumThumbnailAssetId != null) {
       json[r'albumThumbnailAssetId'] = this.albumThumbnailAssetId;
     } else {
       // json[r'albumThumbnailAssetId'] = null;
     }
-      json[r'shared'] = this.shared;
-      json[r'sharedUsers'] = this.sharedUsers;
-      json[r'assets'] = this.assets;
+    json[r'shared'] = this.shared;
+    json[r'sharedUsers'] = this.sharedUsers;
+    json[r'assets'] = this.assets;
     return json;
   }
 
@@ -98,13 +101,13 @@ class AlbumResponseDto {
       // Ensure that the map contains the required keys.
       // Note 1: the values aren't checked for validity beyond being non-null.
       // Note 2: this code is stripped in release mode!
-      assert(() {
-        requiredKeys.forEach((key) {
-          assert(json.containsKey(key), 'Required key "AlbumResponseDto[$key]" is missing from JSON.');
-          assert(json[key] != null, 'Required key "AlbumResponseDto[$key]" has a null value in JSON.');
-        });
-        return true;
-      }());
+      // assert(() {
+      //   requiredKeys.forEach((key) {
+      //     assert(json.containsKey(key), 'Required key "AlbumResponseDto[$key]" is missing from JSON.');
+      //     assert(json[key] != null, 'Required key "AlbumResponseDto[$key]" has a null value in JSON.');
+      //   });
+      //   return true;
+      // }());
 
       return AlbumResponseDto(
         assetCount: mapValueOfType<int>(json, r'assetCount')!,
@@ -112,7 +115,8 @@ class AlbumResponseDto {
         ownerId: mapValueOfType<String>(json, r'ownerId')!,
         albumName: mapValueOfType<String>(json, r'albumName')!,
         createdAt: mapValueOfType<String>(json, r'createdAt')!,
-        albumThumbnailAssetId: mapValueOfType<String>(json, r'albumThumbnailAssetId'),
+        albumThumbnailAssetId:
+            mapValueOfType<String>(json, r'albumThumbnailAssetId'),
         shared: mapValueOfType<bool>(json, r'shared')!,
         sharedUsers: UserResponseDto.listFromJson(json[r'sharedUsers'])!,
         assets: AssetResponseDto.listFromJson(json[r'assets'])!,
@@ -121,7 +125,10 @@ class AlbumResponseDto {
     return null;
   }
 
-  static List<AlbumResponseDto>? listFromJson(dynamic json, {bool growable = false,}) {
+  static List<AlbumResponseDto>? listFromJson(
+    dynamic json, {
+    bool growable = false,
+  }) {
     final result = <AlbumResponseDto>[];
     if (json is List && json.isNotEmpty) {
       for (final row in json) {
@@ -149,12 +156,18 @@ class AlbumResponseDto {
   }
 
   // maps a json object with a list of AlbumResponseDto-objects as value to a dart map
-  static Map<String, List<AlbumResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
+  static Map<String, List<AlbumResponseDto>> mapListFromJson(
+    dynamic json, {
+    bool growable = false,
+  }) {
     final map = <String, List<AlbumResponseDto>>{};
     if (json is Map && json.isNotEmpty) {
       json = json.cast<String, dynamic>(); // ignore: parameter_assignments
       for (final entry in json.entries) {
-        final value = AlbumResponseDto.listFromJson(entry.value, growable: growable,);
+        final value = AlbumResponseDto.listFromJson(
+          entry.value,
+          growable: growable,
+        );
         if (value != null) {
           map[entry.key] = value;
         }
@@ -176,4 +189,3 @@ class AlbumResponseDto {
     'assets',
   };
 }
-

+ 72 - 61
mobile/openapi/lib/model/asset_response_dto.dart

@@ -82,73 +82,76 @@ class AssetResponseDto {
   List<TagResponseDto> tags;
 
   @override
-  bool operator ==(Object other) => identical(this, other) || other is AssetResponseDto &&
-     other.type == type &&
-     other.id == id &&
-     other.deviceAssetId == deviceAssetId &&
-     other.ownerId == ownerId &&
-     other.deviceId == deviceId &&
-     other.originalPath == originalPath &&
-     other.resizePath == resizePath &&
-     other.createdAt == createdAt &&
-     other.modifiedAt == modifiedAt &&
-     other.isFavorite == isFavorite &&
-     other.mimeType == mimeType &&
-     other.duration == duration &&
-     other.webpPath == webpPath &&
-     other.encodedVideoPath == encodedVideoPath &&
-     other.exifInfo == exifInfo &&
-     other.smartInfo == smartInfo &&
-     other.livePhotoVideoId == livePhotoVideoId &&
-     other.tags == tags;
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      other is AssetResponseDto &&
+          other.type == type &&
+          other.id == id &&
+          other.deviceAssetId == deviceAssetId &&
+          other.ownerId == ownerId &&
+          other.deviceId == deviceId &&
+          other.originalPath == originalPath &&
+          other.resizePath == resizePath &&
+          other.createdAt == createdAt &&
+          other.modifiedAt == modifiedAt &&
+          other.isFavorite == isFavorite &&
+          other.mimeType == mimeType &&
+          other.duration == duration &&
+          other.webpPath == webpPath &&
+          other.encodedVideoPath == encodedVideoPath &&
+          other.exifInfo == exifInfo &&
+          other.smartInfo == smartInfo &&
+          other.livePhotoVideoId == livePhotoVideoId &&
+          other.tags == tags;
 
   @override
   int get hashCode =>
-    // ignore: unnecessary_parenthesis
-    (type.hashCode) +
-    (id.hashCode) +
-    (deviceAssetId.hashCode) +
-    (ownerId.hashCode) +
-    (deviceId.hashCode) +
-    (originalPath.hashCode) +
-    (resizePath == null ? 0 : resizePath!.hashCode) +
-    (createdAt.hashCode) +
-    (modifiedAt.hashCode) +
-    (isFavorite.hashCode) +
-    (mimeType == null ? 0 : mimeType!.hashCode) +
-    (duration.hashCode) +
-    (webpPath == null ? 0 : webpPath!.hashCode) +
-    (encodedVideoPath == null ? 0 : encodedVideoPath!.hashCode) +
-    (exifInfo == null ? 0 : exifInfo!.hashCode) +
-    (smartInfo == null ? 0 : smartInfo!.hashCode) +
-    (livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) +
-    (tags.hashCode);
+      // ignore: unnecessary_parenthesis
+      (type.hashCode) +
+      (id.hashCode) +
+      (deviceAssetId.hashCode) +
+      (ownerId.hashCode) +
+      (deviceId.hashCode) +
+      (originalPath.hashCode) +
+      (resizePath == null ? 0 : resizePath!.hashCode) +
+      (createdAt.hashCode) +
+      (modifiedAt.hashCode) +
+      (isFavorite.hashCode) +
+      (mimeType == null ? 0 : mimeType!.hashCode) +
+      (duration.hashCode) +
+      (webpPath == null ? 0 : webpPath!.hashCode) +
+      (encodedVideoPath == null ? 0 : encodedVideoPath!.hashCode) +
+      (exifInfo == null ? 0 : exifInfo!.hashCode) +
+      (smartInfo == null ? 0 : smartInfo!.hashCode) +
+      (livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) +
+      (tags.hashCode);
 
   @override
-  String toString() => 'AssetResponseDto[type=$type, id=$id, deviceAssetId=$deviceAssetId, ownerId=$ownerId, deviceId=$deviceId, originalPath=$originalPath, resizePath=$resizePath, createdAt=$createdAt, modifiedAt=$modifiedAt, isFavorite=$isFavorite, mimeType=$mimeType, duration=$duration, webpPath=$webpPath, encodedVideoPath=$encodedVideoPath, exifInfo=$exifInfo, smartInfo=$smartInfo, livePhotoVideoId=$livePhotoVideoId, tags=$tags]';
+  String toString() =>
+      'AssetResponseDto[type=$type, id=$id, deviceAssetId=$deviceAssetId, ownerId=$ownerId, deviceId=$deviceId, originalPath=$originalPath, resizePath=$resizePath, createdAt=$createdAt, modifiedAt=$modifiedAt, isFavorite=$isFavorite, mimeType=$mimeType, duration=$duration, webpPath=$webpPath, encodedVideoPath=$encodedVideoPath, exifInfo=$exifInfo, smartInfo=$smartInfo, livePhotoVideoId=$livePhotoVideoId, tags=$tags]';
 
   Map<String, dynamic> toJson() {
     final json = <String, dynamic>{};
-      json[r'type'] = this.type;
-      json[r'id'] = this.id;
-      json[r'deviceAssetId'] = this.deviceAssetId;
-      json[r'ownerId'] = this.ownerId;
-      json[r'deviceId'] = this.deviceId;
-      json[r'originalPath'] = this.originalPath;
+    json[r'type'] = this.type;
+    json[r'id'] = this.id;
+    json[r'deviceAssetId'] = this.deviceAssetId;
+    json[r'ownerId'] = this.ownerId;
+    json[r'deviceId'] = this.deviceId;
+    json[r'originalPath'] = this.originalPath;
     if (this.resizePath != null) {
       json[r'resizePath'] = this.resizePath;
     } else {
       // json[r'resizePath'] = null;
     }
-      json[r'createdAt'] = this.createdAt;
-      json[r'modifiedAt'] = this.modifiedAt;
-      json[r'isFavorite'] = this.isFavorite;
+    json[r'createdAt'] = this.createdAt;
+    json[r'modifiedAt'] = this.modifiedAt;
+    json[r'isFavorite'] = this.isFavorite;
     if (this.mimeType != null) {
       json[r'mimeType'] = this.mimeType;
     } else {
       // json[r'mimeType'] = null;
     }
-      json[r'duration'] = this.duration;
+    json[r'duration'] = this.duration;
     if (this.webpPath != null) {
       json[r'webpPath'] = this.webpPath;
     } else {
@@ -174,7 +177,7 @@ class AssetResponseDto {
     } else {
       // json[r'livePhotoVideoId'] = null;
     }
-      json[r'tags'] = this.tags;
+    json[r'tags'] = this.tags;
     return json;
   }
 
@@ -188,13 +191,13 @@ class AssetResponseDto {
       // Ensure that the map contains the required keys.
       // Note 1: the values aren't checked for validity beyond being non-null.
       // Note 2: this code is stripped in release mode!
-      assert(() {
-        requiredKeys.forEach((key) {
-          assert(json.containsKey(key), 'Required key "AssetResponseDto[$key]" is missing from JSON.');
-          assert(json[key] != null, 'Required key "AssetResponseDto[$key]" has a null value in JSON.');
-        });
-        return true;
-      }());
+      // assert(() {
+      //   requiredKeys.forEach((key) {
+      //     assert(json.containsKey(key), 'Required key "AssetResponseDto[$key]" is missing from JSON.');
+      //     assert(json[key] != null, 'Required key "AssetResponseDto[$key]" has a null value in JSON.');
+      //   });
+      //   return true;
+      // }());
 
       return AssetResponseDto(
         type: AssetTypeEnum.fromJson(json[r'type'])!,
@@ -220,7 +223,10 @@ class AssetResponseDto {
     return null;
   }
 
-  static List<AssetResponseDto>? listFromJson(dynamic json, {bool growable = false,}) {
+  static List<AssetResponseDto>? listFromJson(
+    dynamic json, {
+    bool growable = false,
+  }) {
     final result = <AssetResponseDto>[];
     if (json is List && json.isNotEmpty) {
       for (final row in json) {
@@ -248,12 +254,18 @@ class AssetResponseDto {
   }
 
   // maps a json object with a list of AssetResponseDto-objects as value to a dart map
-  static Map<String, List<AssetResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
+  static Map<String, List<AssetResponseDto>> mapListFromJson(
+    dynamic json, {
+    bool growable = false,
+  }) {
     final map = <String, List<AssetResponseDto>>{};
     if (json is Map && json.isNotEmpty) {
       json = json.cast<String, dynamic>(); // ignore: parameter_assignments
       for (final entry in json.entries) {
-        final value = AssetResponseDto.listFromJson(entry.value, growable: growable,);
+        final value = AssetResponseDto.listFromJson(
+          entry.value,
+          growable: growable,
+        );
         if (value != null) {
           map[entry.key] = value;
         }
@@ -280,4 +292,3 @@ class AssetResponseDto {
     'tags',
   };
 }
-