wip read indicators

This commit is contained in:
Henry Hiles 2025-11-18 17:54:58 -05:00
commit fd0b020957
No known key found for this signature in database
3 changed files with 39 additions and 25 deletions

View file

@ -62,6 +62,11 @@ class RoomChatController extends AsyncNotifier<ChatController> {
); );
} }
Future<void> markRead() async {
final controller = await future;
await room.setReadMarker(controller.messages.last.id);
}
Future<void> updateMessage(Message message, Message newMessage) async => Future<void> updateMessage(Message message, Message newMessage) async =>
(await future).updateMessage(message, newMessage); (await future).updateMessage(message, newMessage);

View file

@ -62,6 +62,7 @@ class RoomChat extends HookConsumerWidget {
final controllerProvider = RoomChatController.provider( final controllerProvider = RoomChatController.provider(
room.roomData, room.roomData,
); );
final notifier = ref.watch(controllerProvider.notifier);
return Scaffold( return Scaffold(
appBar: RoomAppbar( appBar: RoomAppbar(
room, room,
@ -112,9 +113,8 @@ class RoomChat extends HookConsumerWidget {
chatAnimatedListBuilder: (_, itemBuilder) => chatAnimatedListBuilder: (_, itemBuilder) =>
ChatAnimatedList( ChatAnimatedList(
itemBuilder: itemBuilder, itemBuilder: itemBuilder,
onEndReached: ref onEndReached: notifier.loadOlder,
.watch(controllerProvider.notifier) onStartReached: () => notifier.markRead(),
.loadOlder,
), ),
composerBuilder: (_) => ChatBox( composerBuilder: (_) => ChatBox(
replyToMessage: replyToMessage.value, replyToMessage: replyToMessage.value,
@ -217,9 +217,8 @@ class RoomChat extends HookConsumerWidget {
), ),
linkPreviewData: message.linkPreviewData, linkPreviewData: message.linkPreviewData,
onLinkPreviewDataFetched: onLinkPreviewDataFetched:
(linkPreviewData) => ref (linkPreviewData) =>
.watch(controllerProvider.notifier) notifier.updateMessage(
.updateMessage(
message, message,
message.copyWith( message.copyWith(
linkPreviewData: linkPreviewData:
@ -292,14 +291,13 @@ class RoomChat extends HookConsumerWidget {
: SizedBox.shrink(), : SizedBox.shrink(),
), ),
onMessageSend: (message) { onMessageSend: (message) {
ref notifier.send(
.watch(controllerProvider.notifier) message,
.send(message, replyTo: replyToMessage.value); replyTo: replyToMessage.value,
);
replyToMessage.value = null; replyToMessage.value = null;
}, },
resolveUser: ref resolveUser: notifier.resolveUser,
.watch(controllerProvider.notifier)
.resolveUser,
chatController: controller, chatController: controller,
), ),
), ),

View file

@ -1,3 +1,4 @@
import "package:collection/collection.dart";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_hooks/flutter_hooks.dart"; import "package:flutter_hooks/flutter_hooks.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
@ -72,11 +73,18 @@ class Sidebar extends HookConsumerWidget {
return Scaffold( return Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
appBar: AppBar( appBar: AppBar(
leading: AvatarOrHash( leading: Badge(
space.avatar, isLabelVisible:
fallback: space.icon, space.children.firstWhereOrNull(
space.title, (room) => room.roomData.isUnread,
headers: space.client.headers, ) !=
null,
child: AvatarOrHash(
space.avatar,
fallback: space.icon,
space.title,
headers: space.client.headers,
),
), ),
title: Text( title: Text(
space.title, space.title,
@ -94,15 +102,18 @@ class Sidebar extends HookConsumerWidget {
destinations: space.children destinations: space.children
.map( .map(
(room) => NavigationRailDestination( (room) => NavigationRailDestination(
icon: AvatarOrHash(
room.avatar,
room.title,
fallback: selectedSpace.value == 1
? null
: Icon(Icons.numbers),
headers: space.client.headers,
),
label: Text(room.title), label: Text(room.title),
icon: Badge(
isLabelVisible: room.roomData.isUnread,
child: AvatarOrHash(
room.avatar,
room.title,
fallback: selectedSpace.value == 1
? null
: Icon(Icons.numbers),
headers: space.client.headers,
),
),
), ),
) )
.toList(), .toList(),