Add (WIP) ban/klck ability

This commit is contained in:
Henry Hiles 2026-04-02 17:37:27 -04:00
commit 3a1bcb5b8f
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
13 changed files with 113 additions and 30 deletions

View file

@ -6,6 +6,7 @@ import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/members_controller.dart";
import "package:nexus/models/membership.dart";
import "package:nexus/models/membership_status.dart";
class AuthorController extends AsyncNotifier<Membership> {
final Message message;
@ -35,6 +36,7 @@ class AuthorController extends AsyncNotifier<Membership> {
);
return Membership(
status: member?.status ?? MembershipStatus.leave,
avatarUrl: pmp?.avatarUrl ?? member?.avatarUrl,
displayName:
pmp?.displayName ??

View file

@ -28,6 +28,7 @@ import "package:nexus/models/requests/paginate_request.dart";
import "package:nexus/models/requests/redact_event_request.dart";
import "package:nexus/models/requests/report_request.dart";
import "package:nexus/models/requests/send_message_request.dart";
import "package:nexus/models/requests/set_membership_request.dart";
import "package:nexus/models/room.dart";
import "package:nexus/models/sync_data.dart";
import "package:nexus/models/sync_status.dart";
@ -224,8 +225,11 @@ class ClientController extends AsyncNotifier<int> {
Future<Profile> getProfile(String userId) async =>
Profile.fromJson(await _sendCommand("get_profile", {"user_id": userId}));
Future<void> reportEvent(ReportRequest report) =>
_sendCommand("report_event", report.toJson());
Future<void> reportEvent(ReportRequest request) =>
_sendCommand("report_event", request.toJson());
Future<void> setMembership(SetMembershipRequest request) =>
_sendCommand("set_membership", request.toJson());
Future<void> markRead(Room room) async {
final event = room.events.firstWhereOrNull(

View file

@ -0,0 +1,25 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/members_controller.dart";
import "package:nexus/models/membership.dart";
import "package:nexus/models/membership_status.dart";
class MembersByTypeController extends AsyncNotifier<IList<Membership>> {
final MembershipStatus status;
MembersByTypeController(this.status);
@override
Future<IList<Membership>> build() => ref.watch(
MembersController.provider.selectAsync(
(members) =>
members.where((membership) => membership.status == status).toIList(),
),
);
static final provider =
AsyncNotifierProvider.family<
MembersByTypeController,
IList<Membership>,
MembershipStatus
>(MembersByTypeController.new);
}

View file

@ -29,7 +29,7 @@ class MembersController extends AsyncNotifier<IList<Membership>> {
);
return state.nonNulls
.where((member) => member.content["membership"] == "join")
.where((state) => state.type == "m.room.member")
.map(
(membership) => Membership.fromContent(
membership.content,

View file

@ -145,11 +145,11 @@ class MessageController extends AsyncNotifier<Message?> {
"${content["displayname"] ?? event.stateKey} ${switch (content["membership"]) {
"invite" => "was invited to",
"join" => "joined",
"leave" => event.authorId == event.stateKey ? "left" : "was kicked",
"leave" => event.authorId == event.stateKey ? "left" : (event.unsigned["prev_content"]?["membership"] == "ban" ? "was unbanned from" : "was kicked from"),
"ban" => "was banned from",
"knock" => "asked to join",
_ => "did something relating to",
}} the room.",
}} the room. ${content["reason"] ?? ""}",
),
"m.room.server_acl" => toSystemMessage(

View file

@ -2,7 +2,6 @@ import "dart:async";
import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_chat_core/flutter_chat_core.dart" as chat;
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:fluttertagger/fluttertagger.dart";
import "package:nexus/controllers/client_controller.dart";
@ -258,21 +257,6 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
if (message != null) insertMessage(message);
}
Future<chat.User> resolveUser(String id) async {
final user = await ref
.watch(ClientController.provider.notifier)
.getProfile(id);
return chat.User(
id: id,
name: user.displayName,
// imageSource: user.avatarUrl == null
// ? null
// : (await ref.watch(
// AvatarController.provider(user.avatarUrl!.toString()).future,
// )).toString(),
);
}
Future<void> scrollToMessage(Message message) async {
final controller = await future;
Future<void> setFlashing(bool flashing) => controller.updateMessage(