forked from Henry-Hiles/nexus
add mention support
This commit is contained in:
parent
6215537f8e
commit
bbe36ff86f
8 changed files with 198 additions and 107 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue