1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.default = void 0;
|
7 |
|
8 | var _react = _interopRequireDefault(require("react"));
|
9 |
|
10 | var _axios = _interopRequireDefault(require("axios"));
|
11 |
|
12 | var _router = require("@reach/router");
|
13 |
|
14 | var _lodash = require("lodash");
|
15 |
|
16 | var _helpers = require("../helpers");
|
17 |
|
18 | var _reducer = _interopRequireDefault(require("./reducer"));
|
19 |
|
20 | var _constants = require("./constants");
|
21 |
|
22 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
23 |
|
24 | const 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)
|
152 | config.headers['Content-Type'] = 'multipart/form-data';
|
153 | return config;
|
154 | });
|
155 |
|
156 | const saved = null;
|
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 |
|
175 | var _default = useRest;
|
176 | exports.default = _default; |
\ | No newline at end of file |