'use strict'; import $ from 'jquery'; import Events from '../lib/_events'; const NoCaptcha = (($) => { // Constants const $window = $(window); const D = document; const $Body = $('body'); const NAME = 'jsNoCaptcha'; class NoCaptcha { static init() { const ui = this; ui.dispose(); console.log(`${NAME}: init`); if ($('.g-recaptcha').length && typeof $window[0].grecaptcha === 'undefined') { console.log(`${NAME}: Loading Captcha API`); $.getScript( 'https://www.google.com/recaptcha/api.js?render=explicit&hl=en&onload=noCaptchaFieldRender', () => { this.renderCaptcha(); }, ); } else { this.renderCaptcha(); } } static dispose() { console.log(`${NAME}: dispose`); } static renderCaptcha() { const grecaptcha = $window[0].grecaptcha; if (typeof grecaptcha === 'undefined' || typeof grecaptcha.render === 'undefined') { return; } console.log(`${NAME}: Rendering Captcha`); const $_noCaptchaFields = $('.g-recaptcha'); if (!$('.g-recaptcha').length) { console.log(`${NAME}: No Captcha fields`); return; } const submitListener = (e) => { const $field = $(e.currentTarget).find('.g-recaptcha'); grecaptcha.execute($field.data('widgetid')); }; $_noCaptchaFields.each((i, field) => { const $field = $(field); if ($field.data('widgetid') || $field.html().length) { return; } const $form = $field.data('form') ? $(`#${$field.data('form')}`) : $field.parents('form'); const widget_id = grecaptcha.render(field, $field.data()); $field.data('widgetid', widget_id); // For the invisible captcha we need to setup some callback listeners if ($field.data('size') === 'invisible' && !$field.data('callback')) { grecaptcha.execute(widget_id); $form.on('submit', submitListener); } }); } } $window.on(`${NAME}.init ${Events.AJAX} ${Events.LOADED}`, () => { NoCaptcha.init(); }); $window.data(`${NAME}`, NoCaptcha); $window[0].noCaptchaFieldRender = NoCaptcha.renderCaptcha; return NoCaptcha; })($); export default NoCaptcha;