123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- import 'package:cached_network_image/cached_network_image.dart';
- import 'package:flutter/material.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/sharing/providers/asset_selection.provider.dart';
- import 'package:openapi/api.dart';
- class SelectionThumbnailImage extends HookConsumerWidget {
- final AssetResponseDto asset;
- const SelectionThumbnailImage({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/thumbnail/${asset.id}';
- var selectedAsset =
- ref.watch(assetSelectionProvider).selectedNewAssetsForAlbum;
- var newAssetsForAlbum =
- ref.watch(assetSelectionProvider).selectedAdditionalAssetsForAlbum;
- var isAlbumExist = ref.watch(assetSelectionProvider).isAlbumExist;
- Widget _buildSelectionIcon(AssetResponseDto asset) {
- if (selectedAsset.contains(asset) && !isAlbumExist) {
- return Icon(
- Icons.check_circle,
- color: Theme.of(context).primaryColor,
- );
- } else if (selectedAsset.contains(asset) && isAlbumExist) {
- return const Icon(
- Icons.check_circle,
- color: Color.fromARGB(255, 233, 233, 233),
- );
- } else if (newAssetsForAlbum.contains(asset) && isAlbumExist) {
- return Icon(
- Icons.check_circle,
- color: Theme.of(context).primaryColor,
- );
- } else {
- return const Icon(
- Icons.circle_outlined,
- color: Colors.white,
- );
- }
- }
- BoxBorder drawBorderColor() {
- if (selectedAsset.contains(asset) && !isAlbumExist) {
- return Border.all(
- color: Theme.of(context).primaryColorLight,
- width: 10,
- );
- } else if (selectedAsset.contains(asset) && isAlbumExist) {
- return Border.all(
- color: const Color.fromARGB(255, 190, 190, 190),
- width: 10,
- );
- } else if (newAssetsForAlbum.contains(asset) && isAlbumExist) {
- return Border.all(
- color: Theme.of(context).primaryColorLight,
- width: 10,
- );
- }
- return const Border();
- }
- return GestureDetector(
- onTap: () {
- if (isAlbumExist) {
- // Operation for existing album
- if (!selectedAsset.contains(asset)) {
- if (newAssetsForAlbum.contains(asset)) {
- ref
- .watch(assetSelectionProvider.notifier)
- .removeSelectedAdditionalAssets([asset]);
- } else {
- ref
- .watch(assetSelectionProvider.notifier)
- .addAdditionalAssets([asset]);
- }
- }
- } else {
- // Operation for new album
- if (selectedAsset.contains(asset)) {
- ref
- .watch(assetSelectionProvider.notifier)
- .removeSelectedNewAssets([asset]);
- } else {
- ref.watch(assetSelectionProvider.notifier).addNewAssets([asset]);
- }
- }
- },
- child: Stack(
- children: [
- Container(
- decoration: BoxDecoration(border: drawBorderColor()),
- child: CachedNetworkImage(
- cacheKey: "${asset.id}-${cacheKey.value}",
- width: 150,
- height: 150,
- memCacheHeight: asset.type == AssetTypeEnum.IMAGE ? 150 : 150,
- 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) {
- return Icon(
- Icons.image_not_supported_outlined,
- color: Theme.of(context).primaryColor,
- );
- },
- ),
- ),
- Padding(
- padding: const EdgeInsets.all(3.0),
- child: Align(
- alignment: Alignment.topLeft,
- child: _buildSelectionIcon(asset),
- ),
- ),
- if (asset.type != AssetTypeEnum.IMAGE)
- Positioned(
- bottom: 5,
- right: 5,
- child: Row(
- children: [
- Text(
- asset.duration.substring(0, 7),
- style: const TextStyle(
- color: Colors.white,
- fontSize: 10,
- ),
- ),
- const Icon(
- Icons.play_circle_outline_rounded,
- color: Colors.white,
- ),
- ],
- ),
- ),
- ],
- ),
- );
- }
- }
|