leancloud-storage
Version:
LeanCloud JavaScript SDK.
179 lines (149 loc) • 5.44 kB
JavaScript
var _ = require('underscore');
var _require = require('./utils'),
tap = _require.tap;
module.exports = function (AV) {
/**
* @class
* @example
* AV.Captcha.request().then(captcha => {
* captcha.bind({
* textInput: 'code', // the id for textInput
* image: 'captcha',
* verifyButton: 'verify',
* }, {
* success: (validateCode) => {}, // next step
* error: (error) => {}, // present error.message to user
* });
* });
*/
AV.Captcha = function Captcha(options, authOptions) {
this._options = options;
this._authOptions = authOptions;
/**
* The image url of the captcha
* @type string
*/
this.url = undefined;
/**
* The captchaToken of the captcha.
* @type string
*/
this.captchaToken = undefined;
/**
* The validateToken of the captcha.
* @type string
*/
this.validateToken = undefined;
};
/**
* Refresh the captcha
* @return {Promise.<string>} a new capcha url
*/
AV.Captcha.prototype.refresh = function refresh() {
var _this = this;
return AV.Cloud._requestCaptcha(this._options, this._authOptions).then(function (_ref) {
var captchaToken = _ref.captchaToken,
url = _ref.url;
_.extend(_this, {
captchaToken: captchaToken,
url: url
});
return url;
});
};
/**
* Verify the captcha
* @param {String} code The code from user input
* @return {Promise.<string>} validateToken if the code is valid
*/
AV.Captcha.prototype.verify = function verify(code) {
var _this2 = this;
return AV.Cloud.verifyCaptcha(code, this.captchaToken).then(tap(function (validateToken) {
return _this2.validateToken = validateToken;
}));
};
if ("NODE_JS" === 'Browser') {
/**
* Bind the captcha to HTMLElements. <b>ONLY AVAILABLE in browsers</b>.
* @param [elements]
* @param {String|HTMLInputElement} [elements.textInput] An input element typed text, or the id for the element.
* @param {String|HTMLImageElement} [elements.image] An image element, or the id for the element.
* @param {String|HTMLElement} [elements.verifyButton] A button element, or the id for the element.
* @param [callbacks]
* @param {Function} [callbacks.success] Success callback will be called if the code is verified. The param `validateCode` can be used for further SMS request.
* @param {Function} [callbacks.error] Error callback will be called if something goes wrong, detailed in param `error.message`.
*/
AV.Captcha.prototype.bind = function bind(_ref2, _ref3) {
var _this3 = this;
var textInput = _ref2.textInput,
image = _ref2.image,
verifyButton = _ref2.verifyButton;
var success = _ref3.success,
error = _ref3.error;
if (typeof textInput === 'string') {
textInput = document.getElementById(textInput);
if (!textInput) throw new Error("textInput with id ".concat(textInput, " not found"));
}
if (typeof image === 'string') {
image = document.getElementById(image);
if (!image) throw new Error("image with id ".concat(image, " not found"));
}
if (typeof verifyButton === 'string') {
verifyButton = document.getElementById(verifyButton);
if (!verifyButton) throw new Error("verifyButton with id ".concat(verifyButton, " not found"));
}
this.__refresh = function () {
return _this3.refresh().then(function (url) {
image.src = url;
if (textInput) {
textInput.value = '';
textInput.focus();
}
}).catch(function (err) {
return console.warn("refresh captcha fail: ".concat(err.message));
});
};
if (image) {
this.__image = image;
image.src = this.url;
image.addEventListener('click', this.__refresh);
}
this.__verify = function () {
var code = textInput.value;
_this3.verify(code).catch(function (err) {
_this3.__refresh();
throw err;
}).then(success, error).catch(function (err) {
return console.warn("verify captcha fail: ".concat(err.message));
});
};
if (textInput && verifyButton) {
this.__verifyButton = verifyButton;
verifyButton.addEventListener('click', this.__verify);
}
};
/**
* unbind the captcha from HTMLElements. <b>ONLY AVAILABLE in browsers</b>.
*/
AV.Captcha.prototype.unbind = function unbind() {
if (this.__image) this.__image.removeEventListener('click', this.__refresh);
if (this.__verifyButton) this.__verifyButton.removeEventListener('click', this.__verify);
};
}
/**
* Request a captcha
* @param [options]
* @param {Number} [options.width] width(px) of the captcha, ranged 60-200
* @param {Number} [options.height] height(px) of the captcha, ranged 30-100
* @param {Number} [options.size=4] length of the captcha, ranged 3-6. MasterKey required.
* @param {Number} [options.ttl=60] time to live(s), ranged 10-180. MasterKey required.
* @return {Promise.<AV.Captcha>}
*/
AV.Captcha.request = function (options, authOptions) {
var captcha = new AV.Captcha(options, authOptions);
return captcha.refresh().then(function () {
return captcha;
});
};
};
;