import { take, fork, call, put } from 'redux-saga/effects'; import axios from 'axios'; import { DOC_CREATED, DOC_READ, DOC_UPDATED, DOC_DELETED } from 'constants/actions'; import { docCreateResponded, docReadResponded, docUpdateResponded, docDeleteResponded } from 'actions/crud'; export function *apiRequest(method, route, params = [], data = null) { let path = `/api1/${route}`; if (params.length) { path = `${path}/${params.join('/')}`; } const args = [[axios, method], path]; if (['post', 'put'].includes(method)) { args.push(data); } try { const response = yield call(...args); return { response, err: null }; } catch (err) { return { response: null, err }; } } export function *createListener() { while (true) { const { route, pendingId, fields } = yield take(DOC_CREATED); const { response, err } = yield call(apiRequest, 'post', route, [], fields); yield put(docCreateResponded(route, pendingId, err, response)); } } export function *readListener() { while (true) { const { route } = yield take(DOC_READ); const { response, err } = yield call(apiRequest, 'get', route); yield put(docReadResponded(route, err, response)); } } export function *updateListener() { while (true) { const { route, id, fields } = yield take(DOC_UPDATED); const { response, err } = yield call(apiRequest, 'put', route, [id], fields); yield put(docUpdateResponded(route, id, err, response)); } } export function *deleteListener() { while (true) { const { route, id } = yield take(DOC_DELETED); const { err } = yield call(apiRequest, 'delete', route, [id]); yield put(docDeleteResponded(route, id, err)); } } export function *crudSaga() { yield fork(createListener); yield fork(readListener); yield fork(updateListener); yield fork(deleteListener); }