fd8a40783d
Sketch 43 files are technically a zip file, so the JavaScript opens the zip file & locates a preview.png which is just a quick preview of the last sketch page edited. After that is loaded it simply places the image into the DOM
73 lines
1.9 KiB
JavaScript
73 lines
1.9 KiB
JavaScript
import JSZip from 'jszip';
|
|
import JSZipUtils from 'jszip-utils';
|
|
|
|
export default class SketchLoader {
|
|
constructor(container) {
|
|
this.container = container;
|
|
this.loadingIcon = this.container.querySelector('.js-loading-icon');
|
|
|
|
this.load();
|
|
}
|
|
|
|
load() {
|
|
return this.getZipFile()
|
|
.then(data => JSZip.loadAsync(data))
|
|
.then(asyncResult => asyncResult.files['previews/preview.png'].async('uint8array'))
|
|
.then((content) => {
|
|
const url = window.URL || window.webkitURL;
|
|
const blob = new Blob([new Uint8Array(content)], {
|
|
type: 'image/png',
|
|
});
|
|
const previewUrl = url.createObjectURL(blob);
|
|
|
|
this.render(previewUrl);
|
|
})
|
|
.catch(this.error.bind(this));
|
|
}
|
|
|
|
getZipFile() {
|
|
return new JSZip.external.Promise((resolve, reject) => {
|
|
JSZipUtils.getBinaryContent(this.container.dataset.endpoint, (err, data) => {
|
|
if (err) {
|
|
reject(err);
|
|
} else {
|
|
resolve(data);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
render(previewUrl) {
|
|
const previewLink = document.createElement('a');
|
|
const previewImage = document.createElement('img');
|
|
|
|
previewLink.href = previewUrl;
|
|
previewLink.target = '_blank';
|
|
previewImage.src = previewUrl;
|
|
previewImage.className = 'img-responsive';
|
|
|
|
previewLink.appendChild(previewImage);
|
|
this.container.appendChild(previewLink);
|
|
|
|
this.removeLoadingIcon();
|
|
}
|
|
|
|
error() {
|
|
const errorMsg = document.createElement('p');
|
|
|
|
errorMsg.className = 'prepend-top-default append-bottom-default text-center';
|
|
errorMsg.textContent = `
|
|
Cannot show preview. For previews on sketch files, they must have the file format
|
|
introduced by Sketch version 43 and above.
|
|
`;
|
|
this.container.appendChild(errorMsg);
|
|
|
|
this.removeLoadingIcon();
|
|
}
|
|
|
|
removeLoadingIcon() {
|
|
if (this.loadingIcon) {
|
|
this.loadingIcon.remove();
|
|
}
|
|
}
|
|
}
|