From 01c0056e69b72867c2caabc975e20e3ea0194ed2 Mon Sep 17 00:00:00 2001 From: bwees Date: Fri, 16 Jan 2026 15:20:53 -0600 Subject: [PATCH] chore: make thumbhash non optional for remote image provider --- mobile/lib/presentation/pages/drift_place.page.dart | 2 +- .../presentation/widgets/album/album_selector.widget.dart | 8 ++++---- mobile/lib/presentation/widgets/album/album_tile.dart | 6 +++++- .../lib/presentation/widgets/images/image_provider.dart | 8 ++++---- .../widgets/images/remote_image_provider.dart | 8 ++++---- .../lib/presentation/widgets/images/thumbnail.widget.dart | 2 +- .../presentation/widgets/memory/memory_lane.widget.dart | 6 +++++- 7 files changed, 24 insertions(+), 16 deletions(-) diff --git a/mobile/lib/presentation/pages/drift_place.page.dart b/mobile/lib/presentation/pages/drift_place.page.dart index d042f52673..10b9ca7ae4 100644 --- a/mobile/lib/presentation/pages/drift_place.page.dart +++ b/mobile/lib/presentation/pages/drift_place.page.dart @@ -167,7 +167,7 @@ class _PlaceTile extends StatelessWidget { child: SizedBox( width: 80, height: 80, - child: Thumbnail.remote(remoteId: place.$2, fit: BoxFit.cover), + child: Thumbnail.remote(remoteId: place.$2, fit: BoxFit.cover, thumbhash: ""), ), ), ); diff --git a/mobile/lib/presentation/widgets/album/album_selector.widget.dart b/mobile/lib/presentation/widgets/album/album_selector.widget.dart index c42f49091f..eb7cc5a543 100644 --- a/mobile/lib/presentation/widgets/album/album_selector.widget.dart +++ b/mobile/lib/presentation/widgets/album/album_selector.widget.dart @@ -14,14 +14,14 @@ import 'package:immich_mobile/models/albums/album_search.model.dart'; import 'package:immich_mobile/presentation/widgets/album/album_tile.dart'; import 'package:immich_mobile/presentation/widgets/album/new_album_name_modal.widget.dart'; import 'package:immich_mobile/presentation/widgets/images/thumbnail.widget.dart'; +import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart'; +import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart'; import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; -import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart'; -import 'package:immich_mobile/providers/app_settings.provider.dart'; -import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/routing/router.dart'; +import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/utils/album_filter.utils.dart'; import 'package:immich_mobile/widgets/common/confirm_dialog.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; @@ -681,7 +681,7 @@ class _GridAlbumCard extends ConsumerWidget { child: SizedBox( width: double.infinity, child: album.thumbnailAssetId != null - ? Thumbnail.remote(remoteId: album.thumbnailAssetId!) + ? Thumbnail.remote(remoteId: album.thumbnailAssetId!, thumbhash: "") : Container( color: context.colorScheme.surfaceContainerHighest, child: const Icon(Icons.photo_album_rounded, size: 40, color: Colors.grey), diff --git a/mobile/lib/presentation/widgets/album/album_tile.dart b/mobile/lib/presentation/widgets/album/album_tile.dart index 561b018ef8..020dd6d59e 100644 --- a/mobile/lib/presentation/widgets/album/album_tile.dart +++ b/mobile/lib/presentation/widgets/album/album_tile.dart @@ -32,7 +32,11 @@ class AlbumTile extends StatelessWidget { leading: album.thumbnailAssetId != null ? ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(15)), - child: SizedBox(width: 80, height: 80, child: Thumbnail.remote(remoteId: album.thumbnailAssetId!)), + child: SizedBox( + width: 80, + height: 80, + child: Thumbnail.remote(remoteId: album.thumbnailAssetId!, thumbhash: ""), + ), ) : SizedBox( width: 80, diff --git a/mobile/lib/presentation/widgets/images/image_provider.dart b/mobile/lib/presentation/widgets/images/image_provider.dart index b821ec375c..ad7d53af13 100644 --- a/mobile/lib/presentation/widgets/images/image_provider.dart +++ b/mobile/lib/presentation/widgets/images/image_provider.dart @@ -112,13 +112,13 @@ ImageProvider getFullImageProvider(BaseAsset asset, {Size size = const Size(1080 provider = LocalFullImageProvider(id: id, size: size, assetType: asset.type); } else { final String assetId; - final String? thumbhash; + final String thumbhash; if (asset is LocalAsset && asset.hasRemote) { assetId = asset.remoteId!; - thumbhash = null; + thumbhash = ""; } else if (asset is RemoteAsset) { assetId = asset.id; - thumbhash = asset.thumbHash; + thumbhash = asset.thumbHash ?? ""; } else { throw ArgumentError("Unsupported asset type: ${asset.runtimeType}"); } @@ -135,7 +135,7 @@ ImageProvider? getThumbnailImageProvider(BaseAsset asset, {Size size = kThumbnai } final assetId = asset is RemoteAsset ? asset.id : (asset as LocalAsset).remoteId; - final thumbhash = asset is RemoteAsset ? asset.thumbHash : null; + final thumbhash = asset is RemoteAsset ? asset.thumbHash ?? "" : ""; return assetId != null ? RemoteThumbProvider(assetId: assetId, thumbhash: thumbhash) : null; } diff --git a/mobile/lib/presentation/widgets/images/remote_image_provider.dart b/mobile/lib/presentation/widgets/images/remote_image_provider.dart index e0d4c0ef6c..b550e53c21 100644 --- a/mobile/lib/presentation/widgets/images/remote_image_provider.dart +++ b/mobile/lib/presentation/widgets/images/remote_image_provider.dart @@ -16,9 +16,9 @@ class RemoteThumbProvider extends CancellableImageProvider with CancellableImageProviderMixin { static final cacheManager = RemoteThumbnailCacheManager(); final String assetId; - final String? thumbhash; + final String thumbhash; - RemoteThumbProvider({required this.assetId, this.thumbhash}); + RemoteThumbProvider({required this.assetId, required this.thumbhash}); @override Future obtainKey(ImageConfiguration configuration) { @@ -64,9 +64,9 @@ class RemoteFullImageProvider extends CancellableImageProvider { static final cacheManager = RemoteThumbnailCacheManager(); final String assetId; - final String? thumbhash; + final String thumbhash; - RemoteFullImageProvider({required this.assetId, this.thumbhash}); + RemoteFullImageProvider({required this.assetId, required this.thumbhash}); @override Future obtainKey(ImageConfiguration configuration) { diff --git a/mobile/lib/presentation/widgets/images/thumbnail.widget.dart b/mobile/lib/presentation/widgets/images/thumbnail.widget.dart index 836ed98e04..f878c214a9 100644 --- a/mobile/lib/presentation/widgets/images/thumbnail.widget.dart +++ b/mobile/lib/presentation/widgets/images/thumbnail.widget.dart @@ -23,7 +23,7 @@ class Thumbnail extends StatefulWidget { Thumbnail.remote({ required String remoteId, - String? thumbhash, + required String thumbhash, this.fit = BoxFit.cover, Size size = kThumbnailResolution, super.key, diff --git a/mobile/lib/presentation/widgets/memory/memory_lane.widget.dart b/mobile/lib/presentation/widgets/memory/memory_lane.widget.dart index e85a6c05f8..62889b10cb 100644 --- a/mobile/lib/presentation/widgets/memory/memory_lane.widget.dart +++ b/mobile/lib/presentation/widgets/memory/memory_lane.widget.dart @@ -60,7 +60,11 @@ class DriftMemoryCard extends ConsumerWidget { child: SizedBox( width: 205, height: 200, - child: Thumbnail.remote(remoteId: memory.assets[0].id, fit: BoxFit.cover), + child: Thumbnail.remote( + remoteId: memory.assets[0].id, + thumbhash: memory.assets[0].thumbHash ?? "", + fit: BoxFit.cover, + ), ), ), Positioned(