From 3e82faeb86f06775b7ae5ea498cae8c3f73d13c3 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Thu, 4 Dec 2025 12:23:08 -0500 Subject: [PATCH] fix some stuff (maybe?) --- lib/controllers/message_controller.dart | 4 +- lib/controllers/room_chat_controller.dart | 2 + lib/controllers/selected_room_controller.dart | 8 ---- lib/controllers/spaces_controller.dart | 42 ++++++++++--------- lib/models/full_room.dart | 11 +++++ lib/models/space.dart | 16 ++++++- lib/widgets/chat_page/html/html.dart | 2 - lib/widgets/chat_page/room_chat.dart | 4 +- lib/widgets/chat_page/sidebar.dart | 1 - lib/widgets/chat_page/top_widget.dart | 4 +- 10 files changed, 58 insertions(+), 36 deletions(-) diff --git a/lib/controllers/message_controller.dart b/lib/controllers/message_controller.dart index 2cf8209..f1c253f 100644 --- a/lib/controllers/message_controller.dart +++ b/lib/controllers/message_controller.dart @@ -9,7 +9,9 @@ class MessageController extends AsyncNotifier { @override Future build() async { - final room = await ref.watch(SelectedRoomController.provider.future); + final room = await ref.watch( + SelectedRoomController.provider.selectAsync((a) => a), + ); if (room == null) return null; final event = await room.roomData.getEventById(id); diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index aed2a46..37a0800 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -82,8 +82,10 @@ class RoomChatController extends AsyncNotifier { } Future markRead() async { + if (!room.hasNewMessages) return; final controller = await future; final id = controller.messages.last.id; + await room.setReadMarker(id, mRead: id); } diff --git a/lib/controllers/selected_room_controller.dart b/lib/controllers/selected_room_controller.dart index 4b01014..cfeead6 100644 --- a/lib/controllers/selected_room_controller.dart +++ b/lib/controllers/selected_room_controller.dart @@ -5,14 +5,6 @@ import "package:nexus/controllers/selected_space_controller.dart"; import "package:nexus/models/full_room.dart"; class SelectedRoomController extends AsyncNotifier { - @override - bool updateShouldNotify( - AsyncValue previous, - AsyncValue next, - ) => - previous.value?.avatar != next.value?.avatar || - previous.value?.title != next.value?.title; - @override Future build() async { final space = await ref.watch(SelectedSpaceController.provider.future); diff --git a/lib/controllers/spaces_controller.dart b/lib/controllers/spaces_controller.dart index de0d873..7d2ecf0 100644 --- a/lib/controllers/spaces_controller.dart +++ b/lib/controllers/spaces_controller.dart @@ -15,23 +15,25 @@ class SpacesController extends AsyncNotifier> { client.onSync.stream.listen((_) => ref.invalidateSelf()).cancel, ); - final topLevel = await Future.wait( - client.rooms - .where((room) => !room.isDirectChat) - .where( - (room) => client.rooms - .where((room) => room.isSpace) - .every( - (match) => match.spaceChildren.every( - (child) => child.roomId != room.id, + final topLevel = IList( + await Future.wait( + client.rooms + .where((room) => !room.isDirectChat) + .where( + (room) => client.rooms + .where((room) => room.isSpace) + .every( + (match) => match.spaceChildren.every( + (child) => child.roomId != room.id, + ), ), - ), - ) - .map((room) => room.fullRoom), + ) + .map((room) => room.fullRoom), + ), ); - final topLevelSpaces = topLevel.where((r) => r.roomData.isSpace).toList(); - final topLevelRooms = topLevel.where((r) => !r.roomData.isSpace).toList(); + final topLevelSpaces = topLevel.where((r) => r.roomData.isSpace).toIList(); + final topLevelRooms = topLevel.where((r) => !r.roomData.isSpace).toIList(); return IList([ Space( @@ -45,10 +47,12 @@ class SpacesController extends AsyncNotifier> { client: client, title: "Direct Messages", id: "dms", - children: await Future.wait( - client.rooms - .where((room) => room.isDirectChat) - .map((room) => room.fullRoom), + children: IList( + await Future.wait( + client.rooms + .where((room) => room.isDirectChat) + .map((room) => room.fullRoom), + ), ), icon: Icon(Icons.person), ), @@ -60,7 +64,7 @@ class SpacesController extends AsyncNotifier> { avatar: space.avatar, id: space.roomData.id, roomData: space.roomData, - children: await space.roomData.getAllChildren(client), + children: IList(await space.roomData.getAllChildren(client)), ), ), )), diff --git a/lib/models/full_room.dart b/lib/models/full_room.dart index 671a767..dd81619 100644 --- a/lib/models/full_room.dart +++ b/lib/models/full_room.dart @@ -4,9 +4,20 @@ part "full_room.freezed.dart"; @freezed abstract class FullRoom with _$FullRoom { + const FullRoom._(); const factory FullRoom({ required Room roomData, required String title, required Uri? avatar, }) = _FullRoom; + + @override + bool operator ==(Object other) => + other.runtimeType == runtimeType && + other is FullRoom && + other.avatar == avatar && + other.title == title; + + @override + int get hashCode => Object.hash(runtimeType, title, avatar); } diff --git a/lib/models/space.dart b/lib/models/space.dart index 79c2176..0ff21f5 100644 --- a/lib/models/space.dart +++ b/lib/models/space.dart @@ -1,3 +1,4 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/widgets.dart"; import "package:freezed_annotation/freezed_annotation.dart"; import "package:matrix/matrix.dart"; @@ -6,13 +7,26 @@ part "space.freezed.dart"; @freezed abstract class Space with _$Space { + const Space._(); const factory Space({ required String title, required String id, - required List children, + required IList children, required Client client, Room? roomData, Uri? avatar, Icon? icon, }) = _Space; + + @override + bool operator ==(Object other) => + other.runtimeType == runtimeType && + other is Space && + other.title == title && + other.id == id && + other.icon == icon && + other.avatar == avatar; + + @override + int get hashCode => Object.hash(runtimeType, title, id, icon, avatar); } diff --git a/lib/widgets/chat_page/html/html.dart b/lib/widgets/chat_page/html/html.dart index 505a52f..37042d1 100644 --- a/lib/widgets/chat_page/html/html.dart +++ b/lib/widgets/chat_page/html/html.dart @@ -19,8 +19,6 @@ class Html extends ConsumerWidget { return SpoilerText(text: element.text); } return switch (element.localName) { - "mx-reply" => SizedBox.shrink(), - "code" => CodeBlock( element.text, lang: element.className.replaceAll("language-", ""), diff --git a/lib/widgets/chat_page/room_chat.dart b/lib/widgets/chat_page/room_chat.dart index 2a23d94..b5d9de6 100644 --- a/lib/widgets/chat_page/room_chat.dart +++ b/lib/widgets/chat_page/room_chat.dart @@ -172,9 +172,7 @@ class RoomChat extends HookConsumerWidget { ChatAnimatedList( itemBuilder: itemBuilder, onEndReached: notifier.loadOlder, - onStartReached: () async { - notifier.markRead(); - }, + onStartReached: notifier.markRead, ), composerBuilder: (_) => ChatBox( replyToMessage: replyToMessage.value, diff --git a/lib/widgets/chat_page/sidebar.dart b/lib/widgets/chat_page/sidebar.dart index 7703c5e..423300b 100644 --- a/lib/widgets/chat_page/sidebar.dart +++ b/lib/widgets/chat_page/sidebar.dart @@ -97,7 +97,6 @@ class Sidebar extends HookConsumerWidget { ), IconButton( onPressed: () => Navigator.of(context).push( - // TODO: explore public rooms/spaces MaterialPageRoute(builder: (_) => SettingsPage()), ), icon: Icon(Icons.settings), diff --git a/lib/widgets/chat_page/top_widget.dart b/lib/widgets/chat_page/top_widget.dart index 0f2283f..95f613c 100644 --- a/lib/widgets/chat_page/top_widget.dart +++ b/lib/widgets/chat_page/top_widget.dart @@ -48,7 +48,9 @@ class TopWidget extends ConsumerWidget { ), ) : null; - final replyText = (smallerText == null) + final replyText = + (smallerText == null || + smallerText.length == replyMessage.text.length) ? replyMessage.text : "$smallerText...";