'use client'; import { ElementTypes, type PPTElement } from '@/lib/types/slides'; import { useMemo } from 'react'; import { BaseImageElement } from '../components/element/ImageElement/BaseImageElement'; import { BaseTextElement } from '../components/element/TextElement/BaseTextElement'; import { BaseShapeElement } from '../components/element/ShapeElement/BaseShapeElement'; import { BaseLineElement } from '../components/element/LineElement/BaseLineElement'; import { BaseChartElement } from '../components/element/ChartElement/BaseChartElement'; import { BaseLatexElement } from '../components/element/LatexElement/BaseLatexElement'; import { BaseTableElement } from '../components/element/TableElement/BaseTableElement'; import { BaseVideoElement } from '../components/element/VideoElement/BaseVideoElement'; import { useSceneSelector } from '@/lib/contexts/scene-context'; import type { SceneContent } from '@/lib/types/stage'; interface ScreenElementProps { readonly elementInfo: PPTElement; readonly elementIndex: number; readonly animate?: boolean; } export function ScreenElement({ elementInfo, elementIndex, animate }: ScreenElementProps) { const CurrentElementComponent = useMemo(() => { // eslint-disable-next-line @typescript-eslint/no-explicit-any -- element components have varying prop signatures const elementTypeMap: Record = { [ElementTypes.IMAGE]: BaseImageElement, [ElementTypes.TEXT]: BaseTextElement, [ElementTypes.SHAPE]: BaseShapeElement, [ElementTypes.LINE]: BaseLineElement, [ElementTypes.CHART]: BaseChartElement, [ElementTypes.LATEX]: BaseLatexElement, [ElementTypes.TABLE]: BaseTableElement, [ElementTypes.VIDEO]: BaseVideoElement, // TODO: Add other element types // [ElementTypes.AUDIO]: BaseAudioElement, }; return elementTypeMap[elementInfo.type] || null; }, [elementInfo.type]); const theme = useSceneSelector( (content) => { if (content.type === 'slide') { return content.canvas.theme; } return { fontColor: '#333333', fontName: 'Microsoft YaHei', }; }, ); if (!CurrentElementComponent) { return null; } return (
); }