45 lines
1.2 KiB
JavaScript
45 lines
1.2 KiB
JavaScript
import APIClient from './api_client';
|
|
import { UPDATE, DELETE } from './duck/jwt';
|
|
|
|
export default store => next => (action) => {
|
|
const { types, call, ...rest } = action;
|
|
if (!call) {
|
|
return next(action);
|
|
}
|
|
const [ REQUEST, SUCCESS, FAILURE ] = types;
|
|
next({ ...rest, type: REQUEST });
|
|
const client = new APIClient();
|
|
|
|
return call(client)
|
|
.then(response => {
|
|
if (response.status === 403) {
|
|
next({ type: DELETE });
|
|
}
|
|
return response.json()
|
|
})
|
|
.then(json => json || {}) // TEMP TODO on server: no empty responces
|
|
.then(({ jwt, errors, data }) => {
|
|
if (errors) {
|
|
next({ type: FAILURE, errors, data });
|
|
} else {
|
|
next({ type: SUCCESS, data, ...rest });
|
|
}
|
|
if (jwt) {
|
|
next({ type: UPDATE, data: jwt });
|
|
}
|
|
})
|
|
.catch(() => {
|
|
return next({ type: FAILURE, errors: [ 'Connection error' ] });
|
|
});
|
|
};
|
|
|
|
function jwtExpired(token) {
|
|
try {
|
|
const base64Url = token.split('.')[ 1 ];
|
|
const base64 = base64Url.replace('-', '+').replace('_', '/');
|
|
const tokenObj = JSON.parse(window.atob(base64));
|
|
return tokenObj.exp * 1000 < Date.now(); // exp in Unix time (sec)
|
|
} catch (e) {
|
|
return true;
|
|
}
|
|
}
|