diff --git a/packages/client/src/tiptap/extensions/iframe.ts b/packages/client/src/tiptap/extensions/iframe.ts index 4fc18502..93a1f7b1 100644 --- a/packages/client/src/tiptap/extensions/iframe.ts +++ b/packages/client/src/tiptap/extensions/iframe.ts @@ -34,7 +34,7 @@ export const Iframe = Node.create({ parseHTML: getDatasetAttribute('width'), }, height: { - default: 200, + default: 66, parseHTML: getDatasetAttribute('height'), }, url: { diff --git a/packages/client/src/tiptap/extensions/link.ts b/packages/client/src/tiptap/extensions/link.ts index 21ef8393..057283f7 100644 --- a/packages/client/src/tiptap/extensions/link.ts +++ b/packages/client/src/tiptap/extensions/link.ts @@ -53,9 +53,8 @@ export const Link = BuiltInLink.extend({ title: null, parseHTML: (element) => element.getAttribute('title'), }, - canonicalSrc: { - default: null, - parseHTML: (element) => element.dataset.canonicalSrc, + hasTrigger: { + default: false, }, }; }, diff --git a/packages/client/src/tiptap/menubar.tsx b/packages/client/src/tiptap/menubar.tsx index 2b8eafab..2de6181e 100644 --- a/packages/client/src/tiptap/menubar.tsx +++ b/packages/client/src/tiptap/menubar.tsx @@ -15,6 +15,7 @@ import { BaseBubbleMenu } from './menus/base-bubble-menu'; import { ImageBubbleMenu } from './menus/image'; import { BannerBubbleMenu } from './menus/banner'; import { LinkBubbleMenu } from './menus/link'; +import { IframeBubbleMenu } from './menus/iframe'; import { TableBubbleMenu } from './menus/table'; export const MenuBar: React.FC<{ editor: any }> = ({ editor }) => { @@ -76,6 +77,7 @@ export const MenuBar: React.FC<{ editor: any }> = ({ editor }) => { + diff --git a/packages/client/src/tiptap/menus/iframe.tsx b/packages/client/src/tiptap/menus/iframe.tsx new file mode 100644 index 00000000..42363853 --- /dev/null +++ b/packages/client/src/tiptap/menus/iframe.tsx @@ -0,0 +1,120 @@ +import { useCallback, useRef } from 'react'; +import { Space, Button, Modal, Form, Typography } from '@douyinfe/semi-ui'; +import { FormApi } from '@douyinfe/semi-ui/lib/es/form'; +import { IconEdit, IconExternalOpen, IconLineHeight, IconDelete } from '@douyinfe/semi-icons'; +import { useToggle } from 'hooks/use-toggle'; +import { Tooltip } from 'components/tooltip'; +import { BubbleMenu } from '../views/bubble-menu'; +import { Iframe } from '../extensions/iframe'; +import { Divider } from '../divider'; +import { Size } from './size'; + +const { Text } = Typography; + +const EXAMPLE_LINK = + 'https://proxy.tencentsuite.com/openapi/proxy/v2/addon?uid=144115212008575217&creator=144115212008575217&redirect=https%3A%2F%2Fi.y.qq.com%2Fn2%2Fm%2Foutchain%2Fplayer%2Findex.html%3Fsongid%3D5408217&docType=1&docID=300000000$RwqOunTcpXjs&addonID=0b69e1b9517e44a4aee35d33ee021b55&packageID=817&nonce=m3rqxn'; + +export const IframeBubbleMenu = ({ editor }) => { + const attrs = editor.getAttributes(Iframe.name); + const { width, height, url } = attrs; + const $form = useRef(); + const [visible, toggleVisible] = useToggle(false); + + const useExample = useCallback(() => { + $form.current.setValue('url', EXAMPLE_LINK); + }, []); + + const handleCancel = useCallback(() => { + toggleVisible(false); + }, []); + + const handleOk = useCallback(() => { + $form.current.validate().then((values) => { + editor + .chain() + .updateAttributes(Iframe.name, { + url: values.url, + }) + .setNodeSelection(editor.state.selection.from) + .focus() + .run(); + toggleVisible(false); + }); + }, []); + + const visitLink = useCallback(() => { + window.open(url, '_blank'); + }, [url]); + + const openEditLinkModal = useCallback(() => { + toggleVisible(true); + }, []); + + const setSize = useCallback( + (size) => { + editor.chain().updateAttributes(Iframe.name, size).setNodeSelection(editor.state.selection.from).focus().run(); + }, + [editor] + ); + + const deleteNode = useCallback(() => editor.chain().deleteSelection().run(), [editor]); + + return ( + editor.isActive(Iframe.name)} + tippyOptions={{ maxWidth: 456 }} + > + toggleVisible(false)} + centered + footer={ +
+ + 查看示例 + +
+ + +
+
+ } + > +
($form.current = formApi)} labelPosition="left"> + +
+
+ + + +