[client] Download older versions

This commit is contained in:
Abhishek Shroff
2025-06-23 18:31:27 +05:30
parent 526ecc31d7
commit 821b1beaa7
4 changed files with 29 additions and 13 deletions

View File

@@ -2,8 +2,9 @@ import 'package:flutter/material.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/phylum_account.dart';
Future<void> downloadResource(BuildContext context, Resource r) => throw UnimplementedError();
Future<void> downloadResource(BuildContext context, Resource r, {ResourceVersion? version}) =>
throw UnimplementedError();
class DownloadManager with ChangeNotifier {
Future<void> downloadResource(PhylumAccount account, Resource r) async {}
Future<void> downloadResource(PhylumAccount account, Resource r, {ResourceVersion? version}) async {}
}

View File

@@ -8,8 +8,8 @@ import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:provider/provider.dart';
Future<bool> downloadResource(BuildContext context, Resource r) async {
await context.read<DownloadManager>().downloadResource(context.read(), r);
Future<bool> downloadResource(BuildContext context, Resource r, {ResourceVersion? version}) async {
await context.read<DownloadManager>().downloadResource(context.read(), r, version: version);
return true;
}
@@ -73,17 +73,20 @@ class DownloadManager with ChangeNotifier {
_downloader.start();
}
Future<void> downloadResource(PhylumAccount account, Resource r) async {
Future<void> 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,

View File

@@ -7,7 +7,7 @@ import 'package:phylum/libphylum/responses/responses.dart';
import 'package:provider/provider.dart';
import 'package:web/web.dart' as web;
Future<bool> downloadResource(BuildContext context, Resource r) async {
Future<bool> downloadResource(BuildContext context, Resource r, {ResourceVersion? version}) async {
final apiClient = context.read<PhylumAccount>().apiClient;
final success = await apiClient
.sendRequest(const SetCookieRequest(), (_, response) => parseEmptyResponse(response))
@@ -15,15 +15,19 @@ Future<bool> 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<void> downloadResource(PhylumAccount account, Resource r) async {}
Future<void> downloadResource(PhylumAccount account, Resource r, {String? versionId}) async {}
}

View File

@@ -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);
}),
],
),
)),