Compare commits

..

No commits in common. "b836c3b06e06d4e1bf786dd0edd2a92477ade707" and "6de046bf7beac1590bf7bd97e6c79425f0b1eaec" have entirely different histories.

7 changed files with 50 additions and 65 deletions

View file

@ -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<int> {
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);

View file

@ -44,16 +44,12 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
loadOlder();
}
return IMap<int, int?>.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<IList<Event>> {
),
);
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<void> removeReaction(

View file

@ -50,13 +50,6 @@ class RoomsController extends Notifier<IMap<String, Room>> {
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

View file

@ -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<int, int?> timeline,
@Default(ISet.empty()) ISet<int> sticky,
@Default(IMap.empty())
@JsonKey(fromJson: Room.eventsJsonToIMap)

View file

@ -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...",
),
),
],

View file

@ -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),
);
}

View file

@ -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),
],