vue3-recaptcha2
Version:
Vue v3 component for Google reCAPTCHA v2
2 lines (1 loc) • 1.68 kB
JavaScript
(function(e,c){typeof exports=="object"&&typeof module!="undefined"?module.exports=c(require("vue")):typeof define=="function"&&define.amd?define(["vue"],c):(e=typeof globalThis!="undefined"?globalThis:e||self,e.VueRecaptcha=c(e.Vue))})(this,function(e){"use strict";return e.defineComponent({__name:"vueRecaptcha",props:{sitekey:{type:String,required:!0},size:{type:String,required:!1,default:"normal"},theme:{type:String,required:!1,default:"light"},hl:{type:String,required:!1},loadingTimeout:{type:Number,required:!1,default:0}},emits:{verify:t=>t!=null&&t!="",error:t=>t,expire:null,fail:null},setup(t,{expose:g,emit:a}){const r=t,s=e.ref(null);let l=null;g({execute:function(){window.grecaptcha.execute(l)},reset:function(){window.grecaptcha.reset(l)}});function p(){l=window.grecaptcha.render(s.value,{sitekey:r.sitekey,theme:r.theme,size:r.size,callback:n=>a("verify",n),"expired-callback":()=>a("expire"),"error-callback":()=>a("fail")})}return e.onMounted(()=>{window.grecaptcha==null?new Promise((n,f)=>{let u,o=!1;window.recaptchaReady=function(){o||(o=!0,clearTimeout(u),n())};const h="recaptcha-script",d=y=>()=>{var w;o||(o=!0,clearTimeout(u),(w=document.getElementById(h))==null||w.remove(),f(y))};r.loadingTimeout>0&&(u=setTimeout(d("timeout"),r.loadingTimeout));const m=window.document,i=m.createElement("script");i.id=h,i.onerror=d("error"),i.onabort=d("aborted"),i.setAttribute("src",`https://www.google.com/recaptcha/api.js?onload=recaptchaReady&render=explicit&hl=${r.hl}&_=${+new Date}`),m.head.appendChild(i)}).then(()=>{p()}).catch(n=>{a("error",n)}):p()}),(n,f)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"recaptchaDiv",ref:s},null,512))}})});