chore: Enhance room pills

This commit is contained in:
Krille 2023-05-24 08:23:06 +02:00
parent 692d6042c5
commit 1a1c166ab0
No known key found for this signature in database
1 changed files with 31 additions and 78 deletions

View File

@ -114,8 +114,7 @@ class HtmlMessage extends StatelessWidget {
), ),
}, },
extensions: [ extensions: [
UserPillExtension(context, room), RoomPillExtension(context, room),
RoomPillExtension(context, room.client),
CodeExtension(fontSize: fontSize), CodeExtension(fontSize: fontSize),
MatrixMathExtension( MatrixMathExtension(
style: TextStyle(fontSize: fontSize, color: textColor), style: TextStyle(fontSize: fontSize, color: textColor),
@ -378,24 +377,21 @@ class CodeExtension extends HtmlExtension {
); );
} }
class UserPillExtension extends HtmlExtension { class RoomPillExtension extends HtmlExtension {
final Room room; final Room room;
final BuildContext context; final BuildContext context;
UserPillExtension(this.context, this.room); RoomPillExtension(this.context, this.room);
@override @override
Set<String> get supportedTags => {'a'}; Set<String> get supportedTags => {'a'};
@override @override
bool matches(ExtensionContext context) { bool matches(ExtensionContext context) {
if (context.elementName != 'a') return false; if (context.elementName != 'a') return false;
final href = context.element?.attributes['href']; final userId = context.element?.attributes['href']
if (href == null) return false; ?.parseIdentifierIntoParts()
final uri = Uri.tryParse(href); ?.primaryIdentifier;
if (uri == null || uri.host != 'matrix.to') return false; return userId != null;
final userId = uri.fragment.split('/').last;
if (userId.sigil != '@') return false;
return true;
} }
@override @override
@ -403,83 +399,40 @@ class UserPillExtension extends HtmlExtension {
ExtensionContext context, ExtensionContext context,
Map<StyledElement, InlineSpan> Function() parseChildren, Map<StyledElement, InlineSpan> Function() parseChildren,
) { ) {
final href = context.element!.attributes['href']!;
final uri = Uri.parse(href);
final userId = uri.fragment.split('/').last;
final user = room.unsafeGetUserFromMemoryOrFallback(userId);
return WidgetSpan(
child: MatrixPill(
name: user.calcDisplayname(),
avatar: user.avatarUrl,
uri: href,
outerContext: this.context,
),
);
}
}
class RoomPillExtension extends HtmlExtension {
final Client client;
final BuildContext context;
RoomPillExtension(this.context, this.client);
@override
Set<String> get supportedTags => {'a'};
@override
bool matches(ExtensionContext context) {
if (context.elementName != 'a') return false;
final href = context.element?.attributes['href']; final href = context.element?.attributes['href'];
if (href == null) return false; final matrixId = href?.parseIdentifierIntoParts()?.primaryIdentifier;
final uri = Uri.tryParse(href); if (href == null || matrixId == null) {
if (uri == null || uri.host != 'matrix.to') return false; return TextSpan(text: context.innerHtml);
final roomId = Uri.decodeComponent(uri.fragment.split('/').last); }
if (!{'#', '!'}.contains(roomId.sigil)) return false; if (matrixId.sigil == '@') {
return true; final user = room.unsafeGetUserFromMemoryOrFallback(matrixId);
}
@override
InlineSpan build(
ExtensionContext context,
Map<StyledElement, InlineSpan> Function() parseChildren,
) {
final href = context.element!.attributes['href']!;
final uri = Uri.parse(href);
final roomId = Uri.decodeComponent(uri.fragment.split('/').last);
final room = roomId.sigil == '!'
? client.getRoomById(roomId)
: client.getRoomByAlias(roomId);
if (room != null) {
return WidgetSpan( return WidgetSpan(
child: MatrixPill( child: MatrixPill(
name: room.getLocalizedDisplayname(), key: Key('user_pill_$matrixId'),
avatar: room.avatar, name: user.calcDisplayname(),
avatar: user.avatarUrl,
uri: href, uri: href,
outerContext: this.context, outerContext: this.context,
), ),
); );
} }
if (matrixId.sigil == '#' || matrixId.sigil == '!') {
return WidgetSpan( final room = matrixId.sigil == '!'
child: FutureBuilder<QueryPublicRoomsResponse>( ? this.room.client.getRoomById(matrixId)
future: client.queryPublicRooms( : this.room.client.getRoomByAlias(matrixId);
server: roomId.domain, if (room != null) {
filter: PublicRoomQueryFilter( return WidgetSpan(
genericSearchTerm: roomId, child: MatrixPill(
), name: room.getLocalizedDisplayname(),
), avatar: room.avatar,
builder: (context, snapshot) {
final room = snapshot.data;
return MatrixPill(
name: room?.chunk.singleOrNull?.name ?? roomId,
avatar: room?.chunk.singleOrNull?.avatarUrl,
uri: href, uri: href,
outerContext: this.context, outerContext: this.context,
); ),
}, );
), }
); }
return TextSpan(text: context.innerHtml);
} }
} }