import { state } from './state.js'; import { UI } from './components.js'; import { AIService } from './api.js'; export const Dashboard = { render() { const container = document.getElementById('view-container'); const nav = document.getElementById('top-nav'); if (nav) nav.classList.remove('hidden'); container.innerHTML = `
`; this.initEventListeners(); this.loadTimeline(); lucide.createIcons(); }, initEventListeners() { document.querySelectorAll('.nav-item').forEach(btn => { btn.onclick = () => { if (btn.classList.contains('active')) return; document.querySelectorAll('.nav-item').forEach(b => b.classList.remove('active')); btn.classList.add('active'); const view = btn.dataset.view; this.animateTransition(() => { if(view === 'timeline') this.loadTimeline(); if(view === 'script') this.loadScriptGenerator(); if(view === 'path') this.loadPathGenerator(); }); }; }); const profileBtn = document.getElementById('user-profile-btn'); if (profileBtn) profileBtn.onclick = () => this.showProfile(); }, animateTransition(callback) { const content = document.getElementById('dash-content'); gsap.to(content, { opacity: 0, y: 10, duration: 0.3, onComplete: () => { callback(); gsap.to(content, { opacity: 1, y: 0, duration: 0.6, ease: "power2.out" }); lucide.createIcons(); }}); }, loadTimeline() { const content = document.getElementById('dash-content'); const hasEvents = state.lifeEvents.length > 0; content.innerHTML = `

生命长河

塑造你的每一刻,都被星辰见证。

${hasEvents ? '
' : ''}
${hasEvents ? state.lifeEvents.sort((a,b) => new Date(b.time) - new Date(a.time)).map(ev => this.renderEventCard(ev)).join('') : this.renderEmpty()}
`; document.getElementById('add-event-btn').onclick = () => this.showEventModal(); }, renderEventCard(ev) { return `

${ev.title}

${ev.time}

${ev.content}

引路人洞察

${ev.aiFeedback}

`; }, showEventModal() { const modal = document.getElementById('modal-overlay'); const body = document.getElementById('modal-body'); modal.classList.remove('hidden'); body.innerHTML = `

记录足迹

${UI.renderInput('事件标题', 'ev-title', 'text', '给这段经历起个名字')} ${UI.renderInput('发生时间', 'ev-time', 'date')} ${UI.renderTextArea('经历详情', 'ev-content', '当时发生了什么?你的感受如何?')}
`; document.getElementById('save-event').onclick = async () => { const btn = document.getElementById('save-event'); const event = { title: document.getElementById('ev-title').value, time: document.getElementById('ev-time').value, content: document.getElementById('ev-content').value, aiFeedback: "分析中..." }; if(!event.title || !event.time || !event.content) return alert("请完整填写记录。"); btn.disabled = true; btn.innerHTML = `正在共鸣生命轨迹...`; event.aiFeedback = await AIService.analyzeLifeEvent(event); state.addLifeEvent(event); modal.classList.add('hidden'); this.loadTimeline(); }; lucide.createIcons(); }, loadScriptGenerator() { const content = document.getElementById('dash-content'); const userData = state.registrationData; const styles = [ {value:'都市', label:'都市沉浮'}, {value:'古风', label:'快意恩仇'}, {value:'爱情', label:'唯美浪漫'}, {value:'科幻', label:'星际远征'}, {value:'喜剧', label:'荒诞不经'}, {value:'悬疑', label:'迷雾重重'}, {value:'恐怖', label:'午夜回响'} ]; const lengths = [{value:'短', label:'极简'}, {value:'中', label:'连载'}, {value:'长', label:'史诗'}]; content.innerHTML = `

角色设定

${userData.nickname}
${userData.zodiac}
${userData.mbti}
${userData.hobbies.join(', ')}

创作需求

${UI.renderInput('剧本主题', 'sc-theme', 'text', '例如:我在职场逆袭了')} ${UI.renderSelect('叙事风格', 'sc-style', styles)} ${UI.renderSelect('剧本篇幅', 'sc-length', lengths)}
历史卷轴
${state.scripts.length > 0 ? state.scripts.map(s => `
${s.theme}
${s.style} | ${s.length}${s.date}
`).join('') : '

暂无卷轴

'}
${state.selectedScriptId ? this.renderScript(state.getSelectedScript()) : this.renderEmptyScript()}
`; document.getElementById('gen-script-btn').onclick = async () => { const theme = document.getElementById('sc-theme').value; if(!theme) return alert('请输入主题'); const btn = document.getElementById('gen-script-btn'); btn.disabled = true; btn.innerHTML = ` 编撰中...`; lucide.createIcons(); const params = { theme, style: document.getElementById('sc-style').value, length: document.getElementById('sc-length').value, character: state.registrationData }; const content = await AIService.generateEpicScript(params, state.lifeEvents); state.addScript({ ...params, content }); this.animateTransition(() => this.loadScriptGenerator()); }; document.querySelectorAll('.script-item').forEach(item => { item.onclick = () => { state.selectedScriptId = parseInt(item.dataset.id); state.save(); this.animateTransition(() => this.loadScriptGenerator()); }; }); lucide.createIcons(); }, renderScript(script) { return `

${script.theme}

${script.style}篇 · ${script.length}卷

${script.content.replace(/【/g, '
【').replace(/】/g, '】
')}
`; }, renderEmptyScript() { return `

请在左侧设定需求,开启你的天命爽文

`; }, loadPathGenerator() { const content = document.getElementById('dash-content'); const script = state.getSelectedScript(); if (!script) { content.innerHTML = `

先生成剧本,方能洞察路径。

`; return; } content.innerHTML = `

实现路径

基于《${script.theme}》,拆解达成目标的每一步。

${state.selectedPath ? this.renderPath(state.selectedPath) : this.renderEmptyPath()}
`; document.getElementById('gen-path-btn').onclick = async () => { const btn = document.getElementById('gen-path-btn'); btn.disabled = true; btn.innerHTML = ` 规划中...`; const path = await AIService.generatePath(script.content); state.setPath(path); this.animateTransition(() => this.loadPathGenerator()); }; }, renderPath(path) { return path.split(/【/).filter(s => s.trim()).map((s, i) => { const parts = s.split(/】/); return `
${i+1} ${parts[0]}
${parts[1] || ''}
`; }).join(''); }, renderEmptyPath() { return `
等待开启人生导航...
`; }, renderEmpty() { return `

此间尚无回响,等待你执笔...

`; }, showProfile() { const modal = document.getElementById('modal-overlay'); const body = document.getElementById('modal-body'); modal.classList.remove('hidden'); this.renderProfileMain(body); lucide.createIcons(); }, renderProfileMain(container) { const data = state.registrationData; container.innerHTML = `
${(data.nickname || '人').charAt(0)}

${data.nickname || '旅行者'}

${data.mbti || '-'} | ${data.zodiac || '-'}

${state.lifeEvents.length}
生命足迹
${state.scripts.length}
天命卷轴
`; document.getElementById('edit-profile').onclick = () => { container.innerHTML = UI.renderAccountSettings(state.registrationData); lucide.createIcons(); document.getElementById('cancel-edit-btn').onclick = () => this.renderProfileMain(container); document.getElementById('save-profile-btn').onclick = () => { state.updateRegistration({ nickname: document.getElementById('edit-nickname').value, profession: document.getElementById('edit-profession').value, mbti: document.getElementById('edit-mbti').value, zodiac: document.getElementById('edit-zodiac').value, hobbies: document.getElementById('edit-hobbies').value.split(',').map(s => s.trim()) }); this.renderProfileMain(container); }; }; document.getElementById('logout-btn').onclick = () => { if(confirm("确定要删除所有记录吗?此操作不可逆。")) state.clear(); }; } }; const closeBtn = document.getElementById('close-modal'); if (closeBtn) closeBtn.onclick = () => document.getElementById('modal-overlay').classList.add('hidden');