add pill support
This commit is contained in:
parent
3ddd6f5c41
commit
48a5cf3b3d
|
@ -9,8 +9,9 @@ class HtmlMessage extends StatelessWidget {
|
||||||
final String html;
|
final String html;
|
||||||
final Color textColor;
|
final Color textColor;
|
||||||
final int maxLines;
|
final int maxLines;
|
||||||
|
final Room room;
|
||||||
|
|
||||||
const HtmlMessage({this.html, this.textColor, this.maxLines});
|
const HtmlMessage({this.html, this.textColor, this.maxLines, this.room});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -36,6 +37,57 @@ class HtmlMessage extends StatelessWidget {
|
||||||
method: ThumbnailMethod.scale,
|
method: ThumbnailMethod.scale,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
getPillInfo: (String identifier) async {
|
||||||
|
if (room == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (identifier[0] == '@') {
|
||||||
|
// we have a user pill
|
||||||
|
final user = room.getState('m.room.member', identifier);
|
||||||
|
if (user != null) {
|
||||||
|
return user.content;
|
||||||
|
}
|
||||||
|
// there might still be a profile...
|
||||||
|
final profile = await room.client.getProfileFromUserId(identifier);
|
||||||
|
if (profile != null) {
|
||||||
|
return {
|
||||||
|
'displayname': profile.displayname,
|
||||||
|
'avatar_url': profile.avatarUrl.toString(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (identifier[0] == '#') {
|
||||||
|
// we have an alias pill
|
||||||
|
for (final r in room.client.rooms) {
|
||||||
|
final state = r.getState('m.room.canonical_alias');
|
||||||
|
if (
|
||||||
|
state != null && (
|
||||||
|
(state.content['alias'] is String && state.content['alias'] == identifier) ||
|
||||||
|
(state.content['alt_aliases'] is List && state.content['alt_aliases'].contains(identifier))
|
||||||
|
)) {
|
||||||
|
// we have a room!
|
||||||
|
return {
|
||||||
|
'displayname': identifier,
|
||||||
|
'avatar_url': r.getState('m.room.avatar')?.content['url'],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (identifier[0] == '!') {
|
||||||
|
// we have a room ID pill
|
||||||
|
final r = room.client.getRoomById(identifier);
|
||||||
|
if (r == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
'displayname': r.canonicalAlias,
|
||||||
|
'avatar_url': r.getState('m.room.avatar')?.content['url'],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ class MessageContent extends StatelessWidget {
|
||||||
case MessageTypes.Text:
|
case MessageTypes.Text:
|
||||||
case MessageTypes.Notice:
|
case MessageTypes.Notice:
|
||||||
case MessageTypes.Emote:
|
case MessageTypes.Emote:
|
||||||
|
case MessageTypes.Reply:
|
||||||
if (Matrix.of(context).renderHtml &&
|
if (Matrix.of(context).renderHtml &&
|
||||||
!event.redacted &&
|
!event.redacted &&
|
||||||
event.content['format'] == 'org.matrix.custom.html' &&
|
event.content['format'] == 'org.matrix.custom.html' &&
|
||||||
|
@ -51,12 +52,12 @@ class MessageContent extends StatelessWidget {
|
||||||
return HtmlMessage(
|
return HtmlMessage(
|
||||||
html: html,
|
html: html,
|
||||||
textColor: textColor,
|
textColor: textColor,
|
||||||
|
room: event.room,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// else we fall through to the normal message rendering
|
// else we fall through to the normal message rendering
|
||||||
continue textmessage;
|
continue textmessage;
|
||||||
case MessageTypes.BadEncrypted:
|
case MessageTypes.BadEncrypted:
|
||||||
case MessageTypes.Reply:
|
|
||||||
case MessageTypes.Location:
|
case MessageTypes.Location:
|
||||||
case MessageTypes.None:
|
case MessageTypes.None:
|
||||||
textmessage:
|
textmessage:
|
||||||
|
|
|
@ -33,6 +33,7 @@ class ReplyContent extends StatelessWidget {
|
||||||
? Colors.white
|
? Colors.white
|
||||||
: Theme.of(context).textTheme.bodyText2.color,
|
: Theme.of(context).textTheme.bodyText2.color,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
|
room: replyEvent.room,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
replyBody = Text(
|
replyBody = Text(
|
||||||
|
@ -51,6 +52,7 @@ class ReplyContent extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return Row(
|
return Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Container(
|
Container(
|
||||||
width: 3,
|
width: 3,
|
||||||
|
@ -58,7 +60,7 @@ class ReplyContent extends StatelessWidget {
|
||||||
color: lightText ? Colors.white : Theme.of(context).primaryColor,
|
color: lightText ? Colors.white : Theme.of(context).primaryColor,
|
||||||
),
|
),
|
||||||
SizedBox(width: 6),
|
SizedBox(width: 6),
|
||||||
Expanded(
|
Flexible(
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
|
|
@ -203,7 +203,7 @@ packages:
|
||||||
name: flutter_matrix_html
|
name: flutter_matrix_html
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.0.5"
|
version: "0.0.6"
|
||||||
flutter_plugin_android_lifecycle:
|
flutter_plugin_android_lifecycle:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -54,7 +54,7 @@ dependencies:
|
||||||
open_file: ^3.0.1
|
open_file: ^3.0.1
|
||||||
mime_type: ^0.3.0
|
mime_type: ^0.3.0
|
||||||
bot_toast: ^3.0.0
|
bot_toast: ^3.0.0
|
||||||
flutter_matrix_html: ^0.0.5
|
flutter_matrix_html: ^0.0.6
|
||||||
moor: ^3.0.2
|
moor: ^3.0.2
|
||||||
random_string: ^2.0.1
|
random_string: ^2.0.1
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue