You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { createRoot } from 'react-dom/client';
|
|
import { SessionQRCode, SessionQRCodeProps } from '../components/SessionQRCode';
|
|
import { convertIconToImageURL } from '../hooks/useIconToImageURL';
|
|
import { sleepFor } from '../session/utils/Promise';
|
|
import { saveURLAsFile } from './saveURLAsFile';
|
|
|
|
export async function saveBWQRCode(filename: string, props: SessionQRCodeProps): Promise<void> {
|
|
try {
|
|
const root = document.querySelector('#root');
|
|
const divElement = document.createElement('div');
|
|
divElement.style.display = 'none';
|
|
root?.appendChild(divElement);
|
|
|
|
let logoImage = props.logoImage;
|
|
|
|
if (props.hasLogo) {
|
|
const { dataUrl } = await convertIconToImageURL(props.hasLogo);
|
|
logoImage = dataUrl;
|
|
}
|
|
|
|
const reactRoot = createRoot(divElement!);
|
|
reactRoot.render(
|
|
<SessionQRCode
|
|
id={props.id}
|
|
value={props.value}
|
|
size={props.size}
|
|
hasLogo={props.hasLogo}
|
|
logoImage={logoImage}
|
|
logoSize={props.logoSize}
|
|
/>
|
|
);
|
|
// wait for it to render
|
|
await sleepFor(100);
|
|
|
|
const qrCanvas = root?.querySelector(`#${props.id}-canvas`);
|
|
if (qrCanvas) {
|
|
const url = (qrCanvas as HTMLCanvasElement).toDataURL('image/jpeg');
|
|
if (url) {
|
|
saveURLAsFile({
|
|
filename,
|
|
url,
|
|
document,
|
|
});
|
|
}
|
|
} else {
|
|
throw Error('QR Code canvas not found');
|
|
}
|
|
|
|
reactRoot?.unmount();
|
|
root?.removeChild(divElement);
|
|
} catch (err) {
|
|
window.log.error(`[saveBWQRCode] failed for ${filename}`, err);
|
|
}
|
|
}
|