auto-save 2026-05-21 02:36 (~2)

This commit is contained in:
2026-05-21 02:36:11 +08:00
parent 9520d9328c
commit 515ef798ad
2 changed files with 33 additions and 4 deletions

View File

@@ -1888,6 +1888,13 @@
"message": "auto-save 2026-05-21 02:25 (~2)", "message": "auto-save 2026-05-21 02:25 (~2)",
"hash": "7524b3c", "hash": "7524b3c",
"files_changed": 2 "files_changed": 2
},
{
"ts": "2026-05-21T02:30:46+08:00",
"type": "commit",
"message": "auto-save 2026-05-21 02:30 (~2)",
"hash": "9520d93",
"files_changed": 2
} }
] ]
} }

View File

@@ -384,7 +384,8 @@ export default function Home() {
const [uploadLoading, setUploadLoading] = useState(false); const [uploadLoading, setUploadLoading] = useState(false);
const [provider, setProvider] = useState<string>('?'); const [provider, setProvider] = useState<string>('?');
const [sidebarOpen, setSidebarOpen] = useState(true); const [sidebarOpen, setSidebarOpen] = useState(true);
const [activeAssetPanel, setActiveAssetPanel] = useState('pack-patent'); const [activeAssetPanel, setActiveAssetPanel] = useState(DEFAULT_ASSET_PANEL);
const [restoreAttempted, setRestoreAttempted] = useState(false);
const refreshSessions = useCallback(async () => { const refreshSessions = useCallback(async () => {
const r = await fetch('/api/sessions'); const r = await fetch('/api/sessions');
@@ -394,7 +395,24 @@ export default function Home() {
}, []); }, []);
useEffect(() => { refreshSessions(); }, [refreshSessions]); useEffect(() => { refreshSessions(); }, [refreshSessions]);
useEffect(() => { setActiveAssetPanel('pack-patent'); }, [current?.id]);
useEffect(() => {
if (restoreAttempted || !sessions.length) return;
const persisted = readPersistedProjectState();
if (persisted.sessionId) {
const restored = sessions.find(session => session.id === persisted.sessionId);
if (restored) {
setCurrent(restored);
setActiveAssetPanel(persisted.panel);
}
}
setRestoreAttempted(true);
}, [restoreAttempted, sessions]);
useEffect(() => {
if (!current) return;
writePersistedProjectState(current.id, activeAssetPanel);
}, [activeAssetPanel, current]);
async function handleGenerate(opts: { prompt: string; refImages: string[]; count: number; style?: string }) { async function handleGenerate(opts: { prompt: string; refImages: string[]; count: number; style?: string }) {
setLoading(true); setLoading(true);
@@ -658,7 +676,11 @@ export default function Home() {
sessions={sessions} sessions={sessions}
currentId={current?.id ?? null} currentId={current?.id ?? null}
onPick={id => setCurrent(sessions.find(s => s.id === id) ?? null)} onPick={id => setCurrent(sessions.find(s => s.id === id) ?? null)}
onNew={() => setCurrent(null)} onNew={() => {
setCurrent(null);
setActiveAssetPanel(DEFAULT_ASSET_PANEL);
clearPersistedProjectState();
}}
/> />
<main className="project-stage min-w-0 flex-1"> <main className="project-stage min-w-0 flex-1">
<div className="project-stage-inner"> <div className="project-stage-inner">
@@ -729,7 +751,7 @@ export default function Home() {
<PackPanel <PackPanel
session={current} session={current}
activeNav={activeAssetPanel} activeNav={activeAssetPanel}
onActiveNavChange={setActiveAssetPanel} onActiveNavChange={id => setActiveAssetPanel(normalizeAssetPanel(id))}
textLoading={textLoading} textLoading={textLoading}
videoLoading={videoLoading} videoLoading={videoLoading}
onGenerateText={handleGenerateText} onGenerateText={handleGenerateText}