Compare commits
No commits in common. "b836c3b06e06d4e1bf786dd0edd2a92477ade707" and "6de046bf7beac1590bf7bd97e6c79425f0b1eaec" have entirely different histories.
b836c3b06e
...
6de046bf7b
7 changed files with 50 additions and 65 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -165,12 +165,10 @@ 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...",
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -446,22 +446,19 @@ 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(
|
||||||
event.sendError!,
|
event.sendError!,
|
||||||
style: theme.textTheme.labelSmall?.copyWith(
|
style: theme.textTheme.labelSmall?.copyWith(
|
||||||
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),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue