show timestamps for state events

This commit is contained in:
Henry Hiles 2026-09-17 23:21:33 -04:00
commit cfab803fa0
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
4 changed files with 35 additions and 17 deletions

View file

@ -24,6 +24,7 @@ import "package:nexus/widgets/renderers/message.dart";
import "package:nexus/widgets/reaction_row.dart"; import "package:nexus/widgets/reaction_row.dart";
import "package:nexus/widgets/renderers/membership.dart"; import "package:nexus/widgets/renderers/membership.dart";
import "package:nexus/widgets/renderers/generic_event.dart"; import "package:nexus/widgets/renderers/generic_event.dart";
import "package:nexus/widgets/timestamp.dart";
class const EventRenderer( class const EventRenderer(
final Event event, { final Event event, {
@ -196,7 +197,18 @@ class const EventRenderer(
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8) padding: EdgeInsets.symmetric(horizontal: 8)
.copyWith(top: isGrouped ? 0 : 8), .copyWith(top: isGrouped ? 0 : 8),
child: child, child: Row(
mainAxisSize: .min,
spacing: 6,
children: [
Flexible(child: child),
if (child is! MessageRenderer)
Flexible(
flex: 0,
child: Timestamp(event.timestamp),
),
],
),
), ),
), ),
), ),
@ -204,10 +216,7 @@ class const EventRenderer(
), ),
...[ ...[
if (event.content is! MessageContent && if (child is! MessageRenderer) ReactionRow(event),
event.content is! StickerContent &&
event.content is! EncryptedContent)
ReactionRow(event),
if (event.sendError != null && event.sendError != "not sent") if (event.sendError != null && event.sendError != "not sent")
Padding( Padding(

View file

@ -10,9 +10,10 @@ class const GenericEventRenderer(
padding: .symmetric(vertical: 4), padding: .symmetric(vertical: 4),
child: Row( child: Row(
spacing: 8, spacing: 8,
mainAxisSize: .min,
children: [ children: [
Padding(padding: .symmetric(horizontal: 4), child: Icon(icon)), Padding(padding: .symmetric(horizontal: 4), child: Icon(icon)),
Expanded(child: Wrap(spacing: 4, children: children)), Flexible(child: Wrap(spacing: 4, children: children)),
], ],
), ),
); );

View file

@ -15,6 +15,7 @@ import "package:nexus/widgets/lazy_loading/message_displayname.dart";
import "package:nexus/widgets/linkified_text.dart"; import "package:nexus/widgets/linkified_text.dart";
import "package:nexus/widgets/message_image.dart"; import "package:nexus/widgets/message_image.dart";
import "package:nexus/widgets/reaction_row.dart"; import "package:nexus/widgets/reaction_row.dart";
import "package:nexus/widgets/timestamp.dart";
import "package:nexus/widgets/url_preview.dart"; import "package:nexus/widgets/url_preview.dart";
import "package:timeago/timeago.dart"; import "package:timeago/timeago.dart";
import "package:nexus/widgets/event_preview.dart"; import "package:nexus/widgets/event_preview.dart";
@ -35,16 +36,6 @@ class const MessageRenderer(
final colorScheme = theme.colorScheme; final colorScheme = theme.colorScheme;
final errorStyle = TextStyle(color: colorScheme.error); final errorStyle = TextStyle(color: colorScheme.error);
final timestamp = Tooltip(
message: event.timestamp.toString(),
child: Text(
format(event.timestamp),
maxLines: 1,
overflow: .ellipsis,
style: theme.textTheme.labelSmall?.copyWith(color: Colors.grey),
),
);
final textStyle = TextStyle( final textStyle = TextStyle(
fontSize: event.localContent?.bigEmoji == true ? 32 : null, fontSize: event.localContent?.bigEmoji == true ? 32 : null,
fontStyle: event.content is EmoteMessageContent ? .italic : null, fontStyle: event.content is EmoteMessageContent ? .italic : null,
@ -70,7 +61,7 @@ class const MessageRenderer(
spacing: 4, spacing: 4,
children: [ children: [
Flexible(child: MessageDisplayname(event)), Flexible(child: MessageDisplayname(event)),
Flexible(flex: 0, child: timestamp), Flexible(flex: 0, child: Timestamp(event.timestamp)),
], ],
), ),
Card( Card(

View file

@ -0,0 +1,17 @@
import "package:flutter/material.dart";
import "package:timeago/timeago.dart";
class const Timestamp(final DateTime timestamp, {super.key})
extends StatelessWidget {
@override
Widget build(BuildContext context) => Tooltip(
message: timestamp.toString(),
child: Text(
format(timestamp),
maxLines: 1,
overflow: .ellipsis,
style: Theme.of(context).textTheme.labelSmall
?.copyWith(color: Colors.grey),
),
);
}