diff --git a/src/App.vue b/src/App.vue index 9e4f55b..1450411 100644 --- a/src/App.vue +++ b/src/App.vue @@ -7,6 +7,8 @@ import { store } from './core/store' import { readAsDataURL, fileToImageElement } from './core/importer' import { checkImageQuota } from './core/ai' import { putAsset, isOssEnabled } from './core/assets' +import { publishDeck } from './core/share' +import { appAlert } from './core/dialog' import { isTauri, readLocalFiles } from './core/bridge' import AppDialog from './components/common/AppDialog.vue' import FileDock from './components/common/FileDock.vue' @@ -167,6 +169,24 @@ function onHome() { mode.value = 'home' } +/* ---------- 分享:发布 deck 到 OSS,生成公开只读链接 ---------- */ +async function onShare() { + try { + const { url } = await publishDeck() + try { await navigator.clipboard.writeText(url) } catch (e) { /* 剪贴板失败不阻断展示 */ } + await appAlert('分享链接已生成' + '(已复制到剪贴板)', url) + } catch (e: any) { + const msg = e?.message || String(e) + // 未配置云存储时引导到设置页 + if (msg.includes('云存储') || msg.includes('OSS')) { + await appAlert('无法分享', msg) + ossVisible.value = true + } else { + await appAlert('分享失败', msg) + } + } +} + function onImportClose() { importVisible.value = false if (mode.value === 'home') { @@ -469,6 +489,7 @@ onUnmounted(() => { @export-json="onExportJson" @import-materials="onImportMaterials" @home="onHome" + @share="onShare" @import-json="onImportJson" @export-pdf="onExportPdf" /> diff --git a/src/components/editor/Toolbar.vue b/src/components/editor/Toolbar.vue index a567722..cd2c2de 100644 --- a/src/components/editor/Toolbar.vue +++ b/src/components/editor/Toolbar.vue @@ -20,6 +20,7 @@ const emit = defineEmits<{ (e: 'import-materials'): void (e: 'export-pdf'): void (e: 'home'): void + (e: 'share'): void }>() const themeKeys = Object.keys(themes) @@ -71,6 +72,7 @@ function fileAction(a: string) { case 'import-materials': emit('import-materials'); break case 'import-json': emit('import-json'); break case 'export-pdf': emit('export-pdf'); break + case 'share': emit('share'); break case 'reset': action('reset'); break } } @@ -148,6 +150,9 @@ defineProps<{ disabledActions?: string[] }>() +