import * as React from "react"; import type tinymce from "tinymce"; import { createRoot } from "@wordpress/element"; import { TitleDialog } from "../components/title-dialog/TitleDialog"; import { JustwatchProvider } from "../context/context"; import { TitleSelection } from "../types"; import { generateShortcode } from "@/block/save"; // Declare tinyMCE on the window interface declare global { interface Window { tinyMCE: typeof tinymce } } export const TITLE_DIALOG_ROOT_ID = "jw-title-dialog-root"; document.addEventListener("DOMContentLoaded", function () { if (!window.tinyMCE) { return; } window.tinyMCE.PluginManager.add("justwatch", function (editor) { let modalContainer = document.getElementById(TITLE_DIALOG_ROOT_ID); const { settings, pluginUrl } = window.justwatch; if (!modalContainer) { modalContainer = document.createElement("div"); modalContainer.id = TITLE_DIALOG_ROOT_ID; } // Create a root for the React component const root = createRoot(modalContainer); const render = (jsx: React.ReactNode) => { root.render( {jsx} ); }; // Function to close the modal and remove the root node const closeModal = () => { render(<>); }; const handleConfirm = (titleSelection: TitleSelection | undefined): void => { if (!titleSelection) return; const str = generateShortcode(titleSelection); editor.insertContent(` ${str} `); // Insert text into the editor closeModal(); // Close the modal after confirming }; // Function to render the modal using React const openModal = () => { // Use React to render the modal render( ); }; // Add command to open the modal editor.addCommand("openJustwatchModal", () => { openModal(); return true; }); // Add the button to the TinyMCE toolbar editor.addButton("justwatch", { // text: "Justwatch", cmd: "openJustwatchModal", // Use command to open modal image : pluginUrl + '/../img/justwatch-icon.png', }); return { getMetadata: () => ({ name: "JustWatch", url: "https://justwatch.com", }), }; }); });