UNPKG

insta-toc

Version:

Simultaneously generate, update, and maintain a table of contents for your notes in real time.

45 lines (32 loc) 1.29 kB
import { SvelteMap } from "svelte/reactivity"; import type { FileKey } from "../../../types"; import type UiStateManager from "../../../uiStateManager"; import { TocToolbarState } from "./TocToolbarState.svelte"; type SharedToolbarStateEntry = { refs: number; state: TocToolbarState; }; const toolbarStateByPath = new SvelteMap<string, SharedToolbarStateEntry>(); export function acquireTocToolbarState(sourcePath: FileKey, settingsManager: UiStateManager): TocToolbarState { const existing = toolbarStateByPath.get(sourcePath); if (existing) { existing.refs += 1; return existing.state; } const state = new TocToolbarState((key, collapsed) => { settingsManager.setTocFoldState(key, collapsed); }, (collapsed) => { settingsManager.setTocBlockCollapsed(sourcePath, collapsed); }); toolbarStateByPath.set(sourcePath, { refs: 1, state }); return state; } export function releaseTocToolbarState(sourcePath: string): void { const existing = toolbarStateByPath.get(sourcePath); if (!existing) return; if (existing.refs <= 1) { toolbarStateByPath.delete(sourcePath); return; } existing.refs -= 1; } export function clearTocToolbarStates(): void { toolbarStateByPath.clear(); }