import type { Writable } from 'svelte/store' import { writable } from 'svelte/store' import type { SvelteRenderOptions } from './types' /** * @internal */ export interface SvelteRenderer { key: string context: Context render: (options: SvelteRenderOptions) => VoidFunction updateContext: () => void } /** * @internal */ export interface SvelteRendererResult { readonly renderSvelteRenderer: (renderer: SvelteRenderer, options: SvelteRenderOptions) => void readonly removeSvelteRenderer: (renderer: SvelteRenderer) => void } /** * @internal */ export function useSvelteRenderer(): SvelteRendererResult { const unmounts: Writable> = writable({}) const renderSvelteRenderer = (renderer: SvelteRenderer, options: SvelteRenderOptions) => { unmounts.update((records) => ({ ...records, [renderer.key]: renderer.render(options), })) } const removeSvelteRenderer = (renderer: SvelteRenderer) => { unmounts.update((records) => { const { [renderer.key]: unmount, ...rest } = records unmount?.() return rest }) } return { renderSvelteRenderer, removeSvelteRenderer, } as const }