// Request utils, // feel free to replace with your code // (get, post are used in ApiServices) import {getLocalToken} from 'api/AuthSvc'; import config from 'config' window.BASE_API = config.BASE_API function requestWrapper(method) { return async function (url, data = null, params = {}) { if (method === 'GET') { // is it a GET? // GET doesn't have data params = data; data = null; } else if (data === Object(data)) { // (data === Object(data)) === _.isObject(data) data = JSON.stringify(data) } else { throw new Error(`XHR invalid, check ${method} on ${url}`) } // default params for fetch = method + (Content-Type) let defaults = { method: method, headers: { 'Content-Type': 'application/json; charset=UTF-8' } } // check that req url is relative and request was sent to our domain if (url.match(/^https?:\/\//gi) > -1) { let token = getLocalToken(); if (token) { defaults.headers['Authorization'] = `JWT ${token}`; } url = window.BASE_API + url; } if (data) { defaults.body = data; } let paramsObj = {...defaults, headers: {...params, ...defaults.headers}} return await fetch(url, paramsObj) .then(parseJSON) .catch((err) => { console.error(err) }); } } // middlewares // parse fetch json, add ok property and return request result /** * 1. parse response * 2. add "ok" property to result * 3. return request result * @param {Object} res - response from server * @return {Object} response result with "ok" property */ async function parseJSON(res) { let json; try { json = await res.json() } catch (e) { return {data: {}, ok: false} } // simplest validation ever, ahah :) if (!res.ok) { return {data: json, ok: false} } // resultOK - is a function with side effects // It removes ok property from result object return {data: json, ok: true} } export const get = requestWrapper('GET') export const post = requestWrapper('POST') export const put = requestWrapper('PUT') export const patch = requestWrapper('PATCH') export const del = requestWrapper('DELETE') // USAGE: // get('https://www.google.com', { // Authorization: 'JWT LOL', // headers: { // 'Content-Type': 'text/html' // } // }) // FUNCTION WITH SIDE-EFFECTS /** * `parseJSON()` adds property "ok" * that identicates that response is OK * * `resultOK`removes result.ok from result and returns "ok" property * It widely used in `/actions/*` * for choosing action to dispatch after request to API * * @param {Object} result - response result that * @return {bool} - indicates was request successful or not */ export function resultOK(result) { if (result) { let ok = result.ok delete result.ok return ok //look at parseJSON } else { return false } }