@kineticdata/react
Version:
A React library for the Kinetic Platform
66 lines (65 loc) • 2.84 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createClass"));
var _axios = _interopRequireDefault(require("axios"));
var AuthInterceptor = exports["default"] = /*#__PURE__*/function () {
function AuthInterceptor(store, unauthenticatedAction, authenticatedSelector, cancelledSelector) {
(0, _classCallCheck2["default"])(this, AuthInterceptor);
this.store = store;
this.unauthenticatedAction = unauthenticatedAction;
this.authenticatedSelector = authenticatedSelector;
this.cancelledSelector = cancelledSelector;
this.authPromise = null;
this.handleRejected = this.handleRejected.bind(this);
this.authenticate = this.authenticate.bind(this);
}
(0, _createClass2["default"])(AuthInterceptor, [{
key: "authenticate",
value: function authenticate() {
var _this = this;
this.store.dispatch(this.unauthenticatedAction());
if (this.authenticatedSelector(this.store.getState()) || this.cancelledSelector(this.store.getState())) {
console.error('AuthInterceptor found invalid state when handling unauthenticated ' + 'response. The selectors given (authenticated and cancelled) should ' + 'both return false initially and then return true once the user has ' + 'successfully authenticated or cancelled respectively.');
return Promise.reject();
}
return new Promise(function (resolve, reject) {
var unsub = _this.store.subscribe(function () {
if (_this.authenticatedSelector(_this.store.getState())) {
unsub();
resolve();
} else if (_this.cancelledSelector && _this.cancelledSelector(_this.store.getState())) {
unsub();
reject();
}
});
});
}
}, {
key: "handleRejected",
value: function handleRejected(error) {
var _this2 = this;
if (error.response && error.response.status === 401 && !error.response.config.__bypassAuthInterceptor) {
if (!this.authPromise) {
this.authPromise = this.authenticate();
}
return new Promise(function (resolve, reject) {
_this2.authPromise.then(function () {
(0, _axios["default"])(error.response.config).then(resolve)["catch"](reject);
})["catch"](function () {
reject(error);
})["finally"](function () {
_this2.authPromise = null;
});
});
} else {
return Promise.reject(error);
}
}
}]);
return AuthInterceptor;
}();