diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-11-12 02:02:25 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-11-12 02:02:25 +0900 |
| commit | 0e4a111f81cceed275d9bec2695f6e401fb654d8 (patch) | |
| tree | 40874799472fa07416f17b50a398ac33b7771905 /packages/client/src/scripts/select-file.ts | |
| parent | update deps (diff) | |
| download | sharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.gz sharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.bz2 sharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.zip | |
refactoring
Resolve #7779
Diffstat (limited to 'packages/client/src/scripts/select-file.ts')
| -rw-r--r-- | packages/client/src/scripts/select-file.ts | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/packages/client/src/scripts/select-file.ts b/packages/client/src/scripts/select-file.ts new file mode 100644 index 0000000000..5fbc545b26 --- /dev/null +++ b/packages/client/src/scripts/select-file.ts @@ -0,0 +1,89 @@ +import * as os from '@/os'; +import { i18n } from '@/i18n'; +import { defaultStore } from '@/store'; + +export function selectFile(src: any, label: string | null, multiple = false) { + return new Promise((res, rej) => { + const chooseFileFromPc = () => { + const input = document.createElement('input'); + input.type = 'file'; + input.multiple = multiple; + input.onchange = () => { + const promises = Array.from(input.files).map(file => os.upload(file, defaultStore.state.uploadFolder)); + + Promise.all(promises).then(driveFiles => { + res(multiple ? driveFiles : driveFiles[0]); + }).catch(e => { + os.dialog({ + type: 'error', + text: e + }); + }); + + // 一応廃棄 + (window as any).__misskey_input_ref__ = null; + }; + + // https://qiita.com/fukasawah/items/b9dc732d95d99551013d + // iOS Safari で正常に動かす為のおまじない + (window as any).__misskey_input_ref__ = input; + + input.click(); + }; + + const chooseFileFromDrive = () => { + os.selectDriveFile(multiple).then(files => { + res(files); + }); + }; + + const chooseFileFromUrl = () => { + os.dialog({ + title: i18n.locale.uploadFromUrl, + input: { + placeholder: i18n.locale.uploadFromUrlDescription + } + }).then(({ canceled, result: url }) => { + if (canceled) return; + + const marker = Math.random().toString(); // TODO: UUIDとか使う + + const connection = os.stream.useChannel('main'); + connection.on('urlUploadFinished', data => { + if (data.marker === marker) { + res(multiple ? [data.file] : data.file); + connection.dispose(); + } + }); + + os.api('drive/files/upload-from-url', { + url: url, + folderId: defaultStore.state.uploadFolder, + marker + }); + + os.dialog({ + title: i18n.locale.uploadFromUrlRequested, + text: i18n.locale.uploadFromUrlMayTakeTime + }); + }); + }; + + os.popupMenu([label ? { + text: label, + type: 'label' + } : undefined, { + text: i18n.locale.upload, + icon: 'fas fa-upload', + action: chooseFileFromPc + }, { + text: i18n.locale.fromDrive, + icon: 'fas fa-cloud', + action: chooseFileFromDrive + }, { + text: i18n.locale.fromUrl, + icon: 'fas fa-link', + action: chooseFileFromUrl + }], src); + }); +} |