diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index fd84f5d..5ccdc27 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -15,6 +15,7 @@ import "package:nexus/controllers/top_level_spaces_controller.dart"; import "package:nexus/helpers/extensions/gomuks_buffer.dart"; import "package:nexus/main.dart"; import "package:nexus/models/client_state.dart"; +import "package:nexus/models/content/content.dart"; import "package:nexus/models/event.dart"; import "package:nexus/models/paginate.dart"; import "package:nexus/models/requests/get_event_request.dart"; @@ -78,17 +79,10 @@ class ClientController extends AsyncNotifier { break; case "send_complete": final event = Event.fromJson(decodedMuksEvent["event"]); - ref - .watch(RoomsController.provider.notifier) - .update( - { - event.roomId: Room( - events: {event.rowId: event}.toIMap(), - ), - }.toIMap(), - const ISet.empty(), - ); + if (event.type == EventType.message.type) { + // ref.watch(provider.notifier).addEvent(event); TODO + } break; case "sync_complete": final syncData = SyncData.fromJson(decodedMuksEvent); diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index d8fea0c..028f2a1 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -44,16 +44,12 @@ class RoomChatController extends AsyncNotifier> { loadOlder(); } - return IMap.fromValues( - keyMapper: (id) => 9999999 + (id ?? 0), - values: room.sticky, - ) - .addAll(room.timeline) + return room.timeline .toEntryIList(compare: (a, b) => (b?.key ?? 0).compareTo(a?.key ?? 0)) .map((entry) { - final foundEvent = entry.value == null - ? null - : room.events[entry.value!]; + if (entry.value == null) return null; + + final foundEvent = room.events[entry.value!]; final editedEvent = foundEvent == null || foundEvent.lastEditRowId == 0 @@ -157,17 +153,23 @@ class RoomChatController extends AsyncNotifier> { ), ); - ref - .watch(RoomsController.provider.notifier) - .update( - { - roomId: Room( - events: {event.rowId: event}.toIMap(), - sticky: {event.rowId}.toISet(), - ), - }.toIMap(), - const ISet.empty(), - ); + // TODO: Add new event to timeline whilst its sending + // ref + // .watch(RoomsController.provider.notifier) + // .update( + // { + // roomId: Room( + // events: [event].toIList(), + // timeline: [ + // TimelineRowTuple( + // timelineRowId: event.timelineRowId, + // eventRowId: event.rowId, + // ), + // ].toIList(), + // ), + // }.toIMap(), + // const ISet.empty(), + // ); } Future removeReaction( diff --git a/lib/controllers/rooms_controller.dart b/lib/controllers/rooms_controller.dart index c4b36c1..382fac4 100644 --- a/lib/controllers/rooms_controller.dart +++ b/lib/controllers/rooms_controller.dart @@ -50,13 +50,6 @@ class RoomsController extends Notifier> { roomId, existing?.copyWith( hasMore: incoming.hasMore, - sticky: - (incoming.sticky.isEmpty == true - ? existing.sticky - : existing.sticky.addAll(incoming.sticky)) - .removeWhere( - (rowId) => incoming.timeline.values.contains(rowId), - ), metadata: incoming.metadata ?? existing.metadata, events: incoming.events.isEmpty ? existing.events diff --git a/lib/models/room.dart b/lib/models/room.dart index fb21a55..8aaadbe 100644 --- a/lib/models/room.dart +++ b/lib/models/room.dart @@ -28,13 +28,11 @@ abstract class Room with _$Room { /// [timeline] is an IMap of timelineRowId to eventRowId /// [events] is an IMap of eventRowId to event - /// [sticky] is an ISet of eventRowId const factory Room({ @JsonKey(name: "meta") RoomMetadata? metadata, @Default(IMap.empty()) @JsonKey(fromJson: Room.timelineTupleJsonToIMap) IMap timeline, - @Default(ISet.empty()) ISet sticky, @Default(IMap.empty()) @JsonKey(fromJson: Room.eventsJsonToIMap) diff --git a/lib/widgets/composer/composer.dart b/lib/widgets/composer/composer.dart index 401f269..4faa5c1 100644 --- a/lib/widgets/composer/composer.dart +++ b/lib/widgets/composer/composer.dart @@ -165,12 +165,10 @@ class Composer extends HookConsumerWidget { ), ] : [ - Expanded( - child: Padding( - padding: EdgeInsetsGeometry.all(8), - child: Text( - "You don't have permission to send messages in this room...", - ), + Padding( + padding: EdgeInsetsGeometry.all(8), + child: Text( + "You don't have permission to send messages in this room...", ), ), ], diff --git a/lib/widgets/lazy_loading/message_avatar.dart b/lib/widgets/lazy_loading/message_avatar.dart index 11c4704..215bb35 100644 --- a/lib/widgets/lazy_loading/message_avatar.dart +++ b/lib/widgets/lazy_loading/message_avatar.dart @@ -1,6 +1,7 @@ import "package:flutter/material.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/author_controller.dart"; +import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/helpers/extensions/show_user_popover.dart"; import "package:nexus/models/event.dart"; @@ -12,22 +13,24 @@ class MessageAvatar extends ConsumerWidget { const MessageAvatar(this.event, {this.height = 24, super.key}); @override - Widget build(BuildContext context, WidgetRef ref) => - switch (ref.watch(AuthorController.provider(event))) { - AsyncData(:final value) || AsyncLoading(:final value?) => InkWell( + Widget build(BuildContext context, WidgetRef ref) => ref + .watch(AuthorController.provider(event)) + .betterWhen( + data: (membership) => InkWell( onTapUp: (details) { context.showUserPopover( - value, + membership, event.sender, globalPosition: details.globalPosition, ); }, child: AvatarOrHash( - value.avatarUrl, - value.displayName ?? event.sender.localpart, + membership.avatarUrl, + membership.displayName ?? event.sender.localpart, height: height, ), ), - _ => AvatarOrHash(null, event.sender.localpart, height: height), - }; + loading: () => + AvatarOrHash(null, event.sender.localpart, height: height), + ); } diff --git a/lib/widgets/renderers/event.dart b/lib/widgets/renderers/event.dart index 2302156..217c4d3 100644 --- a/lib/widgets/renderers/event.dart +++ b/lib/widgets/renderers/event.dart @@ -446,22 +446,19 @@ class EventRenderer extends ConsumerWidget { ), ), - ...[ - if (event.content is! MessageContent) ReactionRow(event), + if (event.content is! MessageContent) + Padding( + padding: EdgeInsetsGeometry.only(left: 12), + child: ReactionRow(event), + ), - if (event.sendError != null && event.sendError != "not sent") - Text( - event.sendError!, - style: theme.textTheme.labelSmall?.copyWith( - color: theme.colorScheme.error, - ), + if (event.sendError != null && event.sendError != "not sent") + Text( + event.sendError!, + style: theme.textTheme.labelSmall?.copyWith( + color: theme.colorScheme.error, ), - ].map( - (child) => Padding( - padding: EdgeInsetsGeometry.only(left: 4), - child: child, ), - ), ] else if (textOnly) Text("Unknown event type", style: errorStyle), ],