@civet/core 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -68,6 +68,14 @@ var DataProvider = /*#__PURE__*/function () {
68
68
  _createClass(DataProvider, [{
69
69
  key: "extend",
70
70
  value: function extend() {}
71
+ }, {
72
+ key: "createInstance",
73
+ value: function createInstance() {
74
+ return null;
75
+ }
76
+ }, {
77
+ key: "releaseInstance",
78
+ value: function releaseInstance() {}
71
79
  }, {
72
80
  key: "subscribe",
73
81
  value: function subscribe(resource, handler) {
package/lib/Meta.js CHANGED
@@ -18,10 +18,11 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+
18
18
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
19
19
 
20
20
  var Meta = /*#__PURE__*/function () {
21
- function Meta(base) {
21
+ function Meta(base, instance) {
22
22
  _classCallCheck(this, Meta);
23
23
 
24
24
  this.data = base == null ? {} : base;
25
+ this.instance = instance;
25
26
  }
26
27
 
27
28
  _createClass(Meta, [{
@@ -9,7 +9,7 @@ var _react = _interopRequireDefault(require("react"));
9
9
 
10
10
  var _AbortSignal = _interopRequireDefault(require("./AbortSignal"));
11
11
 
12
- var _context2 = require("./context");
12
+ var _context3 = require("./context");
13
13
 
14
14
  var _Meta = _interopRequireDefault(require("./Meta"));
15
15
 
@@ -59,12 +59,12 @@ function useResource(_ref) {
59
59
  nextPersistent = _ref.persistent,
60
60
  rest = _objectWithoutProperties(_ref, _excluded);
61
61
 
62
- var configContext = (0, _context2.useConfigContext)();
62
+ var configContext = (0, _context3.useConfigContext)();
63
63
  var currentDataProvider = dataProviderProp || configContext.dataProvider;
64
64
 
65
- var dataProvider = _react["default"].useMemo(function () {
66
- return currentDataProvider;
67
- }, []);
65
+ var _React$useState = _react["default"].useState(currentDataProvider),
66
+ _React$useState2 = _slicedToArray(_React$useState, 1),
67
+ dataProvider = _React$useState2[0];
68
68
 
69
69
  if (dataProvider == null) {
70
70
  throw new Error('Unmet requirement: The DataProvider for the useResource hook is missing - Check your ConfigContext provider and the dataProvider property');
@@ -74,6 +74,18 @@ function useResource(_ref) {
74
74
  throw new Error('Constant violation: The DataProvider provided to the useResource hook must not be replaced - Check your ConfigContext provider and the dataProvider property');
75
75
  }
76
76
 
77
+ var _React$useState3 = _react["default"].useState(function () {
78
+ return dataProvider.createInstance();
79
+ }),
80
+ _React$useState4 = _slicedToArray(_React$useState3, 1),
81
+ instance = _React$useState4[0];
82
+
83
+ _react["default"].useEffect(function () {
84
+ return function () {
85
+ dataProvider.releaseInstance(instance);
86
+ };
87
+ }, []);
88
+
77
89
  var nextRequestDetails = _react["default"].useMemo(function () {
78
90
  return {
79
91
  name: nextName,
@@ -83,7 +95,7 @@ function useResource(_ref) {
83
95
  };
84
96
  }, [nextName, nextQuery, nextEmpty, nextOptions]);
85
97
 
86
- var _React$useState = _react["default"].useState(function () {
98
+ var _React$useState5 = _react["default"].useState(function () {
87
99
  var request = (0, _uniqueIdentifier["default"])();
88
100
  var revision = (0, _uniqueIdentifier["default"])();
89
101
  return {
@@ -107,9 +119,9 @@ function useResource(_ref) {
107
119
  persistent: nextPersistent
108
120
  };
109
121
  }),
110
- _React$useState2 = _slicedToArray(_React$useState, 2),
111
- state = _React$useState2[0],
112
- setState = _React$useState2[1];
122
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
123
+ state = _React$useState6[0],
124
+ setState = _React$useState6[1];
113
125
 
114
126
  var requestDetails = state.requestDetails,
115
127
  request = state.request,
@@ -198,41 +210,55 @@ function useResource(_ref) {
198
210
  _react["default"].useEffect(function () {
199
211
  if (requestDetails.empty) return undefined;
200
212
  var abortSignal = new _AbortSignal["default"]();
201
- var meta = new _Meta["default"](_objectSpread({}, value.meta));
213
+ var meta = new _Meta["default"](_objectSpread({}, value.meta), instance);
214
+ var promise = Promise.resolve(state);
202
215
 
203
216
  var callback = function callback(error, done, data) {
204
- setState(function (prevState) {
205
- if (request !== prevState.request || revision !== prevState.revision) return prevState;
206
-
207
- if (error != null) {
208
- return _objectSpread(_objectSpread({}, prevState), {}, {
209
- isLoading: false,
210
- value: _objectSpread(_objectSpread({}, prevState.value), {}, {
211
- error: error,
212
- isIncomplete: false
213
- })
217
+ promise = promise.then(function (prevState) {
218
+ try {
219
+ var nextState;
220
+
221
+ if (error != null) {
222
+ nextState = _objectSpread(_objectSpread({}, prevState), {}, {
223
+ isLoading: false,
224
+ value: _objectSpread(_objectSpread({}, prevState.value), {}, {
225
+ error: error,
226
+ isIncomplete: false
227
+ })
228
+ });
229
+ } else {
230
+ var _context2 = {
231
+ name: requestDetails.name,
232
+ query: requestDetails.query,
233
+ options: requestDetails.options,
234
+ request: request,
235
+ revision: revision,
236
+ data: data,
237
+ meta: meta.commit(prevState.value.meta),
238
+ error: undefined,
239
+ isEmpty: false,
240
+ isIncomplete: !done,
241
+ isInitial: !!prevState.isInitial && !done
242
+ };
243
+ _context2.data = dataProvider.transition(_context2, prevState.value);
244
+ _context2.data = dataProvider.recycleItems(_context2, prevState.value);
245
+ nextState = _objectSpread(_objectSpread({}, prevState), {}, {
246
+ isLoading: !done,
247
+ value: _context2
248
+ });
249
+ }
250
+
251
+ setState(function (otherState) {
252
+ if (request !== otherState.request || revision !== otherState.revision) {
253
+ return otherState;
254
+ }
255
+
256
+ return nextState;
214
257
  });
258
+ return nextState;
259
+ } catch (_unused) {
260
+ return prevState;
215
261
  }
216
-
217
- var context = {
218
- name: requestDetails.name,
219
- query: requestDetails.query,
220
- options: requestDetails.options,
221
- request: request,
222
- revision: revision,
223
- data: data,
224
- meta: meta.commit(prevState.value.meta),
225
- error: undefined,
226
- isEmpty: false,
227
- isIncomplete: !done,
228
- isInitial: !!prevState.isInitial && !done
229
- };
230
- context.data = dataProvider.transition(context, prevState.value);
231
- context.data = dataProvider.recycleItems(context, prevState.value);
232
- return _objectSpread(_objectSpread({}, prevState), {}, {
233
- isLoading: !done,
234
- value: context
235
- });
236
262
  });
237
263
  };
238
264
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@civet/core",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "Civet",
5
5
  "main": "./lib/index.js",
6
6
  "scripts": {
@@ -42,6 +42,12 @@ class DataProvider {
42
42
 
43
43
  extend() {}
44
44
 
45
+ createInstance() {
46
+ return null;
47
+ }
48
+
49
+ releaseInstance() {}
50
+
45
51
  subscribe(resource, handler) {
46
52
  if (resource == null) throw new Error('No resource name specified');
47
53
  return this.notifier.subscribe(resource, handler);
package/src/Meta.js CHANGED
@@ -1,6 +1,7 @@
1
1
  class Meta {
2
- constructor(base) {
2
+ constructor(base, instance) {
3
3
  this.data = base == null ? {} : base;
4
+ this.instance = instance;
4
5
  }
5
6
 
6
7
  clear() {
@@ -21,7 +21,7 @@ function useResource({
21
21
  }) {
22
22
  const configContext = useConfigContext();
23
23
  const currentDataProvider = dataProviderProp || configContext.dataProvider;
24
- const dataProvider = React.useMemo(() => currentDataProvider, []);
24
+ const [dataProvider] = React.useState(currentDataProvider);
25
25
  if (dataProvider == null) {
26
26
  throw new Error(
27
27
  'Unmet requirement: The DataProvider for the useResource hook is missing - Check your ConfigContext provider and the dataProvider property',
@@ -33,6 +33,14 @@ function useResource({
33
33
  );
34
34
  }
35
35
 
36
+ const [instance] = React.useState(() => dataProvider.createInstance());
37
+ React.useEffect(
38
+ () => () => {
39
+ dataProvider.releaseInstance(instance);
40
+ },
41
+ [],
42
+ );
43
+
36
44
  const nextRequestDetails = React.useMemo(
37
45
  () => ({ name: nextName, query: nextQuery, empty: nextEmpty, options: nextOptions }),
38
46
  [nextName, nextQuery, nextEmpty, nextOptions],
@@ -137,45 +145,61 @@ function useResource({
137
145
 
138
146
  const abortSignal = new AbortSignal();
139
147
 
140
- const meta = new Meta({ ...value.meta });
148
+ const meta = new Meta({ ...value.meta }, instance);
149
+
150
+ let promise = Promise.resolve(state);
141
151
 
142
152
  const callback = (error, done, data) => {
143
- setState((prevState) => {
144
- if (request !== prevState.request || revision !== prevState.revision) return prevState;
145
-
146
- if (error != null) {
147
- return {
148
- ...prevState,
149
- isLoading: false,
150
- value: {
151
- ...prevState.value,
152
- error,
153
- isIncomplete: false,
154
- },
155
- };
153
+ promise = promise.then((prevState) => {
154
+ try {
155
+ let nextState;
156
+
157
+ if (error != null) {
158
+ nextState = {
159
+ ...prevState,
160
+ isLoading: false,
161
+ value: {
162
+ ...prevState.value,
163
+ error,
164
+ isIncomplete: false,
165
+ },
166
+ };
167
+ } else {
168
+ const context = {
169
+ name: requestDetails.name,
170
+ query: requestDetails.query,
171
+ options: requestDetails.options,
172
+ request,
173
+ revision,
174
+ data,
175
+ meta: meta.commit(prevState.value.meta),
176
+ error: undefined,
177
+ isEmpty: false,
178
+ isIncomplete: !done,
179
+ isInitial: !!prevState.isInitial && !done,
180
+ };
181
+ context.data = dataProvider.transition(context, prevState.value);
182
+ context.data = dataProvider.recycleItems(context, prevState.value);
183
+
184
+ nextState = {
185
+ ...prevState,
186
+ isLoading: !done,
187
+ value: context,
188
+ };
189
+ }
190
+
191
+ setState((otherState) => {
192
+ if (request !== otherState.request || revision !== otherState.revision) {
193
+ return otherState;
194
+ }
195
+
196
+ return nextState;
197
+ });
198
+
199
+ return nextState;
200
+ } catch {
201
+ return prevState;
156
202
  }
157
-
158
- const context = {
159
- name: requestDetails.name,
160
- query: requestDetails.query,
161
- options: requestDetails.options,
162
- request,
163
- revision,
164
- data,
165
- meta: meta.commit(prevState.value.meta),
166
- error: undefined,
167
- isEmpty: false,
168
- isIncomplete: !done,
169
- isInitial: !!prevState.isInitial && !done,
170
- };
171
- context.data = dataProvider.transition(context, prevState.value);
172
- context.data = dataProvider.recycleItems(context, prevState.value);
173
-
174
- return {
175
- ...prevState,
176
- isLoading: !done,
177
- value: context,
178
- };
179
203
  });
180
204
  };
181
205