auto-save 2026-05-21 02:36 (~2)
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user