1+ import 'package:collection/collection.dart' ;
12import 'package:flutter/material.dart' ;
23import 'package:matrix/matrix.dart' ;
34import 'package:scroll_to_index/scroll_to_index.dart' ;
@@ -9,11 +10,13 @@ import '../../../../common/view/build_context_x.dart';
910import '../../../../common/view/theme.dart' ;
1011import '../../../../common/view/ui_constants.dart' ;
1112import '../../../../l10n/l10n.dart' ;
13+ import '../../../common/chat_model.dart' ;
1214import '../../../common/event_x.dart' ;
1315import '../../../events/view/chat_event_tile.dart' ;
1416import '../../../settings/settings_model.dart' ;
1517import '../../titlebar/chat_room_title_bar.dart' ;
1618import '../timeline_model.dart' ;
19+ import 'chat_room_pinned_events_dialog.dart' ;
1720import 'chat_seen_by_indicator.dart' ;
1821
1922class ChatRoomTimelineList extends StatefulWidget
@@ -35,6 +38,7 @@ class _ChatRoomTimelineListState extends State<ChatRoomTimelineList> {
3538 final AutoScrollController _controller = AutoScrollController ();
3639 bool _showScrollButton = false ;
3740 int retryCount = 15 ;
41+ String ? scrolledToId;
3842
3943 @override
4044 void initState () {
@@ -57,6 +61,13 @@ class _ChatRoomTimelineListState extends State<ChatRoomTimelineList> {
5761 watchPropertyValue ((SettingsModel m) => m.showChatAvatarChanges);
5862 final showDisplayNameChanges =
5963 watchPropertyValue ((SettingsModel m) => m.showChatDisplaynameChanges);
64+ final pinnedEvents = watchStream (
65+ (ChatModel m) => m
66+ .getJoinedRoomUpdate (widget.timeline.room.id)
67+ .map ((_) => widget.timeline.room.pinnedEventIds),
68+ initialValue: widget.timeline.room.pinnedEventIds,
69+ ).data ??
70+ [];
6071
6172 return Stack (
6273 children: [
@@ -132,6 +143,26 @@ class _ChatRoomTimelineListState extends State<ChatRoomTimelineList> {
132143 },
133144 ),
134145 ),
146+ if (pinnedEvents.isNotEmpty)
147+ Positioned (
148+ right: kBigPadding,
149+ top: kBigPadding,
150+ child: AnimatedContainer (
151+ duration: const Duration (milliseconds: 200 ),
152+ child: FloatingActionButton .small (
153+ backgroundColor: getMonochromeBg (theme: theme, darkFactor: 5 ),
154+ onPressed: () => showDialog (
155+ context: context,
156+ builder: (context) =>
157+ ChatRoomPinnedEventsDialog (timeline: widget.timeline),
158+ ),
159+ child: Icon (
160+ YaruIcons .pin,
161+ color: theme.colorScheme.onSurface,
162+ ),
163+ ),
164+ ),
165+ ),
135166 if (_showScrollButton)
136167 Positioned (
137168 right: kBigPadding,
0 commit comments