mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-05-01 17:49:45 -05:00
[client] move paste action handling to ExplorerView
This commit is contained in:
@@ -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,
|
||||
);
|
||||
|
||||
@@ -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)),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user