Files
phylum/client/lib/ui/explorer/resource_versions_view.dart
T
2025-07-04 14:15:36 +05:30

68 lines
2.9 KiB
Dart

import 'package:collection/collection.dart';
import 'package:drift/drift.dart' show TableOrViewStatements, OrderingTerm;
import 'package:flutter/material.dart';
import 'package:phylum/integrations/download_manager.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:phylum/ui/file_preview/file_preview_dialog.dart';
import 'package:phylum/util/file_size.dart';
import 'package:phylum/util/time.dart';
import 'package:provider/provider.dart';
class ResourceVersionsView extends StatelessWidget {
final String resourceId;
ResourceVersionsView({required this.resourceId}) : super(key: ValueKey(resourceId));
@override
Widget build(BuildContext context) {
final account = context.read<PhylumAccount>();
return ListTileTheme(
data: ListTileThemeData(
visualDensity: VisualDensity.adaptivePlatformDensity,
titleTextStyle: Theme.of(context).textTheme.labelLarge,
subtitleTextStyle: Theme.of(context).textTheme.bodyLarge,
),
child: StreamBuilder<List<ResourceVersion>>(
stream: (account.db.resourceVersions.select()
..where((v) => v.resourceId.equals(resourceId))
..orderBy([(o) => OrderingTerm.desc(o.created)]))
.watch(),
initialData: const [],
builder: (context, snapshot) {
final versions = snapshot.data ?? const [];
return Column(
mainAxisSize: MainAxisSize.min,
children: [
...versions.mapIndexed((i, v) => ListTile(
title: Text(v.sha256.isEmpty ? 'Unknown' : v.sha256.substring(0, 12)),
subtitle: Text('${v.created.formatShort()} \u2022 ${v.size.formatForDisplay()}'),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(Icons.remove_red_eye),
onPressed: () async {
final resource = await account.db.getResource(resourceId);
if (resource == null || !context.mounted) return;
FilePreviewDialog.showVersions(context, resource, versions, i);
}),
IconButton(
icon: Icon(Icons.download),
onPressed: () async {
final r = await account.db.getResource(resourceId);
if (r == null || !context.mounted) return;
downloadResource(context, r, version: v);
}),
],
),
)),
],
);
}),
);
}
}