plopfile-generate
Version:
Installation:
137 lines (122 loc) • 3.68 kB
JavaScript
import { appConfig } from '../config/index';
// import { store } from '../setup';
const checkIfErrorOccurs = res => {
return {
code: res.status,
res,
};
};
const TIME_OUT = 10000;
async function customFetch(path, headerOptions, ops = { noParse: false }) {
const normalFetch = fetch(path, headerOptions);
if (ops.noParse) {
return timeoutPromise(TIME_OUT, normalFetch);
}
const res = await timeoutPromise(TIME_OUT, normalFetch.then(checkIfErrorOccurs));
if (res.code < 300) {
const response = await res.res.json();
return response;
}
try {
const response = await res.res.json();
const error = {
code: res.code,
...response,
};
throw error;
} catch (e) {
if (res.code === 426) {
const error = {
code: res.code,
message:
'We have had some significant upgrades for the app. Please click below to upgrade your app!',
};
throw error;
} else {
const error = {
code: res.code,
message: e.error || e.message ? e.error || e.message : 'Something wrong. Please try again.',
};
throw error;
}
}
}
export const timeoutPromise = (ms, promise) => {
return new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
reject('Request time out! Please try again.');
}, ms);
promise.then(
res => {
clearTimeout(timeoutId);
resolve(res);
},
err => {
clearTimeout(timeoutId);
reject(err);
},
);
});
};
export default customFetch;
function requestWrapper(method) {
return async function(url, data = null, params = {}) {
let convertUrl = appConfig.REACT_APP_SERVER_URL + url;
let convertParams = params;
let convertData = data;
if (method === 'GET') {
// is it a GET?
// GET doesn't have data
convertParams = convertData;
if (convertParams !== null) {
convertUrl = `${convertUrl}?${getQueryString(convertParams)}`;
}
convertData = null;
} else if (convertData === Object(convertData)) {
// (data === Object(data)) === _.isObject(data)
convertData = JSON.stringify(convertData);
}
// default params for fetch = method + (Content-Type)
const defaults = {
method,
headers: {
'Content-Type': 'application/json; charset=UTF-8',
'X-Parse-Application-Id': appConfig.PARSE_APP_ID,
'X-Parse-REST-API-Key': appConfig.REST_API_KEY,
},
};
// check that req url is relative and request was sent to our domain
let token = null;
if (sessionStorage.getItem('sessionToken')) {
token = sessionStorage.getItem('sessionToken');
}
if (token) {
defaults.headers['X-Parse-Session-Token'] = token;
}
if (method === 'POST' || method === 'PUT') {
defaults.headers.Accept = 'application/json';
defaults.headers['Content-Type'] = 'application/json';
}
// defaults.headers.Platform = Platform.OS === 'ios' ? 'ios' : 'android';
// defaults.headers.VersionNo = '1.0.350';
if (convertData) {
defaults.body = convertData;
}
const paramsObj = {
...defaults,
headers: { ...params, ...defaults.headers },
};
return customFetch(convertUrl, paramsObj);
};
}
function getQueryString(params) {
const esc = encodeURIComponent;
return Object.keys(params)
.map(k => `${esc(k)}=${esc(params[k])}`)
.join('&');
}
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');