UNPKG

google-react-recaptcha-v3

Version:

React component for Google reCAPTCHA v3 with advanced features and optimizations

3 lines 4.67 kB
'use strict';var react=require('react');var Y=Object.defineProperty;var q=(r,e,t)=>e in r?Y(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var D=(r,e,t)=>q(r,e+"",t);var v=(a=>(a.LOGIN="login",a.REGISTER="register",a.PURCHASE="purchase",a.PAYMENT="payment",a.SUBMIT="submit",a.CHECKOUT="checkout",a.ORDER="order",a.SIGNUP="signup",a.SIGNIN="signin",a.TRANSACTION="transaction",a))(v||{});var P=class{constructor(e){D(this,"grecaptcha",null);this.grecaptcha=e||(typeof window!="undefined"?window.grecaptcha:null);}async execute(e){if(!this.isReady())return {success:false,error:new Error("reCAPTCHA not ready")};try{return {success:!0,token:await this.grecaptcha.execute(e.siteKey,{action:e.action})}}catch(t){return {success:false,error:t instanceof Error?t:new Error("Unknown reCAPTCHA error")}}}isReady(){return !!(this.grecaptcha&&typeof this.grecaptcha.execute=="function")}reset(){var e;(e=this.grecaptcha)!=null&&e.reset&&this.grecaptcha.reset();}validateAction(e){return Object.values(v).includes(e)?{isValid:true,warning:`autoExecute no recomendado para acci\xF3n transaccional: "${e}". Los tokens expiran en 2 minutos.`}:{isValid:true}}setGrecaptcha(e){this.grecaptcha=e;}},R=new P,J=r=>new P(r);var b="recaptcha-v3-script";var w=class{static buildScriptUrl(e){let t=e.trustedTypes?"&trustedtypes=true":"";return `https://www.google.com/recaptcha/api.js?render=${e.siteKey}${e.hl?`&hl=${e.hl}`:""}${t}`}static isScriptLoaded(){return !!document.getElementById(b)}static async loadScript(e,t={}){let{timeout:p=5e3,onLoad:c,onError:n}=t;return new Promise(u=>{if(this.isScriptLoaded()){u({success:true});return}let i=document.createElement("script");i.id=b,i.src=this.buildScriptUrl(e),i.async=true,i.defer=true;let l=setTimeout(()=>{let s=new Error(`Script loading timeout after ${p}ms`);n==null||n(s),u({success:false,error:s});},p);i.onload=()=>{clearTimeout(l),c==null||c(),u({success:true});},i.onerror=()=>{clearTimeout(l);let s=new Error("Failed to load reCAPTCHA script");n==null||n(s),u({success:false,error:s});},document.head.appendChild(i);})}static waitForGrecaptcha(e=5e3){return new Promise(t=>{if(typeof window!="undefined"&&window.grecaptcha){t(true);return}let p=Date.now(),c=setInterval(()=>{typeof window!="undefined"&&window.grecaptcha?(clearInterval(c),t(true)):Date.now()-p>e&&(clearInterval(c),t(false));},100);})}},L=(r,e)=>w.loadScript(r,e),U=r=>w.waitForGrecaptcha(r);function I(r){let{siteKey:e,action:t,hl:p,trustedTypes:c=false,timeout:n=5e3,autoExecute:u=false,onVerify:i,onError:l}=r,[s,a]=react.useState(false),[x,f]=react.useState(true),S=react.useRef(false),G=react.useRef(t),H=react.useRef(e),E=react.useRef(i),o=react.useRef(l);E.current=i,o.current=l,react.useEffect(()=>{(H.current!==e||G.current!==t)&&(S.current=false,H.current=e,G.current=t);},[e,t]);let C=react.useCallback(async()=>{var m,g;let d={siteKey:e,action:t,hl:p,trustedTypes:c},h=await R.execute(d);return h.success&&h.token?((m=E.current)==null||m.call(E,h.token),h.token):((g=o.current)==null||g.call(o,h.error||new Error("Unknown error")),null)},[e,t,p,c]),K=react.useCallback(async()=>{if(!u||S.current||!s)return;S.current=true;let d=R.validateAction(t);d.warning&&console.warn(`\u26A0\uFE0F ${d.warning}`),await C();},[u,s,t,C]),j=react.useCallback(()=>{S.current=false,R.reset();},[]);return react.useEffect(()=>{let d=true;return (async()=>{var m,g;try{if(f(!0),!(await L({siteKey:e,hl:p,trustedTypes:c},{timeout:n,onError:B=>{var F;return (F=o.current)==null?void 0:F.call(o,B)}})).success)return;if(!await U(n)){(m=o.current)==null||m.call(o,new Error("reCAPTCHA failed to initialize"));return}typeof window!="undefined"&&window.grecaptcha&&(R.setGrecaptcha(window.grecaptcha),window.grecaptcha.ready(()=>{d&&(a(!0),f(!1),K());}));}catch(V){if(d){let $=V instanceof Error?V:new Error("Initialization failed");(g=o.current)==null||g.call(o,$),f(false);}}})(),()=>{d=false;}},[e,p,c,n,K]),{isReady:s,execute:C,reset:j,isLoading:x}}var T=react.forwardRef(({siteKey:r,action:e,hl:t,onVerify:p,onError:c,trustedTypes:n=false,timeout:u=5e3,autoExecute:i=false},l)=>{let{isReady:s,execute:a,reset:x,isLoading:f}=I({siteKey:r,action:e,hl:t,trustedTypes:n,timeout:u,autoExecute:i,onVerify:p,onError:c});return react.useImperativeHandle(l,()=>({execute:a,isReady:()=>s,reset:x,isLoading:()=>f}),[a,s,x,f]),null});T.displayName="ReCaptchaV3";var X=T; exports.ReCaptchaV3=X;exports.ScriptLoader=w;exports.TRANSACTIONAL_ACTIONS=v;exports.createRecaptchaService=J;exports.loadRecaptchaScript=L;exports.recaptchaService=R;exports.useReCaptcha=I;exports.waitForRecaptcha=U;//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map