fix: video thumbnail quality sharing (#29104)

This commit is contained in:
Brandon Wees 2026-06-16 09:13:31 -05:00 committed by GitHub
parent 10fddf2d51
commit 010220d588
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 30 additions and 8 deletions

View file

@ -6,10 +6,12 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/settings_key.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart';
import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart';
import 'package:immich_mobile/providers/infrastructure/action.provider.dart';
import 'package:immich_mobile/providers/infrastructure/settings.provider.dart';
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
@ -51,7 +53,9 @@ class _SharePreparingDialog extends StatelessWidget {
}
class _ShareFileTypeDialog extends StatelessWidget {
const _ShareFileTypeDialog();
final bool showPreview;
const _ShareFileTypeDialog({this.showPreview = true});
@override
Widget build(BuildContext context) {
@ -66,11 +70,12 @@ class _ShareFileTypeDialog extends StatelessWidget {
title: Text(context.t.share_original),
onTap: () => context.pop(ShareAssetType.original),
),
ListTile(
leading: const Icon(Icons.photo_size_select_large_rounded),
title: Text(context.t.share_preview),
onTap: () => context.pop(ShareAssetType.preview),
),
if (showPreview)
ListTile(
leading: const Icon(Icons.photo_size_select_large_rounded),
title: Text(context.t.share_preview),
onTap: () => context.pop(ShareAssetType.preview),
),
],
),
actions: [TextButton(onPressed: () => context.pop(), child: Text(context.t.cancel))],
@ -85,6 +90,16 @@ class ShareActionButton extends ConsumerWidget {
const ShareActionButton({super.key, required this.source, this.iconOnly = false, this.menuItem = false});
Set<BaseAsset> _getSelectedAssets(WidgetRef ref) {
return switch (source) {
ActionSource.timeline => ref.read(multiSelectProvider).selectedAssets,
ActionSource.viewer => switch (ref.read(assetViewerProvider).currentAsset) {
BaseAsset asset => {asset},
null => const {},
},
};
}
void _onTap(BuildContext context, WidgetRef ref) async {
if (!context.mounted) {
return;
@ -99,9 +114,14 @@ class ShareActionButton extends ConsumerWidget {
return;
}
// only show preview option when at least one of the assets is not a video
// we cant share previews of videos
final assets = _getSelectedAssets(ref);
final showPreview = assets.isEmpty || assets.any((asset) => !asset.isVideo);
final fileType = await showDialog<ShareAssetType>(
context: context,
builder: (_) => const _ShareFileTypeDialog(),
builder: (_) => _ShareFileTypeDialog(showPreview: showPreview),
useRootNavigator: false,
);

View file

@ -285,7 +285,9 @@ class AssetMediaRepository {
return 0;
}
final shareFile = switch (fileType) {
final effectiveFileType = asset.isVideo ? ShareAssetType.original : fileType;
final shareFile = switch (effectiveFileType) {
ShareAssetType.original => await _getOriginalShareFile(
asset,
cancelCompleter: cancelCompleter,