返回 presentation-ai
YourImagesControls.tsx
1 "use client";
2
3 import { type TElement } from "platejs";
4 import { useEditorRef } from "platejs/react";
5
6 import { useDebouncedSave } from "@/hooks/presentation/useDebouncedSave";
7 import { usePresentationState } from "@/states/presentation-state";
8 import { type RootImage as RootImageType } from "../../../utils/parser";
9 import { UploadedImagesGrid } from "./UploadedImagesGrid";
10
11 interface YourImagesControlsProps {
12 element: TElement & RootImageType;
13 slideId?: string;
14 isRootImage: boolean;
15 onPick?: () => void;
16 }
17
18 export function YourImagesControls({
19 element,
20 slideId,
21 isRootImage,
22 onPick,
23 }: YourImagesControlsProps) {
24 const editor = useEditorRef(slideId);
25 const { saveImmediately } = useDebouncedSave();
26
27 const handleImageSelect = (url: string, name: string) => {
28 const { setSlides, clearRootImageGeneration } =
29 usePresentationState.getState();
30 if (isRootImage) {
31 if (slideId) clearRootImageGeneration(slideId);
32 setSlides((slides) =>
33 slides.map((slide) =>
34 slide.id === slideId
35 ? {
36 ...slide,
37 rootImage: {
38 ...slide.rootImage!,
39 url: url,
40 query: name,
41 embedType: undefined,
42 imageSource: "upload",
43 chartType: undefined,
44 chartData: undefined,
45 },
46 }
47 : slide,
48 ),
49 );
50 void saveImmediately();
51 } else {
52 editor.tf.setNodes(
53 { url: url, query: name, embedType: undefined, imageSource: "upload" },
54 { at: editor.api.findPath(element) },
55 );
56 void saveImmediately();
57 }
58 onPick?.();
59 };
60
61 return (
62 <div className="flex h-full flex-col gap-y-4">
63 <UploadedImagesGrid
64 onImageSelect={(image) => handleImageSelect(image.url, image.name)}
65 />
66 </div>
67 );
68 }
69
69 lines Plain Text