UNPKG

fractal-login

Version:
104 lines (89 loc) 2.89 kB
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; }); }