Add share token support with virtual filesystem and selection toolbar button

This commit is contained in:
Leo Vasanko
2026-04-26 07:46:14 +00:00
parent e3282d1456
commit 1e75763f77
11 changed files with 675 additions and 50 deletions
@@ -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>
+11
View File
@@ -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[]
}
}