UNPKG

vue3-smart-captcha

Version:

Yandex Smart Captcha for Vue3 projects

2 lines (1 loc) 3.71 kB
"use strict";var x=Object.defineProperty;var j=(a,e,s)=>e in a?x(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s;var b=(a,e,s)=>j(a,typeof e!="symbol"?e+"":e,s);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("vue");class _{constructor(){b(this,"SCRIPT_RENDER_ONLOAD_SRC","https://smartcaptcha.cloud.yandex.ru/captcha.js?render=onload")}execute(e){var s;(s=window.smartCaptcha)==null||s.execute(e)}reset(e){var s;(s=window.smartCaptcha)==null||s.reset(e)}destroy(e){var s;(s=window.smartCaptcha)==null||s.destroy(e)}getResponse(e){var s;return(s=window.smartCaptcha)==null?void 0:s.getResponse(e)}subscribe(e,s,n){var i;(i=window.smartCaptcha)==null||i.subscribe(e,s,n)}}const f=(a,e,s=!0,n=2e3)=>{const i=new _,c=l.ref(),d=l.ref(),o=l.ref(),r={success:[],"javascript-error":[],"network-error":[],"token-expired":[],"challenge-hidden":[],"challenge-visible":[]},h=()=>{typeof a=="string"?o.value=document.querySelector(a):a instanceof HTMLElement?o.value=a:a.value&&(o.value=a.value)},w=()=>{const t=document.createElement("script");t.src=i.SCRIPT_RENDER_ONLOAD_SRC,t.defer=!0,t.type="text/javascript",t.crossOrigin="anonymous",t.dataset.captcha="true",document.head.appendChild(t)},C=()=>{if(typeof e=="string")return{sitekey:e};const t=(e==null?void 0:e.sitekey)||void 0;if(!t)throw new Error("Captcha key is not defined. Please provide value or specify `VITE_SMARTCAPTCHA_KEY` environment variable");return{...e,sitekey:t}},y=t=>{d.value=t},g=t=>{r[t].length>0&&r[t].forEach(u=>{i.subscribe(c.value,t,u)})},k=()=>{c.value!==void 0&&(i.subscribe(c.value,"success",y),Array.from(Object.keys(r)).forEach(t=>{g(t)}))},S=()=>{o.value&&window.smartCaptcha!==void 0&&(c.value=window.smartCaptcha.render(o.value,C()),k())};l.onMounted(()=>{h(),window.smartCaptcha===void 0&&s&&w();const t=10,u=setInterval(()=>{let T=0;if(++T===t){console.warn(`The captcha could not be initialized in ${n}ms. Make sure the widget script has been loaded`),clearInterval(u);return}window.smartCaptcha!==void 0&&(clearInterval(u),S())},n/t)}),l.onUnmounted(()=>{var t;s&&((t=document.querySelector("script[data-captcha]"))==null||t.remove()),m()});const E=()=>{i.execute(c.value)},v=()=>{c.value=void 0,d.value=void 0},R=()=>{i.reset(c.value),v()},m=()=>{i.destroy(c.value),v()};return{widgetId:c,token:d,execute:E,reset:R,destroy:m,getResponse:()=>i.getResponse(c.value),subscribeTo:(t,u)=>{r[t].push(u)}}},p=l.defineComponent({__name:"SmartCaptcha",props:{sitekey:{},callback:{},hl:{},test:{type:Boolean},webview:{type:Boolean},invisible:{type:Boolean},shieldPosition:{},hideShield:{type:Boolean},loadWidget:{type:Boolean,default:!0},timeout:{default:2e3}},emits:["challengeHidden","challengeVisible","javascriptError","networkError","tokenExpired","success","initialized"],setup(a,{emit:e}){const s=l.ref(),n=a,{subscribeTo:i,widgetId:c,destroy:d}=f(s,{sitekey:n.sitekey,callback:n.callback,hl:n.hl,test:n.test,webview:n.webview,invisible:n.invisible,shieldPosition:n.shieldPosition,hideShield:n.hideShield},n.loadWidget,n.timeout),o=e;return l.watch(c,r=>{r!==void 0&&o("initialized",r)}),i("challenge-hidden",()=>{o("challengeHidden")}),i("challenge-visible",()=>{o("challengeVisible")}),i("javascript-error",r=>{o("javascriptError",r)}),i("network-error",()=>{o("networkError")}),i("token-expired",()=>{o("tokenExpired")}),i("success",r=>{o("success",r)}),l.onUnmounted(()=>{d()}),(r,h)=>(l.openBlock(),l.createElementBlock("div",{ref_key:"container",ref:s},null,512))}}),I={install:a=>{a.component("SmartCaptcha",p)}};exports.SmartCaptcha=p;exports.SmartCaptchaPlugin=I;exports.SmartCaptchaUtils=_;exports.default=p;exports.useSmartCaptcha=f;