forked from Henry-Hiles/nexus
fix html rendering for image bodies
This commit is contained in:
parent
d77c89d0a3
commit
cb22bdc314
1 changed files with 88 additions and 85 deletions
|
|
@ -51,6 +51,37 @@ class RoomChat extends HookConsumerWidget {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
final danger = theme.colorScheme.error;
|
final danger = theme.colorScheme.error;
|
||||||
|
|
||||||
|
Widget getTextWidget(TextMessage message) => Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Html(
|
||||||
|
textStyle: message.metadata?["big"] == true
|
||||||
|
? TextStyle(fontSize: 32)
|
||||||
|
: null,
|
||||||
|
message.text
|
||||||
|
.replaceAllMapped(
|
||||||
|
RegExp(
|
||||||
|
"(<a\\b[^>]*>.*?<\\/a>)|(\\bhttps?:\\/\\/[^\\s<]+)",
|
||||||
|
caseSensitive: false,
|
||||||
|
),
|
||||||
|
(m) {
|
||||||
|
// If it's already an <a> tag, leave it unchanged
|
||||||
|
if (m.group(1) != null) {
|
||||||
|
return m.group(1)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, wrap the bare URL
|
||||||
|
final url = m.group(2)!;
|
||||||
|
return "<a href=\"$url\">$url</a>";
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.replaceAll("\n", "<br class=\"fake-break\"/>"),
|
||||||
|
),
|
||||||
|
if (message.editedAt != null)
|
||||||
|
Text("(edited)", style: theme.textTheme.labelSmall),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
if (room == null || userId == null || room.metadata?.id == null) {
|
if (room == null || userId == null || room.metadata?.id == null) {
|
||||||
return Center(
|
return Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
|
|
@ -401,44 +432,7 @@ class RoomChat extends HookConsumerWidget {
|
||||||
required bool isSentByMe,
|
required bool isSentByMe,
|
||||||
MessageGroupStatus? groupStatus,
|
MessageGroupStatus? groupStatus,
|
||||||
}) => FlyerChatTextMessage(
|
}) => FlyerChatTextMessage(
|
||||||
customWidget: Column(
|
customWidget: getTextWidget(message),
|
||||||
crossAxisAlignment:
|
|
||||||
CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Html(
|
|
||||||
textStyle:
|
|
||||||
message.metadata?["big"] == true
|
|
||||||
? TextStyle(fontSize: 32)
|
|
||||||
: null,
|
|
||||||
message.text
|
|
||||||
.replaceAllMapped(
|
|
||||||
RegExp(
|
|
||||||
"(<a\\b[^>]*>.*?<\\/a>)|(\\bhttps?:\\/\\/[^\\s<]+)",
|
|
||||||
caseSensitive: false,
|
|
||||||
),
|
|
||||||
(m) {
|
|
||||||
// If it's already an <a> tag, leave it unchanged
|
|
||||||
if (m.group(1) != null) {
|
|
||||||
return m.group(1)!;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, wrap the bare URL
|
|
||||||
final url = m.group(2)!;
|
|
||||||
return "<a href=\"$url\">$url</a>";
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.replaceAll(
|
|
||||||
"\n",
|
|
||||||
"<br class=\"fake-break\"/>",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
if (message.editedAt != null)
|
|
||||||
Text(
|
|
||||||
"(edited)",
|
|
||||||
style: theme.textTheme.labelSmall,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
topWidget: TopWidget(
|
topWidget: TopWidget(
|
||||||
message,
|
message,
|
||||||
groupStatus: groupStatus,
|
groupStatus: groupStatus,
|
||||||
|
|
@ -473,25 +467,33 @@ class RoomChat extends HookConsumerWidget {
|
||||||
index, {
|
index, {
|
||||||
required bool isSentByMe,
|
required bool isSentByMe,
|
||||||
MessageGroupStatus? groupStatus,
|
MessageGroupStatus? groupStatus,
|
||||||
}) => Column(
|
}) {
|
||||||
|
final textMessage =
|
||||||
|
message.text?.isNotEmpty == true
|
||||||
|
? TextMessage(
|
||||||
|
id: "${message.id}-text",
|
||||||
|
authorId: message.authorId,
|
||||||
|
text: message.text!,
|
||||||
|
)
|
||||||
|
: null;
|
||||||
|
return Column(
|
||||||
spacing: 4,
|
spacing: 4,
|
||||||
crossAxisAlignment: isSentByMe
|
crossAxisAlignment: isSentByMe
|
||||||
? CrossAxisAlignment.end
|
? CrossAxisAlignment.end
|
||||||
: CrossAxisAlignment.start,
|
: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(height: 12),
|
SizedBox(height: 12),
|
||||||
if (message.text?.isNotEmpty == true)
|
if (textMessage != null)
|
||||||
FlyerChatTextMessage(
|
FlyerChatTextMessage(
|
||||||
|
customWidget: getTextWidget(
|
||||||
|
textMessage,
|
||||||
|
),
|
||||||
topWidget: TopWidget(
|
topWidget: TopWidget(
|
||||||
message,
|
message,
|
||||||
groupStatus: groupStatus,
|
groupStatus: groupStatus,
|
||||||
alwaysShow: true,
|
alwaysShow: true,
|
||||||
),
|
),
|
||||||
message: TextMessage(
|
message: textMessage,
|
||||||
id: "${message.id}-text",
|
|
||||||
authorId: message.authorId,
|
|
||||||
text: message.text!,
|
|
||||||
),
|
|
||||||
index: index,
|
index: index,
|
||||||
),
|
),
|
||||||
FlyerChatImageMessage(
|
FlyerChatImageMessage(
|
||||||
|
|
@ -526,7 +528,8 @@ class RoomChat extends HookConsumerWidget {
|
||||||
index: index,
|
index: index,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
);
|
||||||
|
},
|
||||||
fileMessageBuilder:
|
fileMessageBuilder:
|
||||||
(
|
(
|
||||||
_,
|
_,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue