vue-captcha-switcher
Version:
A Vue.js component to switch between different CAPTCHA services.
2 lines (1 loc) • 5.33 kB
JavaScript
(function(t,u){typeof exports=="object"&&typeof module<"u"?module.exports=u(require("vue")):typeof define=="function"&&define.amd?define(["vue"],u):(t=typeof globalThis<"u"?globalThis:t||self,t.VueCaptchaSwitcher=u(t.Vue))})(this,function(t){"use strict";const u=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:s,emit:l}){const r=t.ref(null);let c=null;const n=p,i=l;s({execute(){window.turnstile&&c!==null&&window.turnstile.execute(c)},reset(){window.turnstile&&c!==null&&window.turnstile.reset(c)},cleanup:o});function d(){window.turnstile&&r.value&&(c=window.turnstile.render(r.value,{sitekey:n.sitekey,theme:n.theme,size:n.size,callback:e=>i("verify",e),"expired-callback":()=>i("expire"),"error-callback":()=>i("fail")}))}function a(){window.onloadTurnstileCallback=d}t.onMounted(()=>{if(document.getElementById(n.scriptId))d();else{const e=document.createElement("script");e.id=n.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=a}});function o(){const e=document.getElementById(n.scriptId);e==null||e.remove(),r.value&&(r.value.innerHTML=""),delete window.onloadTurnstileCallback,delete window.turnstile}return t.onBeforeUnmount(()=>{o()}),(e,h)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"turnstileDiv",ref:r},null,512))}}),m=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:s,emit:l}){const r=t.ref(null);let c=null;const n=p,i=l;s({execute(){window.grecaptcha&&c!==null&&window.grecaptcha.execute(c)},reset(){window.grecaptcha&&c!==null&&window.grecaptcha.reset(c)},cleanup:o});function d(){window.grecaptcha&&r.value&&(c=window.grecaptcha.render(r.value,{sitekey:n.sitekey,theme:n.theme,size:n.size,callback:e=>i("verify",e),"expired-callback":()=>i("expire"),"error-callback":()=>i("fail")}))}function a(){window.onloadRecaptchaCallback=d}t.onMounted(()=>{if(document.getElementById(n.scriptId))d();else{const e=document.createElement("script");e.id=n.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=a}});function o(){const e=document.getElementById(n.scriptId);e==null||e.remove(),r.value&&(r.value.innerHTML=""),delete window.onloadRecaptchaCallback,delete window.grecaptcha}return t.onBeforeUnmount(()=>{o()}),(e,h)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"recaptchaDiv",ref:r},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:s,emit:l}){const r=t.ref(null);let c=null;const n=p,i=l;s({execute(){window.hcaptcha&&c!==null&&window.hcaptcha.execute(c)},reset(){window.hcaptcha&&c!==null&&window.hcaptcha.reset(c)},cleanup:o});function d(){window.hcaptcha&&r.value&&(c=window.hcaptcha.render(r.value,{sitekey:n.sitekey,theme:n.theme,size:n.size,callback:e=>i("verify",e),"expired-callback":()=>i("expire"),"error-callback":()=>i("fail")}))}function a(){window.onloadHcaptchaCallback=d}t.onMounted(()=>{if(document.getElementById(n.scriptId))d();else{const e=document.createElement("script");e.id=n.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=a}});function o(){const e=document.getElementById(n.scriptId);e==null||e.remove(),r.value&&(r.value.innerHTML=""),delete window.onloadHcaptchaCallback,delete window.hcaptcha}return t.onBeforeUnmount(()=>{o()}),(e,h)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"hcaptchaDiv",ref:r},null,512))}});return t.defineComponent({__name:"CaptchaSwitcher",props:{modelValue:{},captchaName:{},publicKey:{},captchaScriptIds:{},captchaReset:{type:Boolean},theme:{},size:{}},emits:["update:modelValue","captchaReset"],setup(p,{emit:s}){const l=p,r=s,c=t.ref(null),n=a=>{r("update:modelValue",a)};t.watch(()=>l.captchaReset,a=>{var o;a&&((o=c.value)!=null&&o.reset)&&(c.value.reset(),r("captchaReset"))});const i=a=>{const o=l.captchaScriptIds||{};for(const[e,h]of Object.entries(o))if(e!==a&&h){const f=document.getElementById(h);f&&f.remove()}};t.watch(()=>l.captchaName,a=>{i(a)}),t.onMounted(()=>{i(l.captchaName)}),t.onBeforeUnmount(()=>{i("")});const d=t.computed(()=>({recaptcha:m,hcaptcha:w,turnstile:u})[l.captchaName]);return(a,o)=>{var e;return t.openBlock(),t.createBlock(t.resolveDynamicComponent(d.value),{sitekey:a.publicKey,theme:a.theme,size:a.size,"script-id":(e=a.captchaScriptIds)==null?void 0:e[a.captchaName],onVerify:n,ref_key:"captchaRef",ref:c},null,40,["sitekey","theme","size","script-id"])}}})});