From 6ec259a0e71174651bae95d4628138bf6fd68742 Mon Sep 17 00:00:00 2001 From: kj_sh604 Date: Sun, 15 Mar 2026 16:19:35 -0400 Subject: refactor: packages/ --- packages/excalidraw/hooks/useLibraryItemSvg.ts | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 packages/excalidraw/hooks/useLibraryItemSvg.ts (limited to 'packages/excalidraw/hooks/useLibraryItemSvg.ts') diff --git a/packages/excalidraw/hooks/useLibraryItemSvg.ts b/packages/excalidraw/hooks/useLibraryItemSvg.ts new file mode 100644 index 0000000..72b648d --- /dev/null +++ b/packages/excalidraw/hooks/useLibraryItemSvg.ts @@ -0,0 +1,79 @@ +import { useEffect, useState } from "react"; +import { COLOR_PALETTE } from "../colors"; +import { atom, useAtom } from "../editor-jotai"; +import { exportToSvg } from "@excalidraw/utils/export"; +import type { LibraryItem } from "../types"; + +export type SvgCache = Map; + +export const libraryItemSvgsCache = atom(new Map()); + +const exportLibraryItemToSvg = async (elements: LibraryItem["elements"]) => { + return await exportToSvg({ + elements, + appState: { + exportBackground: false, + viewBackgroundColor: COLOR_PALETTE.white, + }, + files: null, + renderEmbeddables: false, + skipInliningFonts: true, + }); +}; + +export const useLibraryItemSvg = ( + id: LibraryItem["id"] | null, + elements: LibraryItem["elements"] | undefined, + svgCache: SvgCache, +): SVGSVGElement | undefined => { + const [svg, setSvg] = useState(); + + useEffect(() => { + if (elements) { + if (id) { + // Try to load cached svg + const cachedSvg = svgCache.get(id); + + if (cachedSvg) { + setSvg(cachedSvg); + } else { + // When there is no svg in cache export it and save to cache + (async () => { + const exportedSvg = await exportLibraryItemToSvg(elements); + // TODO: should likely be removed for custom fonts + exportedSvg.querySelector(".style-fonts")?.remove(); + + if (exportedSvg) { + svgCache.set(id, exportedSvg); + setSvg(exportedSvg); + } + })(); + } + } else { + // When we have no id (usualy selected items from canvas) just export the svg + (async () => { + const exportedSvg = await exportLibraryItemToSvg(elements); + setSvg(exportedSvg); + })(); + } + } + }, [id, elements, svgCache, setSvg]); + + return svg; +}; + +export const useLibraryCache = () => { + const [svgCache] = useAtom(libraryItemSvgsCache); + + const clearLibraryCache = () => svgCache.clear(); + + const deleteItemsFromLibraryCache = (items: LibraryItem["id"][]) => { + items.forEach((item) => svgCache.delete(item)); + }; + + return { + clearLibraryCache, + deleteItemsFromLibraryCache, + svgCache, + }; +}; -- cgit v1.2.3