react-recaptcha-hook
Version:
React hook for google-recaptcha v3
91 lines (81 loc) • 2.81 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
var useScript = require('react-script-hook');
function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/_interopNamespace(React);
var useScript__default = /*#__PURE__*/_interopDefault(useScript);
function useRecaptcha({
sitekey,
hideDefaultBadge = false,
checkForExisting = true
}) {
const [recaptcha, setRecaptcha] = React__namespace.useState();
React__namespace.useEffect(() => {
if (isBrowser && hideDefaultBadge) {
injectStyle('.grecaptcha-badge { visibility: hidden; }');
}
}, [hideDefaultBadge]);
useScript__default["default"]({
src: `https://www.google.com/recaptcha/api.js?render=${sitekey}`,
onload: () => window.grecaptcha.ready(() => {
setRecaptcha(window.grecaptcha);
}),
checkForExisting
});
React__namespace.useEffect(() => {
if (window.grecaptcha) {
window.grecaptcha.ready(() => {
setRecaptcha(window.grecaptcha);
});
}
}, []);
return action => {
return new Promise((resolve, reject) => {
if (recaptcha) {
resolve(recaptcha.execute(sitekey, {
action
}));
} else {
reject(new Error('Recaptcha script not available'));
}
});
};
}
const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
const injectStyle = rule => {
const styleEl = document.createElement('style');
document.head.appendChild(styleEl);
const styleSheet = styleEl.sheet;
if (styleSheet) styleSheet.insertRule(rule, styleSheet.cssRules.length);
};
const Badge = props => {
return /*#__PURE__*/React__namespace.createElement("span", props, "This site is protected by reCAPTCHA and the Google", ' ', /*#__PURE__*/React__namespace.createElement("a", {
href: "https://policies.google.com/privacy",
target: "_blank",
rel: "noopener noreferrer"
}, "Privacy Policy"), ' ', "and", ' ', /*#__PURE__*/React__namespace.createElement("a", {
href: "https://policies.google.com/terms",
target: "_blank",
rel: "noopener noreferrer"
}, "Terms of Service"), ' ', "apply.");
};
exports.Badge = Badge;
exports.useRecaptcha = useRecaptcha;