fractal-login
Version:
Fractal Studios core login
104 lines (89 loc) • 2.89 kB
JavaScript
import { createBrowserHistory } from 'history';
import { accountService } from './accountService';
import Cookies from 'universal-cookie';
export const Role = {
Admin: 'Admin',
User: 'User'
}
export const history = createBrowserHistory();
export const fetchWrapper = {
get,
post,
put,
delete: _delete,
upload
}
const cookies = new Cookies();
function get(url) {
const rt = cookies.get('refreshToken');
const requestOptions = {
method: 'GET',
headers: authHeader(url),
credentials: 'include',
cookies: rt
};
return fetch(url, requestOptions).then(handleResponse);
}
function post(url, body) {
const rt = cookies.get('refreshToken');
const requestOptions = {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...authHeader(url), 'RT': rt },
credentials: 'include',
body: JSON.stringify(body),
cookies: rt
};
return fetch(url, requestOptions).then(handleResponse);
}
function upload(url, formData) {
const requestOptions = {
method: 'POST',
headers: { ...authHeader(url) },
credentials: 'include',
body: formData
};
return fetch(url, requestOptions).then(handleResponse);
}
function put(url, body) {
const requestOptions = {
method: 'PUT',
headers: { 'Content-Type': 'application/json', ...authHeader(url) },
credentials: 'include',
body: JSON.stringify(body)
};
return fetch(url, requestOptions).then(handleResponse);
}
// prefixed with underscored because delete is a reserved word in javascript
function _delete(url) {
const requestOptions = {
method: 'DELETE',
headers: authHeader(url)
};
return fetch(url, requestOptions).then(handleResponse);
}
// helper functions
function authHeader(url) {
// return auth header with jwt if user is logged in and request is to the api url
const user = accountService.userValue;
const isLoggedIn = user && user.jwtToken;
const isApiUrl = url.startsWith(process.env.REACT_APP_API_URL);
if (isLoggedIn && isApiUrl) {
return { Authorization: `Bearer ${user.jwtToken}` };
} else {
return {};
}
}
function handleResponse(response) {
return response.text().then(text => {
const data = text && JSON.parse(text);
if (!response.ok) {
if ([401, 403].includes(response.status) && accountService.userValue) {
// auto logout if 401 Unauthorized or 403 Forbidden response returned from api
accountService.logout();
}
const error = (data && data.message) || response.statusText;
return Promise.reject(error);
}
return data;
});
}