diff --git a/mobile/lib/modules/album/providers/shared_album.provider.dart b/mobile/lib/modules/album/providers/shared_album.provider.dart index e428136c7c..eefc09163e 100644 --- a/mobile/lib/modules/album/providers/shared_album.provider.dart +++ b/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> { - 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 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? sharedAlbums = - await _sharedAlbumService.getAlbums(isShared: true); + await _albumService.getAlbums(isShared: true); if (sharedAlbums != null) { state = sharedAlbums; @@ -61,7 +61,7 @@ class SharedAlbumNotifier extends StateNotifier> { } Future 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> { String albumId, List assetIds, ) async { - var res = await _sharedAlbumService.removeAssetFromAlbum(albumId, assetIds); + var res = await _albumService.removeAssetFromAlbum(albumId, assetIds); if (res) { return true; diff --git a/mobile/lib/modules/album/ui/album_viewer_appbar.dart b/mobile/lib/modules/album/ui/album_viewer_appbar.dart index 5c41b08b6e..00a66a18ee 100644 --- a/mobile/lib/modules/album/ui/album_viewer_appbar.dart +++ b/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); diff --git a/mobile/lib/modules/album/views/album_viewer_page.dart b/mobile/lib/modules/album/views/album_viewer_page.dart index 78b9896362..03b6581f56 100644 --- a/mobile/lib/modules/album/views/album_viewer_page.dart +++ b/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)); } diff --git a/mobile/openapi/lib/model/album_response_dto.dart b/mobile/openapi/lib/model/album_response_dto.dart index 282344a16f..7858e857d6 100644 --- a/mobile/openapi/lib/model/album_response_dto.dart +++ b/mobile/openapi/lib/model/album_response_dto.dart @@ -43,48 +43,51 @@ class AlbumResponseDto { List 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 toJson() { final json = {}; - 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(json, r'assetCount')!, @@ -112,7 +115,8 @@ class AlbumResponseDto { ownerId: mapValueOfType(json, r'ownerId')!, albumName: mapValueOfType(json, r'albumName')!, createdAt: mapValueOfType(json, r'createdAt')!, - albumThumbnailAssetId: mapValueOfType(json, r'albumThumbnailAssetId'), + albumThumbnailAssetId: + mapValueOfType(json, r'albumThumbnailAssetId'), shared: mapValueOfType(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? listFromJson(dynamic json, {bool growable = false,}) { + static List? listFromJson( + dynamic json, { + bool growable = false, + }) { final result = []; 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> mapListFromJson(dynamic json, {bool growable = false,}) { + static Map> mapListFromJson( + dynamic json, { + bool growable = false, + }) { final map = >{}; if (json is Map && json.isNotEmpty) { json = json.cast(); // 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', }; } - diff --git a/mobile/openapi/lib/model/asset_response_dto.dart b/mobile/openapi/lib/model/asset_response_dto.dart index 2f516e2bda..08c7e6cc39 100644 --- a/mobile/openapi/lib/model/asset_response_dto.dart +++ b/mobile/openapi/lib/model/asset_response_dto.dart @@ -82,73 +82,76 @@ class AssetResponseDto { List 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 toJson() { final json = {}; - 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? listFromJson(dynamic json, {bool growable = false,}) { + static List? listFromJson( + dynamic json, { + bool growable = false, + }) { final result = []; 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> mapListFromJson(dynamic json, {bool growable = false,}) { + static Map> mapListFromJson( + dynamic json, { + bool growable = false, + }) { final map = >{}; if (json is Map && json.isNotEmpty) { json = json.cast(); // 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', }; } -