UNPKG

leancloud-storage

Version:
179 lines (149 loc) 5.44 kB
"use strict"; 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; }); }; };