2.0.1 • Published 5 years ago

@tshio/redux-api-endpoint-middleware v2.0.1

Weekly downloads
14
License
MIT
Repository
github
Last release
5 years ago

Endpoint middleware

Installation

Using yarn:

$ yarn add @tshio/redux-api-endpoint-middleware

Using npm:

$ npm install --save @tshio/redux-api-endpoint-middleware

Then, to enable endpointMiddleware, use applyMiddleware:

import { applyMiddleware, createStore } from 'redux';

import { apiMiddleware } from 'redux-api-middleware';
import createEndpointMiddleware from '@tshio/redux-api-endpoint-middleware';

import { appReducer } from 'app/app.reducer';

const endpointMiddleware = createEndpointMiddleware();

const middlewares = [endpointMiddleware, apiMiddleware];

const store = createStore(appReducer, applyMiddleware(...middlewares));

Configuration

By default all endpoints will be prefixed with the API url take from environment variable REACT_APP_API_URL. In order to change it, the configuration object with property apis.default.apiUrl has to be passed to the endpointMiddleware factory:

const endpointMiddleware = createEndpointMiddleware({
  apis: {
    default: {
      apiUrl: process.env.MY_API,
    },
  },
});

Endpoints starting with http:// and https:// won't be prefixed. In order to change the list of the prefixes that should be excluded the configuration object should have property excluded with desired list:

const endpointMiddleware = createEndpointMiddleware({
  excluded: ['http://', 'https://', '/i18n/'],
});

When you have to connect to more than one API in your application, you can define a list of APIs (with URL and custom params) in configuration:

const endpointMiddleware = createEndpointMiddleware({
  apis: {
    default: {
      apiUrl: process.env.MY_API,
      headers: {
        'X-Api-Version': '1',
      },
    },
    microServiceOne: {
      apiUrl: 'http://microservice-1.example.com',
      customParam: {
        foo: 'bar',
      },
    },
    microServiceTwo: {
      apiUrl: 'http://microservice-2.example.com',
      customParam: {
        foo: 'bar',
      },
    },
  },
});

and then you can select defined API directly in action (by api property):

export const fetchUsers = () => ({
  [RSAA]: {
    method: 'GET',
    types: [FETCH_USERS_REQUEST, FETCH_USERS_SUCCESS, FETCH_USERS_FAILURE],
    api: 'microServiceOne',
  },
});

It will be equal to:

export const fetchUsers = () => ({
  [RSAA]: {
    method: 'GET',
    types: [FETCH_USERS_REQUEST, FETCH_USERS_SUCCESS, FETCH_USERS_FAILURE],
    endpoint: 'http://microservice-1.example.com/',
    customParam: {
      foo: 'bar',
    },
  },
});