google-recaptcha-v3
Version:
A hook google-recaptcha-v3 for react
37 lines (36 loc) • 1.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var react_1 = require("react");
var useGoogleRecaptcha = function (siteKey, action, options) {
if (options === void 0) { options = {}; }
var _a = (0, react_1.useState)(null), token = _a[0], setToken = _a[1];
var _b = (0, react_1.useState)(null), error = _b[0], setError = _b[1];
var _c = options.language, language = _c === void 0 ? 'en' : _c;
var loadReCaptcha = (0, react_1.useCallback)(function () {
if (window.grecaptcha) {
window.grecaptcha.ready(function () {
window.grecaptcha
.execute(siteKey, { action: action })
.then(function (token) { return setToken(token); })
.catch(function (err) { return setError("ReCAPTCHA execute failed: ".concat(err)); });
});
}
else {
setError('grecaptcha is not loaded.');
}
}, [siteKey, action]);
(0, react_1.useEffect)(function () {
var script = document.createElement("script");
script.src = "https://www.google.com/recaptcha/api.js?render=".concat(siteKey, "&hl=").concat(language);
script.async = true;
script.defer = true;
script.onload = loadReCaptcha;
script.onerror = function () { return setError('Failed to load ReCAPTCHA script.'); };
document.body.appendChild(script);
return function () {
document.body.removeChild(script);
};
}, [siteKey, action, language, loadReCaptcha]);
return { token: token, error: error, fetchCaptcha: loadReCaptcha };
};
exports.default = useGoogleRecaptcha;