File size: 1,477 Bytes
f56a29b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import { useMemo } from 'react';
import type { Scene, StageMode } from '@/lib/types/stage';
import { SlideEditor as SlideRenderer } from '../slide-renderer/Editor';
import { QuizView } from '../scene-renderers/quiz-view';
import { InteractiveRenderer } from '../scene-renderers/interactive-renderer';
import { PBLRenderer } from '../scene-renderers/pbl-renderer';
interface SceneRendererProps {
readonly scene: Scene;
readonly mode: StageMode;
}
export function SceneRenderer({ scene, mode }: SceneRendererProps) {
const renderer = useMemo(() => {
switch (scene.type) {
case 'slide':
if (scene.content.type !== 'slide') return <div>Invalid slide content</div>;
return <SlideRenderer mode={mode} />;
case 'quiz':
if (scene.content.type !== 'quiz') return <div>Invalid quiz content</div>;
return <QuizView key={scene.id} questions={scene.content.questions} sceneId={scene.id} />;
case 'interactive':
if (scene.content.type !== 'interactive') return <div>Invalid interactive content</div>;
return <InteractiveRenderer content={scene.content} sceneId={scene.id} />;
case 'pbl':
if (scene.content.type !== 'pbl') return <div>Invalid PBL content</div>;
return <PBLRenderer content={scene.content} mode={mode} sceneId={scene.id} />;
default:
return <div>Unknown scene type</div>;
}
}, [scene, mode]);
return <div className="w-full h-full">{renderer}</div>;
}
|