summaryrefslogtreecommitdiff
path: root/packages/frontend/src/utility/get-drive-file-menu.ts
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 14:28:01 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 14:28:01 +0900
commitbe7e3b9a0cb81b78a744993fef2fa2fd2833fa9c (patch)
treec82e18ce93ec0a24c57d7e36eb54a09266b3a25b /packages/frontend/src/utility/get-drive-file-menu.ts
parentenhnace(frontend): 文字列比較のためのローマナイズを強化(... (diff)
downloadmisskey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.tar.gz
misskey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.tar.bz2
misskey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.zip
refactor(frontend): scripts -> utility
Diffstat (limited to 'packages/frontend/src/utility/get-drive-file-menu.ts')
-rw-r--r--packages/frontend/src/utility/get-drive-file-menu.ts162
1 files changed, 162 insertions, 0 deletions
diff --git a/packages/frontend/src/utility/get-drive-file-menu.ts b/packages/frontend/src/utility/get-drive-file-menu.ts
new file mode 100644
index 0000000000..477043a342
--- /dev/null
+++ b/packages/frontend/src/utility/get-drive-file-menu.ts
@@ -0,0 +1,162 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import * as Misskey from 'misskey-js';
+import { defineAsyncComponent } from 'vue';
+import type { MenuItem } from '@/types/menu.js';
+import { i18n } from '@/i18n.js';
+import { copyToClipboard } from '@/utility/copy-to-clipboard.js';
+import * as os from '@/os.js';
+import { misskeyApi } from '@/utility/misskey-api.js';
+import { prefer } from '@/preferences.js';
+
+function rename(file: Misskey.entities.DriveFile) {
+ os.inputText({
+ title: i18n.ts.renameFile,
+ placeholder: i18n.ts.inputNewFileName,
+ default: file.name,
+ }).then(({ canceled, result: name }) => {
+ if (canceled) return;
+ misskeyApi('drive/files/update', {
+ fileId: file.id,
+ name: name,
+ });
+ });
+}
+
+function describe(file: Misskey.entities.DriveFile) {
+ const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkFileCaptionEditWindow.vue')), {
+ default: file.comment ?? '',
+ file: file,
+ }, {
+ done: caption => {
+ misskeyApi('drive/files/update', {
+ fileId: file.id,
+ comment: caption.length === 0 ? null : caption,
+ });
+ },
+ closed: () => dispose(),
+ });
+}
+
+function move(file: Misskey.entities.DriveFile) {
+ os.selectDriveFolder(false).then(folder => {
+ misskeyApi('drive/files/update', {
+ fileId: file.id,
+ folderId: folder[0] ? folder[0].id : null,
+ });
+ });
+}
+
+function toggleSensitive(file: Misskey.entities.DriveFile) {
+ misskeyApi('drive/files/update', {
+ fileId: file.id,
+ isSensitive: !file.isSensitive,
+ }).catch(err => {
+ os.alert({
+ type: 'error',
+ title: i18n.ts.error,
+ text: err.message,
+ });
+ });
+}
+
+function copyUrl(file: Misskey.entities.DriveFile) {
+ copyToClipboard(file.url);
+ os.success();
+}
+
+/*
+function addApp() {
+ alert('not implemented yet');
+}
+*/
+async function deleteFile(file: Misskey.entities.DriveFile) {
+ const { canceled } = await os.confirm({
+ type: 'warning',
+ text: i18n.tsx.driveFileDeleteConfirm({ name: file.name }),
+ });
+
+ if (canceled) return;
+ misskeyApi('drive/files/delete', {
+ fileId: file.id,
+ });
+}
+
+export function getDriveFileMenu(file: Misskey.entities.DriveFile, folder?: Misskey.entities.DriveFolder | null): MenuItem[] {
+ const isImage = file.type.startsWith('image/');
+
+ const menuItems: MenuItem[] = [];
+
+ menuItems.push({
+ type: 'link',
+ to: `/my/drive/file/${file.id}`,
+ text: i18n.ts._fileViewer.title,
+ icon: 'ti ti-info-circle',
+ }, { type: 'divider' }, {
+ text: i18n.ts.rename,
+ icon: 'ti ti-forms',
+ action: () => rename(file),
+ }, {
+ text: i18n.ts.move,
+ icon: 'ti ti-folder-symlink',
+ action: () => move(file),
+ }, {
+ text: file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive,
+ icon: file.isSensitive ? 'ti ti-eye' : 'ti ti-eye-exclamation',
+ action: () => toggleSensitive(file),
+ }, {
+ text: i18n.ts.describeFile,
+ icon: 'ti ti-text-caption',
+ action: () => describe(file),
+ });
+
+ if (isImage) {
+ menuItems.push({
+ text: i18n.ts.cropImage,
+ icon: 'ti ti-crop',
+ action: () => os.cropImage(file, {
+ aspectRatio: NaN,
+ uploadFolder: folder ? folder.id : folder,
+ }),
+ });
+ }
+
+ menuItems.push({ type: 'divider' }, {
+ text: i18n.ts.createNoteFromTheFile,
+ icon: 'ti ti-pencil',
+ action: () => os.post({
+ initialFiles: [file],
+ }),
+ }, {
+ text: i18n.ts.copyUrl,
+ icon: 'ti ti-link',
+ action: () => copyUrl(file),
+ }, {
+ type: 'a',
+ href: file.url,
+ target: '_blank',
+ text: i18n.ts.download,
+ icon: 'ti ti-download',
+ download: file.name,
+ }, { type: 'divider' }, {
+ text: i18n.ts.delete,
+ icon: 'ti ti-trash',
+ danger: true,
+ action: () => deleteFile(file),
+ });
+
+ if (prefer.s.devMode) {
+ menuItems.push({ type: 'divider' }, {
+ icon: 'ti ti-id',
+ text: i18n.ts.copyFileId,
+ action: () => {
+ copyToClipboard(file.id);
+ },
+ });
+ }
+
+ return menuItems;
+}