preview attachments where possible

Fixes #166
This commit is contained in:
Henry Hiles 2026-11-11 15:40:01 -05:00
commit 4448f183ac
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 99 additions and 68 deletions

View file

@ -12,7 +12,6 @@ import "package:nexus/models/location.dart";
import "package:nexus/models/content/poll_start.dart";
import "package:nexus/models/content/sticker.dart";
import "package:nexus/models/event.dart";
import "package:nexus/widgets/renderers/file_card.dart";
import "package:nexus/widgets/html/html.dart";
import "package:nexus/widgets/lazy_loading/message_avatar.dart";
import "package:nexus/widgets/lazy_loading/message_displayname.dart";
@ -24,8 +23,8 @@ import "package:nexus/widgets/reactions/reaction_row.dart";
import "package:nexus/widgets/common/timestamp.dart";
import "package:nexus/widgets/renderers/url_preview.dart";
import "package:nexus/widgets/renderers/event_preview.dart";
import "package:nexus/widgets/players/video.dart";
import "package:nexus/widgets/players/audio.dart";
import "package:nexus/widgets/renderers/message_media.dart";
import "package:nexus/helpers/extensions/is_media.dart";
import "package:nexus/widgets/renderers/poll.dart";
import "package:nexus/widgets/threads/thread_summary.dart";
@ -125,63 +124,10 @@ class const MessageRenderer(
),
if (!textOnly) ...[
if (event.content
case ImageMessageContent(:final url) ||
FileMessageContent(:final url) ||
VideoMessageContent(:final url) ||
AudioMessageContent(:final url))
if (content.isMedia)
ConstrainedBox(
constraints: .loose(.square(500)),
child: switch (event.content) {
VideoMessageContent(
:final info,
:final file,
:final filename,
:final body,
) =>
VideoPlayer(
url,
info,
encrypted: file != null,
filename: filename ?? body,
),
AudioMessageContent(
:final info,
:final file,
:final filename,
:final body,
) =>
AudioPlayer(
url,
info,
encrypted: file != null,
filename: filename ?? body,
),
FileMessageContent(
:final info,
:final filename,
:final file,
) =>
FileCard(
url,
info,
filename: filename,
encrypted: file != null,
),
ImageMessageContent(
:final info,
:final file,
:final filename,
:final body,
) =>
MessageImage(
url,
info: info,
encrypted: file != null,
filename: filename ?? body,
),
_ => SizedBox.shrink(),
},
child: MessageMedia(content),
),
if (event.lastEditRowId != 0)

View file

@ -0,0 +1,55 @@
import "package:material_ui/material_ui.dart";
import "package:nexus/models/content/message.dart";
import "package:nexus/widgets/players/audio.dart";
import "package:nexus/widgets/players/video.dart";
import "package:nexus/widgets/renderers/file_card.dart";
import "package:nexus/widgets/renderers/message_image.dart";
final class const MessageMedia(final MessageContent content, {super.key})
extends StatelessWidget {
@override
Widget build(BuildContext context) => switch (content) {
VideoMessageContent(
:final url,
:final info,
:final file,
:final filename,
:final body,
) =>
VideoPlayer(
url,
info,
encrypted: file != null,
filename: filename ?? body,
),
AudioMessageContent(
:final url,
:final info,
:final file,
:final filename,
:final body,
) =>
AudioPlayer(
url,
info,
encrypted: file != null,
filename: filename ?? body,
),
FileMessageContent(:final url, :final info, :final filename, :final file) =>
FileCard(url, info, filename: filename, encrypted: file != null),
ImageMessageContent(
:final url,
:final info,
:final file,
:final filename,
:final body,
) =>
MessageImage(
url,
info: info,
encrypted: file != null,
filename: filename ?? body,
),
_ => SizedBox.shrink(),
};
}