123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import 'package:auto_route/auto_route.dart';
- import 'package:cached_network_image/cached_network_image.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter/services.dart';
- import 'package:flutter_hooks/flutter_hooks.dart';
- import 'package:hive_flutter/hive_flutter.dart';
- import 'package:hooks_riverpod/hooks_riverpod.dart';
- import 'package:immich_mobile/constants/hive_box.dart';
- import 'package:immich_mobile/modules/home/providers/home_page_state.provider.dart';
- import 'package:immich_mobile/shared/models/immich_asset.model.dart';
- import 'package:immich_mobile/routing/router.dart';
- class ThumbnailImage extends HookConsumerWidget {
- final ImmichAsset asset;
- const ThumbnailImage({Key? key, required this.asset}) : super(key: key);
- @override
- Widget build(BuildContext context, WidgetRef ref) {
- final cacheKey = useState(1);
- var box = Hive.box(userInfoBox);
- var thumbnailRequestUrl =
- '${box.get(serverEndpointKey)}/asset/file?aid=${asset.deviceAssetId}&did=${asset.deviceId}&isThumb=true';
- var selectedAsset = ref.watch(homePageStateProvider).selectedItems;
- var isMultiSelectEnable = ref.watch(homePageStateProvider).isMultiSelectEnable;
- Widget _buildSelectionIcon(ImmichAsset asset) {
- if (selectedAsset.contains(asset)) {
- return Icon(
- Icons.check_circle,
- color: Theme.of(context).primaryColor,
- );
- } else {
- return const Icon(
- Icons.circle_outlined,
- color: Colors.white,
- );
- }
- }
- return GestureDetector(
- onTap: () {
- if (isMultiSelectEnable && selectedAsset.contains(asset) && selectedAsset.length == 1) {
- ref.watch(homePageStateProvider.notifier).disableMultiSelect();
- } else if (isMultiSelectEnable && selectedAsset.contains(asset) && selectedAsset.length > 1) {
- ref.watch(homePageStateProvider.notifier).removeSingleSelectedItem(asset);
- } else if (isMultiSelectEnable && !selectedAsset.contains(asset)) {
- ref.watch(homePageStateProvider.notifier).addSingleSelectedItem(asset);
- } else {
- if (asset.type == 'IMAGE') {
- AutoRouter.of(context).push(
- ImageViewerRoute(
- imageUrl:
- '${box.get(serverEndpointKey)}/asset/file?aid=${asset.deviceAssetId}&did=${asset.deviceId}&isThumb=false',
- heroTag: asset.id,
- thumbnailUrl: thumbnailRequestUrl,
- asset: asset,
- ),
- );
- } else {
- debugPrint("Navigate to video player");
- AutoRouter.of(context).push(
- VideoViewerRoute(
- videoUrl: '${box.get(serverEndpointKey)}/asset/file?aid=${asset.deviceAssetId}&did=${asset.deviceId}',
- ),
- );
- }
- }
- },
- onLongPress: () {
- // Enable multi selecte function
- ref.watch(homePageStateProvider.notifier).enableMultiSelect({asset});
- HapticFeedback.heavyImpact();
- },
- child: Hero(
- tag: asset.id,
- child: Stack(
- children: [
- Container(
- decoration: BoxDecoration(
- border: isMultiSelectEnable && selectedAsset.contains(asset)
- ? Border.all(color: Theme.of(context).primaryColorLight, width: 10)
- : const Border(),
- ),
- child: CachedNetworkImage(
- cacheKey: "${asset.id}-${cacheKey.value}",
- width: 300,
- height: 300,
- memCacheHeight: asset.type == 'IMAGE' ? 250 : 400,
- fit: BoxFit.cover,
- imageUrl: thumbnailRequestUrl,
- httpHeaders: {"Authorization": "Bearer ${box.get(accessTokenKey)}"},
- fadeInDuration: const Duration(milliseconds: 250),
- progressIndicatorBuilder: (context, url, downloadProgress) => Transform.scale(
- scale: 0.2,
- child: CircularProgressIndicator(value: downloadProgress.progress),
- ),
- errorWidget: (context, url, error) {
- debugPrint("Error Loading Thumbnail Widget $error");
- cacheKey.value += 1;
- return const Icon(Icons.error);
- },
- ),
- ),
- Container(
- child: isMultiSelectEnable
- ? Padding(
- padding: const EdgeInsets.all(3.0),
- child: Align(
- alignment: Alignment.topLeft,
- child: _buildSelectionIcon(asset),
- ),
- )
- : Container(),
- ),
- ],
- ),
- ),
- );
- }
- }
|