@@ -16,6 +16,7 @@ import 'actions.dart';
1616import 'app_bar.dart' ;
1717import 'compose_box.dart' ;
1818import 'content.dart' ;
19+ import 'dialog.dart' ;
1920import 'emoji_reaction.dart' ;
2021import 'icons.dart' ;
2122import 'page.dart' ;
@@ -1274,22 +1275,44 @@ String formatHeaderDate(
12741275// Design referenced from:
12751276// - https://github.com/zulip/zulip-mobile/issues/5511
12761277// - https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=538%3A20849&mode=dev
1277- class MessageWithPossibleSender extends StatelessWidget {
1278+ class MessageWithPossibleSender extends StatefulWidget {
12781279 const MessageWithPossibleSender ({super .key, required this .item});
12791280
12801281 final MessageListMessageItem item;
12811282
1283+ @override
1284+ State <MessageWithPossibleSender > createState () => _MessageWithPossibleSenderState ();
1285+ }
1286+
1287+ class _MessageWithPossibleSenderState extends State <MessageWithPossibleSender > {
1288+ final WidgetStatesController statesController = WidgetStatesController ();
1289+
1290+ @override
1291+ void initState () {
1292+ super .initState ();
1293+ statesController.addListener (() {
1294+ setState (() {
1295+ });
1296+ });
1297+ }
1298+
1299+ @override
1300+ void dispose () {
1301+ statesController.dispose ();
1302+ super .dispose ();
1303+ }
1304+
12821305 @override
12831306 Widget build (BuildContext context) {
12841307 final store = PerAccountStoreWidget .of (context);
12851308 final messageListTheme = MessageListTheme .of (context);
12861309 final designVariables = DesignVariables .of (context);
12871310
1288- final message = item.message;
1311+ final message = widget. item.message;
12891312 final sender = store.users[message.senderId];
12901313
12911314 Widget ? senderRow;
1292- if (item.showSender) {
1315+ if (widget. item.showSender) {
12931316 final time = _kMessageTimestampFormat
12941317 .format (DateTime .fromMillisecondsSinceEpoch (1000 * message.timestamp));
12951318 senderRow = Row (
@@ -1347,40 +1370,61 @@ class MessageWithPossibleSender extends StatelessWidget {
13471370
13481371 return GestureDetector (
13491372 behavior: HitTestBehavior .translucent,
1350- onLongPress: () => showMessageActionSheet (context: context, message: message),
1373+ onLongPress: () async {
1374+ statesController.update (WidgetState .selected, true );
1375+ if (context.mounted) {
1376+ ModalStatus status = showMessageActionSheet (
1377+ context: context,
1378+ message: message);
1379+ await status.closed;
1380+ statesController.update (WidgetState .selected, false );
1381+ }
1382+ },
1383+ onLongPressDown: (_) => statesController.update (WidgetState .pressed, true ),
1384+ onLongPressCancel: () => statesController.update (WidgetState .pressed, false ),
1385+ onLongPressUp: () => statesController.update (WidgetState .pressed, false ),
13511386 child: Padding (
13521387 padding: const EdgeInsets .symmetric (vertical: 4 ),
1353- child: Column (children: [
1354- if (senderRow != null )
1355- Padding (padding: const EdgeInsets .fromLTRB (16 , 2 , 16 , 0 ),
1356- child: senderRow),
1357- Row (
1358- crossAxisAlignment: CrossAxisAlignment .baseline,
1359- textBaseline: localizedTextBaseline (context),
1360- children: [
1361- const SizedBox (width: 16 ),
1362- Expanded (child: Column (
1363- crossAxisAlignment: CrossAxisAlignment .stretch,
1364- children: [
1365- MessageContent (message: message, content: item.content),
1366- if ((message.reactions? .total ?? 0 ) > 0 )
1367- ReactionChipsList (messageId: message.id, reactions: message.reactions! ),
1368- if (editStateText != null )
1369- Text (editStateText,
1370- textAlign: TextAlign .end,
1371- style: TextStyle (
1372- color: designVariables.labelEdited,
1373- fontSize: 12 ,
1374- height: (12 / 12 ),
1375- letterSpacing: proportionalLetterSpacing (
1376- context, 0.05 , baseFontSize: 12 ))),
1377- ])),
1378- SizedBox (width: 16 ,
1379- child: message.flags.contains (MessageFlag .starred)
1380- ? Icon (ZulipIcons .star_filled, size: 16 , color: designVariables.star)
1381- : null ),
1382- ]),
1383- ])));
1388+ child: DecoratedBox (
1389+ decoration: BoxDecoration (
1390+ color: WidgetStateColor .fromMap ({
1391+ WidgetState .pressed: designVariables.pressedTint,
1392+ WidgetState .selected: designVariables.pressedTint,
1393+ WidgetState .any: Colors .transparent,
1394+ }).resolve (statesController.value)
1395+ ),
1396+ child: Column (children: [
1397+ if (senderRow != null )
1398+ Padding (padding: const EdgeInsets .fromLTRB (16 , 2 , 16 , 0 ),
1399+ child: senderRow),
1400+ Row (
1401+ crossAxisAlignment: CrossAxisAlignment .baseline,
1402+ textBaseline: localizedTextBaseline (context),
1403+ children: [
1404+ const SizedBox (width: 16 ),
1405+ Expanded (child: Column (
1406+ crossAxisAlignment: CrossAxisAlignment .stretch,
1407+ children: [
1408+ MessageContent (message: message, content: widget.item.content),
1409+ if ((message.reactions? .total ?? 0 ) > 0 )
1410+ ReactionChipsList (messageId: message.id, reactions: message.reactions! ),
1411+ if (editStateText != null )
1412+ Text (editStateText,
1413+ textAlign: TextAlign .end,
1414+ style: TextStyle (
1415+ color: designVariables.labelEdited,
1416+ fontSize: 12 ,
1417+ height: (12 / 12 ),
1418+ letterSpacing: proportionalLetterSpacing (
1419+ context, 0.05 , baseFontSize: 12 ))),
1420+ ])),
1421+ SizedBox (width: 16 ,
1422+ child: message.flags.contains (MessageFlag .starred)
1423+ ? Icon (ZulipIcons .star_filled, size: 16 , color: designVariables.star)
1424+ : null ),
1425+ ]),
1426+ ]),
1427+ )));
13841428 }
13851429}
13861430
0 commit comments