odoo18/addons/google_recaptcha/static/src/js/recaptcha.js

57 lines
1.6 KiB
JavaScript

/** @odoo-module **/
import { session } from "@web/session";
import { loadJS } from "@web/core/assets";
import { _t } from "@web/core/l10n/translation";
export class ReCaptcha {
/**
* @override
*/
constructor() {
this._publicKey = session.recaptcha_public_key;
}
/**
* Loads the recaptcha libraries.
*
* @returns {Promise|boolean} promise if libs are loading else false if the reCaptcha key is empty.
*/
loadLibs() {
if (this._publicKey) {
this._recaptchaReady = loadJS(`https://www.recaptcha.net/recaptcha/api.js?render=${encodeURIComponent(this._publicKey)}`)
.then(() => new Promise(resolve => window.grecaptcha.ready(() => resolve())));
return this._recaptchaReady.then(() => !!document.querySelector('.grecaptcha-badge'));
}
return false;
}
/**
* Returns an object with the token if reCaptcha call succeeds
* If no key is set an object with a message is returned
* If an error occurred an object with the error message is returned
*
* @param {string} action
* @returns {Promise|Object}
*/
async getToken(action) {
if (!this._publicKey) {
return {
message: _t("No recaptcha site key set."),
};
}
await this._recaptchaReady;
try {
return {
token: await window.grecaptcha.execute(this._publicKey, {action: action})
};
} catch {
return {
error: _t("The recaptcha site key is invalid."),
};
}
}
}
export default {
ReCaptcha: ReCaptcha,
};