import React, { AnchorHTMLAttributes, ComponentType, ReactElement, } from 'react'; import { EditorPlugin } from '@draft-js-plugins/editor'; import EditorUtils from '@draft-js-plugins/utils'; import { EditorState } from 'draft-js'; import DefaultLink, { LinkPubProps } from './components/Link'; import LinkButton, { LinkButtonPubParams } from './components/LinkButton'; import linkStrategy from './linkStrategy'; import { defaultTheme } from './theme'; import type { AnchorPluginTheme } from './theme'; import DefaultLinkButton, { DefaultLinkButtonProps, } from './components/DefaultLinkButton'; export { defaultTheme }; export type { AnchorPluginTheme } from './theme'; export type { DefaultLinkButtonProps } from './components/DefaultLinkButton'; export interface AnchorPluginConfig { theme?: AnchorPluginTheme; placeholder?: string; Link?: ComponentType>; linkTarget?: string; validateUrl?: (url: string) => boolean; LinkButton?: ComponentType; } export type AnchorPlugin = EditorPlugin & { LinkButton: ComponentType; }; export interface AnchorPluginStore { getEditorState?(): EditorState; setEditorState?(state: EditorState): void; } export default (config: AnchorPluginConfig = {}): AnchorPlugin => { const { theme = defaultTheme, placeholder, Link, linkTarget, validateUrl, LinkButton: linkButton, } = config; const store: AnchorPluginStore = { getEditorState: undefined, setEditorState: undefined, }; const DecoratedDefaultLink = (props: LinkPubProps): ReactElement => ( ); const DecoratedLinkButton = (props: LinkButtonPubParams): ReactElement => ( store.setEditorState!( EditorUtils.removeLinkAtSelection(store.getEditorState!()) ) } validateUrl={validateUrl} linkButton={linkButton || DefaultLinkButton} /> ); return { initialize: ({ getEditorState, setEditorState }) => { store.getEditorState = getEditorState; store.setEditorState = setEditorState; }, decorators: [ { strategy: linkStrategy, component: Link || DecoratedDefaultLink, }, ], LinkButton: DecoratedLinkButton, }; };