grantglidewell/jsnotes

View on GitHub
src/api/api.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { ApiInterface } from '../interfaces';

import v4 from 'uuid/v4';
import fetch from 'axios';

export function api<T>(args: ApiInterface): Promise<T> {
  const { url, token, payload, method } = args;

  const requestOptions = {
    method,
    data: payload && JSON.stringify(payload),
    headers: {
      Authorization: `Bearer ${token}`,
      Accept: 'application/json',
      'Content-Type': 'application/json',
      'X-Request-Id': v4(),
    },
  };
  return fetch(url, requestOptions)
    .then(response => {
      if (response.status < 400) {
        return response.data;
      } else {
        throw new Error(response.statusText);
      }
    })
    .catch(err => {
      console.error(
        `there was a problem with the request ${(err.statusText &&
          err.statusText) ||
          err}`
      );
      return err;
    });
}