Gomuks SDK Rewrite #2

Closed
Henry-Hiles wants to merge 34 commits from go into main
2 changed files with 112 additions and 115 deletions
Showing only changes of commit 36c6d6958a - Show all commits

wip mention overlay

Henry Hiles 2026-01-30 09:21:41 +01:00
No known key found for this signature in database

View file

@ -8,6 +8,7 @@ import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/controllers/room_chat_controller.dart";
import "package:nexus/models/relation_type.dart"; import "package:nexus/models/relation_type.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
import "package:nexus/widgets/chat_page/mention_overlay.dart";
import "package:nexus/widgets/chat_page/relation_preview.dart"; import "package:nexus/widgets/chat_page/relation_preview.dart";
class ChatBox extends HookConsumerWidget { class ChatBox extends HookConsumerWidget {
@ -108,16 +109,15 @@ class ChatBox extends HookConsumerWidget {
Expanded( Expanded(
child: FlutterTagger( child: FlutterTagger(
triggerStrategy: TriggerStrategy.eager, triggerStrategy: TriggerStrategy.eager,
overlay: SizedBox.shrink(), overlay: MentionOverlay(
// MentionOverlay( TODO: Fix room,
// room, query: query.value,
// query: query.value, triggerCharacter: triggerCharacter.value,
// triggerCharacter: triggerCharacter.value, addTag: ({required id, required name}) {
// addTag: ({required id, required name}) { controller.value.addTag(id: id, name: name);
// controller.value.addTag(id: id, name: name); node.requestFocus();
// node.requestFocus(); },
// }, ),
// ),
controller: controller.value, controller: controller.value,
onSearch: (newQuery, newTriggerCharacter) { onSearch: (newQuery, newTriggerCharacter) {
triggerCharacter.value = newTriggerCharacter; triggerCharacter.value = newTriggerCharacter;

View file

@ -1,12 +1,9 @@
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:hooks_riverpod/hooks_riverpod.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/members_controller.dart";
import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/better_when.dart";
import "package:nexus/helpers/extensions/get_headers.dart"; import "package:nexus/models/room.dart";
import "package:nexus/widgets/avatar_or_hash.dart";
import "package:nexus/widgets/loading.dart"; import "package:nexus/widgets/loading.dart";
class MentionOverlay extends ConsumerWidget { class MentionOverlay extends ConsumerWidget {
@ -23,108 +20,108 @@ class MentionOverlay extends ConsumerWidget {
}); });
@override @override
Widget build(BuildContext context, WidgetRef ref) => Padding( Widget build(BuildContext context, WidgetRef ref) {
padding: EdgeInsets.all(8), final rooms = ref.watch(RoomsController.provider);
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(12)), return Padding(
child: Container( padding: EdgeInsets.all(8),
color: Theme.of(context).colorScheme.surfaceContainerHigh, child: ClipRRect(
padding: EdgeInsets.all(8), borderRadius: BorderRadius.all(Radius.circular(12)),
child: switch (triggerCharacter) { child: Container(
"@" => color: Theme.of(context).colorScheme.surfaceContainerHigh,
ref padding: EdgeInsets.all(8),
.watch(MembersController.provider(room)) child: switch (triggerCharacter) {
.betterWhen( "@" =>
data: (members) => ListView( ref
children: .watch(MembersController.provider(room))
(query.isEmpty .betterWhen(
? members data: (members) => ListView(
: members.where( children:
(member) => (query.isEmpty
member.senderId.toLowerCase().contains( ? members
query.toLowerCase(), : members.where(
) || (member) =>
(member.content["displayname"] member.authorId
as String?) .toLowerCase()
?.toLowerCase() .contains(query.toLowerCase()) ||
.contains( (member.content["displayname"]
query.toLowerCase(), as String?)
) == ?.toLowerCase()
true, .contains(
)) query.toLowerCase(),
.map( ) ==
(member) => ListTile( true,
leading: AvatarOrHash( ))
ref .map(
.watch( (member) => ListTile(
AvatarController.provider( // leading: AvatarOrHash( TODO: Images
member.content["avatar_url"] // ref
.toString(), // .watch(
), // AvatarController.provider(
) // member.content["avatar_url"]
.whenOrNull(data: (data) => data), // .toString(),
member.content["displayname"].toString(), // ),
headers: room.client.headers, // )
// .whenOrNull(data: (data) => data),
// member.content["displayname"].toString(),
// headers: room.client.headers,
// ),
title: Text(
member.content["displayname"] as String? ??
member.authorId,
),
onTap: () => addTag(
id: member.authorId,
name: member.authorId
.substring(1)
.split(":")
.first,
),
), ),
title: Text( )
member.content["displayname"] as String? ?? .toList(),
member.senderId, ),
),
onTap: () => addTag(
id: member.senderId,
name: member.senderId
.substring(1)
.split(":")
.first,
),
),
)
.toList(),
), ),
), "#" => ListView(
"#" => children:
ref (query.isEmpty
.watch(RoomsController.provider) ? rooms.values
.betterWhen( : rooms.values.where(
data: (rooms) => ListView( (room) => (room.metadata?.name ?? "Unnamed Room")
children: .toLowerCase()
(query.isEmpty .contains(query.toLowerCase()),
? rooms ))
: rooms.where( .map(
(room) => room.title.toLowerCase().contains( (room) => ListTile(
query.toLowerCase(), // leading: AvatarOrHash( TODO: Images
), // room.avatar,
)) // room.title,
.map( // fallback: Icon(Icons.numbers),
(room) => ListTile( // headers: room.roomData.client.headers,
leading: AvatarOrHash( // ),
room.avatar, title: Text(room.metadata?.name ?? "Unnamed Room"),
room.title, subtitle: room.metadata?.topic == null
fallback: Icon(Icons.numbers), ? null
headers: room.roomData.client.headers, : Text(room.metadata!.topic!, maxLines: 1),
), onTap: () => addTag(
title: Text(room.title), id: "[#${room.metadata?.name ?? "Unnamed Room"}](https://matrix.to/#/${room.metadata?.id})",
subtitle: room.roomData.topic.isEmpty name:
? null (room.metadata?.canonicalAlias ??
: Text(room.roomData.topic, maxLines: 1), room.metadata?.id)
onTap: () => addTag( ?.substring(1)
id: "[#${room.roomData.getLocalizedDisplayname()}](https://matrix.to/#/${room.roomData.id})", .split(":")
name: .first ??
(room.roomData.canonicalAlias.isEmpty "",
? room.roomData.id ),
: room.roomData.canonicalAlias) ),
.substring(1) )
.split(":") .toList(),
.first, ),
),
), _ => Loading(),
) },
.toList(), ),
),
),
_ => Loading(),
},
), ),
), );
); }
} }