UNPKG

tldraw

Version:

A tiny little drawing editor.

102 lines (101 loc) 3.76 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var useImageOrVideoAsset_exports = {}; __export(useImageOrVideoAsset_exports, { useAsset: () => useAsset, useImageOrVideoAsset: () => useImageOrVideoAsset }); module.exports = __toCommonJS(useImageOrVideoAsset_exports); var import_editor = require("@tldraw/editor"); var import_react = require("react"); function useImageOrVideoAsset({ shapeId, assetId }) { const editor = (0, import_editor.useEditor)(); const isExport = !!(0, import_editor.useSvgExportContext)(); const isReady = (0, import_editor.useDelaySvgExport)(); const resolveAssetUrlDebounced = (0, import_react.useMemo)(() => (0, import_editor.debounce)(resolveAssetUrl, 500), []); const [result, setResult] = (0, import_react.useState)(() => ({ asset: assetId ? editor.getAsset(assetId) ?? null : null, url: null })); const didAlreadyResolve = (0, import_react.useRef)(false); const previousUrl = (0, import_react.useRef)(null); (0, import_react.useEffect)(() => { if (!assetId) return; let isCancelled = false; let cancelDebounceFn; const cleanupEffectScheduler = (0, import_editor.react)("update state", () => { if (!isExport && editor.getCulledShapes().has(shapeId)) return; const asset = editor.getAsset(assetId); if (!asset) return; const shape = editor.getShape(shapeId); if (!shape) return; if (!asset.props.src) { const preview = editor.getTemporaryAssetPreview(asset.id); if (preview) { if (previousUrl.current !== preview) { previousUrl.current = preview; setResult((prev) => ({ ...prev, isPlaceholder: true, url: preview })); isReady(); } return; } } const screenScale = editor.getZoomLevel() * (shape.props.w / asset.props.w); function resolve(asset2, url) { if (isCancelled) return; if (previousUrl.current === url) return; didAlreadyResolve.current = true; previousUrl.current = url; setResult({ asset: asset2, url }); isReady(); } if (didAlreadyResolve.current) { resolveAssetUrlDebounced( editor, assetId, screenScale, isExport, (url) => resolve(asset, url) ); cancelDebounceFn = resolveAssetUrlDebounced.cancel; } else { resolveAssetUrl(editor, assetId, screenScale, isExport, (url) => resolve(asset, url)); } }); return () => { cleanupEffectScheduler(); cancelDebounceFn?.(); isCancelled = true; }; }, [editor, assetId, isExport, isReady, shapeId, resolveAssetUrlDebounced]); return result; } function resolveAssetUrl(editor, assetId, screenScale, isExport, callback) { editor.resolveAssetUrl(assetId, { screenScale, shouldResolveToOriginal: isExport }).then((url) => { callback(url); }); } const useAsset = useImageOrVideoAsset; //# sourceMappingURL=useImageOrVideoAsset.js.map