fix(mobile): cancel share download when dialog is dismissed (#25466)

* fix(mobile): cancel share download when dialog is dismissed

* refactor: centralize temporary file cleanup logic

* refactor: replace `CancellationToken` with `Completer<void>` for asset sharing cancellation

---------

Co-authored-by: cmdpromptcritical <cmdpromptcritical@github.com>
This commit is contained in:
cmdPromptCritical
2026-02-05 14:08:35 -05:00
committed by GitHub
parent 9d8efe2685
commit ad9f3cfa05
4 changed files with 53 additions and 20 deletions
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
@@ -41,16 +42,20 @@ class ShareActionButton extends ConsumerWidget {
return;
}
final cancelCompleter = Completer<void>();
const preparingDialog = _SharePreparingDialog();
await showDialog(
context: context,
builder: (BuildContext buildContext) {
ref.read(actionProvider.notifier).shareAssets(source, context).then((ActionResult result) {
ref.read(multiSelectProvider.notifier).reset();
if (!context.mounted) {
ref.read(actionProvider.notifier).shareAssets(source, context, cancelCompleter: cancelCompleter).then((
ActionResult result,
) {
if (cancelCompleter.isCompleted || !context.mounted) {
return;
}
ref.read(multiSelectProvider.notifier).reset();
if (!result.success) {
ImmichToast.show(
context: context,
@@ -64,11 +69,15 @@ class ShareActionButton extends ConsumerWidget {
});
// show a loading spinner with a "Preparing" message
return const _SharePreparingDialog();
return preparingDialog;
},
barrierDismissible: false,
useRootNavigator: false,
);
).then((_) {
if (!cancelCompleter.isCompleted) {
cancelCompleter.complete();
}
});
}
@override