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.
session-desktop/ts/util/saveQRCode.tsx

35 lines
1.2 KiB
TypeScript

import { isEmpty } from 'lodash';
import { createRoot } from 'react-dom/client';
import { SessionQRCode, SessionQRCodeProps } from '../components/SessionQRCode';
import { sleepFor } from '../session/utils/Promise';
import { saveURLAsFile } from './saveURLAsFile';
export async function saveQRCode(id: string, customProps?: SessionQRCodeProps): Promise<void> {
let qrCanvas: HTMLCanvasElement | undefined;
if (!isEmpty(customProps)) {
const root = document.querySelector('#root');
const divElement = document.createElement('div');
root?.appendChild(divElement);
const reactRoot = createRoot(divElement!);
reactRoot.render(<SessionQRCode {...customProps} />);
// wait for it to render
await sleepFor(100);
qrCanvas = root?.querySelector(`#${customProps.id}`) as HTMLCanvasElement;
reactRoot?.unmount();
root?.removeChild(divElement);
} else {
qrCanvas = document.querySelector(`#${id}`) as HTMLCanvasElement;
}
if (qrCanvas) {
saveURLAsFile({
filename: `${id}-${new Date().toISOString()}.png`,
url: qrCanvas.toDataURL(),
document,
});
} else {
window.log.error('[saveQRCode] QR code not found!');
}
}