From 0a2f5daf8f45fa7312fa6467d07742de0aa35d28 Mon Sep 17 00:00:00 2001 From: yuliang Date: Mon, 23 Mar 2026 10:49:19 +0800 Subject: [PATCH] fix: persist classroom to server for cross-device access Previously, classrooms were only stored in browser IndexedDB, making them inaccessible from other devices on the same network. This fix: - Calls POST /api/classroom when first scene is generated to persist initial data - Updates server storage again when all scenes complete generation - Allows other devices to fetch classroom data via API instead of relying solely on local storage Fixes 404 errors when accessing classrooms from different devices in LAN. Editor: vscode --- app/classroom/[id]/page.tsx | 21 ++++++++++++++++++++- app/generation-preview/page.tsx | 23 +++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app/classroom/[id]/page.tsx b/app/classroom/[id]/page.tsx index 523e23211..40dd2b872 100644 --- a/app/classroom/[id]/page.tsx +++ b/app/classroom/[id]/page.tsx @@ -27,8 +27,27 @@ export default function ClassroomDetailPage() { const generationStartedRef = useRef(false); const { generateRemaining, retrySingleOutline, stop } = useSceneGenerator({ - onComplete: () => { + onComplete: async () => { log.info('[Classroom] All scenes generated'); + // Update server-side storage with all generated scenes + const state = useStageStore.getState(); + if (state.stage && state.scenes.length > 0) { + try { + const resp = await fetch('/api/classroom', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + stage: state.stage, + scenes: state.scenes, + }), + }); + if (resp.ok) { + log.info('[Classroom] Updated server-side storage with all scenes'); + } + } catch (err) { + log.warn('[Classroom] Failed to update server-side storage:', err); + } + } }, }); diff --git a/app/generation-preview/page.tsx b/app/generation-preview/page.tsx index 213a51409..55dca6d9f 100644 --- a/app/generation-preview/page.tsx +++ b/app/generation-preview/page.tsx @@ -721,6 +721,29 @@ function GenerationPreviewContent() { }), ); + // Persist classroom to server-side storage for cross-device access + const state = store; + try { + const persistResp = await fetch('/api/classroom', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + stage: state.stage, + scenes: state.scenes, + }), + }); + if (persistResp.ok) { + const persistData = await persistResp.json(); + log.info('[Generation] Classroom persisted to server:', persistData.url); + } else { + log.warn( + '[Generation] Failed to persist classroom to server, continuing with local-only storage', + ); + } + } catch (persistErr) { + log.warn('[Generation] Error persisting classroom to server:', persistErr); + } + sessionStorage.removeItem('generationSession'); await store.saveToStorage(); router.push(`/classroom/${stage.id}`);