{ "version": 3, "sources": ["../../../../src/lib/ui/hooks/useExportAs.ts"], "sourcesContent": ["import { TLFrameShape, TLShapeId, useEditor } from '@tldraw/editor'\nimport { useCallback } from 'react'\nimport {\n\tTLExportType,\n\tdownloadDataURLAsFile,\n\tgetSvgAsDataUrl,\n\tgetSvgAsImage,\n} from '../../utils/export'\nimport { useToasts } from './useToastsProvider'\nimport { useTranslation } from './useTranslation/useTranslation'\n\n/** @public */\nexport function useExportAs() {\n\tconst editor = useEditor()\n\tconst { addToast } = useToasts()\n\tconst msg = useTranslation()\n\n\treturn useCallback(\n\t\tasync function exportAs(\n\t\t\tids: TLShapeId[] = editor.selectedShapeIds,\n\t\t\tformat: TLExportType = 'png'\n\t\t) {\n\t\t\tif (ids.length === 0) {\n\t\t\t\tids = [...editor.currentPageShapeIds]\n\t\t\t}\n\n\t\t\tif (ids.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst svg = await editor.getSvg(ids, {\n\t\t\t\tscale: 1,\n\t\t\t\tbackground: editor.instanceState.exportBackground,\n\t\t\t})\n\n\t\t\tif (!svg) throw new Error('Could not construct SVG.')\n\n\t\t\tlet name = 'shapes' + getTimestamp()\n\n\t\t\tif (ids.length === 1) {\n\t\t\t\tconst first = editor.getShape(ids[0])!\n\t\t\t\tif (editor.isShapeOfType(first, 'frame')) {\n\t\t\t\t\tname = first.props.name ?? 'frame'\n\t\t\t\t} else {\n\t\t\t\t\tname = first.id.replace(/:/, '_')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch (format) {\n\t\t\t\tcase 'svg': {\n\t\t\t\t\tconst dataURL = await getSvgAsDataUrl(svg)\n\t\t\t\t\tdownloadDataURLAsFile(dataURL, `${name}.svg`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcase 'webp':\n\t\t\t\tcase 'png': {\n\t\t\t\t\tconst image = await getSvgAsImage(svg, {\n\t\t\t\t\t\ttype: format,\n\t\t\t\t\t\tquality: 1,\n\t\t\t\t\t\tscale: 2,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!image) {\n\t\t\t\t\t\taddToast({\n\t\t\t\t\t\t\tid: 'export-fail',\n\t\t\t\t\t\t\t// icon: 'error',\n\t\t\t\t\t\t\ttitle: msg('toast.error.export-fail.title'),\n\t\t\t\t\t\t\tdescription: msg('toast.error.export-fail.desc'),\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dataURL = URL.createObjectURL(image)\n\n\t\t\t\t\tdownloadDataURLAsFile(dataURL, `${name}.${format}`)\n\n\t\t\t\t\tURL.revokeObjectURL(dataURL)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcase 'json': {\n\t\t\t\t\tconst data = editor.getContentFromCurrentPage(ids)\n\t\t\t\t\tconst dataURL = URL.createObjectURL(\n\t\t\t\t\t\tnew Blob([JSON.stringify(data, null, 4)], { type: 'application/json' })\n\t\t\t\t\t)\n\n\t\t\t\t\tdownloadDataURLAsFile(dataURL, `${name || 'shapes'}.json`)\n\n\t\t\t\t\tURL.revokeObjectURL(dataURL)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Export type ${format} not supported.`)\n\t\t\t}\n\t\t},\n\t\t[editor, addToast, msg]\n\t)\n}\n\nfunction getTimestamp() {\n\tconst now = new Date()\n\n\tconst year = String(now.getFullYear()).slice(2)\n\tconst month = String(now.getMonth() + 1).padStart(2, '0')\n\tconst day = String(now.getDate()).padStart(2, '0')\n\tconst hours = String(now.getHours()).padStart(2, '0')\n\tconst minutes = String(now.getMinutes()).padStart(2, '0')\n\tconst seconds = String(now.getSeconds()).padStart(2, '0')\n\n\treturn ` at ${year}-${month}-${day} ${hours}.${minutes}.${seconds}`\n}\n"], "mappings": "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", "names": [] }