Skip to content

Commit 3295591

Browse files
authored
fix: show "preparing" when sharing in beta timeline (#21390)
* fix: show "preparing" when sharing in beta timeline * embed dialog inside of share_action_button * dont await the share sheet so "preparing" dialog disappears once share sheet presents this mimics old timeline behavior * chore: lint
1 parent aacb27e commit 3295591

File tree

3 files changed

+59
-31
lines changed

3 files changed

+59
-31
lines changed

mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,34 @@
11
import 'dart:io';
22

3+
import 'package:easy_localization/easy_localization.dart';
34
import 'package:flutter/material.dart';
45
import 'package:fluttertoast/fluttertoast.dart';
56
import 'package:hooks_riverpod/hooks_riverpod.dart';
67
import 'package:immich_mobile/constants/enums.dart';
8+
import 'package:immich_mobile/extensions/build_context_extensions.dart';
79
import 'package:immich_mobile/extensions/translate_extensions.dart';
810
import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart';
911
import 'package:immich_mobile/providers/infrastructure/action.provider.dart';
1012
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
1113
import 'package:immich_mobile/widgets/common/immich_toast.dart';
1214

15+
class _SharePreparingDialog extends StatelessWidget {
16+
const _SharePreparingDialog();
17+
18+
@override
19+
Widget build(BuildContext context) {
20+
return AlertDialog(
21+
content: Column(
22+
mainAxisSize: MainAxisSize.min,
23+
children: [
24+
const CircularProgressIndicator(),
25+
Container(margin: const EdgeInsets.only(top: 12), child: const Text('share_dialog_preparing').tr()),
26+
],
27+
),
28+
);
29+
}
30+
}
31+
1332
class ShareActionButton extends ConsumerWidget {
1433
final ActionSource source;
1534

@@ -20,28 +39,34 @@ class ShareActionButton extends ConsumerWidget {
2039
return;
2140
}
2241

23-
final result = await ref.read(actionProvider.notifier).shareAssets(source);
24-
ref.read(multiSelectProvider.notifier).reset();
42+
showDialog(
43+
context: context,
44+
builder: (BuildContext buildContext) {
45+
ref.read(actionProvider.notifier).shareAssets(source).then((ActionResult result) {
46+
ref.read(multiSelectProvider.notifier).reset();
2547

26-
if (!context.mounted) {
27-
return;
28-
}
48+
if (!context.mounted) {
49+
return;
50+
}
2951

30-
if (!result.success) {
31-
ImmichToast.show(
32-
context: context,
33-
msg: 'scaffold_body_error_occurred'.t(context: context),
34-
gravity: ToastGravity.BOTTOM,
35-
toastType: ToastType.error,
36-
);
37-
} else if (result.count > 0) {
38-
ImmichToast.show(
39-
context: context,
40-
msg: 'share_action_prompt'.t(context: context, args: {'count': result.count.toString()}),
41-
gravity: ToastGravity.BOTTOM,
42-
toastType: ToastType.success,
43-
);
44-
}
52+
if (!result.success) {
53+
ImmichToast.show(
54+
context: context,
55+
msg: 'scaffold_body_error_occurred'.t(context: context),
56+
gravity: ToastGravity.BOTTOM,
57+
toastType: ToastType.error,
58+
);
59+
}
60+
61+
buildContext.pop();
62+
});
63+
64+
// show a loading spinner with a "Preparing" message
65+
return const _SharePreparingDialog();
66+
},
67+
barrierDismissible: false,
68+
useRootNavigator: false,
69+
);
4570
}
4671

4772
@override

mobile/lib/providers/infrastructure/action.provider.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,8 @@ class ActionNotifier extends Notifier<void> {
334334
final ids = _getAssets(source).toList(growable: false);
335335

336336
try {
337-
final count = await _service.shareAssets(ids);
338-
return ActionResult(count: count, success: true);
337+
await _service.shareAssets(ids);
338+
return ActionResult(count: ids.length, success: true);
339339
} catch (error, stack) {
340340
_logger.severe('Failed to share assets', error, stack);
341341
return ActionResult(count: ids.length, success: false, error: error.toString());

mobile/lib/repositories/asset_media.repository.dart

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,18 @@ class AssetMediaRepository {
104104
return 0;
105105
}
106106

107-
final result = await Share.shareXFiles(downloadedXFiles);
108-
109-
for (var file in downloadedXFiles) {
110-
try {
111-
await File(file.path).delete();
112-
} catch (e) {
113-
_log.warning("Failed to delete temporary file: ${file.path}", e);
107+
// we dont want to await the share result since the
108+
// "preparing" dialog will not disappear unti
109+
Share.shareXFiles(downloadedXFiles).then((result) async {
110+
for (var file in downloadedXFiles) {
111+
try {
112+
await File(file.path).delete();
113+
} catch (e) {
114+
_log.warning("Failed to delete temporary file: ${file.path}", e);
115+
}
114116
}
115-
}
116-
return result.status == ShareResultStatus.success ? downloadedXFiles.length : 0;
117+
});
118+
119+
return downloadedXFiles.length;
117120
}
118121
}

0 commit comments

Comments
 (0)