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

@ -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/spoiler_text.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";
class Html extends ConsumerWidget {
@ -23,7 +23,7 @@ class Html extends ConsumerWidget {
html,
customWidgetBuilder: (element) {
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;
@ -42,7 +42,7 @@ class Html extends ConsumerWidget {
"a" =>
Uri.tryParse(element.attributes["href"] ?? "")?.host == "matrix.to"
? MentionChip(element.text)
? InlineCustomWidget(child: MentionChip(element.text))
: null,
"img" =>

View file

@ -1,5 +1,4 @@
import "package:flutter/material.dart";
import "package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart";
import "package:matrix/matrix.dart";
class MentionChip extends StatelessWidget {
@ -7,20 +6,18 @@ class MentionChip extends StatelessWidget {
const MentionChip(this.label, {super.key});
@override
Widget build(BuildContext context) => InlineCustomWidget(
child: ActionChip(
label: Text(
label.parseIdentifierIntoParts()?.primaryIdentifier ?? label,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.onPrimary,
),
Widget build(BuildContext context) => ActionChip(
label: Text(
label.parseIdentifierIntoParts()?.primaryIdentifier ?? label,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.onPrimary,
),
backgroundColor: Theme.of(context).colorScheme.primary,
onPressed: () {
// TODO: Open room or join room dialog, or user popover
showAboutDialog(context: context);
},
),
backgroundColor: Theme.of(context).colorScheme.primary,
onPressed: () {
// TODO: Open room or join room dialog, or user popover
showAboutDialog(context: context);
},
);
}

View file

@ -0,0 +1,16 @@
import "package:flutter/material.dart";
class Quoted extends StatelessWidget {
final Widget child;
const Quoted(this.child, {super.key});
@override
Widget build(BuildContext context) => Container(
decoration: BoxDecoration(
border: Border(
left: BorderSide(width: 4, color: Theme.of(context).dividerColor),
),
),
child: Padding(padding: EdgeInsets.only(left: 8), child: child),
);
}

View file

@ -1,6 +1,5 @@
import "package:flutter/material.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 {
final String text;
@ -11,20 +10,18 @@ class SpoilerText extends HookWidget {
Widget build(BuildContext context) {
final revealed = useState(false);
return InlineCustomWidget(
child: InkWell(
onTap: () => revealed.value = !revealed.value,
child: AnimatedContainer(
duration: const Duration(milliseconds: 100),
padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
decoration: BoxDecoration(
color: revealed.value ? Colors.transparent : Colors.blueGrey,
borderRadius: BorderRadius.circular(4),
),
child: Text(
text,
style: TextStyle(color: revealed.value ? null : Colors.transparent),
),
return InkWell(
onTap: () => revealed.value = !revealed.value,
child: AnimatedContainer(
duration: const Duration(milliseconds: 100),
padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
decoration: BoxDecoration(
color: revealed.value ? Colors.transparent : Colors.blueGrey,
borderRadius: BorderRadius.circular(4),
),
child: Text(
text,
style: TextStyle(color: revealed.value ? null : Colors.transparent),
),
),
);