vue3-recaptcha-v2
Version:
reCAPTCHA for Vue3 : CompositionAPI, Types
2 lines (1 loc) • 2.66 kB
JavaScript
(function(r,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(r=typeof globalThis<"u"?globalThis:r||self,e(r.index={},r.Vue))})(this,function(r,e){"use strict";const b="https://www.google.com/recaptcha/api.js",g="https://recaptcha.net/recaptcha/api.js",u="vue3-recaptcha-v2:options",l="vue3-recaptcha-v2",d=typeof window>"u";class n extends Error{constructor(a){super(a),this.message="[vue3-recaptcha-v2] "+a}}const m=()=>{const c=e.inject(u);return{options:c,handleGenerateScript:s=>{if(d)throw new n("Cannot generate script on server side");const t=document.getElementById(l);t&&t.remove();const o=document.createElement("script"),p=c!=null&&c.cnDomains?g:b,h=s?`&hl=${s}`:"";o.setAttribute("id",l),o.setAttribute("src",`${p}?render=explicit${h}`),o.setAttribute("async",""),o.setAttribute("defer",""),o.onerror=()=>{new n("Failed to load script")},document.head.appendChild(o)}}},v=()=>({handleReset:t=>{if(d)throw new n("reCaptcha is not available on server side");if(!window.grecaptcha)throw new n("reCaptcha is not available on window");window.grecaptcha.reset(t)},handleGetResponse:t=>{if(d)throw new n("reCaptcha is not available on server side");if(!window.grecaptcha)throw new n("reCaptcha is not available on window");return window.grecaptcha.getResponse(t)},handleExecute:t=>{if(d)throw new n("reCaptcha is not available on server side");if(!window.grecaptcha)throw new n("reCaptcha is not available on window");window.grecaptcha.execute(t)}}),R=e.defineComponent({__name:"Recaptcha",props:{sitekey:{},theme:{},size:{},tabindex:{},language:{}},emits:["widgetId","loadCallback","expiredCallback","errorCallback"],setup(c,{emit:a}){const s=c,t=e.ref(null),o=e.ref(null),{handleGenerateScript:p,options:h}=m(),f=i=>{if(!window.grecaptcha)throw new n("reCAPTCHA is not loaded");if(!o.value)throw new n("element is not defined");const{theme:C,size:_,tabindex:k}=s;window.grecaptcha.ready(()=>{try{t.value=window.grecaptcha.render(o.value,{sitekey:i,theme:C,size:_,tabindex:k,callback:w=>a("loadCallback",w),"expired-callback":()=>a("expiredCallback"),"error-callback":()=>a("errorCallback")}),a("widgetId",t.value)}catch(w){throw new n(w.message)}})};return e.watch(()=>s.sitekey,i=>{i&&!t.value&&f(i)}),e.onBeforeMount(()=>{p(s.language)}),e.onMounted(()=>{const{sitekey:i}=h;document.getElementById(l).onload=()=>{i&&f(i)}}),(i,C)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"reCAPTCHARef",ref:o},null,512))}});function A(c,a={}){c.provide(u,a)}r.RecaptchaV2=R,r.install=A,r.useRecaptcha=v,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});