import { AwesomeQR, Options } from "awesome-qr"; import Promise from "bluebird"; import React, { useEffect, useRef, useState } from "react"; export type AwesomeQRCodeState = "working" | "idle"; export interface AwesomeQRCodeProps { options: Partial; onStateChange?: (state: AwesomeQRCodeState) => void; } export const AwesomeQRCode: React.FC = ({ options, onStateChange }: AwesomeQRCodeProps) => { const currentTask = useRef>(); const [qrDataUri, setQrDataUri] = useState(); useEffect(() => { if (currentTask.current && !currentTask.current.isFulfilled && !currentTask.current.isCancelled) { currentTask.current.cancel(); } currentTask.current = new Promise((resolve) => { const instance = new AwesomeQR(options); onStateChange && onStateChange("working"); instance.draw().then((dataUri) => resolve(dataUri as string)); }); currentTask.current.then((dataUri) => { setQrDataUri(dataUri as string); onStateChange && onStateChange("idle"); }); }, [options]); return (
); }; const a = ( { switch (state) { case "working": // ... break; case "idle": // ... break; } }} /> ); // AwesomeQRCode.defaultProps = { // options: AwesomeQR.defaultOptions, // };