Add share token support with virtual filesystem and selection toolbar button
This commit is contained in:
@@ -15,6 +15,11 @@
|
||||
</div>
|
||||
<span class="select-size">{{ selectionDisplay.size }}</span>
|
||||
<DownloadButton />
|
||||
<button
|
||||
class="action-button"
|
||||
title="Copy share link (Alt-click for read/write)"
|
||||
@click="copyShareLink"
|
||||
>share</button>
|
||||
<SvgButton name="copy" tooltip="Copy here" @click="op('cp', dst)" />
|
||||
<SvgButton name="paste" tooltip="Move here" @click="op('mv', dst)" />
|
||||
<SvgButton name="trash" tooltip="Delete ⚠️" @click="op('rm')" />
|
||||
@@ -30,6 +35,8 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { apiFetch } from '@/repositories/Client'
|
||||
import type { ISimpleError } from '@/repositories/Client'
|
||||
import { createShareToken } from '@/repositories/User'
|
||||
import router from '@/router'
|
||||
import { useMainStore } from '@/stores/main'
|
||||
import { formatSize } from '@/utils'
|
||||
@@ -170,6 +177,35 @@ const op = async (opName: string, dst?: string) => {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const copyShareLink = async (ev: MouseEvent) => {
|
||||
const mode: 'ro' | 'rw' = ev.altKey ? 'rw' : 'ro'
|
||||
const sel = store.selectedFiles
|
||||
const paths = sel.keys
|
||||
.map(key => {
|
||||
const doc = sel.docs[key]
|
||||
if (!doc) return ''
|
||||
if (doc.loc === '/' || !doc.loc) return doc.name
|
||||
return `${doc.loc}/${doc.name}`
|
||||
})
|
||||
.filter(Boolean)
|
||||
|
||||
if (!paths.length) {
|
||||
store.showToast('No selected files')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const token = await createShareToken(paths, mode)
|
||||
await navigator.clipboard.writeText(token.url)
|
||||
store.showToast(
|
||||
mode === 'rw' ? 'Copied read/write share link' : 'Copied share link'
|
||||
)
|
||||
} catch (e) {
|
||||
const httpError = e as ISimpleError
|
||||
store.showToast(httpError.message || 'Failed to create share link')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
@@ -93,3 +93,14 @@ export async function deleteToken(tokenId: string) {
|
||||
const data = await Client.delete(`${url_tokens}/${tokenId}`)
|
||||
return data
|
||||
}
|
||||
|
||||
export async function createShareToken(paths: string[], mode: 'ro' | 'rw' = 'ro') {
|
||||
const data = await Client.post('/api/share-tokens', { paths, mode })
|
||||
return data as {
|
||||
id: string
|
||||
key: string
|
||||
url: string
|
||||
mode: 'ro' | 'rw'
|
||||
paths: string[]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user