返回 presentation-ai
StaticPlate.tsx
1 "use client";
2
3 import { createStaticEditor as createSlateEditor } from "platejs/static";
4 import { useEffect, useMemo } from "react";
5
6 import { cn } from "@/lib/utils";
7 import { normalizePresentationValue } from "../../utils/normalizePresentationSlate";
8 import { type PlateSlide } from "../../utils/parser";
9 import { EditorStatic } from "../custom-elements/static/editor-static";
10 import RootImageStatic from "../custom-elements/static/root-image-static";
11 import { PresentationEditorBaseKit } from "../plugins/presentation-editor-base-kit";
12 import { PresentationStaticCustomKit } from "../plugins/static-custom-kit";
13 import { getAlignmentClass } from "../utils/alignment-utils";
14
15 interface StaticPlateProps {
16 initialContent?: PlateSlide;
17 className?: string;
18 id?: string;
19 }
20
21 export function StaticPlate({
22 initialContent,
23 className,
24 id,
25 }: StaticPlateProps) {
26 const slideId = initialContent?.id ?? id;
27 const normalizedContent = useMemo(
28 () => normalizePresentationValue(initialContent?.content),
29 [initialContent?.content],
30 );
31
32 const editor = useMemo(
33 () =>
34 createSlateEditor({
35 plugins: [...PresentationEditorBaseKit, ...PresentationStaticCustomKit],
36 value: normalizedContent,
37 id: slideId,
38 }),
39 [normalizedContent, slideId],
40 );
41
42 useEffect(() => {
43 editor.tf.setValue(normalizedContent);
44 }, [editor, normalizedContent]);
45
46 return (
47 <>
48 <EditorStatic
49 className={cn(
50 className,
51 "@container/presentation-slide-content flex flex-1 flex-col overflow-clip border-none bg-transparent! px-8 py-8 outline-hidden",
52 getAlignmentClass(initialContent?.alignment),
53 )}
54 id={id}
55 editor={editor}
56 value={normalizedContent}
57 />
58
59 {initialContent?.rootImage &&
60 initialContent.layoutType !== undefined &&
61 initialContent.layoutType !== "background" &&
62 initialContent.layoutType !== "none" && (
63 <RootImageStatic
64 image={initialContent.rootImage}
65 layoutType={initialContent.layoutType}
66 slideId={initialContent.id}
67 />
68 )}
69 </>
70 );
71 }
72
72 lines Plain Text