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/helpers/extensions/gomuks_buffer.dart";
import "package:nexus/main.dart"; import "package:nexus/main.dart";
import "package:nexus/models/client_state.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/event.dart";
import "package:nexus/models/paginate.dart"; import "package:nexus/models/paginate.dart";
import "package:nexus/models/requests/get_event_request.dart"; import "package:nexus/models/requests/get_event_request.dart";
@ -78,17 +79,10 @@ class ClientController extends AsyncNotifier<int> {
break; break;
case "send_complete": case "send_complete":
final event = Event.fromJson(decodedMuksEvent["event"]); 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; break;
case "sync_complete": case "sync_complete":
final syncData = SyncData.fromJson(decodedMuksEvent); final syncData = SyncData.fromJson(decodedMuksEvent);

View file

@ -44,16 +44,12 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
loadOlder(); loadOlder();
} }
return IMap<int, int?>.fromValues( return room.timeline
keyMapper: (id) => 9999999 + (id ?? 0),
values: room.sticky,
)
.addAll(room.timeline)
.toEntryIList(compare: (a, b) => (b?.key ?? 0).compareTo(a?.key ?? 0)) .toEntryIList(compare: (a, b) => (b?.key ?? 0).compareTo(a?.key ?? 0))
.map((entry) { .map((entry) {
final foundEvent = entry.value == null if (entry.value == null) return null;
? null
: room.events[entry.value!]; final foundEvent = room.events[entry.value!];
final editedEvent = final editedEvent =
foundEvent == null || foundEvent.lastEditRowId == 0 foundEvent == null || foundEvent.lastEditRowId == 0
@ -157,17 +153,23 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
), ),
); );
ref // TODO: Add new event to timeline whilst its sending
.watch(RoomsController.provider.notifier) // ref
.update( // .watch(RoomsController.provider.notifier)
{ // .update(
roomId: Room( // {
events: {event.rowId: event}.toIMap(), // roomId: Room(
sticky: {event.rowId}.toISet(), // events: [event].toIList(),
), // timeline: [
}.toIMap(), // TimelineRowTuple(
const ISet.empty(), // timelineRowId: event.timelineRowId,
); // eventRowId: event.rowId,
// ),
// ].toIList(),
// ),
// }.toIMap(),
// const ISet.empty(),
// );
} }
Future<void> removeReaction( Future<void> removeReaction(

View file

@ -50,13 +50,6 @@ class RoomsController extends Notifier<IMap<String, Room>> {
roomId, roomId,
existing?.copyWith( existing?.copyWith(
hasMore: incoming.hasMore, 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, metadata: incoming.metadata ?? existing.metadata,
events: incoming.events.isEmpty events: incoming.events.isEmpty
? existing.events ? existing.events

View file

@ -28,13 +28,11 @@ abstract class Room with _$Room {
/// [timeline] is an IMap of timelineRowId to eventRowId /// [timeline] is an IMap of timelineRowId to eventRowId
/// [events] is an IMap of eventRowId to event /// [events] is an IMap of eventRowId to event
/// [sticky] is an ISet of eventRowId
const factory Room({ const factory Room({
@JsonKey(name: "meta") RoomMetadata? metadata, @JsonKey(name: "meta") RoomMetadata? metadata,
@Default(IMap.empty()) @Default(IMap.empty())
@JsonKey(fromJson: Room.timelineTupleJsonToIMap) @JsonKey(fromJson: Room.timelineTupleJsonToIMap)
IMap<int, int?> timeline, IMap<int, int?> timeline,
@Default(ISet.empty()) ISet<int> sticky,
@Default(IMap.empty()) @Default(IMap.empty())
@JsonKey(fromJson: Room.eventsJsonToIMap) @JsonKey(fromJson: Room.eventsJsonToIMap)

View file

@ -165,14 +165,12 @@ class Composer extends HookConsumerWidget {
), ),
] ]
: [ : [
Expanded( Padding(
child: Padding(
padding: EdgeInsetsGeometry.all(8), padding: EdgeInsetsGeometry.all(8),
child: Text( child: Text(
"You don't have permission to send messages in this room...", "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/material.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/author_controller.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/get_localpart.dart";
import "package:nexus/helpers/extensions/show_user_popover.dart"; import "package:nexus/helpers/extensions/show_user_popover.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
@ -12,22 +13,24 @@ class MessageAvatar extends ConsumerWidget {
const MessageAvatar(this.event, {this.height = 24, super.key}); const MessageAvatar(this.event, {this.height = 24, super.key});
@override @override
Widget build(BuildContext context, WidgetRef ref) => Widget build(BuildContext context, WidgetRef ref) => ref
switch (ref.watch(AuthorController.provider(event))) { .watch(AuthorController.provider(event))
AsyncData(:final value) || AsyncLoading(:final value?) => InkWell( .betterWhen(
data: (membership) => InkWell(
onTapUp: (details) { onTapUp: (details) {
context.showUserPopover( context.showUserPopover(
value, membership,
event.sender, event.sender,
globalPosition: details.globalPosition, globalPosition: details.globalPosition,
); );
}, },
child: AvatarOrHash( child: AvatarOrHash(
value.avatarUrl, membership.avatarUrl,
value.displayName ?? event.sender.localpart, membership.displayName ?? event.sender.localpart,
height: height, height: height,
), ),
), ),
_ => AvatarOrHash(null, event.sender.localpart, height: height), loading: () =>
}; AvatarOrHash(null, event.sender.localpart, height: height),
);
} }

View file

@ -446,8 +446,11 @@ class EventRenderer extends ConsumerWidget {
), ),
), ),
...[ if (event.content is! MessageContent)
if (event.content is! MessageContent) ReactionRow(event), Padding(
padding: EdgeInsetsGeometry.only(left: 12),
child: ReactionRow(event),
),
if (event.sendError != null && event.sendError != "not sent") if (event.sendError != null && event.sendError != "not sent")
Text( Text(
@ -456,12 +459,6 @@ class EventRenderer extends ConsumerWidget {
color: theme.colorScheme.error, color: theme.colorScheme.error,
), ),
), ),
].map(
(child) => Padding(
padding: EdgeInsetsGeometry.only(left: 4),
child: child,
),
),
] else if (textOnly) ] else if (textOnly)
Text("Unknown event type", style: errorStyle), Text("Unknown event type", style: errorStyle),
], ],