const TicketCreate = { files: [], render(container, { type, prefill, backLink }) { const user = Auth.user(); const isReport = type === 'report'; const isSuggestion = type === 'suggestion'; const isAppeal = type === 'appeal'; const typeLabel = isReport ? '举报' : isAppeal ? '申诉' : '建议'; this.files = []; container.innerHTML = `
提交${typeLabel}
${isReport ? `
` : isAppeal ? `
` : `
`}
上传文件 (图片/视频,每个最?0MB)

点击选择文件或拖拽到此处

支持: JPG/PNG/GIF/WebP/MP4/WebM   每个最?0MB

${backLink ? `` : ''}
`; this.bindFileUpload(container); this.bindSubmit(container, type); }, bindFileUpload(container) { const drop = container.querySelector('#file-drop'); const input = container.querySelector('#file-input'); const list = container.querySelector('#file-list'); drop.onclick = () => input.click(); input.onchange = () => this.addFiles(input.files, list); drop.ondragover = e => { e.preventDefault(); drop.style.borderColor = 'var(--p)'; }; drop.ondragleave = () => { drop.style.borderColor = 'var(--g300)'; }; drop.ondrop = e => { e.preventDefault(); drop.style.borderColor = 'var(--g300)'; this.addFiles(e.dataTransfer.files, list); }; }, addFiles(fileList, listEl) { const allowed = ['image/jpeg','image/png','image/gif','image/webp','video/mp4','video/webm']; for (const f of fileList) { if (!allowed.includes(f.type)) { alert(`不支持的文件类型: ${f.name}`); continue; } if (f.size > 50 * 1024 * 1024) { alert(`文件过大: ${f.name}`); continue; } if (this.files.length >= 5) { alert('最?个文?); break; } this.files.push(f); } this.refreshFileList(listEl); }, refreshFileList(listEl) { listEl.innerHTML = this.files.map((f, i) => `
${U.esc(f.name)} (${(f.size / 1024 / 1024).toFixed(2)}MB)
`).join(''); }, removeFile(i) { this.files.splice(i, 1); this.refreshFileList(document.getElementById('file-list')); }, async bindSubmit(container, type) { const form = container.querySelector('#ticket-form'); form.addEventListener('submit', async e => { e.preventDefault(); const fd = new FormData(form); if (type === 'report') { const tgn = fd.get('target_game_name'); const tgu = fd.get('target_game_uid'); if (!tgn && !tgu) { return alert('举报需至少填写对方游戏名或UID之一'); } } for (const f of this.files) fd.append('files', f); const btn = form.querySelector('[type="submit"]'); btn.disabled = true; btn.innerHTML = ' 提交?..'; try { const res = await API.req('POST', '/tickets', fd); if (res.tracking_token) { document.cookie = `tracking_token=${res.tracking_token};path=/;max-age=${365*24*3600};SameSite=Lax`; } alert('提交成功!工单编? #' + res.id); if (Auth.logged()) App.navigate('tickets'); else App.navigate('home'); } catch (ex) { alert(ex.message); btn.disabled = false; btn.innerHTML = ' 提交'; } }); } };