"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
    result["default"] = mod;
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importStar(require("react"));
const react_2 = require("react");
const abstraction_1 = require("./abstraction");
function useRecaptcha(recaptchaBrowserKey) {
    const verificationTokenRef = react_2.useRef(null);
    const recaptchaAbstraction = react_2.useRef();
    const ref = react_2.useRef(null);
    const [key] = react_2.useState(Date.now());
    react_2.useEffect(() => {
        if (ref.current == null) {
            return;
        }
        recaptchaAbstraction.current = abstraction_1.createRecaptchaAbstraction(recaptchaBrowserKey, ref.current);
        return () => {
            if (recaptchaAbstraction.current != null) {
                recaptchaAbstraction.current.resetContainer();
            }
            recaptchaAbstraction.current = undefined;
        };
    }, [recaptchaBrowserKey]);
    const startVerification = react_1.useCallback(async () => {
        if (recaptchaAbstraction.current == null) {
            return;
        }
        return (async () => {
            if (recaptchaAbstraction.current == null) {
                return;
            }
            if (ref.current == null) {
                return;
            }
            if (recaptchaAbstraction.current.expired) {
                recaptchaAbstraction.current.resetContainer();
                recaptchaAbstraction.current = abstraction_1.createRecaptchaAbstraction(recaptchaBrowserKey, ref.current);
            }
            await recaptchaAbstraction.current.renderIntoContainer();
            return await recaptchaAbstraction.current.runRecaptchaCheck();
        })().then(result => {
            if (recaptchaAbstraction.current == null) {
                return;
            }
            verificationTokenRef.current = result || null;
            if (typeof result !== "string") {
                throw new Error("Unable to verify Recaptcha: Request is not believed to be a user");
            }
        }, err => {
            if (recaptchaAbstraction.current == null) {
                return;
            }
            throw err;
        });
    }, [recaptchaBrowserKey, ref, recaptchaAbstraction, verificationTokenRef]);
    // We render the invisible recaptcha into this element
    const Element = react_2.useMemo(() => react_2.memo(function ReCaptchaCapture() {
        return <div hidden={true} key={key} ref={ref}/>;
    }, () => false), [key, ref]);
    return {
        startVerification,
        Element,
        verificationTokenRef
    };
}
exports.useRecaptcha = useRecaptcha;
//# sourceMappingURL=component.jsx.map