[client] move paste action handling to ExplorerView

This commit is contained in:
Abhishek Shroff
2024-10-03 13:22:40 +05:30
parent d6747dbbd0
commit c9b1683c11
2 changed files with 56 additions and 53 deletions
@@ -1,5 +1,3 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:phylum/app_shortcuts.dart';
@@ -9,7 +7,6 @@ import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:phylum/ui/preview/resource_preview.dart';
import 'package:phylum/util/dialogs.dart';
import 'package:phylum/util/upload_utils.dart';
import 'package:provider/provider.dart';
import 'package:super_clipboard/super_clipboard.dart';
@@ -81,56 +78,6 @@ class ExplorerActions extends StatelessWidget {
await SystemClipboard.instance?.write(items);
return null;
}),
PasteFromClipboardIntent: CallbackAction<PasteFromClipboardIntent>(onInvoke: (i) async {
// TODO: Move to top-level nav
final account = context.read<PhylumAccount>();
final folderId = context.read<ExplorerViewController>().folderId;
final openUri = account.apiClient.createUri('/open');
final clipboard = SystemClipboard.instance;
if (clipboard == null) {
return;
}
final reader = await clipboard.read();
final paths = <String>[];
final cutResources = <Resource>[];
final copyResources = <Resource>[];
for (final item in reader.items) {
final c = Completer<String?>();
item.getValue(Formats.fileUri, (value) => c.complete(value?.toFilePath()), onError: (value) => c.complete(null));
final filePath = await c.future;
if (filePath != null) {
paths.add(filePath);
} else {
final c = Completer<Uri?>();
item.getValue(Formats.uri, (value) {
c.complete(value?.uri);
}, onError: (value) => c.complete(null));
final uri = await c.future;
if (uri != null) {
if (uri.authority == openUri.authority && uri.path == openUri.path && uri.queryParameters.containsKey('id')) {
final resourceId = uri.queryParameters['id']!;
final cut = uri.queryParameters.containsKey('cut');
final resource = await account.resourceRepository.getResource(resourceId);
if (resource != null) {
(cut ? cutResources : copyResources).add(resource);
}
}
}
}
}
if (!context.mounted) return;
uploadRecursive(context, folderId, paths);
final parent = await account.resourceRepository.getResource(folderId);
if (parent != null) {
for (final r in cutResources) {
account.addAction(ResourceMoveAction(r: r, parent: parent));
}
}
await SystemClipboard.instance?.write([]);
return null;
}),
},
child: child,
);
+56
View File
@@ -1,7 +1,14 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_state_notifier/flutter_state_notifier.dart';
import 'package:phylum/app_shortcuts.dart';
import 'package:phylum/libphylum/actions/action_resource_move.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:phylum/util/upload_utils.dart';
import 'package:provider/provider.dart';
import 'package:super_clipboard/super_clipboard.dart';
import 'explorer_view_controller.dart';
import 'folder_empty_view.dart';
@@ -23,6 +30,55 @@ class ExplorerView extends StatelessWidget {
actions: {
NextFocusIntent: CallbackAction<NextFocusIntent>(onInvoke: (i) => null),
PreviousFocusIntent: CallbackAction<PreviousFocusIntent>(onInvoke: (i) => null),
PasteFromClipboardIntent: CallbackAction<PasteFromClipboardIntent>(onInvoke: (i) async {
// TODO: Move to top-level nav
final account = context.read<PhylumAccount>();
final openUri = account.apiClient.createUri('/open');
final clipboard = SystemClipboard.instance;
if (clipboard == null) {
return;
}
final reader = await clipboard.read();
final paths = <String>[];
final cutResources = <Resource>[];
final copyResources = <Resource>[];
for (final item in reader.items) {
final c = Completer<String?>();
item.getValue(Formats.fileUri, (value) => c.complete(value?.toFilePath()), onError: (value) => c.complete(null));
final filePath = await c.future;
if (filePath != null) {
paths.add(filePath);
} else {
final c = Completer<Uri?>();
item.getValue(Formats.uri, (value) {
c.complete(value?.uri);
}, onError: (value) => c.complete(null));
final uri = await c.future;
if (uri != null) {
if (uri.authority == openUri.authority && uri.path == openUri.path && uri.queryParameters.containsKey('id')) {
final resourceId = uri.queryParameters['id']!;
final cut = uri.queryParameters.containsKey('cut');
final resource = await account.resourceRepository.getResource(resourceId);
if (resource != null) {
(cut ? cutResources : copyResources).add(resource);
}
}
}
}
}
if (!context.mounted) return;
uploadRecursive(context, folderId, paths);
final parent = await account.resourceRepository.getResource(folderId);
if (parent != null) {
for (final r in cutResources) {
account.addAction(ResourceMoveAction(r: r, parent: parent));
}
}
await SystemClipboard.instance?.write([]);
return null;
}),
},
child: ExplorerView._(key: ValueKey(folderId)),
),