@@ -16,6 +16,7 @@ import 'actions.dart';
16
16
import 'app_bar.dart' ;
17
17
import 'compose_box.dart' ;
18
18
import 'content.dart' ;
19
+ import 'dialog.dart' ;
19
20
import 'emoji_reaction.dart' ;
20
21
import 'icons.dart' ;
21
22
import 'page.dart' ;
@@ -1274,22 +1275,44 @@ String formatHeaderDate(
1274
1275
// Design referenced from:
1275
1276
// - https://github.com/zulip/zulip-mobile/issues/5511
1276
1277
// - https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=538%3A20849&mode=dev
1277
- class MessageWithPossibleSender extends StatelessWidget {
1278
+ class MessageWithPossibleSender extends StatefulWidget {
1278
1279
const MessageWithPossibleSender ({super .key, required this .item});
1279
1280
1280
1281
final MessageListMessageItem item;
1281
1282
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
+
1282
1305
@override
1283
1306
Widget build (BuildContext context) {
1284
1307
final store = PerAccountStoreWidget .of (context);
1285
1308
final messageListTheme = MessageListTheme .of (context);
1286
1309
final designVariables = DesignVariables .of (context);
1287
1310
1288
- final message = item.message;
1311
+ final message = widget. item.message;
1289
1312
final sender = store.users[message.senderId];
1290
1313
1291
1314
Widget ? senderRow;
1292
- if (item.showSender) {
1315
+ if (widget. item.showSender) {
1293
1316
final time = _kMessageTimestampFormat
1294
1317
.format (DateTime .fromMillisecondsSinceEpoch (1000 * message.timestamp));
1295
1318
senderRow = Row (
@@ -1347,40 +1370,61 @@ class MessageWithPossibleSender extends StatelessWidget {
1347
1370
1348
1371
return GestureDetector (
1349
1372
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 ),
1351
1386
child: Padding (
1352
1387
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
+ )));
1384
1428
}
1385
1429
}
1386
1430
0 commit comments