@@ -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' ;
@@ -1300,22 +1301,45 @@ String formatHeaderDate(
13001301// Design referenced from:
13011302// - https://github.com/zulip/zulip-mobile/issues/5511
13021303// - https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=538%3A20849&mode=dev
1303- class MessageWithPossibleSender extends StatelessWidget {
1304+ class MessageWithPossibleSender extends StatefulWidget {
13041305 const MessageWithPossibleSender ({super .key, required this .item});
13051306
13061307 final MessageListMessageItem item;
13071308
1309+ @override
1310+ State <MessageWithPossibleSender > createState () => _MessageWithPossibleSenderState ();
1311+ }
1312+
1313+ class _MessageWithPossibleSenderState extends State <MessageWithPossibleSender > {
1314+ final WidgetStatesController statesController = WidgetStatesController ();
1315+
1316+ @override
1317+ void initState () {
1318+ super .initState ();
1319+ statesController.addListener (() {
1320+ setState (() {
1321+ // Force a rebuild to resolve background color
1322+ });
1323+ });
1324+ }
1325+
1326+ @override
1327+ void dispose () {
1328+ statesController.dispose ();
1329+ super .dispose ();
1330+ }
1331+
13081332 @override
13091333 Widget build (BuildContext context) {
13101334 final store = PerAccountStoreWidget .of (context);
13111335 final messageListTheme = MessageListTheme .of (context);
13121336 final designVariables = DesignVariables .of (context);
13131337
1314- final message = item.message;
1338+ final message = widget. item.message;
13151339 final sender = store.users[message.senderId];
13161340
13171341 Widget ? senderRow;
1318- if (item.showSender) {
1342+ if (widget. item.showSender) {
13191343 final time = _kMessageTimestampFormat
13201344 .format (DateTime .fromMillisecondsSinceEpoch (1000 * message.timestamp));
13211345 senderRow = Row (
@@ -1373,40 +1397,57 @@ class MessageWithPossibleSender extends StatelessWidget {
13731397
13741398 return GestureDetector (
13751399 behavior: HitTestBehavior .translucent,
1376- onLongPress: () => showMessageActionSheet (context: context, message: message),
1377- child: Padding (
1378- padding: const EdgeInsets .symmetric (vertical: 4 ),
1379- child: Column (children: [
1380- if (senderRow != null )
1381- Padding (padding: const EdgeInsets .fromLTRB (16 , 2 , 16 , 0 ),
1382- child: senderRow),
1383- Row (
1384- crossAxisAlignment: CrossAxisAlignment .baseline,
1385- textBaseline: localizedTextBaseline (context),
1386- children: [
1387- const SizedBox (width: 16 ),
1388- Expanded (child: Column (
1389- crossAxisAlignment: CrossAxisAlignment .stretch,
1390- children: [
1391- MessageContent (message: message, content: item.content),
1392- if ((message.reactions? .total ?? 0 ) > 0 )
1393- ReactionChipsList (messageId: message.id, reactions: message.reactions! ),
1394- if (editStateText != null )
1395- Text (editStateText,
1396- textAlign: TextAlign .end,
1397- style: TextStyle (
1398- color: designVariables.labelEdited,
1399- fontSize: 12 ,
1400- height: (12 / 12 ),
1401- letterSpacing: proportionalLetterSpacing (
1402- context, 0.05 , baseFontSize: 12 ))),
1403- ])),
1404- SizedBox (width: 16 ,
1405- child: message.flags.contains (MessageFlag .starred)
1406- ? Icon (ZulipIcons .star_filled, size: 16 , color: designVariables.star)
1407- : null ),
1408- ]),
1409- ])));
1400+ onLongPress: () async {
1401+ statesController.update (WidgetState .selected, true );
1402+ ModalStatus status = showMessageActionSheet (context: context,
1403+ message: message);
1404+ await status.closed;
1405+ statesController.update (WidgetState .selected, false );
1406+ },
1407+ onLongPressDown: (_) => statesController.update (WidgetState .pressed, true ),
1408+ onLongPressCancel: () => statesController.update (WidgetState .pressed, false ),
1409+ onLongPressUp: () => statesController.update (WidgetState .pressed, false ),
1410+ child: DecoratedBox (
1411+ decoration: BoxDecoration (
1412+ color: WidgetStateColor .fromMap ({
1413+ WidgetState .pressed: designVariables.pressedTint,
1414+ WidgetState .selected: designVariables.pressedTint,
1415+ WidgetState .any: Colors .transparent,
1416+ }).resolve (statesController.value)
1417+ ),
1418+ child: Padding (
1419+ padding: const EdgeInsets .symmetric (vertical: 4 ),
1420+ child: Column (children: [
1421+ if (senderRow != null )
1422+ Padding (padding: const EdgeInsets .fromLTRB (16 , 2 , 16 , 0 ),
1423+ child: senderRow),
1424+ Row (
1425+ crossAxisAlignment: CrossAxisAlignment .baseline,
1426+ textBaseline: localizedTextBaseline (context),
1427+ children: [
1428+ const SizedBox (width: 16 ),
1429+ Expanded (child: Column (
1430+ crossAxisAlignment: CrossAxisAlignment .stretch,
1431+ children: [
1432+ MessageContent (message: message, content: widget.item.content),
1433+ if ((message.reactions? .total ?? 0 ) > 0 )
1434+ ReactionChipsList (messageId: message.id, reactions: message.reactions! ),
1435+ if (editStateText != null )
1436+ Text (editStateText,
1437+ textAlign: TextAlign .end,
1438+ style: TextStyle (
1439+ color: designVariables.labelEdited,
1440+ fontSize: 12 ,
1441+ height: (12 / 12 ),
1442+ letterSpacing: proportionalLetterSpacing (
1443+ context, 0.05 , baseFontSize: 12 ))),
1444+ ])),
1445+ SizedBox (width: 16 ,
1446+ child: message.flags.contains (MessageFlag .starred)
1447+ ? Icon (ZulipIcons .star_filled, size: 16 , color: designVariables.star)
1448+ : null ),
1449+ ]),
1450+ ]))));
14101451 }
14111452}
14121453
0 commit comments