@@ -4,26 +4,27 @@ import 'package:scroll_to_index/scroll_to_index.dart';
44import 'package:watch_it/watch_it.dart' ;
55import 'package:yaru/yaru.dart' ;
66
7+ import '../../../../common/date_time_x.dart' ;
78import '../../../../common/view/build_context_x.dart' ;
89import '../../../../common/view/theme.dart' ;
910import '../../../../common/view/ui_constants.dart' ;
10- import '../../../events/view/chat_event_column.dart' ;
11+ import '../../../../l10n/l10n.dart' ;
12+ import '../../../common/event_x.dart' ;
13+ import '../../../events/view/chat_event_tile.dart' ;
14+ import '../../../settings/settings_model.dart' ;
1115import '../../titlebar/chat_room_title_bar.dart' ;
1216import '../timeline_model.dart' ;
1317import 'chat_seen_by_indicator.dart' ;
14- import 'chat_typing_indicator.dart' ;
1518
1619class ChatRoomTimelineList extends StatefulWidget
1720 with WatchItStatefulWidgetMixin {
1821 const ChatRoomTimelineList ({
1922 super .key,
2023 required this .timeline,
2124 required this .listKey,
22- required this .room,
2325 });
2426
2527 final Timeline timeline;
26- final Room room;
2728 final GlobalKey <AnimatedListState > listKey;
2829
2930 @override
@@ -52,67 +53,82 @@ class _ChatRoomTimelineListState extends State<ChatRoomTimelineList> {
5253 @override
5354 Widget build (BuildContext context) {
5455 final theme = context.theme;
56+ final showAvatarChanges =
57+ watchPropertyValue ((SettingsModel m) => m.showChatAvatarChanges);
58+ final showDisplayNameChanges =
59+ watchPropertyValue ((SettingsModel m) => m.showChatDisplaynameChanges);
5560
5661 return Stack (
5762 children: [
58- Column (
59- children: [
60- Expanded (
61- child: NotificationListener <ScrollEndNotification >(
62- onNotification: onScroll,
63- child: AnimatedList (
64- controller: _controller,
65- padding: const EdgeInsets .symmetric (
66- horizontal: kMediumPadding,
67- ),
68- key: widget.listKey,
69- reverse: true ,
70- initialItemCount: widget.timeline.events.length,
71- itemBuilder: (context, i, animation) {
72- final event = widget.timeline.events[i];
73-
74- final maybePreviousEvent =
75- widget.timeline.events.elementAtOrNull (i + 1 );
76-
77- if (i == 0 && ! widget.room.isArchived) {
78- widget.timeline.setReadMarker ();
79- }
80-
81- return AutoScrollTag (
82- index: i,
83- controller: _controller,
84- key: ValueKey ('${event .eventId }tag' ),
85- child: FadeTransition (
86- opacity: animation,
87- child: Column (
88- mainAxisSize: MainAxisSize .min,
89- children: [
90- ChatEventColumn (
91- key: ValueKey ('${event .eventId }column' ),
92- event: event,
93- maybePreviousEvent: maybePreviousEvent,
94- jump: _jump,
95- showSeenByIndicator: i == 0 ,
96- timeline: widget.timeline,
97- room: widget.room,
98- ),
99- if (i == 0 )
100- ChatEventSeenByIndicator (
101- key: ValueKey (
102- '${event .eventId }${widget .timeline .events .length }' ,
103- ),
104- event: event,
105- ),
106- ],
63+ NotificationListener <ScrollEndNotification >(
64+ onNotification: onScroll,
65+ child: AnimatedList (
66+ controller: _controller,
67+ padding: const EdgeInsets .symmetric (
68+ horizontal: kMediumPadding,
69+ vertical: kSmallPadding,
70+ ),
71+ key: widget.listKey,
72+ reverse: true ,
73+ initialItemCount: widget.timeline.events.length,
74+ itemBuilder: (context, i, animation) {
75+ final event = widget.timeline.events[i];
76+
77+ if (event.hideEventInTimeline (
78+ showAvatarChanges: showAvatarChanges,
79+ showDisplayNameChanges: showDisplayNameChanges,
80+ )) {
81+ return SizedBox .shrink (
82+ key: ValueKey (ValueKey (event.eventId)),
83+ );
84+ }
85+
86+ final previous = widget.timeline.events.elementAtOrNull (i + 1 );
87+
88+ if (i == 0 && ! widget.timeline.room.isArchived) {
89+ widget.timeline.setReadMarker ();
90+ }
91+
92+ return AutoScrollTag (
93+ index: i,
94+ controller: _controller,
95+ key: ValueKey ('${event .eventId }tag' ),
96+ child: FadeTransition (
97+ opacity: animation,
98+ child: Column (
99+ mainAxisSize: MainAxisSize .min,
100+ children: [
101+ if (previous != null &&
102+ event.originServerTs.toLocal ().day !=
103+ previous.originServerTs.toLocal ().day)
104+ Text (
105+ previous.originServerTs
106+ .toLocal ()
107+ .formatAndLocalizeDay (context.l10n),
108+ textAlign: TextAlign .center,
109+ style: theme.textTheme.labelSmall,
107110 ),
111+ ChatEventTile (
112+ key: ValueKey ('${event .eventId }column' ),
113+ event: event,
114+ partOfMessageCohort:
115+ event.partOfMessageCohort (previous),
116+ onReplyOriginClick: (event) => _jump (event),
117+ timeline: widget.timeline,
108118 ),
109- );
110- },
119+ if (i == 0 )
120+ ChatEventSeenByIndicator (
121+ key: ValueKey (
122+ '${event .eventId }${widget .timeline .events .length }' ,
123+ ),
124+ event: event,
125+ ),
126+ ],
127+ ),
111128 ),
112- ),
113- ),
114- ChatTypingIndicator (room: widget.room),
115- ],
129+ );
130+ },
131+ ),
116132 ),
117133 if (_showScrollButton)
118134 Positioned (
@@ -127,7 +143,8 @@ class _ChatRoomTimelineListState extends State<ChatRoomTimelineList> {
127143 backgroundColor: getMonochromeBg (theme: theme, darkFactor: 5 ),
128144 onPressed: () => showDialog (
129145 context: context,
130- builder: (context) => ChatRoomSearchDialog (room: widget.room),
146+ builder: (context) =>
147+ ChatRoomSearchDialog (room: widget.timeline.room),
131148 ),
132149 child: Icon (
133150 YaruIcons .search,
@@ -190,7 +207,7 @@ class _ChatRoomTimelineListState extends State<ChatRoomTimelineList> {
190207 retryCount-- ;
191208 }
192209 await _maybeScrollTo (index);
193- if (! widget.room.isArchived) {
210+ if (! widget.timeline. room.isArchived) {
194211 widget.timeline.setReadMarker (eventId: event.eventId);
195212 }
196213 }
0 commit comments