/* global grecaptcha */
import React from 'react'; // jshint ignore:line
import FormGroup from 'misago/components/form-group'; // jshint ignore:line
export class BaseCaptcha {
init(context, ajax, include, snackbar) {
this._context = context;
this._ajax = ajax;
this._include = include;
this._snackbar = snackbar;
}
}
export class NoCaptcha extends BaseCaptcha {
load() {
return new Promise(function(resolve) {
// immediately resolve as we don't have anything to validate
resolve();
});
}
validator() {
return null;
}
component() {
return null;
}
}
export class QACaptcha extends BaseCaptcha {
load() {
var self = this;
return new Promise((resolve, reject) => {
self._ajax.get(self._context.get('CAPTCHA_API')).then(
function(data) {
self.question = data.question;
self.helpText = data.help_text;
resolve();
}, function() {
self._snackbar.error(gettext("Failed to load CAPTCHA."));
reject();
});
});
}
validator() {
return [];
}
/* jshint ignore:start */
component(kwargs) {
return (
);
}
/* jshint ignore:end */
}
export class ReCaptchaComponent extends React.Component {
componentDidMount() {
grecaptcha.render('recaptcha', {
'sitekey': this.props.siteKey,
'callback': (response) => {
// fire fakey event to binding
this.props.binding({
target: {
value: response
}
});
}
});
}
render() {
/* jshint ignore:start */
return
;
/* jshint ignore:end */
}
}
export class ReCaptcha extends BaseCaptcha {
load() {
this._include.include('https://www.google.com/recaptcha/api.js', true);
return new Promise(function(resolve) {
var wait = function() {
if (typeof grecaptcha === "undefined") {
window.setTimeout(function() {
wait();
}, 200);
} else {
resolve();
}
};
wait();
});
}
validator() {
return [];
}
/* jshint ignore:start */
component(kwargs) {
return (
);
}
/* jshint ignore:end */
}
export class Captcha {
init(context, ajax, include, snackbar) {
switch(context.get('SETTINGS').captcha_type) {
case 'no':
this._captcha = new NoCaptcha();
break;
case 'qa':
this._captcha = new QACaptcha();
break;
case 're':
this._captcha = new ReCaptcha();
break;
}
this._captcha.init(context, ajax, include, snackbar);
}
// accessors for underlying strategy
load() {
return this._captcha.load();
}
validator() {
return this._captcha.validator();
}
component(kwargs) {
return this._captcha.component(kwargs);
}
}
export default new Captcha();