import type { CoreMarkViewSpec, CoreMarkViewUserOptions } from '@prosemirror-adapter/core' import type { MarkViewConstructor } from 'prosemirror-view' import { getAllContexts } from 'svelte' import type { SvelteRendererResult } from '../SvelteRenderer' import type { AbstractSvelteMarkView } from './SvelteMarkView' import { SvelteMarkView } from './SvelteMarkView' /** * @internal */ export function buildSvelteMarkViewCreator( renderSvelteRenderer: SvelteRendererResult['renderSvelteRenderer'], removeSvelteRenderer: SvelteRendererResult['removeSvelteRenderer'], SvelteMarkViewClass: new (spec: CoreMarkViewSpec) => AbstractSvelteMarkView, context: Map, ) { return function markViewCreator(userOptions: CoreMarkViewUserOptions): MarkViewConstructor { return function markViewConstructor(mark, view, inline) { const patchedUserOptions: CoreMarkViewUserOptions = { ...userOptions, destroy() { userOptions.destroy?.() removeSvelteRenderer(markView) }, } const spec: CoreMarkViewSpec = { mark, view, inline, options: patchedUserOptions, } const markView = new SvelteMarkViewClass(spec) renderSvelteRenderer(markView, { context }) return markView } } } export function useSvelteMarkViewCreator( renderSvelteRenderer: SvelteRendererResult['renderSvelteRenderer'], removeSvelteRenderer: SvelteRendererResult['removeSvelteRenderer'], ) { const context = getAllContexts() return buildSvelteMarkViewCreator(renderSvelteRenderer, removeSvelteRenderer, SvelteMarkView, context) }