54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
import Vue from 'vue';
|
|
import CaptchaModal from '~/captcha/captcha_modal.vue';
|
|
import UnsolvedCaptchaError from '~/captcha/unsolved_captcha_error';
|
|
|
|
/**
|
|
* Opens a Captcha Modal with provided captchaSiteKey.
|
|
*
|
|
* Returns a Promise which resolves if the captcha is solved correctly, and rejects
|
|
* if the captcha process is aborted.
|
|
*
|
|
* @param captchaSiteKey
|
|
* @returns {Promise}
|
|
*/
|
|
export function waitForCaptchaToBeSolved(captchaSiteKey) {
|
|
return new Promise((resolve, reject) => {
|
|
let captchaModalElement = document.createElement('div');
|
|
|
|
document.body.append(captchaModalElement);
|
|
|
|
let captchaModalVueInstance = new Vue({
|
|
el: captchaModalElement,
|
|
render: (createElement) => {
|
|
return createElement(CaptchaModal, {
|
|
props: {
|
|
captchaSiteKey,
|
|
needsCaptchaResponse: true,
|
|
},
|
|
on: {
|
|
hidden: () => {
|
|
// Cleaning up the modal from the DOM
|
|
captchaModalVueInstance.$destroy();
|
|
captchaModalVueInstance.$el.remove();
|
|
captchaModalElement.remove();
|
|
|
|
captchaModalElement = null;
|
|
captchaModalVueInstance = null;
|
|
},
|
|
receivedCaptchaResponse: (captchaResponse) => {
|
|
if (captchaResponse) {
|
|
resolve(captchaResponse);
|
|
} else {
|
|
// reject the promise with a custom exception, allowing consuming apps to
|
|
// adjust their error handling, if appropriate.
|
|
const error = new UnsolvedCaptchaError();
|
|
reject(error);
|
|
}
|
|
},
|
|
},
|
|
});
|
|
},
|
|
});
|
|
});
|
|
}
|