Fix inline widgets

This commit is contained in:
Henry Hiles 2025-12-26 17:24:02 -05:00
commit 3ab8451a64
No known key found for this signature in database
7 changed files with 40 additions and 33 deletions

View file

@ -34,6 +34,7 @@ New Value: ${newValue is AsyncData ? newValue.value : newValue}
void showError(Object error, [StackTrace? stackTrace]) { void showError(Object error, [StackTrace? stackTrace]) {
if (error.toString().contains("DioException")) return; if (error.toString().contains("DioException")) return;
if (error.toString().contains("UTF-16")) return; if (error.toString().contains("UTF-16")) return;
if (error.toString().contains("Invalid image data")) return;
debugPrintStack(stackTrace: stackTrace, label: error.toString()); debugPrintStack(stackTrace: stackTrace, label: error.toString());
if (navigatorKey.currentContext != null) { if (navigatorKey.currentContext != null) {

View file

@ -10,7 +10,7 @@ import "package:nexus/models/image_data.dart";
import "package:nexus/widgets/chat_page/html/mention_chip.dart"; import "package:nexus/widgets/chat_page/html/mention_chip.dart";
import "package:nexus/widgets/chat_page/html/spoiler_text.dart"; import "package:nexus/widgets/chat_page/html/spoiler_text.dart";
import "package:nexus/widgets/chat_page/html/code_block.dart"; import "package:nexus/widgets/chat_page/html/code_block.dart";
import "package:nexus/widgets/chat_page/quoted.dart"; import "package:nexus/widgets/chat_page/html/quoted.dart";
import "package:nexus/widgets/error_dialog.dart"; import "package:nexus/widgets/error_dialog.dart";
class Html extends ConsumerWidget { class Html extends ConsumerWidget {
@ -23,7 +23,7 @@ class Html extends ConsumerWidget {
html, html,
customWidgetBuilder: (element) { customWidgetBuilder: (element) {
if (element.attributes.keys.contains("data-mx-spoiler")) { if (element.attributes.keys.contains("data-mx-spoiler")) {
return SpoilerText(text: element.text); return InlineCustomWidget(child: SpoilerText(text: element.text));
} }
final height = int.tryParse(element.attributes["height"] ?? "") ?? 300; final height = int.tryParse(element.attributes["height"] ?? "") ?? 300;
@ -42,7 +42,7 @@ class Html extends ConsumerWidget {
"a" => "a" =>
Uri.tryParse(element.attributes["href"] ?? "")?.host == "matrix.to" Uri.tryParse(element.attributes["href"] ?? "")?.host == "matrix.to"
? MentionChip(element.text) ? InlineCustomWidget(child: MentionChip(element.text))
: null, : null,
"img" => "img" =>

View file

@ -1,5 +1,4 @@
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart";
import "package:matrix/matrix.dart"; import "package:matrix/matrix.dart";
class MentionChip extends StatelessWidget { class MentionChip extends StatelessWidget {
@ -7,8 +6,7 @@ class MentionChip extends StatelessWidget {
const MentionChip(this.label, {super.key}); const MentionChip(this.label, {super.key});
@override @override
Widget build(BuildContext context) => InlineCustomWidget( Widget build(BuildContext context) => ActionChip(
child: ActionChip(
label: Text( label: Text(
label.parseIdentifierIntoParts()?.primaryIdentifier ?? label, label.parseIdentifierIntoParts()?.primaryIdentifier ?? label,
style: TextStyle( style: TextStyle(
@ -21,6 +19,5 @@ class MentionChip extends StatelessWidget {
// TODO: Open room or join room dialog, or user popover // TODO: Open room or join room dialog, or user popover
showAboutDialog(context: context); showAboutDialog(context: context);
}, },
),
); );
} }

View file

@ -1,6 +1,5 @@
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_hooks/flutter_hooks.dart"; import "package:flutter_hooks/flutter_hooks.dart";
import "package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart";
class SpoilerText extends HookWidget { class SpoilerText extends HookWidget {
final String text; final String text;
@ -11,8 +10,7 @@ class SpoilerText extends HookWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final revealed = useState(false); final revealed = useState(false);
return InlineCustomWidget( return InkWell(
child: InkWell(
onTap: () => revealed.value = !revealed.value, onTap: () => revealed.value = !revealed.value,
child: AnimatedContainer( child: AnimatedContainer(
duration: const Duration(milliseconds: 100), duration: const Duration(milliseconds: 100),
@ -26,7 +24,6 @@ class SpoilerText extends HookWidget {
style: TextStyle(color: revealed.value ? null : Colors.transparent), style: TextStyle(color: revealed.value ? null : Colors.transparent),
), ),
), ),
),
); );
} }
} }

View file

@ -262,6 +262,18 @@ class RoomChat extends HookConsumerWidget {
groupStatus: groupStatus, groupStatus: groupStatus,
alwaysShow: true, alwaysShow: true,
), ),
errorBuilder:
(context, error, stackTrace) =>
Center(
child: Text(
"Image Failed to Load",
style: TextStyle(
color: Theme.of(
context,
).colorScheme.error,
),
),
),
message: message, message: message,
index: index, index: index,
headers: room.roomData.client.headers, headers: room.roomData.client.headers,

View file

@ -3,7 +3,7 @@ import "package:flutter/material.dart";
import "package:flutter_chat_core/flutter_chat_core.dart"; import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_chat_ui/flutter_chat_ui.dart"; import "package:flutter_chat_ui/flutter_chat_ui.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/widgets/chat_page/quoted.dart"; import "package:nexus/widgets/chat_page/html/quoted.dart";
class TopWidget extends ConsumerWidget { class TopWidget extends ConsumerWidget {
final Message message; final Message message;