Browse Source

refactor(neon_files): Use WebDAV client progress logic

Signed-off-by: jld3103 <jld3103yt@gmail.com>
pull/584/head
jld3103 1 year ago
parent
commit
5379f23eec
No known key found for this signature in database
GPG Key ID: 9062417B9E8EB7B3
  1. 16
      packages/neon/neon_files/lib/blocs/files.dart
  2. 4
      packages/neon/neon_files/lib/models/file_details.dart
  3. 1
      packages/neon/neon_files/lib/neon_files.dart
  4. 55
      packages/neon/neon_files/lib/utils/task.dart

16
packages/neon/neon_files/lib/blocs/files.dart

@ -160,16 +160,12 @@ class FilesBloc extends InteractiveBloc implements FilesBlocEvents, FilesBlocSta
void uploadFile(final List<String> path, final String localPath) {
wrapAction(
() async {
final file = File(localPath);
// ignore: avoid_slow_async_io
final stat = await file.stat();
final task = FilesUploadTask(
path: path,
size: stat.size,
lastModified: stat.modified,
file: File(localPath),
);
tasks.add(tasks.value..add(task));
await _uploadQueue.add(() => task.execute(account.client, file.openRead()));
await _uploadQueue.add(() => task.execute(account.client));
tasks.add(tasks.value..remove(task));
},
disableTimeout: true,
@ -180,17 +176,13 @@ class FilesBloc extends InteractiveBloc implements FilesBlocEvents, FilesBlocSta
final List<String> path,
final File file,
) async {
final sink = file.openWrite();
try {
final task = FilesDownloadTask(
path: path,
file: file,
);
tasks.add(tasks.value..add(task));
await _downloadQueue.add(() => task.execute(account.client, sink));
await _downloadQueue.add(() => task.execute(account.client));
tasks.add(tasks.value..remove(task));
} finally {
await sink.close();
}
}
FilesBrowserBloc getNewFilesBrowserBloc() => FilesBrowserBloc(_requestManager, options, account);

4
packages/neon/neon_files/lib/models/file_details.dart

@ -29,8 +29,8 @@ class FileDetails {
FileDetails.fromUploadTask({
required FilesUploadTask this.task,
}) : path = task.path,
size = task.size,
lastModified = task.lastModified,
size = task.stat.size,
lastModified = task.stat.modified,
isDirectory = false,
etag = null,
mimeType = null,

1
packages/neon/neon_files/lib/neon_files.dart

@ -2,7 +2,6 @@ library neon_files;
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:collection/collection.dart';
import 'package:file_icons/file_icons.dart';

55
packages/neon/neon_files/lib/utils/task.dart

@ -3,10 +3,13 @@ part of '../neon_files.dart';
sealed class FilesTask {
FilesTask({
required this.path,
required this.file,
});
final List<String> path;
final File file;
@protected
final streamController = StreamController<double>();
@ -17,50 +20,38 @@ sealed class FilesTask {
class FilesDownloadTask extends FilesTask {
FilesDownloadTask({
required super.path,
required super.file,
});
Future execute(final NextcloudClient client, final IOSink sink) async {
final completer = Completer();
final response = await client.webdav.getStream(path.join('/'));
var downloaded = 0;
response.listen((final chunk) async {
sink.add(chunk);
downloaded += chunk.length;
streamController.add(downloaded / response.contentLength);
if (downloaded >= response.contentLength) {
completer.complete();
}
});
return completer.future;
Future execute(final NextcloudClient client) async {
await client.webdav.getFile(
path.join('/'),
file,
onProgress: (final progress) {
streamController.add(progress);
},
);
}
}
class FilesUploadTask extends FilesTask {
FilesUploadTask({
required super.path,
required this.size,
required this.lastModified,
required super.file,
});
final int size;
final DateTime lastModified;
Future execute(final NextcloudClient client, final Stream<List<int>> stream) async {
var uploaded = 0;
await client.webdav.putStream(
stream.map((final chunk) {
uploaded += chunk.length;
streamController.add(uploaded / size);
FileStat? _stat;
FileStat get stat => _stat ??= file.statSync();
return Uint8List.fromList(chunk);
}),
Future execute(final NextcloudClient client) async {
await client.webdav.putFile(
file,
stat,
path.join('/'),
lastModified: lastModified,
lastModified: stat.modified,
onProgress: (final progress) {
streamController.add(progress);
},
);
}
}

Loading…
Cancel
Save