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' ;
@@ -12,10 +14,11 @@ import 'actions.dart';
12
14
import 'clipboard.dart' ;
13
15
import 'compose_box.dart' ;
14
16
import 'dialog.dart' ;
15
- import 'draggable_scrollable_modal_bottom_sheet.dart' ;
16
17
import 'icons.dart' ;
17
18
import 'message_list.dart' ;
18
19
import 'store.dart' ;
20
+ import 'text.dart' ;
21
+ import 'theme.dart' ;
19
22
20
23
/// Show a sheet of actions you can take on a message in the message list.
21
24
///
@@ -41,25 +44,50 @@ void showMessageActionSheet({required BuildContext context, required Message mes
41
44
&& reactionWithVotes.userIds.contains (store.selfUserId))
42
45
?? false ;
43
46
44
- showDraggableScrollableModalBottomSheet <void >(
47
+ final designVariables = DesignVariables .of (context);
48
+ showModalBottomSheet <void >(
45
49
context: context,
50
+ clipBehavior: Clip .antiAlias,
51
+ backgroundColor: designVariables.actionSheetBackground,
52
+ shape: const RoundedRectangleBorder (borderRadius: BorderRadius .vertical (top: Radius .circular (20.0 ))),
53
+ useSafeArea: true ,
54
+ isScrollControlled: true ,
46
55
builder: (BuildContext _) {
47
- return Column (children: [
48
- if (! hasThumbsUpReactionVote) AddThumbsUpButton (message: message, messageListContext: context),
49
- StarButton (message: message, messageListContext: context),
50
- if (isComposeBoxOffered) QuoteAndReplyButton (
51
- message: message,
52
- messageListContext: context,
53
- ),
54
- if (showMarkAsUnreadButton) MarkAsUnreadButton (
55
- message: message,
56
- messageListContext: context,
57
- narrow: narrow,
56
+ return Padding (
57
+ padding: const EdgeInsets .all (16.0 ),
58
+ child: Column (
59
+ crossAxisAlignment: CrossAxisAlignment .stretch,
60
+ mainAxisSize: MainAxisSize .min,
61
+ children: [
62
+ // TODO(#217): show message text
63
+ Flexible (
64
+ child: SingleChildScrollView (
65
+ child: ClipRRect (
66
+ borderRadius: BorderRadius .circular (7 ),
67
+ child: Column (spacing: 1 , children: [
68
+ if (! hasThumbsUpReactionVote) AddThumbsUpButton (message: message, messageListContext: context),
69
+ StarButton (message: message, messageListContext: context),
70
+ if (isComposeBoxOffered) QuoteAndReplyButton (
71
+ message: message,
72
+ messageListContext: context,
73
+ ),
74
+ if (showMarkAsUnreadButton) MarkAsUnreadButton (
75
+ message: message,
76
+ messageListContext: context,
77
+ narrow: narrow,
78
+ ),
79
+ CopyMessageTextButton (message: message, messageListContext: context),
80
+ CopyMessageLinkButton (message: message, messageListContext: context),
81
+ ShareButton (message: message, messageListContext: context),
82
+ ]),
83
+ ),
84
+ ),
85
+ ),
86
+ const SizedBox (height: 8 ),
87
+ const MessageActionSheetCancelButton (),
88
+ ],
58
89
),
59
- CopyMessageTextButton (message: message, messageListContext: context),
60
- CopyMessageLinkButton (message: message, messageListContext: context),
61
- ShareButton (message: message, messageListContext: context),
62
- ]);
90
+ );
63
91
});
64
92
}
65
93
@@ -79,11 +107,22 @@ abstract class MessageActionSheetMenuItemButton extends StatelessWidget {
79
107
80
108
@override
81
109
Widget build (BuildContext context) {
110
+ final designVariables = DesignVariables .of (context);
82
111
final zulipLocalizations = ZulipLocalizations .of (context);
83
112
return MenuItemButton (
84
- leadingIcon: Icon (icon),
113
+ trailingIcon: Icon (icon, color: designVariables.actionSheetMenuButtonForeground),
114
+ style: MenuItemButton .styleFrom (
115
+ padding: const EdgeInsets .symmetric (vertical: 12 , horizontal: 16 ),
116
+ tapTargetSize: MaterialTapTargetSize .shrinkWrap,
117
+ minimumSize: Size .zero,
118
+ backgroundColor: designVariables.actionSheetMenuButtonBackground,
119
+ foregroundColor: designVariables.actionSheetMenuButtonForeground,
120
+ ),
85
121
onPressed: () => onPressed (context),
86
- child: Text (label (zulipLocalizations)));
122
+ child: Text (label (zulipLocalizations),
123
+ style: const TextStyle (fontSize: 20 )
124
+ .merge (weightVariableTextStyle (context, wght: 600 )),
125
+ ));
87
126
}
88
127
}
89
128
@@ -96,7 +135,7 @@ class AddThumbsUpButton extends MessageActionSheetMenuItemButton {
96
135
required super .messageListContext,
97
136
});
98
137
99
- @override IconData get icon => Icons .add_reaction_outlined ;
138
+ @override IconData get icon => ZulipIcons .smile ;
100
139
101
140
@override
102
141
String label (ZulipLocalizations zulipLocalizations) {
@@ -137,11 +176,13 @@ class StarButton extends MessageActionSheetMenuItemButton {
137
176
required super .messageListContext,
138
177
});
139
178
140
- @override IconData get icon => ZulipIcons .star_filled;
179
+ @override IconData get icon => _isStarred ? ZulipIcons .star_filled : ZulipIcons .star;
180
+
181
+ bool get _isStarred => message.flags.contains (MessageFlag .starred);
141
182
142
183
@override
143
184
String label (ZulipLocalizations zulipLocalizations) {
144
- return message.flags. contains ( MessageFlag .starred)
185
+ return _isStarred
145
186
? zulipLocalizations.actionSheetOptionUnstarMessage
146
187
: zulipLocalizations.actionSheetOptionStarMessage;
147
188
}
@@ -233,7 +274,7 @@ class QuoteAndReplyButton extends MessageActionSheetMenuItemButton {
233
274
required super .messageListContext,
234
275
});
235
276
236
- @override IconData get icon => Icons .format_quote_outlined ;
277
+ @override IconData get icon => ZulipIcons .format_quote ;
237
278
238
279
@override
239
280
String label (ZulipLocalizations zulipLocalizations) {
@@ -318,7 +359,7 @@ class CopyMessageTextButton extends MessageActionSheetMenuItemButton {
318
359
required super .messageListContext,
319
360
});
320
361
321
- @override IconData get icon => Icons .copy;
362
+ @override IconData get icon => ZulipIcons .copy;
322
363
323
364
@override
324
365
String label (ZulipLocalizations zulipLocalizations) {
@@ -386,7 +427,7 @@ class ShareButton extends MessageActionSheetMenuItemButton {
386
427
required super .messageListContext,
387
428
});
388
429
389
- @override IconData get icon => Icons .adaptive .share;
430
+ @override IconData get icon => Platform .isIOS ? ZulipIcons .share_ios : ZulipIcons .share;
390
431
391
432
@override
392
433
String label (ZulipLocalizations zulipLocalizations) {
@@ -435,3 +476,26 @@ class ShareButton extends MessageActionSheetMenuItemButton {
435
476
}
436
477
}
437
478
}
479
+
480
+ class MessageActionSheetCancelButton extends StatelessWidget {
481
+ const MessageActionSheetCancelButton ({super .key});
482
+
483
+ @override
484
+ Widget build (BuildContext context) {
485
+ final designVariables = DesignVariables .of (context);
486
+ return TextButton (
487
+ style: TextButton .styleFrom (
488
+ padding: const EdgeInsets .all (10 ),
489
+ tapTargetSize: MaterialTapTargetSize .shrinkWrap,
490
+ minimumSize: Size .zero,
491
+ backgroundColor: designVariables.actionSheetCancelButtonBackground,
492
+ foregroundColor: designVariables.actionSheetCancelButtonForeground,
493
+ shape: RoundedRectangleBorder (borderRadius: BorderRadius .circular (7 )),
494
+ ),
495
+ onPressed: () => Navigator .pop (context),
496
+ child: Text (ZulipLocalizations .of (context).dialogCancel,
497
+ style: const TextStyle (fontSize: 20 )
498
+ .merge (weightVariableTextStyle (context, wght: 600 ))),
499
+ );
500
+ }
501
+ }
0 commit comments