@@ -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' ;
@@ -1316,22 +1317,45 @@ String formatHeaderDate(
13161317// Design referenced from:
13171318// - https://github.com/zulip/zulip-mobile/issues/5511
13181319// - https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=538%3A20849&mode=dev
1319- class MessageWithPossibleSender extends StatelessWidget {
1320+ class MessageWithPossibleSender extends StatefulWidget {
13201321 const MessageWithPossibleSender ({super .key, required this .item});
13211322
13221323 final MessageListMessageItem item;
13231324
1325+ @override
1326+ State <MessageWithPossibleSender > createState () => _MessageWithPossibleSenderState ();
1327+ }
1328+
1329+ class _MessageWithPossibleSenderState extends State <MessageWithPossibleSender > {
1330+ final WidgetStatesController statesController = WidgetStatesController ();
1331+
1332+ @override
1333+ void initState () {
1334+ super .initState ();
1335+ statesController.addListener (() {
1336+ setState (() {
1337+ // Force a rebuild to resolve background color
1338+ });
1339+ });
1340+ }
1341+
1342+ @override
1343+ void dispose () {
1344+ statesController.dispose ();
1345+ super .dispose ();
1346+ }
1347+
13241348 @override
13251349 Widget build (BuildContext context) {
13261350 final store = PerAccountStoreWidget .of (context);
13271351 final messageListTheme = MessageListTheme .of (context);
13281352 final designVariables = DesignVariables .of (context);
13291353
1330- final message = item.message;
1354+ final message = widget. item.message;
13311355 final sender = store.users[message.senderId];
13321356
13331357 Widget ? senderRow;
1334- if (item.showSender) {
1358+ if (widget. item.showSender) {
13351359 final time = _kMessageTimestampFormat
13361360 .format (DateTime .fromMillisecondsSinceEpoch (1000 * message.timestamp));
13371361 senderRow = Row (
@@ -1389,40 +1413,57 @@ class MessageWithPossibleSender extends StatelessWidget {
13891413
13901414 return GestureDetector (
13911415 behavior: HitTestBehavior .translucent,
1392- onLongPress: () => showMessageActionSheet (context: context, message: message),
1393- child: Padding (
1394- padding: const EdgeInsets .symmetric (vertical: 4 ),
1395- child: Column (children: [
1396- if (senderRow != null )
1397- Padding (padding: const EdgeInsets .fromLTRB (16 , 2 , 16 , 0 ),
1398- child: senderRow),
1399- Row (
1400- crossAxisAlignment: CrossAxisAlignment .baseline,
1401- textBaseline: localizedTextBaseline (context),
1402- children: [
1403- const SizedBox (width: 16 ),
1404- Expanded (child: Column (
1405- crossAxisAlignment: CrossAxisAlignment .stretch,
1406- children: [
1407- MessageContent (message: message, content: item.content),
1408- if ((message.reactions? .total ?? 0 ) > 0 )
1409- ReactionChipsList (messageId: message.id, reactions: message.reactions! ),
1410- if (editStateText != null )
1411- Text (editStateText,
1412- textAlign: TextAlign .end,
1413- style: TextStyle (
1414- color: designVariables.labelEdited,
1415- fontSize: 12 ,
1416- height: (12 / 12 ),
1417- letterSpacing: proportionalLetterSpacing (
1418- context, 0.05 , baseFontSize: 12 ))),
1419- ])),
1420- SizedBox (width: 16 ,
1421- child: message.flags.contains (MessageFlag .starred)
1422- ? Icon (ZulipIcons .star_filled, size: 16 , color: designVariables.star)
1423- : null ),
1424- ]),
1425- ])));
1416+ onLongPress: () async {
1417+ statesController.update (WidgetState .selected, true );
1418+ ModalStatus status = showMessageActionSheet (context: context,
1419+ message: message);
1420+ await status.closed;
1421+ statesController.update (WidgetState .selected, false );
1422+ },
1423+ onLongPressDown: (_) => statesController.update (WidgetState .pressed, true ),
1424+ onLongPressCancel: () => statesController.update (WidgetState .pressed, false ),
1425+ onLongPressUp: () => statesController.update (WidgetState .pressed, false ),
1426+ child: DecoratedBox (
1427+ decoration: BoxDecoration (
1428+ color: WidgetStateColor .fromMap ({
1429+ WidgetState .pressed: designVariables.pressedTint,
1430+ WidgetState .selected: designVariables.pressedTint,
1431+ WidgetState .any: Colors .transparent,
1432+ }).resolve (statesController.value)
1433+ ),
1434+ child: Padding (
1435+ padding: const EdgeInsets .symmetric (vertical: 4 ),
1436+ child: Column (children: [
1437+ if (senderRow != null )
1438+ Padding (padding: const EdgeInsets .fromLTRB (16 , 2 , 16 , 0 ),
1439+ child: senderRow),
1440+ Row (
1441+ crossAxisAlignment: CrossAxisAlignment .baseline,
1442+ textBaseline: localizedTextBaseline (context),
1443+ children: [
1444+ const SizedBox (width: 16 ),
1445+ Expanded (child: Column (
1446+ crossAxisAlignment: CrossAxisAlignment .stretch,
1447+ children: [
1448+ MessageContent (message: message, content: widget.item.content),
1449+ if ((message.reactions? .total ?? 0 ) > 0 )
1450+ ReactionChipsList (messageId: message.id, reactions: message.reactions! ),
1451+ if (editStateText != null )
1452+ Text (editStateText,
1453+ textAlign: TextAlign .end,
1454+ style: TextStyle (
1455+ color: designVariables.labelEdited,
1456+ fontSize: 12 ,
1457+ height: (12 / 12 ),
1458+ letterSpacing: proportionalLetterSpacing (
1459+ context, 0.05 , baseFontSize: 12 ))),
1460+ ])),
1461+ SizedBox (width: 16 ,
1462+ child: message.flags.contains (MessageFlag .starred)
1463+ ? Icon (ZulipIcons .star_filled, size: 16 , color: designVariables.star)
1464+ : null ),
1465+ ]),
1466+ ]))));
14261467 }
14271468}
14281469
0 commit comments