From 3ea3f101000df9828bd4338618caad706afe42e1 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Mon, 27 Jul 2026 10:14:14 +0800 Subject: [PATCH] fix: replace _upload with publish modal (file picker + local list) --- static/js/pages/market.js | 66 ++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/static/js/pages/market.js b/static/js/pages/market.js index c5fd8d4..334b837 100644 --- a/static/js/pages/market.js +++ b/static/js/pages/market.js @@ -220,22 +220,58 @@ const PageMarket = { }, _upload() { - const input = document.createElement('input'); input.type = 'file'; input.accept = this._tab === 'scenes' ? '.tss' : '.tsd'; - const endpoint = this._tab === 'scenes' ? '/api/market/scenes/upload' : '/api/market/upload'; - input.onchange = async (e) => { - const file = e.target.files[0]; if (!file) return; - const fd = new FormData(); fd.append('file', file); - fd.append('name', file.name.replace('.tsd','')); - fd.append('category', 'community'); - fd.append('author', 'TurboSu User'); - fd.append('token', this._marketToken); - try { - const res = await fetch('/api/market/upload', { method: 'POST', body: fd }); + if (!this._marketToken) { Toast.show('请先登录', 'error'); return; } + const overlay = document.createElement('div'); overlay.className = 'modal-overlay'; + overlay.innerHTML = ''; + document.body.appendChild(overlay); + overlay.addEventListener('click', (e) => { if (e.target === overlay) overlay.remove(); }); + overlay.querySelector('#pub-file-btn').addEventListener('click', () => { + const input = document.createElement('input'); input.type = 'file'; input.accept = '.tsd,.tss'; + input.onchange = async (e) => { + const file = e.target.files[0]; if (!file) return; + const isTss = file.name.endsWith('.tss'); + const fd = new FormData(); fd.append('file', file); fd.append('token', this._marketToken); + const res = await fetch(isTss ? '/api/market/scenes/upload' : '/api/market/upload', { method: 'POST', body: fd }); const data = await res.json(); - Toast.show(data.error ? '上传失败: ' + data.error : '上传成功', data.error ? 'error' : 'success'); - if (!data.error) this._loadItems(); - } catch (e) { Toast.show('上传失败', 'error'); } - }; input.click(); + Toast.show(data.error ? '失败: '+data.error : '发布成功', data.error ? 'error' : 'success'); + if (!data.error) { overlay.remove(); this._loadItems(); } + }; input.click(); + }); + this._loadLocalItems(overlay); + }, + + async _loadLocalItems(overlay) { + const list = overlay.querySelector('#pub-local-list'); + try { + const dashRes = await fetch('/api/dashboards?category=all'); + const dashes = (await dashRes.json()) || []; + const sceneRes = await fetch('/api/scenes'); + const scenes = (await sceneRes.json()) || []; + const upD = dashes.filter(d => !d.is_builtin && !(d.id||'').match(/^[a-f0-9]{6}__/)); + const upS = Array.isArray(scenes) ? scenes.filter(s => !s.is_builtin && !(s.id||'').match(/^[a-f0-9]{6}__/)) : []; + let h = ''; + if (upD.length) { + h += '
本地仪表盘
'; + h += upD.map(d => '
'+(d.icon||'📊')+' '+d.name+'
').join(''); + } + if (upS.length) { + h += '
本地场景
'; + h += upS.map(s => '
🎬 '+s.name+'
').join(''); + } + list.innerHTML = h || '

没有可发布的内容

'; + list.querySelectorAll('.pub-dash-btn').forEach(btn => btn.addEventListener('click', async () => { + const r = await fetch('/api/market/publish-local', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:btn.dataset.id,type:'dashboard',token:this._marketToken})}); + const d = await r.json(); + Toast.show(d.error?'失败:'+d.error:'发布成功',d.error?'error':'success'); + if(!d.error){overlay.remove();this._loadItems();} + })); + list.querySelectorAll('.pub-scene-btn').forEach(btn => btn.addEventListener('click', async () => { + const r = await fetch('/api/market/publish-local', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:btn.dataset.id,type:'scene',token:this._marketToken})}); + const d = await r.json(); + Toast.show(d.error?'失败:'+d.error:'发布成功',d.error?'error':'success'); + if(!d.error){overlay.remove();this._loadItems();} + })); + } catch(e) { list.innerHTML = '

加载失败

'; } }, _showLogin() {