/
request.js
executable file
·38 lines (30 loc) · 999 Bytes
/
request.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import { call, fork, join, put, select, take } from 'redux-saga/effects';
import selectors from '../../selectors';
import actions from '../../actions';
import { removeAccessToken } from '../../utils/access-token-storage';
import ErrorCodes from '../../constants/ErrorCodes';
let lastRequestTask;
function* queueRequest(method, ...args) {
if (lastRequestTask) {
try {
yield join(lastRequestTask);
} catch {} // eslint-disable-line no-empty
}
const accessToken = yield select(selectors.selectAccessToken);
try {
return yield call(method, ...args, {
Authorization: `Bearer ${accessToken}`,
});
} catch (error) {
if (error.code === ErrorCodes.UNAUTHORIZED) {
yield call(removeAccessToken);
yield put(actions.logout()); // TODO: next url
yield take();
}
throw error;
}
}
export default function* request(method, ...args) {
lastRequestTask = yield fork(queueRequest, method, ...args);
return yield join(lastRequestTask);
}