fix: 首启同意门(consent 事件存证)+ 条件渲染系统(flags 推导 27 变量)+ 10 类内容-界面不一致修复
This commit is contained in:
+23
-1
@@ -1,4 +1,4 @@
|
||||
import { useMemo, useState } from 'react';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import './App.css';
|
||||
import { StoryEngine } from './engine/engine';
|
||||
import { LocalStorageEventStore } from './engine/eventStore';
|
||||
@@ -6,6 +6,7 @@ import { SqliteEventStore, isTauriRuntime } from './engine/sqliteEventStore';
|
||||
import type { Chapter } from './engine/types';
|
||||
import { getJevClient } from './services/jev';
|
||||
import { StoryPlayer } from './ui/StoryPlayer';
|
||||
import { ConsentGate } from './ui/ConsentGate';
|
||||
import { ReportPage } from './ui/report/ReportPage';
|
||||
import chapter1 from '../content/chapters/chapter1.json';
|
||||
import chapter2 from '../content/chapters/chapter2.json';
|
||||
@@ -15,6 +16,8 @@ const chapters = [chapter1, chapter2, chapter3] as Chapter[];
|
||||
|
||||
export default function App() {
|
||||
const [screen, setScreen] = useState<'story' | 'report'>('story');
|
||||
// consent: unknown=查询中 / needed=待同意 / granted=已同意(事件存证命中,同意门只出现一次)
|
||||
const [consent, setConsent] = useState<'unknown' | 'needed' | 'granted'>('unknown');
|
||||
// 引擎与存储整个会话只建一次;重玩走 engine.replay()(新 sessionId,旧事件保留)
|
||||
// 运行时选择:Tauri 原生端用 SQLite,浏览器 dev 用 localStorage(同一 append-only 接口)
|
||||
const { engine, store, jev } = useMemo(() => {
|
||||
@@ -23,6 +26,25 @@ export default function App() {
|
||||
return { engine: new StoryEngine(chapters, store, jev), store, jev };
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
void engine.hasConsent().then((ok) => setConsent(ok ? 'granted' : 'needed'));
|
||||
}, [engine]);
|
||||
|
||||
if (consent !== 'granted') {
|
||||
return (
|
||||
<div className="app">
|
||||
{consent === 'needed' && (
|
||||
<ConsentGate
|
||||
onAgree={async () => {
|
||||
await engine.grantConsent();
|
||||
setConsent('granted');
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="app">
|
||||
{screen === 'story' ? (
|
||||
|
||||
Reference in New Issue
Block a user