mirror of
https://github.com/krille-chan/fluffychat
synced 2024-09-10 13:05:11 +00:00
chore: Follow up jump to unread message
This commit is contained in:
parent
e690f1e14c
commit
14c2bf0508
4 changed files with 60 additions and 37 deletions
|
@ -276,6 +276,8 @@ class ChatController extends State<ChatPageWithRoom> {
|
|||
_loadDraft();
|
||||
super.initState();
|
||||
sendingClient = Matrix.of(context).client;
|
||||
readMarkerEventId = room.fullyRead;
|
||||
loadTimelineFuture = _getTimeline();
|
||||
}
|
||||
|
||||
void updateView() {
|
||||
|
@ -283,33 +285,34 @@ class ChatController extends State<ChatPageWithRoom> {
|
|||
setState(() {});
|
||||
}
|
||||
|
||||
Future<void> getTimeline([String? eventContextId]) async {
|
||||
if (timeline == null) {
|
||||
await Matrix.of(context).client.roomsLoading;
|
||||
await Matrix.of(context).client.accountDataLoading;
|
||||
timeline = await room.getTimeline(
|
||||
onUpdate: updateView,
|
||||
eventContextId: eventContextId,
|
||||
);
|
||||
if (timeline!.events.isNotEmpty) {
|
||||
if (room.markedUnread) room.markUnread(false);
|
||||
setReadMarker();
|
||||
}
|
||||
Future<void>? loadTimelineFuture;
|
||||
|
||||
// when the scroll controller is attached we want to scroll to an event id, if specified
|
||||
// and update the scroll controller...which will trigger a request history, if the
|
||||
// "load more" button is visible on the screen
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) async {
|
||||
if (mounted) {
|
||||
final event = VRouter.of(context).queryParameters['event'];
|
||||
if (event != null) {
|
||||
scrollToEventId(event);
|
||||
}
|
||||
_updateScrollController();
|
||||
}
|
||||
});
|
||||
Future<void> _getTimeline([String? eventContextId]) async {
|
||||
await Matrix.of(context).client.roomsLoading;
|
||||
await Matrix.of(context).client.accountDataLoading;
|
||||
final timeline = this.timeline = await room.getTimeline(
|
||||
onUpdate: updateView,
|
||||
eventContextId: eventContextId,
|
||||
);
|
||||
if (timeline.events.isNotEmpty) {
|
||||
if (room.markedUnread) room.markUnread(false);
|
||||
setReadMarker();
|
||||
}
|
||||
timeline!.requestKeys(onlineKeyBackupOnly: false);
|
||||
|
||||
// when the scroll controller is attached we want to scroll to an event id, if specified
|
||||
// and update the scroll controller...which will trigger a request history, if the
|
||||
// "load more" button is visible on the screen
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) async {
|
||||
if (mounted) {
|
||||
final event = VRouter.of(context).queryParameters['event'];
|
||||
if (event != null) {
|
||||
scrollToEventId(event);
|
||||
}
|
||||
_updateScrollController();
|
||||
}
|
||||
});
|
||||
|
||||
timeline.requestKeys(onlineKeyBackupOnly: false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -317,7 +320,8 @@ class ChatController extends State<ChatPageWithRoom> {
|
|||
|
||||
void setReadMarker({String? eventId}) {
|
||||
if (_setReadMarkerFuture != null) return;
|
||||
if (lastReadEventVisible &&
|
||||
if (eventId == null &&
|
||||
lastReadEventVisible &&
|
||||
!room.hasNewMessages &&
|
||||
room.notificationCount == 0) {
|
||||
return;
|
||||
|
@ -784,8 +788,9 @@ class ChatController extends State<ChatPageWithRoom> {
|
|||
if (eventIndex == -1) {
|
||||
setState(() {
|
||||
timeline = null;
|
||||
loadTimelineFuture = _getTimeline(eventId);
|
||||
});
|
||||
await getTimeline(eventId);
|
||||
await loadTimelineFuture;
|
||||
eventIndex = timeline!.events.indexWhere((e) => e.eventId == eventId);
|
||||
}
|
||||
if (!mounted) {
|
||||
|
@ -802,8 +807,9 @@ class ChatController extends State<ChatPageWithRoom> {
|
|||
if (!timeline!.allowNewEvent) {
|
||||
setState(() {
|
||||
timeline = null;
|
||||
loadTimelineFuture = _getTimeline();
|
||||
});
|
||||
await getTimeline();
|
||||
await loadTimelineFuture;
|
||||
setReadMarker(eventId: timeline!.events.first.eventId);
|
||||
}
|
||||
scrollController.jumpTo(0);
|
||||
|
|
|
@ -124,7 +124,8 @@ class ChatEventList extends StatelessWidget {
|
|||
.any((e) => e.eventId == event.eventId),
|
||||
timeline: controller.timeline!,
|
||||
displayReadMarker:
|
||||
controller.readMarkerEventId == event.eventId,
|
||||
controller.readMarkerEventId == event.eventId &&
|
||||
controller.timeline?.allowNewEvent == false,
|
||||
nextEvent: i < controller.timeline!.events.length
|
||||
? controller.timeline!.events[i]
|
||||
: null,
|
||||
|
|
|
@ -139,8 +139,6 @@ class ChatView extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
controller.readMarkerEventId ??= controller.room.fullyRead;
|
||||
|
||||
if (controller.room.membership == Membership.invite) {
|
||||
showFutureLoadingDialog(
|
||||
context: context,
|
||||
|
@ -167,7 +165,7 @@ class ChatView extends StatelessWidget {
|
|||
stream: controller.room.onUpdate.stream
|
||||
.rateLimit(const Duration(seconds: 1)),
|
||||
builder: (context, snapshot) => FutureBuilder(
|
||||
future: controller.getTimeline(),
|
||||
future: controller.loadTimelineFuture,
|
||||
builder: (BuildContext context, snapshot) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
|
|
|
@ -354,12 +354,30 @@ class Message extends StatelessWidget {
|
|||
if (displayReadMarker)
|
||||
Row(
|
||||
children: [
|
||||
const Expanded(child: Divider()),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text(L10n.of(context)!.readUpToHere),
|
||||
Expanded(
|
||||
child: Divider(color: Theme.of(context).colorScheme.primary),
|
||||
),
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
color: Theme.of(context).colorScheme.primaryContainer,
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
margin: const EdgeInsets.all(8.0),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8,
|
||||
),
|
||||
child: Text(
|
||||
L10n.of(context)!.readUpToHere,
|
||||
style:
|
||||
TextStyle(color: Theme.of(context).colorScheme.primary),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Divider(color: Theme.of(context).colorScheme.primary),
|
||||
),
|
||||
const Expanded(child: Divider()),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
|
Loading…
Reference in a new issue