/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the Chameleon License found in the * LICENSE file in the root directory of this source tree. */ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext"; import { $createParagraphNode, $createTextNode, $getRoot, } from "lexical"; import { useEffect, useState } from "react"; import type { InsertImagePayload } from "./ImagesPlugin"; import { INSERT_IMAGE_COMMAND } from "./ImagesPlugin"; /** * This is a hacky plugin to replace contents in the Lexical Composer. It needs to be improved. */ export type ReplaceContentData = { content_type: string; content: string; }; export function ReplaceContentPlugin({ payload, }: { payload: ReplaceContentData[]; }) { const [editor] = useLexicalComposerContext(); const [last, setLast] = useState(null); useEffect(() => { if (last == null) { return; } editor.update(() => { const root = $getRoot(); root.clear(); for (let i = 0; i < last.length; i++) { const item = last[i]; if (item.content_type === "TEXT") { const paragraphNode = $createParagraphNode(); const text = $createTextNode(item.content); paragraphNode.append(text); root.append(paragraphNode); } else { editor.dispatchCommand(INSERT_IMAGE_COMMAND, { altText: "an image", src: item.content, } as InsertImagePayload); } } setLast(null); }); }, [last]); useEffect(() => { if (payload !== null) { setLast(payload); } }, [payload]); return null; }