diff --git a/lib/widgets/messages/message_bubble.dart b/lib/widgets/messages/message_bubble.dart index 05d48b9..386ad1c 100644 --- a/lib/widgets/messages/message_bubble.dart +++ b/lib/widgets/messages/message_bubble.dart @@ -468,7 +468,7 @@ class _MessageBubbleState extends State { 'Status: ${widget.message.deliveryStatus.name}', 'Path length (nodes/hops): ${widget.message.pathLen}', 'Sender timestamp: ${widget.message.senderTimestamp} (${widget.message.sentAt.toIso8601String()})', - 'Received at: ${widget.message.receivedAt.toIso8601String()}', + 'Received at (RFC3339): ${_formatRfc3339(widget.message.receivedAt)}', 'Channel index: ${widget.message.channelIdx ?? '-'}', 'Echo count: ${widget.message.echoCount}', 'Last echo RSSI: ${widget.message.lastEchoRssiDbm ?? '-'}', @@ -707,6 +707,14 @@ class _MessageBubbleState extends State { label: l10n.status, value: widget.message.deliveryStatus.name, ), + _detailRow( + context, + label: 'Received (RFC3339)', + value: _formatRfc3339(widget.message.receivedAt), + onCopy: () => copyField( + _formatRfc3339(widget.message.receivedAt), + ), + ), if (widget.message.expectedAckTag != null) _detailRow( context, @@ -1073,6 +1081,19 @@ class _MessageBubbleState extends State { ); } + String _formatRfc3339(DateTime dateTime) { + final utc = dateTime.toUtc(); + String two(int v) => v.toString().padLeft(2, '0'); + String four(int v) => v.toString().padLeft(4, '0'); + final fraction = utc.millisecond == 0 + ? '' + : '.${utc.millisecond.toString().padLeft(3, '0')}'; + + return '${four(utc.year)}-${two(utc.month)}-${two(utc.day)}' + 'T${two(utc.hour)}:${two(utc.minute)}:${two(utc.second)}' + '${fraction}Z'; + } + BlePacketLog? _findBestMatchingRxLog( List logs, Message message,