tldraw
Version:
A tiny little drawing editor.
67 lines (59 loc) • 1.89 kB
text/typescript
import { Editor, sanitizeId, TLExportType, TLImageExportOptions, TLShapeId } from '@tldraw/editor'
/** @public */
export interface ExportAsOptions extends TLImageExportOptions {
/** {@inheritdoc @tldraw/editor#TLImageExportOptions.format} */
format: TLExportType
/** Name of the exported file. If undefined a predefined name, based on the selection, will be used. */
name?: string
}
/**
* Export the given shapes as files.
*
* @param editor - The editor instance.
* @param ids - The ids of the shapes to export.
* @param opts - Options for the export.
*
* @public
*/
export async function exportAs(
editor: Editor,
ids: TLShapeId[],
opts: ExportAsOptions
): Promise<void> {
// If we don't get name then use a predefined one
let name = opts.name
if (!name) {
name = `shapes at ${getTimestamp()}`
if (ids.length === 1) {
const first = editor.getShape(ids[0])!
if (editor.isShapeOfType(first, 'frame')) {
name = first.props.name || 'frame'
} else {
name = `${sanitizeId(first.id)} at ${getTimestamp()}`
}
}
}
name += `.${opts.format}`
const { blob } = await editor.toImage(ids, opts)
const file = new File([blob], name, { type: blob.type })
downloadFile(file)
}
function getTimestamp() {
const now = new Date()
const year = String(now.getFullYear()).slice(2)
const month = String(now.getMonth() + 1).padStart(2, '0')
const day = String(now.getDate()).padStart(2, '0')
const hours = String(now.getHours()).padStart(2, '0')
const minutes = String(now.getMinutes()).padStart(2, '0')
const seconds = String(now.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hours}.${minutes}.${seconds}`
}
/** @internal */
export function downloadFile(file: File) {
const link = document.createElement('a')
const url = URL.createObjectURL(file)
link.href = url
link.download = file.name
link.click()
URL.revokeObjectURL(url)
}