-
Notifications
You must be signed in to change notification settings - Fork 72
/
Copy pathapiUtils.js
103 lines (93 loc) · 2.53 KB
/
apiUtils.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import "isomorphic-fetch";
import jwt_decode from "jwt-decode";
export function checkStatus(response) {
if (!response.ok) {
// (response.status < 200 || response.status > 300)
const error = new Error(response.statusText);
error.response = response;
throw error;
}
return response;
}
export function parseJSON(response) {
return response.json();
}
/**
* A utility to call a restful service.
*
* @param url The restful service end point.
* @param config The config object of the call. Can be null.
* @param request The request action.
* @param onRequestSuccess The callback function to create request success action.
* The function expects response json payload as its argument.
* @param onRequestFailure The callback function to create request failure action.
* The function expects error as its argument.
*/
export function callApi(
url,
config,
request,
onRequestSuccess,
onRequestFailure
) {
return dispatch => {
dispatch(request);
return fetch(url, config)
.then(checkStatus)
.then(parseJSON)
.then(json => {
dispatch(onRequestSuccess(json));
})
.catch(error => {
const response = error.response;
if (response === undefined) {
dispatch(onRequestFailure(error));
} else {
error.status = response.status;
error.statusText = response.statusText;
response.text().then(text => {
try {
const json = JSON.parse(text);
error.message = json.message;
} catch (ex) {
error.message = text;
}
dispatch(onRequestFailure(error));
});
}
});
};
}
export const ID_TOKEN = "id_token";
export function setIdToken(idToken) {
localStorage.setItem(ID_TOKEN, idToken);
}
export function removeIdToken() {
localStorage.removeItem(ID_TOKEN);
}
export function loadIdToken() {
return localStorage.getItem(ID_TOKEN);
}
export function decodeUserProfile(idToken) {
try {
return jwt_decode(idToken);
} catch (err) {
return null;
}
}
export function loadUserProfile() {
try {
const idToken = localStorage.getItem(ID_TOKEN);
const userProfile = jwt_decode(idToken);
const now = new Date().getTime() / 1000; // Date().getTime() returns milliseconds.
// So divide by 1000 to get seconds
if (now > userProfile.exp) {
// user profile has expired.
removeIdToken();
return null;
}
return userProfile;
} catch (err) {
return null;
}
}