import React, { useRef, useState } from 'react';
import * as ob from 'urbit-ob';
import { saveAs } from 'file-saver';
import { sigil, stringRenderer } from 'urbit-sigil-js';
import { dataURItoBlob, loadImg, initCanvas } from 'lib/SigilDownloader';
import { DownloadButton } from 'components/Buttons';
export default function DownloadSigilButton({
point,
children = 'Download Sigil',
...rest
}) {
const [downloaded, setDownloaded] = useState(false);
const downloadSigil = () => {
const patp = ob.patp(point);
const _size = 1024 / window.devicePixelRatio;
const pngSize = 1024;
const DATA_URI_PREFIX = 'data:image/svg+xml;base64,';
// initialize canvas element
const canvas = initCanvas(canvasRef.current, { x: _size, y: _size });
const ctx = canvas.getContext('2d');
// make sigil svg and encoded into base64
const svg = sigil({
patp,
renderer: stringRenderer,
size: _size,
colors: ['#FFFFFF', '#000000'],
margin: (54 / 256) * _size,
});
// FF rendering hack
const svgDocument = new DOMParser().parseFromString(svg, 'image/svg+xml');
svgDocument.documentElement.width.baseVal.valueAsString = `${pngSize}px`;
svgDocument.documentElement.height.baseVal.valueAsString = `${pngSize}px`;
const svgText = new XMLSerializer().serializeToString(svgDocument);
const svg64 = btoa(svgText);
const pngTask = loadImg(DATA_URI_PREFIX + svg64, _size, _size).then(img => {
ctx.drawImage(img, 0, 0, _size, _size);
const png = dataURItoBlob(canvas.toDataURL('image/png'));
saveAs(png, `${patp.slice(1)}-sigil.png`);
ctx.clearRect(0, 0, pngSize, pngSize);
setDownloaded(true);
});
return pngTask;
};
const canvasRef = useRef(null);
return (
<>
{children}
>
);
}