add mention support

This commit is contained in:
Henry Hiles 2025-12-26 17:00:59 -05:00
commit bbe36ff86f
No known key found for this signature in database
8 changed files with 198 additions and 107 deletions

View file

@ -6,14 +6,9 @@ import "package:flutter_hooks/flutter_hooks.dart";
import "package:fluttertagger/fluttertagger.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:matrix/matrix.dart";
import "package:nexus/controllers/avatar_controller.dart";
import "package:nexus/controllers/members_controller.dart";
import "package:nexus/controllers/room_chat_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart";
import "package:nexus/helpers/extensions/get_headers.dart";
import "package:nexus/widgets/avatar_or_hash.dart";
import "package:nexus/widgets/chat_page/mention_overlay.dart";
import "package:nexus/widgets/chat_page/reply_preview.dart";
import "package:nexus/widgets/loading.dart";
class ChatBox extends HookConsumerWidget {
final Message? replyToMessage;
@ -95,82 +90,14 @@ class ChatBox extends HookConsumerWidget {
Expanded(
child: FlutterTagger(
triggerStrategy: TriggerStrategy.eager,
overlay: Padding(
padding: EdgeInsets.all(8),
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(12)),
child: Container(
color: theme.colorScheme.surfaceContainerHigh,
padding: EdgeInsets.all(8),
child: switch (triggerCharacter.value) {
"@" =>
ref
.watch(MembersController.provider(room))
.betterWhen(
data: (members) => ListView(
children:
(query.value.isEmpty
? members
: members.where(
(member) =>
member.senderId
.contains(
query.value,
) ||
(member.content["displayname"]
as String?)
?.contains(
query
.value,
) ==
true,
))
.map(
(member) => ListTile(
leading: AvatarOrHash(
ref
.watch(
AvatarController.provider(
member
.content["avatar_url"]
.toString(),
),
)
.whenOrNull(
data: (data) =>
data,
),
member
.content["displayname"]
.toString(),
headers:
room.client.headers,
),
title: Text(
member.content["displayname"]
as String? ??
member.senderId,
),
onTap: () => controller
.value
.addTag(
id: member.senderId,
name: member
.senderId
.substring(1)
.split(":")
.first,
),
),
)
.toList(),
),
),
"#" => Text("Todo"),
_ => Loading(),
},
),
),
overlay: MentionOverlay(
room,
query: query.value,
triggerCharacter: triggerCharacter.value,
addTag: ({required id, required name}) {
controller.value.addTag(id: id, name: name);
node.requestFocus();
},
),
controller: controller.value,
onSearch: (newQuery, newTriggerCharacter) {