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
text/typescript
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();
}