From 3b3423bec805f58490cfa6ef02f973799c60ac75 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sun, 1 Mar 2026 13:56:40 -0500 Subject: [PATCH] Fix fetching issue, use gomuks generated edit source --- lib/controllers/account_data_controller.dart | 16 +++++ lib/controllers/client_controller.dart | 13 +++- lib/controllers/message_controller.dart | 1 + lib/controllers/room_chat_controller.dart | 62 ++++++++++---------- lib/controllers/spaces_controller.dart | 21 ++++++- lib/models/account_data.dart | 16 +++++ lib/models/event.dart | 1 + lib/models/sync_data.dart | 3 +- lib/widgets/chat_page/chat_box.dart | 9 +-- 9 files changed, 99 insertions(+), 43 deletions(-) create mode 100644 lib/controllers/account_data_controller.dart create mode 100644 lib/models/account_data.dart diff --git a/lib/controllers/account_data_controller.dart b/lib/controllers/account_data_controller.dart new file mode 100644 index 0000000..125d7cf --- /dev/null +++ b/lib/controllers/account_data_controller.dart @@ -0,0 +1,16 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/models/account_data.dart"; + +class AccountDataController extends Notifier> { + @override + IMap build() => const IMap.empty(); + + void update(IMap newData) => + state = IMap({...state.unlock, ...newData.unlock}); + + static final provider = + NotifierProvider>( + AccountDataController.new, + ); +} diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index 6639de6..780439d 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -5,6 +5,7 @@ import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:ffi/ffi.dart"; import "package:flutter/foundation.dart"; +import "package:nexus/controllers/account_data_controller.dart"; import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/init_complete_controller.dart"; import "package:nexus/controllers/rooms_controller.dart"; @@ -66,16 +67,26 @@ class ClientController extends AsyncNotifier { case "sync_complete": final syncData = SyncData.fromJson(decodedMuksEvent); final roomProvider = RoomsController.provider; + final accountDataProvider = AccountDataController.provider; + + if (syncData.clearState) { + ref.invalidate(roomProvider); + ref.invalidate(accountDataProvider); + } - if (syncData.clearState) ref.invalidate(roomProvider); ref .watch(roomProvider.notifier) .update(syncData.rooms, syncData.leftRooms); + ref + .watch(accountDataProvider.notifier) + .update(syncData.accountData); + if (syncData.topLevelSpaces != null) { ref .watch(TopLevelSpacesController.provider.notifier) .set(syncData.topLevelSpaces!); } + if (syncData.spaceEdges != null) { ref .watch(SpaceEdgesController.provider.notifier) diff --git a/lib/controllers/message_controller.dart b/lib/controllers/message_controller.dart index b6e326b..5a2e6e7 100644 --- a/lib/controllers/message_controller.dart +++ b/lib/controllers/message_controller.dart @@ -70,6 +70,7 @@ class MessageController extends AsyncNotifier { "body": newContent?["body"] ?? content["body"], "eventType": type, "avatarUrl": author?.content["avatar_url"], + "editSource": event.localContent?.editSource, "displayName": author?.content["displayname"]?.isNotEmpty == true ? author?.content["displayname"] : event.authorId.substring(1).split(":")[0], diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index 6486306..ab04b44 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -28,6 +28,37 @@ class RoomChatController extends AsyncNotifier { final room = ref.read(RoomsController.provider)[roomId]; if (room == null) return InMemoryChatController(); + final state = await client.getRoomState( + GetRoomStateRequest( + roomId: roomId, + fetchMembers: room.metadata?.hasMemberList == false, + includeMembers: true, + ), + ); + + ref + .read(RoomsController.provider.notifier) + .update( + { + roomId: Room( + events: state, + state: state.fold( + const IMap.empty(), + (previousValue, stateEvent) => previousValue.add( + stateEvent.type, + (previousValue[stateEvent.type] ?? const IMap.empty()).addAll( + IMap({ + if (stateEvent.stateKey != null) + stateEvent.stateKey!: stateEvent.rowId, + }), + ), + ), + ), + ), + }.toIMap(), + const ISet.empty(), + ); + final messages = await ref.watch( MessagesController.provider( MessagesConfig( @@ -103,37 +134,6 @@ class RoomChatController extends AsyncNotifier { if (messages.length < 20) await loadOlder(controller); } - final state = await client.getRoomState( - GetRoomStateRequest( - roomId: roomId, - fetchMembers: room.metadata?.hasMemberList == false, - includeMembers: true, - ), - ); - - ref - .read(RoomsController.provider.notifier) - .update( - { - roomId: Room( - events: state, - state: state.fold( - const IMap.empty(), - (previousValue, stateEvent) => previousValue.add( - stateEvent.type, - (previousValue[stateEvent.type] ?? const IMap.empty()).addAll( - IMap({ - if (stateEvent.stateKey != null) - stateEvent.stateKey!: stateEvent.rowId, - }), - ), - ), - ), - ), - }.toIMap(), - const ISet.empty(), - ); - return controller; } diff --git a/lib/controllers/spaces_controller.dart b/lib/controllers/spaces_controller.dart index 646f48d..ca217a5 100644 --- a/lib/controllers/spaces_controller.dart +++ b/lib/controllers/spaces_controller.dart @@ -1,6 +1,7 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/material.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/controllers/account_data_controller.dart"; import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/controllers/top_level_spaces_controller.dart"; import "package:nexus/controllers/space_edges_controller.dart"; @@ -57,12 +58,28 @@ class SpacesController extends Notifier> { ) .map((e) => e.value); + final accountData = ref.watch(AccountDataController.provider); + + final directMessages = IMap( + accountData["m.direct"]?.content ?? {}, + ).values.expand((element) => element); + final homeRooms = otherRooms - .where((room) => room.metadata?.dmUserId == null) + .where( + (room) => + directMessages.any( + (directMessage) => directMessage == room.metadata?.id, + ) == + false, + ) .toIList(); final dmRooms = otherRooms - .where((room) => room.metadata?.dmUserId != null) + .where( + (room) => directMessages.any( + (directMessage) => directMessage == room.metadata?.id, + ), + ) .toIList(); final topLevelSpacesList = topLevelSpaceIds diff --git a/lib/models/account_data.dart b/lib/models/account_data.dart new file mode 100644 index 0000000..a325ffe --- /dev/null +++ b/lib/models/account_data.dart @@ -0,0 +1,16 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +part "account_data.freezed.dart"; +part "account_data.g.dart"; + +@freezed +abstract class AccountData with _$AccountData { + const factory AccountData({ + required String userId, + required String? roomId, + required String type, + required dynamic content, + }) = _AccountData; + + factory AccountData.fromJson(Map json) => + _$AccountDataFromJson(json); +} diff --git a/lib/models/event.dart b/lib/models/event.dart index c2f157f..734f667 100644 --- a/lib/models/event.dart +++ b/lib/models/event.dart @@ -38,6 +38,7 @@ abstract class Event with _$Event { abstract class LocalContent with _$LocalContent { const factory LocalContent({ String? sanitizedHtml, + String? editSource, bool? wasPlaintext, bool? bigEmoji, bool? hasMath, diff --git a/lib/models/sync_data.dart b/lib/models/sync_data.dart index 0fc18ac..0f98bb2 100644 --- a/lib/models/sync_data.dart +++ b/lib/models/sync_data.dart @@ -1,5 +1,6 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/account_data.dart"; import "package:nexus/models/room.dart"; import "package:nexus/models/space_edge.dart"; part "sync_data.freezed.dart"; @@ -9,7 +10,7 @@ part "sync_data.g.dart"; abstract class SyncData with _$SyncData { const factory SyncData({ @Default(false) bool clearState, - // required IMap accountData, + @Default(IMap.empty()) IMap accountData, @Default(IMap.empty()) IMap rooms, @Default(ISet.empty()) ISet leftRooms, // required IList invitedRooms, diff --git a/lib/widgets/chat_page/chat_box.dart b/lib/widgets/chat_page/chat_box.dart index 885ddd9..20a8116 100644 --- a/lib/widgets/chat_page/chat_box.dart +++ b/lib/widgets/chat_page/chat_box.dart @@ -34,14 +34,7 @@ class ChatBox extends HookConsumerWidget { if (relationType == RelationType.edit && relatedMessage is TextMessage && controller.value.text.isEmpty) { - final text = (relatedMessage as TextMessage).text; - final splitText = relatedMessage?.replyToMessageId == null - ? text - : text.split("\n\n").sublist(1).join("\n\n"); - final notEmpty = splitText.isEmpty ? text : splitText; - controller.value.text = notEmpty.startsWith("* ") - ? notEmpty.substring(2) - : notEmpty; + controller.value.text = relatedMessage?.metadata?["editSource"]; } void send() {