import React, { useCallback } from "react";
import { memo, useEffect, useMemo, useRef, useState } from "react";
import { createRecaptchaAbstraction } from "./abstraction";
export function useRecaptcha(recaptchaBrowserKey) {
    const verificationTokenRef = useRef(null);
    const recaptchaAbstraction = useRef();
    const ref = useRef(null);
    const [key] = useState(Date.now());
    useEffect(() => {
        if (ref.current == null) {
            return;
        }
        recaptchaAbstraction.current = createRecaptchaAbstraction(recaptchaBrowserKey, ref.current);
        return () => {
            if (recaptchaAbstraction.current != null) {
                recaptchaAbstraction.current.resetContainer();
            }
            recaptchaAbstraction.current = undefined;
        };
    }, [recaptchaBrowserKey]);
    const startVerification = 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 = 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 = useMemo(() => memo(function ReCaptchaCapture() {
        return <div hidden={true} key={key} ref={ref}/>;
    }, () => false), [key, ref]);
    return {
        startVerification,
        Element,
        verificationTokenRef
    };
}
//# sourceMappingURL=component.jsx.map