From 0126523bc40ad54e9944e918265420f8172b19fa Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Tue, 13 May 2025 21:04:22 +0900 Subject: [PATCH] wip --- .../src/components/MkDrive.folder.vue | 23 +++++++- .../src/components/MkDrive.navFolder.vue | 12 +++- packages/frontend/src/components/MkDrive.vue | 55 ++++++++++++++----- packages/frontend/src/events.ts | 4 +- 4 files changed, 73 insertions(+), 21 deletions(-) diff --git a/packages/frontend/src/components/MkDrive.folder.vue b/packages/frontend/src/components/MkDrive.folder.vue index 520d5088ec..74d5ff5eab 100644 --- a/packages/frontend/src/components/MkDrive.folder.vue +++ b/packages/frontend/src/components/MkDrive.folder.vue @@ -147,7 +147,11 @@ function onDrop(ev: DragEvent) { fileIds: droppedData.map(f => f.id), folderId: props.folder.id, }).then(() => { - globalEvents.emit('driveFilesMoved', droppedData, props.folder); + globalEvents.emit('driveFilesUpdated', droppedData.map(x => ({ + ...x, + folderId: props.folder.id, + folder: props.folder, + }))); }); } } @@ -166,7 +170,11 @@ function onDrop(ev: DragEvent) { folderId: droppedFolder.id, parentId: props.folder.id, }).then(() => { - globalEvents.emit('driveFoldersMoved', [droppedFolder], props.folder); + globalEvents.emit('driveFoldersUpdated', [droppedFolder].map(x => ({ + ...x, + parentId: props.folder.id, + parent: props.folder, + }))); }).catch(err => { switch (err.code) { case 'RECURSIVE_NESTING': @@ -216,6 +224,11 @@ function rename() { misskeyApi('drive/folders/update', { folderId: props.folder.id, name: name, + }).then(() => { + globalEvents.emit('driveFoldersUpdated', [{ + ...props.folder, + name: name, + }]); }); }); } @@ -227,6 +240,12 @@ function move() { misskeyApi('drive/folders/update', { folderId: props.folder.id, parentId: folder[0] ? folder[0].id : null, + }).then(() => { + globalEvents.emit('driveFoldersUpdated', [{ + ...props.folder, + parentId: folder[0] ? folder[0].id : null, + parent: folder[0] ?? null, + }]); }); }); } diff --git a/packages/frontend/src/components/MkDrive.navFolder.vue b/packages/frontend/src/components/MkDrive.navFolder.vue index 11890d89e8..506af043a7 100644 --- a/packages/frontend/src/components/MkDrive.navFolder.vue +++ b/packages/frontend/src/components/MkDrive.navFolder.vue @@ -97,7 +97,11 @@ function onDrop(ev: DragEvent) { fileIds: droppedData.map(f => f.id), folderId: props.folder ? props.folder.id : null, }).then(() => { - globalEvents.emit('driveFilesMoved', droppedData, props.folder ?? null); + globalEvents.emit('driveFilesUpdated', droppedData.map(x => ({ + ...x, + folderId: props.folder ? props.folder.id : null, + folder: props.folder ?? null, + }))); }); } } @@ -114,7 +118,11 @@ function onDrop(ev: DragEvent) { folderId: droppedFolder.id, parentId: props.folder ? props.folder.id : null, }).then(() => { - globalEvents.emit('driveFoldersMoved', [droppedFolder], props.folder ?? null); + globalEvents.emit('driveFoldersUpdated', [droppedFolder].map(x => ({ + ...x, + parentId: props.folder ? props.folder.id : null, + parent: props.folder ?? null, + }))); }); } } diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue index b1fcfb3fc1..61676c1a72 100644 --- a/packages/frontend/src/components/MkDrive.vue +++ b/packages/frontend/src/components/MkDrive.vue @@ -330,7 +330,11 @@ function onDrop(ev: DragEvent) { fileIds: droppedData.map(f => f.id), folderId: folder.value ? folder.value.id : null, }).then(() => { - globalEvents.emit('driveFilesMoved', droppedData, folder.value); + globalEvents.emit('driveFilesUpdated', droppedData.map(x => ({ + ...x, + folderId: folder.value ? folder.value.id : null, + folder: folder.value, + }))); }); } } @@ -348,7 +352,11 @@ function onDrop(ev: DragEvent) { folderId: droppedFolder.id, parentId: folder.value ? folder.value.id : null, }).then(() => { - globalEvents.emit('driveFoldersMoved', [droppedFolder], folder.value); + globalEvents.emit('driveFoldersUpdated', [droppedFolder].map(x => ({ + ...x, + parentId: folder.value ? folder.value.id : null, + parent: folder.value, + }))); }).catch(err => { switch (err.code) { case 'RECURSIVE_NESTING': @@ -418,8 +426,7 @@ async function renameFolder(folderToRename: Misskey.entities.DriveFolder) { name: name, }); - // FIXME: 画面を更新するために自分自身に移動 - cd(updatedFolder); + globalEvents.emit('driveFoldersUpdated', [updatedFolder]); } function deleteFolder(folderToDelete: Misskey.entities.DriveFolder) { @@ -533,7 +540,11 @@ async function moveFilesBulk() { folderId: toFolder[0] ? toFolder[0].id : null, }); - globalEvents.emit('driveFilesMoved', selectedFiles.value, toFolder[0]); + globalEvents.emit('driveFilesUpdated', selectedFiles.value.map(x => ({ + ...x, + folderId: toFolder[0] ? toFolder[0].id : null, + folder: toFolder[0] ?? null, + }))); } function goRoot() { @@ -651,12 +662,19 @@ useGlobalEvent('driveFileCreated', (file) => { } }); -useGlobalEvent('driveFilesMoved', (files, to) => { +useGlobalEvent('driveFilesUpdated', (files) => { for (const f of files) { - filesPaginator.removeItem(f.id); - } - if ((to?.id ?? null) === (folder.value?.id ?? null)) { - filesPaginator.unshiftItems(files); + if (filesPaginator.items.value.some(x => x.id === f.id)) { + if (f.folderId === (folder.value?.id ?? null)) { + filesPaginator.updateItem(f.id, () => f); + } else { + filesPaginator.removeItem(f.id); + } + } else { + if (f.folderId === (folder.value?.id ?? null)) { + filesPaginator.prepend(f); + } + } } }); @@ -666,12 +684,19 @@ useGlobalEvent('driveFilesDeleted', (files) => { } }); -useGlobalEvent('driveFoldersMoved', (folders, to) => { +useGlobalEvent('driveFoldersUpdated', (folders) => { for (const f of folders) { - foldersPaginator.removeItem(f.id); - } - if ((to?.id ?? null) === (folder.value?.id ?? null)) { - foldersPaginator.unshiftItems(folders); + if (foldersPaginator.items.value.some(x => x.id === f.id)) { + if (f.parentId === (folder.value?.id ?? null)) { + foldersPaginator.updateItem(f.id, () => f); + } else { + foldersPaginator.removeItem(f.id); + } + } else { + if (f.parentId === (folder.value?.id ?? null)) { + foldersPaginator.prepend(f); + } + } } }); diff --git a/packages/frontend/src/events.ts b/packages/frontend/src/events.ts index 0d13523903..649561cd75 100644 --- a/packages/frontend/src/events.ts +++ b/packages/frontend/src/events.ts @@ -14,9 +14,9 @@ type Events = { notePosted: (note: Misskey.entities.Note) => void; noteDeleted: (noteId: Misskey.entities.Note['id']) => void; driveFileCreated: (file: Misskey.entities.DriveFile) => void; - driveFilesMoved: (files: Misskey.entities.DriveFile[], to: Misskey.entities.DriveFolder | null) => void; + driveFilesUpdated: (files: Misskey.entities.DriveFile[]) => void; driveFilesDeleted: (files: Misskey.entities.DriveFile[]) => void; - driveFoldersMoved: (folders: Misskey.entities.DriveFolder[], to: Misskey.entities.DriveFolder | null) => void; + driveFoldersUpdated: (folders: Misskey.entities.DriveFolder[]) => void; driveFoldersDeleted: (folders: Misskey.entities.DriveFolder[]) => void; };