返回 presentation-ai
ImageSearchControls.tsx
1 "use client";
2
3 import { type TElement } from "platejs";
4 import { useEditorRef } from "platejs/react";
5 import React from "react";
6
7 import { type RootImage as RootImageType } from "@/components/notebook/presentation/utils/parser";
8 import { SharedImageSearchControls } from "@/components/presentation/shared/SharedImageSearchControls";
9 import { useDebouncedSave } from "@/hooks/presentation/useDebouncedSave";
10 import {
11 usePresentationState,
12 type PresentationStockImageProvider,
13 } from "@/states/presentation-state";
14
15 interface ImageSearchControlsProps {
16 element: TElement & RootImageType;
17 slideId?: string;
18 isRootImage: boolean;
19 onPick?: () => void;
20 initialQuery?: string;
21 initialQueryKey?: string;
22 }
23
24 export function ImageSearchControls({
25 element,
26 slideId,
27 isRootImage,
28 onPick,
29 initialQuery,
30 initialQueryKey,
31 }: ImageSearchControlsProps) {
32 const editor = useEditorRef(slideId);
33 const setSlides = usePresentationState((s) => s.setSlides);
34 const { saveImmediately } = useDebouncedSave();
35
36 const handleSelect = React.useCallback(
37 (url: string, provider: PresentationStockImageProvider) => {
38 const { clearRootImageGeneration } = usePresentationState.getState();
39 if (isRootImage) {
40 if (slideId) clearRootImageGeneration(slideId);
41 setSlides((slides) =>
42 slides.map((slide) =>
43 slide.id === slideId
44 ? {
45 ...slide,
46 rootImage: {
47 ...slide.rootImage!,
48 url: url,
49 imageSource: "search",
50 stockImageProvider: provider,
51 },
52 }
53 : slide,
54 ),
55 );
56 void saveImmediately();
57 } else {
58 editor.tf.setNodes({
59 ...element,
60 url: url,
61 imageSource: "search",
62 stockImageProvider: provider,
63 });
64 void saveImmediately();
65 }
66 onPick?.();
67 },
68 [isRootImage, setSlides, slideId, editor, element, onPick, saveImmediately],
69 );
70
71 return (
72 <SharedImageSearchControls
73 onImageSelect={handleSelect}
74 initialQuery={initialQuery}
75 initialQueryKey={initialQueryKey ?? slideId}
76 disableTrendingFallback={true}
77 className="h-full"
78 />
79 );
80 }
81
81 lines Plain Text