| 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 |