|
|
|
@ -72,7 +72,7 @@ class _ChatState extends State<Chat> {
|
|
|
|
|
|
|
|
|
|
|
|
List<Event> filteredEvents;
|
|
|
|
List<Event> filteredEvents;
|
|
|
|
|
|
|
|
|
|
|
|
bool _collapseRoomCreate = true;
|
|
|
|
final Set<String> _unfolded = {};
|
|
|
|
|
|
|
|
|
|
|
|
Event replyEvent;
|
|
|
|
Event replyEvent;
|
|
|
|
|
|
|
|
|
|
|
|
@ -146,12 +146,22 @@ class _ChatState extends State<Chat> {
|
|
|
|
if (!mounted) return;
|
|
|
|
if (!mounted) return;
|
|
|
|
setState(
|
|
|
|
setState(
|
|
|
|
() {
|
|
|
|
() {
|
|
|
|
filteredEvents =
|
|
|
|
filteredEvents = timeline.getFilteredEvents(unfolded: _unfolded);
|
|
|
|
timeline.getFilteredEvents(collapseRoomCreate: _collapseRoomCreate);
|
|
|
|
|
|
|
|
},
|
|
|
|
},
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void _unfold(String eventId) {
|
|
|
|
|
|
|
|
var i = filteredEvents.indexWhere((e) => e.eventId == eventId);
|
|
|
|
|
|
|
|
setState(() {
|
|
|
|
|
|
|
|
while (i < filteredEvents.length - 1 && filteredEvents[i].isState) {
|
|
|
|
|
|
|
|
_unfolded.add(filteredEvents[i].eventId);
|
|
|
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
filteredEvents = timeline.getFilteredEvents(unfolded: _unfolded);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<bool> getTimeline(BuildContext context) async {
|
|
|
|
Future<bool> getTimeline(BuildContext context) async {
|
|
|
|
if (timeline == null) {
|
|
|
|
if (timeline == null) {
|
|
|
|
timeline = await room.getTimeline(onUpdate: updateView);
|
|
|
|
timeline = await room.getTimeline(onUpdate: updateView);
|
|
|
|
@ -712,9 +722,7 @@ class _ChatState extends State<Chat> {
|
|
|
|
thisEventsKeyMap[filteredEvents[i].eventId] = i;
|
|
|
|
thisEventsKeyMap[filteredEvents[i].eventId] = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ListView.custom(
|
|
|
|
final horizontalPadding = max(
|
|
|
|
padding: EdgeInsets.symmetric(
|
|
|
|
|
|
|
|
horizontal: max(
|
|
|
|
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
(MediaQuery.of(context).size.width -
|
|
|
|
(MediaQuery.of(context).size.width -
|
|
|
|
FluffyThemes.columnWidth *
|
|
|
|
FluffyThemes.columnWidth *
|
|
|
|
@ -724,7 +732,14 @@ class _ChatState extends State<Chat> {
|
|
|
|
null
|
|
|
|
null
|
|
|
|
? 4.5
|
|
|
|
? 4.5
|
|
|
|
: 3.5)) /
|
|
|
|
: 3.5)) /
|
|
|
|
2),
|
|
|
|
2)
|
|
|
|
|
|
|
|
.toDouble();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ListView.custom(
|
|
|
|
|
|
|
|
padding: EdgeInsets.only(
|
|
|
|
|
|
|
|
top: 16,
|
|
|
|
|
|
|
|
left: horizontalPadding,
|
|
|
|
|
|
|
|
right: horizontalPadding,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
reverse: true,
|
|
|
|
reverse: true,
|
|
|
|
controller: _scrollController,
|
|
|
|
controller: _scrollController,
|
|
|
|
@ -759,9 +774,11 @@ class _ChatState extends State<Chat> {
|
|
|
|
builder: (_, __) {
|
|
|
|
builder: (_, __) {
|
|
|
|
final seenByText =
|
|
|
|
final seenByText =
|
|
|
|
room.getLocalizedSeenByText(
|
|
|
|
room.getLocalizedSeenByText(
|
|
|
|
context,
|
|
|
|
context,
|
|
|
|
timeline,
|
|
|
|
timeline,
|
|
|
|
filteredEvents);
|
|
|
|
filteredEvents,
|
|
|
|
|
|
|
|
_unfolded,
|
|
|
|
|
|
|
|
);
|
|
|
|
return AnimatedContainer(
|
|
|
|
return AnimatedContainer(
|
|
|
|
height: seenByText.isEmpty ? 0 : 24,
|
|
|
|
height: seenByText.isEmpty ? 0 : 24,
|
|
|
|
duration: seenByText.isEmpty
|
|
|
|
duration: seenByText.isEmpty
|
|
|
|
@ -830,13 +847,8 @@ class _ChatState extends State<Chat> {
|
|
|
|
'${event.senderId} ',
|
|
|
|
'${event.senderId} ',
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
|
|
|
|
unfold: _unfold,
|
|
|
|
onSelect: (Event event) {
|
|
|
|
onSelect: (Event event) {
|
|
|
|
if (event.type ==
|
|
|
|
|
|
|
|
EventTypes.RoomCreate) {
|
|
|
|
|
|
|
|
return setState(() =>
|
|
|
|
|
|
|
|
_collapseRoomCreate =
|
|
|
|
|
|
|
|
false);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!event.redacted) {
|
|
|
|
if (!event.redacted) {
|
|
|
|
if (selectedEvents
|
|
|
|
if (selectedEvents
|
|
|
|
.contains(event)) {
|
|
|
|
.contains(event)) {
|
|
|
|
|