UNPKG

vue-captcha-switcher

Version:

A Vue.js component to switch between different CAPTCHA services.

2 lines (1 loc) 5.11 kB
"use strict";const t=require("vue"),m=t.defineComponent({__name:"TurnstileCaptcha",props:{sitekey:{type:String,required:!0},size:{type:String,default:"normal"},theme:{type:String,default:"light"},scriptId:{type:String,default:"turnstile-script"}},emits:["verify","error","expire","fail"],setup(p,{expose:d,emit:o}){const a=t.ref(null);let n=null;const c=p,i=o;d({execute(){window.turnstile&&n!==null&&window.turnstile.execute(n)},reset(){window.turnstile&&n!==null&&window.turnstile.reset(n)},cleanup:l});function s(){window.turnstile&&a.value&&(n=window.turnstile.render(a.value,{sitekey:c.sitekey,theme:c.theme,size:c.size,callback:e=>i("verify",e),"expired-callback":()=>i("expire"),"error-callback":()=>i("fail")}))}function r(){window.onloadTurnstileCallback=s}t.onMounted(()=>{if(document.getElementById(c.scriptId))s();else{const e=document.createElement("script");e.id=c.scriptId,e.src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback&render=explicit",e.async=!0,e.defer=!0,e.onerror=()=>i("error",new Error("Turnstile script failed to load.")),document.head.appendChild(e),e.onload=r}});function l(){const e=document.getElementById(c.scriptId);e==null||e.remove(),a.value&&(a.value.innerHTML=""),delete window.onloadTurnstileCallback,delete window.turnstile}return t.onBeforeUnmount(()=>{l()}),(e,u)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"turnstileDiv",ref:a},null,512))}}),f=t.defineComponent({__name:"RecaptchaV2",props:{sitekey:{type:String,required:!0},size:{type:String,default:"normal"},theme:{type:String,default:"light"},scriptId:{type:String,default:"recaptcha-script"}},emits:["verify","error","expire","fail"],setup(p,{expose:d,emit:o}){const a=t.ref(null);let n=null;const c=p,i=o;d({execute(){window.grecaptcha&&n!==null&&window.grecaptcha.execute(n)},reset(){window.grecaptcha&&n!==null&&window.grecaptcha.reset(n)},cleanup:l});function s(){window.grecaptcha&&a.value&&(n=window.grecaptcha.render(a.value,{sitekey:c.sitekey,theme:c.theme,size:c.size,callback:e=>i("verify",e),"expired-callback":()=>i("expire"),"error-callback":()=>i("fail")}))}function r(){window.onloadRecaptchaCallback=s}t.onMounted(()=>{if(document.getElementById(c.scriptId))s();else{const e=document.createElement("script");e.id=c.scriptId,e.src="https://www.google.com/recaptcha/api.js?onload=onloadRecaptchaCallback&render=explicit",e.async=!0,e.defer=!0,e.onerror=()=>i("error"),document.head.appendChild(e),e.onload=r}});function l(){const e=document.getElementById(c.scriptId);e==null||e.remove(),a.value&&(a.value.innerHTML=""),delete window.onloadRecaptchaCallback,delete window.grecaptcha}return t.onBeforeUnmount(()=>{l()}),(e,u)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"recaptchaDiv",ref:a},null,512))}}),w=t.defineComponent({__name:"HCaptcha",props:{sitekey:{type:String,required:!0},size:{type:String,default:"normal"},theme:{type:String,default:"light"},scriptId:{type:String,default:"hcaptcha-script"}},emits:["verify","error","expire","fail"],setup(p,{expose:d,emit:o}){const a=t.ref(null);let n=null;const c=p,i=o;d({execute(){window.hcaptcha&&n!==null&&window.hcaptcha.execute(n)},reset(){window.hcaptcha&&n!==null&&window.hcaptcha.reset(n)},cleanup:l});function s(){window.hcaptcha&&a.value&&(n=window.hcaptcha.render(a.value,{sitekey:c.sitekey,theme:c.theme,size:c.size,callback:e=>i("verify",e),"expired-callback":()=>i("expire"),"error-callback":()=>i("fail")}))}function r(){window.onloadHcaptchaCallback=s}t.onMounted(()=>{if(document.getElementById(c.scriptId))s();else{const e=document.createElement("script");e.id=c.scriptId,e.src="https://js.hcaptcha.com/1/api.js?onload=onloadHcaptchaCallback&render=explicit",e.async=!0,e.defer=!0,e.onerror=()=>i("error"),document.head.appendChild(e),e.onload=r}});function l(){const e=document.getElementById(c.scriptId);e==null||e.remove(),a.value&&(a.value.innerHTML=""),delete window.onloadHcaptchaCallback,delete window.hcaptcha}return t.onBeforeUnmount(()=>{l()}),(e,u)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"hcaptchaDiv",ref:a},null,512))}}),y=t.defineComponent({__name:"CaptchaSwitcher",props:{modelValue:{},captchaName:{},publicKey:{},captchaScriptIds:{},captchaReset:{type:Boolean},theme:{},size:{}},emits:["update:modelValue","captchaReset"],setup(p,{emit:d}){const o=p,a=d,n=t.ref(null),c=r=>{a("update:modelValue",r)};t.watch(()=>o.captchaReset,r=>{var l;r&&((l=n.value)!=null&&l.reset)&&(n.value.reset(),a("captchaReset"))});const i=r=>{const l=o.captchaScriptIds||{};for(const[e,u]of Object.entries(l))if(e!==r&&u){const h=document.getElementById(u);h&&h.remove()}};t.watch(()=>o.captchaName,r=>{i(r)}),t.onMounted(()=>{i(o.captchaName)}),t.onBeforeUnmount(()=>{i("")});const s=t.computed(()=>({recaptcha:f,hcaptcha:w,turnstile:m})[o.captchaName]);return(r,l)=>{var e;return t.openBlock(),t.createBlock(t.resolveDynamicComponent(s.value),{sitekey:r.publicKey,theme:r.theme,size:r.size,"script-id":(e=r.captchaScriptIds)==null?void 0:e[r.captchaName],onVerify:c,ref_key:"captchaRef",ref:n},null,40,["sitekey","theme","size","script-id"])}}});module.exports=y;