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