diff --git a/client/lib/integrations/download_manager_stub.dart b/client/lib/integrations/download_manager_stub.dart index acb84e90..849b8629 100644 --- a/client/lib/integrations/download_manager_stub.dart +++ b/client/lib/integrations/download_manager_stub.dart @@ -2,8 +2,9 @@ import 'package:flutter/material.dart'; import 'package:phylum/libphylum/db/db.dart'; import 'package:phylum/libphylum/phylum_account.dart'; -Future downloadResource(BuildContext context, Resource r) => throw UnimplementedError(); +Future downloadResource(BuildContext context, Resource r, {ResourceVersion? version}) => + throw UnimplementedError(); class DownloadManager with ChangeNotifier { - Future downloadResource(PhylumAccount account, Resource r) async {} + Future downloadResource(PhylumAccount account, Resource r, {ResourceVersion? version}) async {} } diff --git a/client/lib/integrations/download_manager_vm.dart b/client/lib/integrations/download_manager_vm.dart index 4127a9be..88750d6b 100644 --- a/client/lib/integrations/download_manager_vm.dart +++ b/client/lib/integrations/download_manager_vm.dart @@ -8,8 +8,8 @@ import 'package:phylum/libphylum/db/db.dart'; import 'package:phylum/libphylum/phylum_account.dart'; import 'package:provider/provider.dart'; -Future downloadResource(BuildContext context, Resource r) async { - await context.read().downloadResource(context.read(), r); +Future downloadResource(BuildContext context, Resource r, {ResourceVersion? version}) async { + await context.read().downloadResource(context.read(), r, version: version); return true; } @@ -73,17 +73,20 @@ class DownloadManager with ChangeNotifier { _downloader.start(); } - Future downloadResource(PhylumAccount account, Resource r) async { + Future downloadResource(PhylumAccount account, Resource r, {ResourceVersion? version}) async { await _downloader.ready; if (Platform.isAndroid || Platform.isAndroid) { await Permission.notification.request(); } final uri = account.apiClient.createUriBuilder('/api/v1/fs/contents/${r.id}:'); - final version = await account.db.latestVersion(r.id).getSingleOrNull(); - final mimeType = version?.mimeType ?? MimeTypeResolver().lookup(r.name) ?? 'application/octet-stream'; + if (version != null) { + uri.queryParameters['version'] = version.id; + } + final v = version ?? await account.db.latestVersion(r.id).getSingleOrNull(); + final mimeType = v?.mimeType ?? MimeTypeResolver().lookup(r.name) ?? 'application/octet-stream'; final task = DownloadTask( url: uri.toString(), - filename: r.name, + filename: version == null ? r.name : '${r.name}-${version.created.toIso8601String()}', displayName: r.name, headers: account.apiClient.requestHeaders, updates: Updates.statusAndProgress, diff --git a/client/lib/integrations/download_manager_web.dart b/client/lib/integrations/download_manager_web.dart index 8dfb7431..d2b9d659 100644 --- a/client/lib/integrations/download_manager_web.dart +++ b/client/lib/integrations/download_manager_web.dart @@ -7,7 +7,7 @@ import 'package:phylum/libphylum/responses/responses.dart'; import 'package:provider/provider.dart'; import 'package:web/web.dart' as web; -Future downloadResource(BuildContext context, Resource r) async { +Future downloadResource(BuildContext context, Resource r, {ResourceVersion? version}) async { final apiClient = context.read().apiClient; final success = await apiClient .sendRequest(const SetCookieRequest(), (_, response) => parseEmptyResponse(response)) @@ -15,15 +15,19 @@ Future downloadResource(BuildContext context, Resource r) async { if (!success) { return false; } - final uri = apiClient.createUriBuilder('/api/v1/fs/contents/${r.id}:')..queryParameters['download'] = ''; + final uri = apiClient.createUriBuilder('/api/v1/fs/contents/${r.id}:'); + uri.queryParameters['download'] = ''; + if (version != null) { + uri.queryParameters['version'] = version.id; + } web.HTMLAnchorElement() ..target = '_blank' ..href = uri.toString() - ..download = r.name + ..download = version == null ? r.name : '${r.name}-${version.created.toIso8601String()}' ..click(); return true; } class DownloadManager with ChangeNotifier { - Future downloadResource(PhylumAccount account, Resource r) async {} + Future downloadResource(PhylumAccount account, Resource r, {String? versionId}) async {} } diff --git a/client/lib/ui/explorer/resource_versions_view.dart b/client/lib/ui/explorer/resource_versions_view.dart index 430df213..7bb2c2e8 100644 --- a/client/lib/ui/explorer/resource_versions_view.dart +++ b/client/lib/ui/explorer/resource_versions_view.dart @@ -1,6 +1,8 @@ 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/util/file_size.dart'; import 'package:phylum/util/time.dart'; @@ -39,7 +41,13 @@ class ResourceVersionsView extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ IconButton(icon: Icon(Icons.remove_red_eye), onPressed: () {}), - IconButton(icon: Icon(Icons.download), onPressed: () {}), + 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); + }), ], ), )),