import React, { useState, useMemo } from 'react' import isUrl from 'is-url' import { Slate, Editable, withReact, useSlate } from 'slate-react' import { Node, Transforms, Editor, Range, createEditor } from 'slate' import { withHistory } from 'slate-history' import { Button, Icon, Toolbar } from '../components' const LinkExample = () => { const [value, setValue] = useState(initialValue) const editor = useMemo( () => withLinks(withHistory(withReact(createEditor()))), [] ) return ( setValue(value)}> } placeholder="Enter some text..." /> ) } const withLinks = editor => { const { insertData, insertText, isInline } = editor editor.isInline = element => { return element.type === 'link' ? true : isInline(element) } editor.insertText = text => { if (text && isUrl(text)) { wrapLink(editor, text) } else { insertText(text) } } editor.insertData = data => { const text = data.getData('text/plain') if (text && isUrl(text)) { wrapLink(editor, text) } else { insertData(data) } } return editor } const insertLink = (editor, url) => { if (editor.selection) { wrapLink(editor, url) } } const isLinkActive = editor => { const [link] = Editor.nodes(editor, { match: n => n.type === 'link' }) return !!link } const unwrapLink = editor => { Transforms.unwrapNodes(editor, { match: n => n.type === 'link' }) } const wrapLink = (editor, url) => { if (isLinkActive(editor)) { unwrapLink(editor) } const { selection } = editor const isCollapsed = selection && Range.isCollapsed(selection) const link = { type: 'link', url, children: isCollapsed ? [{ text: url }] : [], } if (isCollapsed) { Transforms.insertNodes(editor, link) } else { Transforms.wrapNodes(editor, link, { split: true }) Transforms.collapse(editor, { edge: 'end' }) } } const Element = ({ attributes, children, element }) => { switch (element.type) { case 'link': return ( {children} ) default: return

{children}

} } const LinkButton = () => { const editor = useSlate() return ( ) } const initialValue = [ { children: [ { text: 'In addition to block nodes, you can create inline nodes, like ', }, { type: 'link', url: 'https://en.wikipedia.org/wiki/Hypertext', children: [{ text: 'hyperlinks' }], }, { text: '!', }, ], }, { children: [ { text: 'This example shows hyperlinks in action. It features two ways to add links. You can either add a link via the toolbar icon above, or if you want in on a little secret, copy a URL to your keyboard and paste it while a range of text is selected.', }, ], }, ] export default LinkExample