UNPKG

4.45 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7
8var _react = _interopRequireDefault(require("react"));
9
10var _axios = _interopRequireDefault(require("axios"));
11
12var _router = require("@reach/router");
13
14var _lodash = require("lodash");
15
16var _helpers = require("../helpers");
17
18var _reducer = _interopRequireDefault(require("./reducer"));
19
20var _constants = require("./constants");
21
22function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
24const useRest = ({
25 url,
26 poll,
27 redirectOnSearch,
28 key,
29 pluralized,
30 select,
31 runOnInit = false,
32 decorators = {},
33 location = {},
34 history = {},
35 headers = {}
36}) => {
37 if (!url) throw new Error('Requires a valid URL');
38 const {
39 search
40 } = location;
41
42 const [state, dispatch] = _react.default.useReducer(_reducer.default, {
43 fetching: runOnInit,
44 progress: 0
45 });
46
47 const call = (type, data = {}, err = {}) => dispatch({
48 key,
49 data,
50 pluralized,
51 err,
52 type
53 });
54
55 const handleRequest = (promise, actions, verb) => promise.then(({
56 data
57 }) => {
58 (0, _lodash.invoke)(decorators, 'get', data);
59
60 const resolver = () => new Promise(res => {
61 call(verb, data);
62 res(data);
63 });
64
65 return poll ? poll().then(resolver) : resolver();
66 }).catch(err => Promise.reject((0, _lodash.get)(err, 'response.data')));
67
68 const wrapUpdateFn = (id, verb) => (values, actions) => {
69 (0, _lodash.invoke)(decorators, verb, values);
70 return handleRequest((0, _lodash.invoke)(_axios.default, verb, (0, _helpers.makePath)([url, id]), values), actions, _constants.UPDATED);
71 };
72
73 const invokeFetchingWithQueryString = callWithLoading => (query = '') => {
74 if (callWithLoading) call(_constants.FETCHING);
75 return _axios.default.get((0, _helpers.formatUrlPath)(url, query, select)).then(({
76 data
77 }) => {
78 (0, _lodash.invoke)(decorators, 'get', data);
79 call(_constants.FETCHED, data);
80 return Promise.resolve(data);
81 }).catch(err => {
82 call(_constants.FETCHED, null, err);
83 return Promise.reject(err);
84 });
85 };
86
87 const methods = {
88 get: invokeFetchingWithQueryString(true),
89 poll: invokeFetchingWithQueryString(false),
90
91 remove(id) {
92 return () => _axios.default.delete((0, _helpers.makePath)([url, id])).then(() => {
93 call(_constants.DELETED, {
94 id
95 });
96 return poll ? poll() : null;
97 }).catch(err => {
98 return Promise.reject(err);
99 });
100 },
101
102 removeBulk(ids = []) {
103 return () => _axios.default.delete((0, _helpers.makeQueryPath)(url, ids)).then(() => {
104 call(_constants.DELETED_MANY, {
105 ids
106 });
107 return poll ? poll() : null;
108 }).catch(err => {
109 return err;
110 });
111 },
112
113 patch(id) {
114 const {
115 name
116 } = methods.patch;
117 return wrapUpdateFn(id, name);
118 },
119
120 patchBulk(ids, done) {
121 return (values, actions) => {
122 (0, _lodash.invoke)(decorators, 'patch', values);
123 return handleRequest((0, _lodash.invoke)(_axios.default, 'patch', (0, _helpers.makeQueryPath)(url, ids), values), actions, _constants.UPDATED).then(r => {
124 if (done) done();
125 return r;
126 });
127 };
128 },
129
130 put(id) {
131 const {
132 name
133 } = methods.put;
134 return wrapUpdateFn(id, name);
135 },
136
137 post(values, actions) {
138 const {
139 name
140 } = methods.post;
141 (0, _lodash.invoke)(decorators, name, values);
142 return handleRequest(_axios.default.post(url, values, {
143 headers
144 }), actions, _constants.CREATED);
145 }
146
147 };
148
149 _react.default.useEffect(() => {
150 _axios.default.interceptors.request.use(function (config) {
151 if (config.data instanceof FormData) // eslint-disable-next-line
152 config.headers['Content-Type'] = 'multipart/form-data';
153 return config;
154 });
155
156 const saved = null; // localStorage.getItem(url);
157
158 if (!location.search && saved && saved !== 'null' && saved !== 'undefined') {
159 (0, _router.navigate)(`?${saved}`);
160 } else if (runOnInit && !redirectOnSearch) {
161 methods.get(search);
162 } else if (redirectOnSearch && search) {
163 const {
164 push
165 } = history;
166 push(`${redirectOnSearch}${search}`);
167 }
168 }, [search, url]);
169
170 return { ...state,
171 ...methods
172 };
173};
174
175var _default = useRest;
176exports.default = _default;
\No newline at end of file