@@ -6,8 +6,6 @@ import 'package:share_plus/share_plus.dart';
6
6
import '../api/exception.dart' ;
7
7
import '../api/model/model.dart' ;
8
8
import '../api/route/messages.dart' ;
9
- import '../model/internal_link.dart' ;
10
- import '../model/narrow.dart' ;
11
9
import 'clipboard.dart' ;
12
10
import 'compose_box.dart' ;
13
11
import 'dialog.dart' ;
@@ -41,13 +39,12 @@ void showMessageActionSheet({required BuildContext context, required Message mes
41
39
return Column (children: [
42
40
if (! hasThumbsUpReactionVote) AddThumbsUpButton (message: message, messageListContext: context),
43
41
StarButton (message: message, messageListContext: context),
42
+ ShareButton (message: message, messageListContext: context),
44
43
if (isComposeBoxOffered) QuoteAndReplyButton (
45
44
message: message,
46
45
messageListContext: context,
47
46
),
48
47
CopyMessageTextButton (message: message, messageListContext: context),
49
- CopyMessageLinkButton (message: message, messageListContext: context),
50
- ShareButton (message: message, messageListContext: context),
51
48
]);
52
49
});
53
50
}
@@ -167,6 +164,63 @@ class StarButton extends MessageActionSheetMenuItemButton {
167
164
}
168
165
}
169
166
167
+ class ShareButton extends MessageActionSheetMenuItemButton {
168
+ ShareButton ({
169
+ super .key,
170
+ required super .message,
171
+ required super .messageListContext,
172
+ });
173
+
174
+ @override IconData get icon => Icons .adaptive.share;
175
+
176
+ @override
177
+ String label (ZulipLocalizations zulipLocalizations) {
178
+ return zulipLocalizations.actionSheetOptionShare;
179
+ }
180
+
181
+ @override void onPressed (BuildContext context) async {
182
+ // Close the message action sheet; we're about to show the share
183
+ // sheet. (We could do this after the sharing Future settles
184
+ // with [ShareResultStatus.success], but on iOS I get impatient with
185
+ // how slowly our action sheet dismisses in that case.)
186
+ // TODO(#24): Fix iOS bug where this call causes the keyboard to
187
+ // reopen (if it was open at the time of this
188
+ // `showMessageActionSheet` call) and cover a large part of the
189
+ // share sheet.
190
+ Navigator .of (context).pop ();
191
+ final zulipLocalizations = ZulipLocalizations .of (messageListContext);
192
+
193
+ final rawContent = await fetchRawContentWithFeedback (
194
+ context: messageListContext,
195
+ messageId: message.id,
196
+ errorDialogTitle: zulipLocalizations.errorSharingFailed,
197
+ );
198
+
199
+ if (rawContent == null ) return ;
200
+
201
+ if (! messageListContext.mounted) return ;
202
+
203
+ // TODO: to support iPads, we're asked to give a
204
+ // `sharePositionOrigin` param, or risk crashing / hanging:
205
+ // https://pub.dev/packages/share_plus#ipad
206
+ // Perhaps a wart in the API; discussion:
207
+ // https://github.com/zulip/zulip-flutter/pull/12#discussion_r1130146231
208
+ final result = await Share .share (rawContent);
209
+
210
+ switch (result.status) {
211
+ // The plugin isn't very helpful: "The status can not be determined".
212
+ // Until we learn otherwise, assume something wrong happened.
213
+ case ShareResultStatus .unavailable:
214
+ if (! messageListContext.mounted) return ;
215
+ await showErrorDialog (context: messageListContext,
216
+ title: zulipLocalizations.errorSharingFailed);
217
+ case ShareResultStatus .success:
218
+ case ShareResultStatus .dismissed:
219
+ // nothing to do
220
+ }
221
+ }
222
+ }
223
+
170
224
/// Fetch and return the raw Markdown content for [messageId] ,
171
225
/// showing an error dialog on failure.
172
226
Future <String ?> fetchRawContentWithFeedback ({
@@ -307,96 +361,8 @@ class CopyMessageTextButton extends MessageActionSheetMenuItemButton {
307
361
308
362
if (! messageListContext.mounted) return ;
309
363
310
- copyWithPopup (context: messageListContext ,
364
+ copyWithPopup (context: context ,
311
365
successContent: Text (zulipLocalizations.successMessageTextCopied),
312
366
data: ClipboardData (text: rawContent));
313
367
}
314
368
}
315
-
316
- class CopyMessageLinkButton extends MessageActionSheetMenuItemButton {
317
- CopyMessageLinkButton ({
318
- super .key,
319
- required super .message,
320
- required super .messageListContext,
321
- });
322
-
323
- @override IconData get icon => Icons .link;
324
-
325
- @override
326
- String label (ZulipLocalizations zulipLocalizations) {
327
- return zulipLocalizations.actionSheetOptionCopyMessageLink;
328
- }
329
-
330
- @override void onPressed (BuildContext context) {
331
- Navigator .of (context).pop ();
332
- final zulipLocalizations = ZulipLocalizations .of (messageListContext);
333
-
334
- final store = PerAccountStoreWidget .of (messageListContext);
335
- final messageLink = narrowLink (
336
- store,
337
- SendableNarrow .ofMessage (message, selfUserId: store.selfUserId),
338
- nearMessageId: message.id,
339
- );
340
-
341
- copyWithPopup (context: messageListContext,
342
- successContent: Text (zulipLocalizations.successMessageLinkCopied),
343
- data: ClipboardData (text: messageLink.toString ()));
344
- }
345
- }
346
-
347
- class ShareButton extends MessageActionSheetMenuItemButton {
348
- ShareButton ({
349
- super .key,
350
- required super .message,
351
- required super .messageListContext,
352
- });
353
-
354
- @override IconData get icon => Icons .adaptive.share;
355
-
356
- @override
357
- String label (ZulipLocalizations zulipLocalizations) {
358
- return zulipLocalizations.actionSheetOptionShare;
359
- }
360
-
361
- @override void onPressed (BuildContext context) async {
362
- // Close the message action sheet; we're about to show the share
363
- // sheet. (We could do this after the sharing Future settles
364
- // with [ShareResultStatus.success], but on iOS I get impatient with
365
- // how slowly our action sheet dismisses in that case.)
366
- // TODO(#24): Fix iOS bug where this call causes the keyboard to
367
- // reopen (if it was open at the time of this
368
- // `showMessageActionSheet` call) and cover a large part of the
369
- // share sheet.
370
- Navigator .of (context).pop ();
371
- final zulipLocalizations = ZulipLocalizations .of (messageListContext);
372
-
373
- final rawContent = await fetchRawContentWithFeedback (
374
- context: messageListContext,
375
- messageId: message.id,
376
- errorDialogTitle: zulipLocalizations.errorSharingFailed,
377
- );
378
-
379
- if (rawContent == null ) return ;
380
-
381
- if (! messageListContext.mounted) return ;
382
-
383
- // TODO: to support iPads, we're asked to give a
384
- // `sharePositionOrigin` param, or risk crashing / hanging:
385
- // https://pub.dev/packages/share_plus#ipad
386
- // Perhaps a wart in the API; discussion:
387
- // https://github.com/zulip/zulip-flutter/pull/12#discussion_r1130146231
388
- final result = await Share .share (rawContent);
389
-
390
- switch (result.status) {
391
- // The plugin isn't very helpful: "The status can not be determined".
392
- // Until we learn otherwise, assume something wrong happened.
393
- case ShareResultStatus .unavailable:
394
- if (! messageListContext.mounted) return ;
395
- await showErrorDialog (context: messageListContext,
396
- title: zulipLocalizations.errorSharingFailed);
397
- case ShareResultStatus .success:
398
- case ShareResultStatus .dismissed:
399
- // nothing to do
400
- }
401
- }
402
- }
0 commit comments