{ "version": 3, "sources": ["../../../../src/lib/shapes/bookmark/BookmarkShapeUtil.tsx"], "sourcesContent": ["import {\n\tAssetRecordType,\n\tBaseBoxShapeUtil,\n\tEditor,\n\tHTMLContainer,\n\tTLAssetId,\n\tTLBookmarkAsset,\n\tTLBookmarkShape,\n\tTLOnBeforeCreateHandler,\n\tTLOnBeforeUpdateHandler,\n\tbookmarkShapeMigrations,\n\tbookmarkShapeProps,\n\tdebounce,\n\tgetHashForString,\n\tisValidUrl,\n\tstopEventPropagation,\n\ttoDomPrecision,\n} from '@tldraw/editor'\nimport { getRotatedBoxShadow } from '../../utils/rotated-box-shadow'\nimport { truncateStringWithEllipsis } from '../../utils/text'\nimport { HyperlinkButton } from '../shared/HyperlinkButton'\n\n/** @public */\nexport class BookmarkShapeUtil extends BaseBoxShapeUtil {\n\tstatic override type = 'bookmark' as const\n\tstatic override props = bookmarkShapeProps\n\tstatic override migrations = bookmarkShapeMigrations\n\n\toverride canResize = () => false\n\n\toverride hideSelectionBoundsFg = () => true\n\n\toverride getDefaultProps(): TLBookmarkShape['props'] {\n\t\treturn {\n\t\t\turl: '',\n\t\t\tw: 300,\n\t\t\th: 320,\n\t\t\tassetId: null,\n\t\t}\n\t}\n\n\toverride component(shape: TLBookmarkShape) {\n\t\tconst asset = (\n\t\t\tshape.props.assetId ? this.editor.getAsset(shape.props.assetId) : null\n\t\t) as TLBookmarkAsset\n\n\t\tconst pageRotation = this.editor.getShapePageTransform(shape)!.rotation()\n\n\t\tconst address = getHumanReadableAddress(shape)\n\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t{asset?.props.image ? (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t{asset?.props.title && (\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t{truncateStringWithEllipsis(asset?.props.title || '', 54)}\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{asset?.props.description && (\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t{truncateStringWithEllipsis(asset?.props.description || '', 128)}\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{truncateStringWithEllipsis(address, 45)}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t)\n\t}\n\n\toverride indicator(shape: TLBookmarkShape) {\n\t\treturn (\n\t\t\t\n\t\t)\n\t}\n\n\toverride onBeforeCreate?: TLOnBeforeCreateHandler = (shape) => {\n\t\tupdateBookmarkAssetOnUrlChange(this.editor, shape)\n\t}\n\n\toverride onBeforeUpdate?: TLOnBeforeUpdateHandler = (prev, shape) => {\n\t\tif (prev.props.url !== shape.props.url) {\n\t\t\tif (!isValidUrl(shape.props.url)) {\n\t\t\t\treturn { ...shape, props: { ...shape.props, url: prev.props.url } }\n\t\t\t} else {\n\t\t\t\tupdateBookmarkAssetOnUrlChange(this.editor, shape)\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** @internal */\nexport const getHumanReadableAddress = (shape: TLBookmarkShape) => {\n\ttry {\n\t\tconst url = new URL(shape.props.url)\n\t\tconst path = url.pathname.replace(/\\/*$/, '')\n\t\treturn `${url.hostname}${path}`\n\t} catch (e) {\n\t\treturn shape.props.url\n\t}\n}\n\nfunction updateBookmarkAssetOnUrlChange(editor: Editor, shape: TLBookmarkShape) {\n\tconst { url } = shape.props\n\n\t// Derive the asset id from the URL\n\tconst assetId: TLAssetId = AssetRecordType.createId(getHashForString(url))\n\n\tif (editor.getAsset(assetId)) {\n\t\t// Existing asset for this URL?\n\t\tif (shape.props.assetId !== assetId) {\n\t\t\teditor.updateShapes([\n\t\t\t\t{\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: { assetId },\n\t\t\t\t},\n\t\t\t])\n\t\t}\n\t} else {\n\t\t// No asset for this URL?\n\n\t\t// First, clear out the existing asset reference\n\t\teditor.updateShapes([\n\t\t\t{\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: { assetId: null },\n\t\t\t},\n\t\t])\n\n\t\t// Then try to asyncronously create a new one\n\t\tcreateBookmarkAssetOnUrlChange(editor, shape)\n\t}\n}\n\nconst createBookmarkAssetOnUrlChange = debounce(async (editor: Editor, shape: TLBookmarkShape) => {\n\tconst { url } = shape.props\n\n\t// Create the asset using the external content manager's createAssetFromUrl method.\n\t// This may be overwritten by the user (for example, we overwrite it on tldraw.com)\n\tconst asset = await editor.getAssetForExternalContent({ type: 'url', url })\n\n\tif (!asset) {\n\t\t// No asset? Just leave the bookmark as a null assetId.\n\t\treturn\n\t}\n\n\teditor.batch(() => {\n\t\t// Create the new asset\n\t\teditor.createAssets([asset])\n\n\t\t// And update the shape\n\t\teditor.updateShapes([\n\t\t\t{\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: { assetId: asset.id },\n\t\t\t},\n\t\t])\n\t})\n}, 500)\n"], "mappings": "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", "names": [] }