summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components/MkDrive.vue
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-03-28 09:47:34 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-03-28 09:47:34 +0900
commita25fa62d645e6b18d676b7c994f2f1218ebe4251 (patch)
treee8310a5f070f77d654698860cfb29c7ef36cc67a /packages/frontend/src/components/MkDrive.vue
parentrefactor (diff)
downloadmisskey-a25fa62d645e6b18d676b7c994f2f1218ebe4251.tar.gz
misskey-a25fa62d645e6b18d676b7c994f2f1218ebe4251.tar.bz2
misskey-a25fa62d645e6b18d676b7c994f2f1218ebe4251.zip
enhance(frontend): ファイルアップロード処理のリファクタと設定の簡略化
Diffstat (limited to 'packages/frontend/src/components/MkDrive.vue')
-rw-r--r--packages/frontend/src/components/MkDrive.vue93
1 files changed, 41 insertions, 52 deletions
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index edbdf1cca1..c212167c8f 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -4,34 +4,37 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
-<div :class="$style.root">
- <nav :class="$style.nav">
- <div :class="$style.navPath" @contextmenu.prevent.stop="() => {}">
- <XNavFolder
- :class="[$style.navPathItem, { [$style.navCurrent]: folder == null }]"
- :parentFolder="folder"
- @move="move"
- @upload="upload"
- @removeFile="removeFile"
- @removeFolder="removeFolder"
- />
- <template v-for="f in hierarchyFolders">
- <span :class="[$style.navPathItem, $style.navSeparator]"><i class="ti ti-chevron-right"></i></span>
+<MkStickyContainer>
+ <template #header>
+ <nav :class="$style.nav">
+ <div :class="$style.navPath" @contextmenu.prevent.stop="() => {}">
<XNavFolder
- :folder="f"
+ :class="[$style.navPathItem, { [$style.navCurrent]: folder == null }]"
:parentFolder="folder"
- :class="[$style.navPathItem]"
@move="move"
@upload="upload"
@removeFile="removeFile"
@removeFolder="removeFolder"
/>
- </template>
- <span v-if="folder != null" :class="[$style.navPathItem, $style.navSeparator]"><i class="ti ti-chevron-right"></i></span>
- <span v-if="folder != null" :class="[$style.navPathItem, $style.navCurrent]">{{ folder.name }}</span>
- </div>
- <button class="_button" :class="$style.navMenu" @click="showMenu"><i class="ti ti-dots"></i></button>
- </nav>
+ <template v-for="f in hierarchyFolders">
+ <span :class="[$style.navPathItem, $style.navSeparator]"><i class="ti ti-chevron-right"></i></span>
+ <XNavFolder
+ :folder="f"
+ :parentFolder="folder"
+ :class="[$style.navPathItem]"
+ @move="move"
+ @upload="upload"
+ @removeFile="removeFile"
+ @removeFolder="removeFolder"
+ />
+ </template>
+ <span v-if="folder != null" :class="[$style.navPathItem, $style.navSeparator]"><i class="ti ti-chevron-right"></i></span>
+ <span v-if="folder != null" :class="[$style.navPathItem, $style.navCurrent]">{{ folder.name }}</span>
+ </div>
+ <button class="_button" :class="$style.navMenu" @click="showMenu"><i class="ti ti-dots"></i></button>
+ </nav>
+ </template>
+
<div
ref="main"
:class="[$style.main, { [$style.uploading]: uploadings.length > 0, [$style.fetching]: fetching }]"
@@ -91,8 +94,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkLoading v-if="fetching"/>
</div>
<div v-if="draghover" :class="$style.dropzone"></div>
- <input ref="fileInput" style="display: none;" type="file" accept="*/*" multiple tabindex="-1" @change="onChangeFileInput"/>
-</div>
+</MkStickyContainer>
</template>
<script lang="ts" setup>
@@ -110,6 +112,7 @@ import { i18n } from '@/i18n.js';
import { uploadFile, uploads } from '@/utility/upload.js';
import { claimAchievement } from '@/utility/achievements.js';
import { prefer } from '@/preferences.js';
+import { chooseFileFromPc } from '@/utility/select-file.js';
const props = withDefaults(defineProps<{
initialFolder?: Misskey.entities.DriveFolder;
@@ -130,7 +133,6 @@ const emit = defineEmits<{
}>();
const loadMoreFiles = useTemplateRef('loadMoreFiles');
-const fileInput = useTemplateRef('fileInput');
const folder = ref<Misskey.entities.DriveFolder | null>(null);
const files = ref<Misskey.entities.DriveFile[]>([]);
@@ -142,7 +144,6 @@ const selectedFiles = ref<Misskey.entities.DriveFile[]>([]);
const selectedFolders = ref<Misskey.entities.DriveFolder[]>([]);
const uploadings = uploads;
const connection = useStream().useChannel('drive');
-const keepOriginal = ref<boolean>(prefer.s.keepOriginalUploading); // 外部渡しが多いので$refは使わないほうがよい
// ドロップされようとしているか
const draghover = ref(false);
@@ -304,10 +305,6 @@ function onDrop(ev: DragEvent) {
//#endregion
}
-function selectLocalFile() {
- fileInput.value?.click();
-}
-
function urlUpload() {
os.inputText({
title: i18n.ts.uploadFromUrl,
@@ -383,15 +380,8 @@ function deleteFolder(folderToDelete: Misskey.entities.DriveFolder) {
});
}
-function onChangeFileInput() {
- if (!fileInput.value?.files) return;
- for (const file of Array.from(fileInput.value.files)) {
- upload(file, folder.value);
- }
-}
-
-function upload(file: File, folderToUpload?: Misskey.entities.DriveFolder | null) {
- uploadFile(file, (folderToUpload && typeof folderToUpload === 'object') ? folderToUpload.id : null, undefined, keepOriginal.value).then(res => {
+function upload(file: File, folderToUpload?: Misskey.entities.DriveFolder | null, keepOriginal?: boolean) {
+ uploadFile(file, (folderToUpload && typeof folderToUpload === 'object') ? folderToUpload.id : null, undefined, keepOriginal).then(res => {
addFile(res, true);
});
}
@@ -630,16 +620,20 @@ function getMenu() {
const menu: MenuItem[] = [];
menu.push({
- type: 'switch',
- text: i18n.ts.keepOriginalUploading,
- ref: keepOriginal,
- }, { type: 'divider' }, {
text: i18n.ts.addFile,
type: 'label',
}, {
+ text: i18n.ts.upload + ' (' + i18n.ts.compress + ')',
+ icon: 'ti ti-upload',
+ action: () => {
+ chooseFileFromPc(true, { keepOriginal: false });
+ },
+ }, {
text: i18n.ts.upload,
icon: 'ti ti-upload',
- action: () => { selectLocalFile(); },
+ action: () => {
+ chooseFileFromPc(true, { keepOriginal: true });
+ },
}, {
text: i18n.ts.fromUrl,
icon: 'ti ti-link',
@@ -751,22 +745,17 @@ onBeforeUnmount(() => {
</script>
<style lang="scss" module>
-.root {
- display: flex;
- flex-direction: column;
- height: 100%;
-}
-
.nav {
display: flex;
- z-index: 2;
width: 100%;
padding: 0 8px;
box-sizing: border-box;
overflow: auto;
font-size: 0.9em;
- box-shadow: 0 1px 0 var(--MI_THEME-divider);
- user-select: none;
+ background: color(from var(--MI_THEME-bg) srgb r g b / 0.75);
+ -webkit-backdrop-filter: var(--MI-blur, blur(15px));
+ backdrop-filter: var(--MI-blur, blur(15px));
+ border-bottom: solid 0.5px var(--MI_THEME-divider);
}
.navPath {