Fix sending permission thingy

This commit is contained in:
Henry Hiles 2025-12-26 15:04:49 -05:00
commit 6215537f8e
No known key found for this signature in database
2 changed files with 148 additions and 137 deletions

View file

@ -7,6 +7,7 @@ import "package:nexus/controllers/avatar_controller.dart";
import "package:nexus/controllers/events_controller.dart"; import "package:nexus/controllers/events_controller.dart";
import "package:nexus/helpers/extensions/event_to_message.dart"; import "package:nexus/helpers/extensions/event_to_message.dart";
import "package:nexus/helpers/extensions/list_to_messages.dart"; import "package:nexus/helpers/extensions/list_to_messages.dart";
import "package:fluttertagger/fluttertagger.dart" as tagger;
class RoomChatController extends AsyncNotifier<ChatController> { class RoomChatController extends AsyncNotifier<ChatController> {
final Room room; final Room room;
@ -93,11 +94,27 @@ class RoomChatController extends AsyncNotifier<ChatController> {
Future<void> updateMessage(Message message, Message newMessage) async => Future<void> updateMessage(Message message, Message newMessage) async =>
(await future).updateMessage(message, newMessage); (await future).updateMessage(message, newMessage);
Future<void> send(String message, {Message? replyTo}) async => Future<void> send(
room.sendTextEvent( String message, {
message, required Iterable<tagger.Tag> tags,
Message? replyTo,
}) async {
var taggedMessage = message;
for (final tag in tags) {
final escaped = RegExp.escape(tag.id.substring(1));
final pattern = RegExp(r"@@(" + escaped + r")#[^#]*#");
taggedMessage = taggedMessage.replaceAllMapped(
pattern,
(m) => "@${m.group(1)}",
);
}
await room.sendTextEvent(
taggedMessage,
inReplyTo: replyTo == null ? null : await room.getEventById(replyTo.id), inReplyTo: replyTo == null ? null : await room.getEventById(replyTo.id),
); );
}
Future<chat.User> resolveUser(String id) async { Future<chat.User> resolveUser(String id) async {
final user = await room.client.getUserProfile(id); final user = await room.client.getUserProfile(id);

View file

@ -33,19 +33,25 @@ class ChatBox extends HookConsumerWidget {
final triggerCharacter = useState(""); final triggerCharacter = useState("");
final query = useState(""); final query = useState("");
Future<void> send() => ref void send() {
ref
.watch(RoomChatController.provider(room).notifier) .watch(RoomChatController.provider(room).notifier)
.send(controller.value.text, replyTo: replyToMessage); .send(
controller.value.formattedText,
replyTo: replyToMessage,
tags: controller.value.tags,
);
controller.value.text = "";
}
final node = useFocusNode( final node = useFocusNode(
onKeyEvent: (_, event) { onKeyEvent: (_, event) {
if (event is! KeyDownEvent || Platform.isAndroid || Platform.isIOS) { if (event is KeyDownEvent && !Platform.isAndroid && !Platform.isIOS) {
if (event.logicalKey == LogicalKeyboardKey.enter && if (event.logicalKey == LogicalKeyboardKey.enter &&
!HardwareKeyboard.instance.isShiftPressed) { !HardwareKeyboard.instance.isShiftPressed) {
send(); send();
return KeyEventResult.handled; return KeyEventResult.handled;
} } else if (event.logicalKey == LogicalKeyboardKey.escape) {
if (event.logicalKey == LogicalKeyboardKey.escape) {
onDismiss(); onDismiss();
return KeyEventResult.handled; return KeyEventResult.handled;
} }
@ -78,13 +84,13 @@ class ChatBox extends HookConsumerWidget {
Container( Container(
color: theme.colorScheme.surfaceContainerHighest, color: theme.colorScheme.surfaceContainerHighest,
padding: EdgeInsets.symmetric(horizontal: 8), padding: EdgeInsets.symmetric(horizontal: 8),
child: room.canSendDefaultMessages child: Row(
? Row(
spacing: 8, spacing: 8,
children: [ children: [
PopupMenuButton( PopupMenuButton(
itemBuilder: (context) => [], itemBuilder: (context) => [],
icon: Icon(Icons.add), icon: Icon(Icons.add),
enabled: room.canSendDefaultMessages,
), ),
Expanded( Expanded(
child: FlutterTagger( child: FlutterTagger(
@ -92,19 +98,14 @@ class ChatBox extends HookConsumerWidget {
overlay: Padding( overlay: Padding(
padding: EdgeInsets.all(8), padding: EdgeInsets.all(8),
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.all( borderRadius: BorderRadius.all(Radius.circular(12)),
Radius.circular(12),
),
child: Container( child: Container(
color: color: theme.colorScheme.surfaceContainerHigh,
theme.colorScheme.surfaceContainerHigh,
padding: EdgeInsets.all(8), padding: EdgeInsets.all(8),
child: switch (triggerCharacter.value) { child: switch (triggerCharacter.value) {
"@" => "@" =>
ref ref
.watch( .watch(MembersController.provider(room))
MembersController.provider(room),
)
.betterWhen( .betterWhen(
data: (members) => ListView( data: (members) => ListView(
children: children:
@ -112,16 +113,15 @@ class ChatBox extends HookConsumerWidget {
? members ? members
: members.where( : members.where(
(member) => (member) =>
member member.senderId
.senderId
.contains( .contains(
query query.value,
.value,
) || ) ||
(member.content["displayname"] (member.content["displayname"]
as String?) as String?)
?.contains( ?.contains(
query.value, query
.value,
) == ) ==
true, true,
)) ))
@ -137,37 +137,28 @@ class ChatBox extends HookConsumerWidget {
), ),
) )
.whenOrNull( .whenOrNull(
data: data: (data) =>
(
data,
) =>
data, data,
), ),
member member
.content["displayname"] .content["displayname"]
.toString(), .toString(),
headers: room headers:
.client room.client.headers,
.headers,
), ),
title: Text( title: Text(
member.content["displayname"] member.content["displayname"]
as String? ?? as String? ??
member member.senderId,
.senderId,
), ),
onTap: () => controller onTap: () => controller
.value .value
.addTag( .addTag(
id: "member", id: member.senderId,
name: member name: member
.senderId .senderId
.substring( .substring(1)
1, .split(":")
)
.split(
":",
)
.first, .first,
), ),
), ),
@ -192,10 +183,13 @@ class ChatBox extends HookConsumerWidget {
":": style, ":": style,
}, },
builder: (context, key) => TextFormField( builder: (context, key) => TextFormField(
enabled: room.canSendDefaultMessages,
maxLines: 12, maxLines: 12,
minLines: 1, minLines: 1,
decoration: InputDecoration( decoration: InputDecoration(
hintText: "Your message here...", hintText: room.canSendDefaultMessages
? "Your message here..."
: "You don't have permission to send messages in this room...",
border: InputBorder.none, border: InputBorder.none,
), ),
controller: controller.value, controller: controller.value,
@ -205,11 +199,11 @@ class ChatBox extends HookConsumerWidget {
), ),
), ),
), ),
IconButton(onPressed: send, icon: Icon(Icons.send)), IconButton(
onPressed: room.canSendDefaultMessages ? send : null,
icon: Icon(Icons.send),
),
], ],
)
: Text(
"You don't have permission to send messages here...",
), ),
), ),
], ],