import { fsm2 } from "@heydovetail/ui-components"; import { Node } from "prosemirror-model"; import { Plugin, Transaction, EditorState } from "prosemirror-state"; import { DocPosRange } from "../types"; import { PortalProviderApi } from "../util/PortalProvider"; import { EditorSchema } from "../schema"; export declare enum LinkPluginStateType { IDLE = "idle", SHOW_DETAIL = "showDetail", SHOW_EDITOR = "showEditor", SHOW_COMPOSER = "showComposer" } export interface Link { readonly text: string; readonly url: string; readonly range: DocPosRange; } export interface LinkDraft { readonly markRange: DocPosRange; readonly text: string; readonly textRange: DocPosRange; } export interface IdleState { readonly type: LinkPluginStateType.IDLE; } export interface ShowDetailState { readonly type: LinkPluginStateType.SHOW_DETAIL; readonly link: Link; } export interface ShowEditorState { readonly type: LinkPluginStateType.SHOW_EDITOR; readonly link: Link; } export interface ShowComposerState { readonly type: LinkPluginStateType.SHOW_COMPOSER; readonly draft: LinkDraft; } export declare type PluginState = IdleState | ShowDetailState | ShowEditorState | ShowComposerState; export declare const transition: (state: CurrentStateShape) => CurrentStateShape extends PluginState ? fsm2.Transition { type: LinkPluginStateType.SHOW_DETAIL; link: Link; }; showEditor: (_prev: IdleState, link: Link) => { type: LinkPluginStateType.SHOW_EDITOR; link: Link; }; showComposer: (_prev: IdleState, draft: LinkDraft) => { type: LinkPluginStateType.SHOW_COMPOSER; draft: LinkDraft; }; tr: (_prev: IdleState, tr: Transaction) => IdleState | ShowDetailState; }; showDetail: { idle: () => { type: LinkPluginStateType.IDLE; }; showDetail: (_prev: ShowDetailState, link: Link) => { type: LinkPluginStateType.SHOW_DETAIL; link: Link; }; showEditor: (_prev: ShowDetailState, link: Link) => { type: LinkPluginStateType.SHOW_EDITOR; link: Link; }; tr: (_prev: ShowDetailState, tr: Transaction) => IdleState | ShowDetailState; }; showEditor: { idle: () => { type: LinkPluginStateType.IDLE; }; showEditor: (_prev: ShowEditorState, link: Link) => { type: LinkPluginStateType.SHOW_EDITOR; link: Link; }; tr: (_prev: ShowEditorState, tr: Transaction) => { type: LinkPluginStateType.IDLE; link?: undefined; } | { type: LinkPluginStateType.SHOW_EDITOR; link: Link; }; }; showComposer: { idle: () => { type: LinkPluginStateType.IDLE; }; showComposer: (_prev: ShowComposerState, draft: LinkDraft) => { type: LinkPluginStateType.SHOW_COMPOSER; draft: LinkDraft; }; tr: (prev: ShowComposerState, tr: Transaction) => { type: LinkPluginStateType.SHOW_COMPOSER; draft: LinkDraft; } | { type: LinkPluginStateType.IDLE; draft?: undefined; }; }; }, { idle: { showDetail: (_prev: IdleState, link: Link) => { type: LinkPluginStateType.SHOW_DETAIL; link: Link; }; showEditor: (_prev: IdleState, link: Link) => { type: LinkPluginStateType.SHOW_EDITOR; link: Link; }; showComposer: (_prev: IdleState, draft: LinkDraft) => { type: LinkPluginStateType.SHOW_COMPOSER; draft: LinkDraft; }; tr: (_prev: IdleState, tr: Transaction) => IdleState | ShowDetailState; }; showDetail: { idle: () => { type: LinkPluginStateType.IDLE; }; showDetail: (_prev: ShowDetailState, link: Link) => { type: LinkPluginStateType.SHOW_DETAIL; link: Link; }; showEditor: (_prev: ShowDetailState, link: Link) => { type: LinkPluginStateType.SHOW_EDITOR; link: Link; }; tr: (_prev: ShowDetailState, tr: Transaction) => IdleState | ShowDetailState; }; showEditor: { idle: () => { type: LinkPluginStateType.IDLE; }; showEditor: (_prev: ShowEditorState, link: Link) => { type: LinkPluginStateType.SHOW_EDITOR; link: Link; }; tr: (_prev: ShowEditorState, tr: Transaction) => { type: LinkPluginStateType.IDLE; link?: undefined; } | { type: LinkPluginStateType.SHOW_EDITOR; link: Link; }; }; showComposer: { idle: () => { type: LinkPluginStateType.IDLE; }; showComposer: (_prev: ShowComposerState, draft: LinkDraft) => { type: LinkPluginStateType.SHOW_COMPOSER; draft: LinkDraft; }; tr: (prev: ShowComposerState, tr: Transaction) => { type: LinkPluginStateType.SHOW_COMPOSER; draft: LinkDraft; } | { type: LinkPluginStateType.IDLE; draft?: undefined; }; }; } extends { [key in CurrentStateShape["type"]]: infer T; } ? T : never> : never; export declare function tryComposeAttemptOnRange(doc: Node, range: DocPosRange): LinkDraft | null; export declare function pickIdleOrDetail({ selection, doc }: Pick, "selection" | "doc">): IdleState | ShowDetailState; export declare function getAdjacentLinkFromSelection({ selection, doc }: Pick, "selection" | "doc">): Link | null; declare const getPluginState: (source: EditorState | Transaction>) => IdleState | ShowDetailState | ShowEditorState | ShowComposerState | null, getPluginStateOrThrow: (source: EditorState | Transaction>) => PluginState, setPluginState: (env: { state: EditorState>; tr?: Transaction> | undefined; dispatch?: ((tr: Transaction>) => void) | undefined; }, newPluginState: IdleState | ShowDetailState | ShowEditorState | ShowComposerState | ((prevPluginState: PluginState) => PluginState)) => void; export { setPluginState, getPluginState, getPluginStateOrThrow }; export declare class LinkPlugin extends Plugin { constructor(options: { portalProviderApi: PortalProviderApi; initialState?: PluginState; }); }