import { createEffect, createSignal, Show } from 'solid-js' import type { Editor, JSONContent } from '@tiptap/core' import { Icon } from '../../_shared/Icon' import { InlineForm } from '../InlineForm' import styles from './EditorFloatingMenu.module.scss' import HTMLParser from 'html-to-json-parser' import { useLocalize } from '../../../context/localize' import { Modal } from '../../Nav/Modal' import { Menu } from './Menu' import type { MenuItem } from './Menu/Menu' import { showModal } from '../../../stores/ui' import { UploadModalContent } from '../UploadModal' import { useOutsideClickHandler } from '../../../utils/useOutsideClickHandler' type FloatingMenuProps = { editor: Editor ref: (el: HTMLDivElement) => void } const embedData = async (data) => { const result = (await HTMLParser(data, false)) as JSONContent if ('type' in result && result.type === 'iframe') { return result.attributes } } const validateEmbed = async (value) => { const iframeData = (await HTMLParser(value, false)) as JSONContent if (iframeData.type !== 'iframe') { return } } export const EditorFloatingMenu = (props: FloatingMenuProps) => { const { t } = useLocalize() const [selectedMenuItem, setSelectedMenuItem] = createSignal() const [menuOpen, setMenuOpen] = createSignal(false) const handleEmbedFormSubmit = async (value: string) => { // TODO: add support instagram embed (blockquote) const emb = await embedData(value) props.editor.chain().focus().setIframe(emb).run() } createEffect(() => { switch (selectedMenuItem()) { case 'image': { showModal('uploadImage') return } case 'horizontal-rule': { props.editor.chain().focus().setHorizontalRule().run() return } } }) const closeUploadModalHandler = () => { setSelectedMenuItem() setMenuOpen(false) } const menuRef: { current: HTMLDivElement } = { current: null } useOutsideClickHandler({ containerRef: menuRef, handler: () => { if (menuOpen()) { setMenuOpen(false) } } }) return ( <>
(menuRef.current = el)}> setSelectedMenuItem(value)} /> setSelectedMenuItem()} validate={validateEmbed} onSubmit={handleEmbedFormSubmit} errorMessage={t('Error')} />
setSelectedMenuItem()} editor={props.editor} /> ) }