diff --git a/apps/client/src/widgets/dialogs/markdown_import.ts b/apps/client/src/widgets/dialogs/markdown_import.ts deleted file mode 100644 index 40af0c84a..000000000 --- a/apps/client/src/widgets/dialogs/markdown_import.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { t } from "../../services/i18n.js"; -import toastService from "../../services/toast.js"; -import utils from "../../services/utils.js"; -import appContext from "../../components/app_context.js"; -import BasicWidget from "../basic_widget.js"; -import shortcutService from "../../services/shortcuts.js"; -import server from "../../services/server.js"; -import { Modal } from "bootstrap"; -import { openDialog } from "../../services/dialog.js"; - -const TPL = /*html*/` -`; - -interface RenderMarkdownResponse { - htmlContent: string; -} - -export default class MarkdownImportDialog extends BasicWidget { - - private lastOpenedTs: number; - private modal!: bootstrap.Modal; - private $importTextarea!: JQuery; - private $importButton!: JQuery; - - constructor() { - super(); - - this.lastOpenedTs = 0; - } - - doRender() { - this.$widget = $(TPL); - this.modal = Modal.getOrCreateInstance(this.$widget[0]); - this.$importTextarea = this.$widget.find(".markdown-import-textarea"); - this.$importButton = this.$widget.find(".markdown-import-button"); - - this.$importButton.on("click", () => this.sendForm()); - - this.$widget.on("shown.bs.modal", () => this.$importTextarea.trigger("focus")); - - shortcutService.bindElShortcut(this.$widget, "ctrl+return", () => this.sendForm()); - } - - async convertMarkdownToHtml(markdownContent: string) { - const { htmlContent } = await server.post("other/render-markdown", { markdownContent }); - - const textEditor = await appContext.tabManager.getActiveContext()?.getTextEditor(); - if (!textEditor) { - return; - } - - const viewFragment = textEditor.data.processor.toView(htmlContent); - const modelFragment = textEditor.data.toModel(viewFragment); - - textEditor.model.insertContent(modelFragment, textEditor.model.document.selection); - textEditor.editing.view.focus(); - - toastService.showMessage(t("markdown_import.import_success")); - } - - async pasteMarkdownIntoTextEvent() { - await this.importMarkdownInlineEvent(); // BC with keyboard shortcuts command - } - - async importMarkdownInlineEvent() { - if (appContext.tabManager.getActiveContextNoteType() !== "text") { - return; - } - - if (utils.isElectron()) { - const { clipboard } = utils.dynamicRequire("electron"); - const text = clipboard.readText(); - - this.convertMarkdownToHtml(text); - } else { - openDialog(this.$widget); - } - } - - async sendForm() { - const text = String(this.$importTextarea.val()); - - this.modal.hide(); - - await this.convertMarkdownToHtml(text); - - this.$importTextarea.val(""); - } -} diff --git a/apps/client/src/widgets/dialogs/markdown_import.tsx b/apps/client/src/widgets/dialogs/markdown_import.tsx new file mode 100644 index 000000000..08054861c --- /dev/null +++ b/apps/client/src/widgets/dialogs/markdown_import.tsx @@ -0,0 +1,82 @@ +import { useRef, useState } from "preact/compat"; +import appContext from "../../components/app_context"; +import { closeActiveDialog, openDialog } from "../../services/dialog"; +import { t } from "../../services/i18n"; +import server from "../../services/server"; +import toast from "../../services/toast"; +import utils from "../../services/utils"; +import Modal from "../react/Modal"; +import ReactBasicWidget from "../react/ReactBasicWidget"; + +interface RenderMarkdownResponse { + htmlContent: string; +} + +function MarkdownImportDialogComponent() { + const markdownImportTextArea = useRef(null); + let [ text, setText ] = useState(""); + + async function sendForm() { + await convertMarkdownToHtml(text); + setText(""); + closeActiveDialog(); + } + + return ( + {t("markdown_import.import_button")}} + onShown={() => markdownImportTextArea.current?.focus()} + > +

{t("markdown_import.modal_body_text")}

+ +
+ ) +} + +export default class MarkdownImportDialog extends ReactBasicWidget { + + get component() { + return ; + } + + async importMarkdownInlineEvent() { + if (appContext.tabManager.getActiveContextNoteType() !== "text") { + return; + } + + if (utils.isElectron()) { + const { clipboard } = utils.dynamicRequire("electron"); + const text = clipboard.readText(); + + convertMarkdownToHtml(text); + } else { + openDialog(this.$widget); + } + } + + async pasteMarkdownIntoTextEvent() { + // BC with keyboard shortcuts command + await this.importMarkdownInlineEvent(); + } + +} + +async function convertMarkdownToHtml(markdownContent: string) { + const { htmlContent } = await server.post("other/render-markdown", { markdownContent }); + + const textEditor = await appContext.tabManager.getActiveContext()?.getTextEditor(); + if (!textEditor) { + return; + } + + const viewFragment = textEditor.data.processor.toView(htmlContent); + const modelFragment = textEditor.data.toModel(viewFragment); + + textEditor.model.insertContent(modelFragment, textEditor.model.document.selection); + textEditor.editing.view.focus(); + + toast.showMessage(t("markdown_import.import_success")); +} \ No newline at end of file diff --git a/apps/client/src/widgets/react/Modal.tsx b/apps/client/src/widgets/react/Modal.tsx index 1522a3947..0ffceb112 100644 --- a/apps/client/src/widgets/react/Modal.tsx +++ b/apps/client/src/widgets/react/Modal.tsx @@ -7,10 +7,11 @@ interface ModalProps { title: string; size: "lg" | "sm"; children: ComponentChildren; + footer?: ComponentChildren; onShown?: () => void; } -export default function Modal({ children, className, size, title, onShown }: ModalProps) { +export default function Modal({ children, className, size, title, footer, onShown }: ModalProps) { const modalRef = useRef(null); if (onShown) { @@ -34,6 +35,12 @@ export default function Modal({ children, className, size, title, onShown }: Mod
{children}
+ + {footer && ( +
+ {footer} +
+ )}