1
+ import 'dart:io' ;
2
+
1
3
import 'package:flutter/material.dart' ;
2
4
import 'package:flutter/services.dart' ;
3
5
import 'package:flutter_gen/gen_l10n/zulip_localizations.dart' ;
@@ -11,10 +13,10 @@ import '../model/narrow.dart';
11
13
import 'clipboard.dart' ;
12
14
import 'compose_box.dart' ;
13
15
import 'dialog.dart' ;
14
- import 'draggable_scrollable_modal_bottom_sheet.dart' ;
15
16
import 'icons.dart' ;
16
17
import 'message_list.dart' ;
17
18
import 'store.dart' ;
19
+ import 'theme.dart' ;
18
20
19
21
/// Show a sheet of actions you can take on a message in the message list.
20
22
///
@@ -36,20 +38,47 @@ void showMessageActionSheet({required BuildContext context, required Message mes
36
38
&& reactionWithVotes.userIds.contains (store.selfUserId))
37
39
?? false ;
38
40
39
- showDraggableScrollableModalBottomSheet <void >(
41
+ final designVariables = DesignVariables .of (context);
42
+ showModalBottomSheet <void >(
40
43
context: context,
44
+ clipBehavior: Clip .antiAlias,
45
+ backgroundColor: designVariables.actionSheetBackground,
46
+ shape: const RoundedRectangleBorder (borderRadius: BorderRadius .vertical (top: Radius .circular (20.0 ))),
47
+ useSafeArea: true ,
48
+ isScrollControlled: true ,
41
49
builder: (BuildContext _) {
42
- return Column (children: [
43
- if (! hasThumbsUpReactionVote) AddThumbsUpButton (message: message, messageListContext: context),
44
- StarButton (message: message, messageListContext: context),
45
- if (isComposeBoxOffered) QuoteAndReplyButton (
46
- message: message,
47
- messageListContext: context,
50
+ return Padding (
51
+ padding: const EdgeInsets .all (16.0 ),
52
+ child: Column (
53
+ crossAxisAlignment: CrossAxisAlignment .stretch,
54
+ mainAxisSize: MainAxisSize .min,
55
+ children: [
56
+ // TODO(#217): show message text
57
+ Flexible (
58
+ child: SingleChildScrollView (
59
+ child: ClipRRect (
60
+ borderRadius: BorderRadius .circular (7 ),
61
+ child: Column (children: [
62
+ if (! hasThumbsUpReactionVote) AddThumbsUpButton (message: message, messageListContext: context),
63
+ StarButton (message: message, messageListContext: context),
64
+ if (isComposeBoxOffered) QuoteAndReplyButton (
65
+ message: message,
66
+ messageListContext: context,
67
+ ),
68
+ CopyMessageTextButton (message: message, messageListContext: context),
69
+ CopyMessageLinkButton (message: message, messageListContext: context),
70
+ ShareButton (message: message, messageListContext: context),
71
+ // TODO: The following line could be replaced by the [spacing]
72
+ // property when https://github.com/flutter/flutter/issues/55378 is fixed.
73
+ ].expand ((item) => [const SizedBox (height: 1 ), item]).skip (1 ).toList ()),
74
+ ),
75
+ ),
76
+ ),
77
+ const SizedBox (height: 8 ),
78
+ const MessageActionSheetCancelButton (),
79
+ ],
48
80
),
49
- CopyMessageTextButton (message: message, messageListContext: context),
50
- CopyMessageLinkButton (message: message, messageListContext: context),
51
- ShareButton (message: message, messageListContext: context),
52
- ]);
81
+ );
53
82
});
54
83
}
55
84
@@ -69,11 +98,21 @@ abstract class MessageActionSheetMenuItemButton extends StatelessWidget {
69
98
70
99
@override
71
100
Widget build (BuildContext context) {
101
+ final designVariables = DesignVariables .of (context);
72
102
final zulipLocalizations = ZulipLocalizations .of (context);
73
103
return MenuItemButton (
74
- leadingIcon: Icon (icon),
104
+ trailingIcon: Icon (icon, color: designVariables.actionSheetMenuButtonForeground),
105
+ style: MenuItemButton .styleFrom (
106
+ padding: const EdgeInsets .symmetric (vertical: 12 , horizontal: 16 ),
107
+ tapTargetSize: MaterialTapTargetSize .shrinkWrap,
108
+ minimumSize: Size .zero,
109
+ backgroundColor: designVariables.actionSheetMenuButtonBackground,
110
+ foregroundColor: designVariables.actionSheetMenuButtonForeground,
111
+ ),
75
112
onPressed: () => onPressed (context),
76
- child: Text (label (zulipLocalizations)));
113
+ child: Text (label (zulipLocalizations),
114
+ style: const TextStyle (fontSize: 20 , fontWeight: FontWeight .w600),
115
+ ));
77
116
}
78
117
}
79
118
@@ -86,7 +125,7 @@ class AddThumbsUpButton extends MessageActionSheetMenuItemButton {
86
125
required super .messageListContext,
87
126
});
88
127
89
- @override IconData get icon => Icons .add_reaction_outlined ;
128
+ @override IconData get icon => ZulipIcons .smile ;
90
129
91
130
@override
92
131
String label (ZulipLocalizations zulipLocalizations) {
@@ -127,11 +166,13 @@ class StarButton extends MessageActionSheetMenuItemButton {
127
166
required super .messageListContext,
128
167
});
129
168
130
- @override IconData get icon => ZulipIcons .star_filled;
169
+ @override IconData get icon => _isStarred ? ZulipIcons .star_filled : ZulipIcons .star;
170
+
171
+ bool get _isStarred => message.flags.contains (MessageFlag .starred);
131
172
132
173
@override
133
174
String label (ZulipLocalizations zulipLocalizations) {
134
- return message.flags. contains ( MessageFlag .starred)
175
+ return _isStarred
135
176
? zulipLocalizations.actionSheetOptionUnstarMessage
136
177
: zulipLocalizations.actionSheetOptionStarMessage;
137
178
}
@@ -223,7 +264,7 @@ class QuoteAndReplyButton extends MessageActionSheetMenuItemButton {
223
264
required super .messageListContext,
224
265
});
225
266
226
- @override IconData get icon => Icons .format_quote_outlined ;
267
+ @override IconData get icon => ZulipIcons .format_quote ;
227
268
228
269
@override
229
270
String label (ZulipLocalizations zulipLocalizations) {
@@ -285,7 +326,7 @@ class CopyMessageTextButton extends MessageActionSheetMenuItemButton {
285
326
required super .messageListContext,
286
327
});
287
328
288
- @override IconData get icon => Icons .copy;
329
+ @override IconData get icon => ZulipIcons .copy;
289
330
290
331
@override
291
332
String label (ZulipLocalizations zulipLocalizations) {
@@ -353,7 +394,7 @@ class ShareButton extends MessageActionSheetMenuItemButton {
353
394
required super .messageListContext,
354
395
});
355
396
356
- @override IconData get icon => Icons .adaptive .share;
397
+ @override IconData get icon => Platform .isIOS ? ZulipIcons .share_ios : ZulipIcons .share;
357
398
358
399
@override
359
400
String label (ZulipLocalizations zulipLocalizations) {
@@ -402,3 +443,25 @@ class ShareButton extends MessageActionSheetMenuItemButton {
402
443
}
403
444
}
404
445
}
446
+
447
+ class MessageActionSheetCancelButton extends StatelessWidget {
448
+ const MessageActionSheetCancelButton ({super .key});
449
+
450
+ @override
451
+ Widget build (BuildContext context) {
452
+ final designVariables = DesignVariables .of (context);
453
+ return TextButton (
454
+ style: TextButton .styleFrom (
455
+ padding: const EdgeInsets .all (10 ),
456
+ tapTargetSize: MaterialTapTargetSize .shrinkWrap,
457
+ minimumSize: Size .zero,
458
+ backgroundColor: designVariables.actionSheetCancelButtonBackground,
459
+ foregroundColor: designVariables.actionSheetCancelButtonForeground,
460
+ shape: RoundedRectangleBorder (borderRadius: BorderRadius .circular (7 )),
461
+ ),
462
+ onPressed: () => Navigator .pop (context),
463
+ child: Text (ZulipLocalizations .of (context).dialogCancel,
464
+ style: const TextStyle (fontSize: 20 , fontWeight: FontWeight .w600)),
465
+ );
466
+ }
467
+ }
0 commit comments