feat: MVP 工程脚手架——剧情引擎、Act 1 三章内容、Jev 服务层、画像报告与分享卡、Tauri 壳

This commit is contained in:
Jayway Liu
2026-10-03 10:05:10 +08:00
parent f57eabe12c
commit bf9d7dad5b
54 changed files with 8040 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
import { useMemo, useState } from 'react';
import './App.css';
import { StoryEngine } from './engine/engine';
import { LocalStorageEventStore } from './engine/eventStore';
import type { Chapter } from './engine/types';
import { getJevClient } from './services/jev';
import { StoryPlayer } from './ui/StoryPlayer';
import { ReportPage } from './ui/report/ReportPage';
import chapter1 from '../content/chapters/chapter1.json';
import chapter2 from '../content/chapters/chapter2.json';
import chapter3 from '../content/chapters/chapter3.json';
const chapters = [chapter1, chapter2, chapter3] as Chapter[];
export default function App() {
const [screen, setScreen] = useState<'story' | 'report'>('story');
// 引擎与存储整个会话只建一次;重玩走 engine.replay()(新 sessionId,旧事件保留)
const { engine, store, jev } = useMemo(() => {
const store = new LocalStorageEventStore();
const jev = getJevClient();
return { engine: new StoryEngine(chapters, store, jev), store, jev };
}, []);
return (
<div className="app">
{screen === 'story' ? (
<StoryPlayer engine={engine} onFinish={() => setScreen('report')} />
) : (
<ReportPage
store={store}
jev={jev}
onReplay={() => {
engine.replay('chapter1');
setScreen('story');
}}
/>
)}
</div>
);
}