Add file card

This commit is contained in:
Henry Hiles 2026-05-19 19:45:39 -04:00
commit 2344ed887d
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
3 changed files with 61 additions and 2 deletions

View file

@ -0,0 +1,22 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart";
extension SizeToString on int {
String get sizeAsString {
const IListConst<String> suffixes = IListConst([
"B",
"KB",
"MB",
"GB",
"TB",
"PB",
]);
var i = 0;
var size = toDouble();
while (size > 1024 && i < suffixes.length - 1) {
size /= 1024;
i++;
}
return "${size.toStringAsFixed(2)} ${suffixes[i]}";
}
}

View file

@ -0,0 +1,29 @@
import "package:flutter/material.dart";
import "package:nexus/helpers/extensions/size_to_string.dart";
import "package:nexus/models/info/file.dart";
class FileCard extends StatelessWidget {
final Uri uri;
final FileInfo? info;
final String? filename;
const FileCard(this.uri, this.info, {this.filename, super.key});
@override
Widget build(BuildContext context) => SizedBox(
width: 320,
child: Card(
color: Theme.of(context).colorScheme.surfaceContainer,
child: ListTile(
leading: Icon(Icons.file_copy),
title: Text(
filename ?? "file",
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
subtitle: info?.size == null ? null : Text(info!.size!.sizeAsString),
// TODO: Downloading files
trailing: IconButton(onPressed: null, icon: Icon(Icons.download)),
),
),
);
}

View file

@ -26,6 +26,7 @@ import "package:nexus/widgets/loading.dart";
import "package:nexus/widgets/players/video.dart"; import "package:nexus/widgets/players/video.dart";
import "package:nexus/widgets/players/audio.dart"; import "package:nexus/widgets/players/audio.dart";
import "package:nexus/widgets/renderers/membership.dart"; import "package:nexus/widgets/renderers/membership.dart";
import "package:nexus/widgets/file_card.dart";
import "package:timeago/timeago.dart"; import "package:timeago/timeago.dart";
import "package:flutter_linkify/flutter_linkify.dart"; import "package:flutter_linkify/flutter_linkify.dart";
@ -238,8 +239,15 @@ class EventRenderer extends ConsumerWidget {
:final info, :final info,
) => ) =>
AudioPlayer(url, info), AudioPlayer(url, info),
// FileMessageContent(:final info) => FileMessageContent(
// FileRenderer(url, info), :final info,
:final filename,
) =>
FileCard(
url,
info,
filename: filename,
),
ImageMessageContent(:final info) => ExpandableImage( ImageMessageContent(:final info) => ExpandableImage(
url.toString(), url.toString(),
child: ClipRRect( child: ClipRRect(