All files / hooks/useMutateGeneric useMutateGeneric.js

100% Statements 31/31
97.43% Branches 38/39
100% Functions 16/16
100% Lines 31/31

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104                32x                         2x 2x 2x     5x 5x     5x 5x 5x       27x 27x 27x                         27x     27x   5x 4x           27x   5x             27x   5x           27x 27x 2x   25x     27x 2x   25x     27x 2x   25x     27x        
import { useMutation } from 'react-query';
import noop from 'lodash/noop';
 
import { useOkapiKy } from '@folio/stripes/core';
 
// DEFAULT ASSUMES PUT/POST goes to ENDPOINT/id and that POST goes to ENDPOINT
// A utility function to provide this all-in-one functionality used in various places
 
const useMutateGeneric = ({
  afterQueryCalls: {
    delete: afterQueryDelete = noop,
    post: afterQueryPost = noop,
    put: afterQueryPut = noop,
  } = {},
  catchQueryCalls: {
    delete: catchQueryDelete = noop,
    post: catchQueryPost = noop,
    put: catchQueryPut = noop,
  } = {},
  endpoint,
  endpointMutators: {
    delete: endpointMutatorDelete = (id) => `${endpoint}/${id}`,
    post: endpointMutatorPost = () => endpoint,
    put: endpointMutatorPut = (data) => `${endpoint}/${data.id}`,
  } = {},
  payloadMutators: {
    post: payloadMutatorPost = (data) => ({ json: data }),
    put: payloadMutatorPut = (data) => ({ json: data })
  } = {},
  promiseReturns: {
    delete: promiseReturnDelete = (id, ky) => ky.delete(endpointMutatorDelete(id)).json(),
    post: promiseReturnPost = (data, ky) => ky.post(endpointMutatorPost(data), payloadMutatorPost(data)).json(),
    put: promiseReturnPut = (data, ky) => ky.put(endpointMutatorPut(data), payloadMutatorPut(data)).json()
  } = {},
  queryKey = [], // Must be type: array
  queryKeyMutators: {
    delete: queryKeyMutatorDelete = () => [...queryKey, 'delete'],
    post: queryKeyMutatorPost = () => [...queryKey, 'create'],
    put: queryKeyMutatorPut = () => [...queryKey, 'edit'],
  } = {},
  queryParams: {
    delete: queryParamsDelete = {},
    post: queryParamsPost = {},
    put: queryParamsPut = {},
  } = {},
  returnQueryObject: {
    delete: returnQueryObjectDelete = false,
    post: returnQueryObjectPost = false,
    put: returnQueryObjectPut = false,
  } = {}
} = {}) => {
  const ky = useOkapiKy();
 
  // DELETE Object
  const deleteQueryObject = useMutation(
    queryKeyMutatorDelete(),
    async (id) => promiseReturnDelete(id, ky)
      .then(res => afterQueryDelete(res))
      .catch(catchQueryDelete),
    queryParamsDelete
  );
 
  // Edit Object
  const putQueryObject = useMutation(
    queryKeyMutatorPut(),
    async (data) => promiseReturnPut(data, ky)
      .then(afterQueryPut)
      .catch(catchQueryPut),
    queryParamsPut
  );
 
  // Create Object
  const postQueryObject = useMutation(
    queryKeyMutatorPost(),
    async (data) => promiseReturnPost(data, ky)
      .then(afterQueryPost)
      .catch(catchQueryPost),
    queryParamsPost
  );
 
  const returnObj = {};
  if (returnQueryObjectDelete) {
    returnObj.delete = deleteQueryObject;
  } else {
    returnObj.delete = deleteQueryObject.mutateAsync;
  }
 
  if (returnQueryObjectPut) {
    returnObj.put = putQueryObject;
  } else {
    returnObj.put = putQueryObject.mutateAsync;
  }
 
  if (returnQueryObjectPost) {
    returnObj.post = postQueryObject;
  } else {
    returnObj.post = postQueryObject.mutateAsync;
  }
 
  return returnObj;
};
 
export default useMutateGeneric;