@infinite-canvas-tutorial/webcomponents
Version:
WebComponents UI implementation
117 lines • 5.14 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { Canvas, co, DOMAdapter, RasterScreenshotRequest, Screenshot, System, VectorScreenshotRequest, } from '@infinite-canvas-tutorial/ecs';
import { Event } from '../event';
import { Container } from '../components';
const downloadedFilename = 'infinite-canvas-screenshot';
export class DownloadScreenshotSystem extends System {
constructor() {
super();
this.canvases = this.query((q) => q.current.and.added.with(Canvas));
this.query((q) => q.using(Container, Screenshot).read);
}
execute() {
this.canvases.added.forEach((canvas) => {
const container = canvas.read(Container);
container.element.addEventListener(Event.SCREENSHOT_REQUESTED, (e) => {
if (e.detail instanceof RasterScreenshotRequest) {
if (!canvas.has(RasterScreenshotRequest)) {
canvas.add(RasterScreenshotRequest);
}
const rasterScreenshotRequest = canvas.write(RasterScreenshotRequest);
Object.assign(rasterScreenshotRequest, e.detail);
this.setScreenshotTrigger(rasterScreenshotRequest);
}
else if (e.detail instanceof VectorScreenshotRequest) {
if (!canvas.has(VectorScreenshotRequest)) {
canvas.add(VectorScreenshotRequest);
}
const vectorScreenshotRequest = canvas.write(VectorScreenshotRequest);
Object.assign(vectorScreenshotRequest, e.detail);
this.setScreenshotTrigger(vectorScreenshotRequest);
}
});
});
this.canvases.current.forEach((canvas) => {
if (!canvas.has(Screenshot)) {
return;
}
const { dataURL } = canvas.read(Screenshot);
const container = canvas.read(Container);
if (dataURL) {
this.downloadImage(downloadedFilename, dataURL);
container.element.dispatchEvent(new CustomEvent(Event.SCREENSHOT_DOWNLOADED, {
detail: {
dataURL,
},
}));
}
});
}
*setScreenshotTrigger(screenshotRequest) {
Object.assign(screenshotRequest, { enabled: true });
yield;
Object.assign(screenshotRequest, { enabled: false });
}
downloadImage(defaultFilename, dataURL) {
const mimeType = dataURL.substring(dataURL.indexOf(':') + 1, dataURL.indexOf(';'));
const suffix = mimeType.split('/')[1];
// g-svg only support .svg
const isSVG = dataURL.startsWith('data:image/svg');
const fileName = `${defaultFilename}.${isSVG ? 'svg' : suffix}`;
const link = DOMAdapter.get()
.getDocument()
.createElement('a');
if (isSVG) {
link.addEventListener('click', () => {
link.download = fileName;
link.href = dataURL;
});
}
else if (window.Blob && window.URL) {
const arr = dataURL.split(',');
let mime = '';
if (arr && arr.length > 0) {
const match = arr[0].match(/:(.*?);/);
// eslint-disable-next-line prefer-destructuring
if (match && match.length >= 2)
mime = match[1];
}
const bstr = atob(arr[1]);
let n = bstr.length;
const u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
const blobObj = new Blob([u8arr], { type: mime });
// account for IE
// @see https://stackoverflow.com/a/41434373
if (navigator.msSaveBlob) {
navigator.msSaveBlob(blobObj, fileName);
}
else {
link.addEventListener('click', () => {
link.download = fileName;
link.href = window.URL.createObjectURL(blobObj);
});
}
}
// trigger click
if (link.click) {
link.click();
}
else {
const e = DOMAdapter.get().getDocument().createEvent('MouseEvents');
e.initEvent('click', false, false);
link.dispatchEvent(e);
}
}
}
__decorate([
co
], DownloadScreenshotSystem.prototype, "setScreenshotTrigger", null);
//# sourceMappingURL=DownloadScreenshot.js.map