@dhis2/app-service-offline 3.11.3 → 3.12.0-alpha.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.
Files changed (60) hide show
  1. package/build/cjs/__tests__/integration.test.js +51 -82
  2. package/build/cjs/index.js +0 -7
  3. package/build/cjs/lib/__tests__/cacheable-section-state.test.js +7 -14
  4. package/build/cjs/lib/__tests__/clear-sensitive-caches.test.js +17 -20
  5. package/build/cjs/lib/__tests__/network-status.test.js +135 -148
  6. package/build/cjs/lib/__tests__/offline-provider.test.js +12 -22
  7. package/build/cjs/lib/__tests__/use-cacheable-section.test.js +87 -98
  8. package/build/cjs/lib/__tests__/use-online-status-message.test.js +7 -14
  9. package/build/cjs/lib/cacheable-section-state.js +27 -38
  10. package/build/cjs/lib/cacheable-section.js +26 -27
  11. package/build/cjs/lib/clear-sensitive-caches.js +14 -24
  12. package/build/cjs/lib/dhis2-connection-status/dev-debug-log.js +1 -3
  13. package/build/cjs/lib/dhis2-connection-status/dhis2-connection-status.js +27 -58
  14. package/build/cjs/lib/dhis2-connection-status/dhis2-connection-status.test.js +287 -230
  15. package/build/cjs/lib/dhis2-connection-status/index.js +0 -1
  16. package/build/cjs/lib/dhis2-connection-status/is-ping-available.js +0 -6
  17. package/build/cjs/lib/dhis2-connection-status/is-ping-available.test.js +0 -1
  18. package/build/cjs/lib/dhis2-connection-status/smart-interval.js +35 -49
  19. package/build/cjs/lib/dhis2-connection-status/use-ping-query.js +4 -5
  20. package/build/cjs/lib/global-state-service.js +9 -27
  21. package/build/cjs/lib/network-status.js +10 -13
  22. package/build/cjs/lib/offline-interface.js +3 -14
  23. package/build/cjs/lib/offline-provider.js +1 -12
  24. package/build/cjs/lib/online-status-message.js +5 -17
  25. package/build/cjs/setupRTL.js +1 -1
  26. package/build/cjs/utils/__tests__/render-counter.test.js +3 -12
  27. package/build/cjs/utils/render-counter.js +2 -10
  28. package/build/cjs/utils/test-mocks.js +13 -18
  29. package/build/es/__tests__/integration.test.js +51 -74
  30. package/build/es/index.js +2 -2
  31. package/build/es/lib/__tests__/cacheable-section-state.test.js +2 -4
  32. package/build/es/lib/__tests__/clear-sensitive-caches.test.js +19 -16
  33. package/build/es/lib/__tests__/network-status.test.js +105 -114
  34. package/build/es/lib/__tests__/offline-provider.test.js +13 -15
  35. package/build/es/lib/__tests__/use-cacheable-section.test.js +69 -73
  36. package/build/es/lib/__tests__/use-online-status-message.test.js +2 -3
  37. package/build/es/lib/cacheable-section-state.js +25 -26
  38. package/build/es/lib/cacheable-section.js +23 -15
  39. package/build/es/lib/clear-sensitive-caches.js +13 -21
  40. package/build/es/lib/dhis2-connection-status/dev-debug-log.js +1 -3
  41. package/build/es/lib/dhis2-connection-status/dhis2-connection-status.js +26 -37
  42. package/build/es/lib/dhis2-connection-status/dhis2-connection-status.test.js +223 -159
  43. package/build/es/lib/dhis2-connection-status/is-ping-available.js +0 -5
  44. package/build/es/lib/dhis2-connection-status/smart-interval.js +34 -42
  45. package/build/es/lib/dhis2-connection-status/use-ping-query.js +6 -3
  46. package/build/es/lib/global-state-service.js +6 -12
  47. package/build/es/lib/network-status.js +10 -9
  48. package/build/es/lib/offline-interface.js +0 -3
  49. package/build/es/lib/offline-provider.js +0 -3
  50. package/build/es/lib/online-status-message.js +3 -2
  51. package/build/es/setupRTL.js +1 -1
  52. package/build/es/utils/__tests__/render-counter.test.js +2 -4
  53. package/build/es/utils/render-counter.js +1 -3
  54. package/build/es/utils/test-mocks.js +8 -9
  55. package/build/types/lib/cacheable-section.d.ts +1 -1
  56. package/build/types/lib/dhis2-connection-status/dhis2-connection-status.d.ts +1 -1
  57. package/build/types/lib/network-status.d.ts +1 -1
  58. package/build/types/lib/online-status-message.d.ts +1 -1
  59. package/build/types/types.d.ts +1 -1
  60. package/package.json +4 -4
@@ -1,21 +1,14 @@
1
1
  "use strict";
2
2
 
3
3
  var _react = require("@testing-library/react");
4
-
5
- var _reactHooks = require("@testing-library/react-hooks");
6
-
7
4
  var _react2 = _interopRequireDefault(require("react"));
8
-
9
5
  var _networkStatus = require("../network-status");
10
-
11
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
-
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
7
  function wait(ms) {
14
8
  return new Promise(resolve => {
15
9
  setTimeout(() => resolve(), ms);
16
10
  });
17
11
  }
18
-
19
12
  beforeEach(() => {
20
13
  jest.restoreAllMocks();
21
14
  });
@@ -27,7 +20,7 @@ describe('initalizes to navigator.onLine value', () => {
27
20
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
28
21
  const {
29
22
  result
30
- } = (0, _reactHooks.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
23
+ } = (0, _react.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
31
24
  expect(result.current.online).toBe(true);
32
25
  expect(result.current.offline).toBe(false);
33
26
  });
@@ -35,61 +28,59 @@ describe('initalizes to navigator.onLine value', () => {
35
28
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(false);
36
29
  const {
37
30
  result
38
- } = (0, _reactHooks.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
31
+ } = (0, _react.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
39
32
  expect(result.current.online).toBe(false);
40
33
  expect(result.current.offline).toBe(true);
41
34
  });
42
35
  });
43
36
  describe('state changes in response to browser "online" and "offline" events', () => {
44
37
  it('switches from online to offline when the "offline" event triggers', async () => {
45
- jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true); // Capture callback to trigger later using addEventListener mock
46
-
38
+ jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
39
+ // Capture callback to trigger later using addEventListener mock
47
40
  const events = {};
48
41
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
49
42
  const {
50
- result,
51
- waitForNextUpdate
52
- } = (0, _reactHooks.renderHook)(function () {
43
+ result
44
+ } = (0, _react.renderHook)(function () {
53
45
  return (0, _networkStatus.useNetworkStatus)(...arguments);
54
46
  }, {
55
47
  initialProps: {
56
48
  debounceDelay: 50
57
49
  }
58
50
  });
59
- (0, _reactHooks.act)(() => {
51
+ (0, _react.act)(() => {
60
52
  // Trigger callback captured by addEventListener mock
61
53
  events.offline(new Event('offline'));
62
- }); // Wait for debounce
54
+ });
63
55
 
64
- await waitForNextUpdate({
65
- timeout: 60
56
+ // Wait for debounce
57
+ await (0, _react.waitFor)(() => {
58
+ expect(result.current.online).toBe(false);
59
+ expect(result.current.offline).toBe(true);
66
60
  });
67
- expect(result.current.online).toBe(false);
68
- expect(result.current.offline).toBe(true);
69
61
  });
70
62
  it('switches from offline to online when the "online" event triggers', async () => {
71
63
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(false);
72
64
  const events = {};
73
65
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
74
66
  const {
75
- result,
76
- waitForNextUpdate
77
- } = (0, _reactHooks.renderHook)(function () {
67
+ result
68
+ } = (0, _react.renderHook)(function () {
78
69
  return (0, _networkStatus.useNetworkStatus)(...arguments);
79
70
  }, {
80
71
  initialProps: {
81
72
  debounceDelay: 50
82
73
  }
83
74
  });
84
- (0, _reactHooks.act)(() => {
75
+ (0, _react.act)(() => {
85
76
  events.online(new Event('online'));
86
- }); // Wait for debounce
77
+ });
87
78
 
88
- await waitForNextUpdate({
89
- timeout: 60
79
+ // Wait for debounce
80
+ await (0, _react.waitFor)(() => {
81
+ expect(result.current.online).toBe(true);
82
+ expect(result.current.offline).toBe(false);
90
83
  });
91
- expect(result.current.online).toBe(true);
92
- expect(result.current.offline).toBe(false);
93
84
  });
94
85
  });
95
86
  describe('debouncing state changes', () => {
@@ -99,22 +90,22 @@ describe('debouncing state changes', () => {
99
90
  const events = {};
100
91
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
101
92
  const {
102
- result,
103
- waitForNextUpdate
104
- } = (0, _reactHooks.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
105
- await (0, _reactHooks.act)(async () => {
93
+ result
94
+ } = (0, _react.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
95
+ await (0, _react.act)(async () => {
106
96
  // Multiple events in succession
107
97
  events.offline(new Event('offline'));
108
98
  events.online(new Event('online'));
109
99
  events.offline(new Event('offline'));
110
- }); // Immediately, nothing should happen
111
-
112
- expect(result.current.online).toBe(true); // 1s later, final 'offline' event should resolve
100
+ });
113
101
 
114
- await waitForNextUpdate({
115
- timeout: 1009
102
+ // Immediately, nothing should happen
103
+ expect(result.current.online).toBe(true);
104
+ await wait(1000);
105
+ // 1s later, final 'offline' event should resolve
106
+ await (0, _react.waitFor)(() => {
107
+ expect(result.current.online).toBe(false);
116
108
  });
117
- expect(result.current.online).toBe(false);
118
109
  });
119
110
  it('can have debounce delay set to another number', async () => {
120
111
  // Start online
@@ -122,55 +113,54 @@ describe('debouncing state changes', () => {
122
113
  const events = {};
123
114
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
124
115
  const {
125
- result,
126
- waitForNextUpdate
127
- } = (0, _reactHooks.renderHook)(function () {
116
+ result
117
+ } = (0, _react.renderHook)(function () {
128
118
  return (0, _networkStatus.useNetworkStatus)(...arguments);
129
119
  }, {
130
120
  initialProps: {
131
121
  debounceDelay: 50
132
122
  }
133
123
  });
134
- await (0, _reactHooks.act)(async () => {
124
+ await (0, _react.act)(async () => {
135
125
  // Multiple events in succession
136
126
  events.offline(new Event('offline'));
137
127
  events.online(new Event('online'));
138
128
  events.offline(new Event('offline'));
139
- }); // Immediately, nothing should happen
129
+ });
140
130
 
141
- expect(result.current.online).toBe(true); // 50ms later, final "offline" event should finally resolve
131
+ // Immediately, nothing should happen
132
+ expect(result.current.online).toBe(true);
142
133
 
143
- await waitForNextUpdate({
144
- timeout: 60
134
+ // 50ms later, final "offline" event should finally resolve
135
+ await (0, _react.waitFor)(() => {
136
+ expect(result.current.online).toBe(false);
145
137
  });
146
- expect(result.current.online).toBe(false);
147
138
  });
148
139
  it('can use a debounceDelay of 0 to skip debouncing', async () => {
149
140
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
150
141
  const events = {};
151
142
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
152
143
  const {
153
- result,
154
- waitForNextUpdate
155
- } = (0, _reactHooks.renderHook)(function () {
144
+ result
145
+ } = (0, _react.renderHook)(function () {
156
146
  return (0, _networkStatus.useNetworkStatus)(...arguments);
157
147
  }, {
158
148
  initialProps: {
159
149
  debounceDelay: 0
160
150
  }
161
151
  });
162
- await (0, _reactHooks.act)(async () => {
152
+ await (0, _react.act)(async () => {
163
153
  events.offline(new Event('offline'));
164
154
  events.online(new Event('online'));
165
155
  events.offline(new Event('offline'));
166
- }); // await wait(0) didn't work here
167
-
168
- await waitForNextUpdate({
169
- timeout: 0
170
- }); // There should be no delay before status is offline
156
+ });
171
157
 
172
- expect(result.current.online).toBe(false);
173
- expect(result.current.offline).toBe(true);
158
+ // await wait(0) didn't work here
159
+ await (0, _react.waitFor)(() => {
160
+ // There should be no delay before status is offline
161
+ expect(result.current.online).toBe(false);
162
+ expect(result.current.offline).toBe(true);
163
+ });
174
164
  });
175
165
  it('can have the debounce delay changed during its lifecycle', async () => {
176
166
  // Start with 150 ms debounce
@@ -179,51 +169,50 @@ describe('debouncing state changes', () => {
179
169
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
180
170
  const {
181
171
  result,
182
- waitForNextUpdate,
183
172
  rerender
184
- } = (0, _reactHooks.renderHook)(function () {
173
+ } = (0, _react.renderHook)(function () {
185
174
  return (0, _networkStatus.useNetworkStatus)(...arguments);
186
175
  }, {
187
176
  initialProps: {
188
177
  debounceDelay: 150
189
178
  }
190
179
  });
191
- await (0, _reactHooks.act)(async () => {
180
+ await (0, _react.act)(async () => {
192
181
  // Multiple events in succession
193
182
  events.offline(new Event('offline'));
194
183
  events.online(new Event('online'));
195
184
  events.offline(new Event('offline'));
196
- }); // Immediately, nothing should happen
185
+ });
197
186
 
198
- expect(result.current.online).toBe(true); // 150ms later, final "offline" event should finally resolve
187
+ // Immediately, nothing should happen
188
+ expect(result.current.online).toBe(true);
199
189
 
200
- await waitForNextUpdate({
201
- timeout: 160
202
- });
203
- expect(result.current.online).toBe(false); // Change to 50 ms debounce
190
+ // 150ms later, final "offline" event should finally resolve
191
+ await wait(160);
192
+ expect(result.current.online).toBe(false);
204
193
 
194
+ // Change to 50 ms debounce
205
195
  rerender({
206
196
  debounceDelay: 50
207
197
  });
208
- await (0, _reactHooks.act)(async () => {
198
+ await (0, _react.act)(async () => {
209
199
  // Multiple events in succession
210
200
  events.online(new Event('online'));
211
201
  events.offline(new Event('offline'));
212
202
  events.online(new Event('online'));
213
- }); // Immediately, nothing should happen
203
+ });
214
204
 
215
- expect(result.current.online).toBe(false); // 50ms later, final "online" event should finally resolve
205
+ // Immediately, nothing should happen
206
+ expect(result.current.online).toBe(false);
216
207
 
217
- await waitForNextUpdate({
218
- timeout: 60
219
- });
208
+ // 50ms later, final "online" event should finally resolve
209
+ await wait(60);
220
210
  expect(result.current.online).toBe(true);
221
211
  });
222
212
  it('handles debounced state change when parent component rerenders during a debounce delay', async () => {
223
213
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
224
214
  const events = {};
225
215
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
226
-
227
216
  const TestComponent = () => {
228
217
  const {
229
218
  online
@@ -234,33 +223,34 @@ describe('debouncing state changes', () => {
234
223
  "data-testid": "status"
235
224
  }, online ? 'on' : 'off');
236
225
  };
237
-
238
226
  const {
239
227
  rerender
240
- } = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(TestComponent, null));
228
+ } = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(TestComponent, null));
241
229
  const {
242
230
  getByTestId
243
231
  } = _react.screen;
244
232
  expect(getByTestId('status')).toHaveTextContent('on');
245
- await (0, _reactHooks.act)(async () => {
233
+ await (0, _react.act)(async () => {
246
234
  // Multiple events in succession
247
235
  events.offline(new Event('offline'));
248
236
  events.online(new Event('online'));
249
237
  events.offline(new Event('offline'));
250
- }); // Immediately, nothing should happen
238
+ });
251
239
 
252
- expect(getByTestId('status')).toHaveTextContent('on'); // Rerender parent component
240
+ // Immediately, nothing should happen
241
+ expect(getByTestId('status')).toHaveTextContent('on');
253
242
 
254
- rerender( /*#__PURE__*/_react2.default.createElement(TestComponent, null)); // Final "offline" event should still resolve
243
+ // Rerender parent component
244
+ rerender(/*#__PURE__*/_react2.default.createElement(TestComponent, null));
255
245
 
246
+ // Final "offline" event should still resolve
256
247
  await (0, _react.waitFor)(() => expect(getByTestId('status')).toHaveTextContent('off'));
257
248
  });
258
249
  it('handles debounced state change when debounce delay is changed during a delay', async () => {
259
250
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
260
251
  const events = {};
261
252
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
262
-
263
- const TestComponent = (_ref) => {
253
+ const TestComponent = _ref => {
264
254
  let {
265
255
  options
266
256
  } = _ref;
@@ -271,10 +261,9 @@ describe('debouncing state changes', () => {
271
261
  "data-testid": "status"
272
262
  }, online ? 'on' : 'off');
273
263
  };
274
-
275
264
  const {
276
265
  rerender
277
- } = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(TestComponent, {
266
+ } = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(TestComponent, {
278
267
  options: {
279
268
  debounceDelay: 100
280
269
  }
@@ -283,28 +272,30 @@ describe('debouncing state changes', () => {
283
272
  getByTestId
284
273
  } = _react.screen;
285
274
  expect(getByTestId('status')).toHaveTextContent('on');
286
- await (0, _reactHooks.act)(async () => {
275
+ await (0, _react.act)(async () => {
287
276
  // Multiple events in succession
288
277
  events.offline(new Event('offline'));
289
278
  events.online(new Event('online'));
290
279
  events.offline(new Event('offline'));
291
- }); // Immediately, nothing should happen
280
+ });
292
281
 
293
- expect(getByTestId('status')).toHaveTextContent('on'); // Change debounce options
282
+ // Immediately, nothing should happen
283
+ expect(getByTestId('status')).toHaveTextContent('on');
294
284
 
295
- rerender( /*#__PURE__*/_react2.default.createElement(TestComponent, {
285
+ // Change debounce options
286
+ rerender(/*#__PURE__*/_react2.default.createElement(TestComponent, {
296
287
  options: {
297
288
  debounceDelay: 50
298
289
  }
299
- })); // Final "offline" event should still resolve
290
+ }));
300
291
 
292
+ // Final "offline" event should still resolve
301
293
  await (0, _react.waitFor)(() => expect(getByTestId('status')).toHaveTextContent('off'));
302
294
  });
303
295
  it('debounces consistently across rerenders', async () => {
304
296
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
305
297
  const events = {};
306
298
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
307
-
308
299
  const TestComponent = () => {
309
300
  const {
310
301
  online
@@ -315,35 +306,39 @@ describe('debouncing state changes', () => {
315
306
  "data-testid": "status"
316
307
  }, online ? 'on' : 'off');
317
308
  };
318
-
319
309
  const {
320
310
  rerender
321
- } = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(TestComponent, null));
311
+ } = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(TestComponent, null));
322
312
  const {
323
313
  getByTestId
324
314
  } = _react.screen;
325
315
  expect(getByTestId('status')).toHaveTextContent('on');
326
- await (0, _reactHooks.act)(async () => {
316
+ await (0, _react.act)(async () => {
327
317
  // Multiple events in succession
328
318
  events.offline(new Event('offline'));
329
319
  events.online(new Event('online'));
330
320
  events.offline(new Event('offline'));
331
- }); // wait a little bit - not long enough for debounce to resolve
321
+ });
332
322
 
323
+ // wait a little bit - not long enough for debounce to resolve
333
324
  await wait(50);
334
- expect(getByTestId('status')).toHaveTextContent('on'); // Rerender parent component
325
+ expect(getByTestId('status')).toHaveTextContent('on');
335
326
 
336
- rerender( /*#__PURE__*/_react2.default.createElement(TestComponent, null)); // Trigger more events
327
+ // Rerender parent component
328
+ rerender(/*#__PURE__*/_react2.default.createElement(TestComponent, null));
337
329
 
338
- await (0, _reactHooks.act)(async () => {
330
+ // Trigger more events
331
+ await (0, _react.act)(async () => {
339
332
  events.online(new Event('online'));
340
333
  events.offline(new Event('offline'));
341
- }); // wait a little more - long enough that the first debounced callbacks
342
- // _would_ have resolved if there weren't the second set of events
334
+ });
343
335
 
336
+ // wait a little more - long enough that the first debounced callbacks
337
+ // _would_ have resolved if there weren't the second set of events
344
338
  await wait(60);
345
- expect(getByTestId('status')).toHaveTextContent('on'); // wait long enough for second set of callbacks to resolve
339
+ expect(getByTestId('status')).toHaveTextContent('on');
346
340
 
341
+ // wait long enough for second set of callbacks to resolve
347
342
  await (0, _react.waitFor)(() => expect(getByTestId('status')).toHaveTextContent('off'));
348
343
  });
349
344
  });
@@ -352,49 +347,48 @@ describe('it updates the lastOnline value in local storage', () => {
352
347
  const testDateString = 'Fri, 27 Aug 2021 19:53:06 GMT';
353
348
  it('sets lastOnline in local storage when it goes offline', async () => {
354
349
  var _result$current$lastO;
355
-
356
350
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
357
351
  const events = {};
358
352
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
359
353
  const {
360
- result,
361
- waitForNextUpdate
362
- } = (0, _reactHooks.renderHook)(function () {
354
+ result
355
+ } = (0, _react.renderHook)(function () {
363
356
  return (0, _networkStatus.useNetworkStatus)(...arguments);
364
357
  }, {
365
358
  initialProps: {
366
359
  debounceDelay: 0
367
360
  }
368
- }); // Correct initial state
361
+ });
369
362
 
363
+ // Correct initial state
370
364
  expect(localStorage.getItem(lastOnlineKey)).toBe(null);
371
365
  expect(result.current.lastOnline).toBe(null);
372
- (0, _reactHooks.act)(() => {
366
+ (0, _react.act)(() => {
373
367
  events.offline(new Event('offline'));
374
- }); // Wait for debounce
375
-
376
- await waitForNextUpdate({
377
- timeout: 0
378
368
  });
369
+
370
+ // Wait for debounce
371
+ await wait(500);
379
372
  expect(result.current.online).toBe(false);
380
- expect(result.current.offline).toBe(true); // Check localStorage for a stored date
373
+ expect(result.current.offline).toBe(true);
381
374
 
375
+ // Check localStorage for a stored date
382
376
  const parsedDate = new Date(localStorage.getItem(lastOnlineKey));
383
- expect(parsedDate.toString()).not.toBe('Invalid Date'); // Check hook return value
384
-
377
+ expect(parsedDate.toString()).not.toBe('Invalid Date');
378
+ // Check hook return value
385
379
  expect(result.current.lastOnline).toBeInstanceOf(Date);
386
380
  expect((_result$current$lastO = result.current.lastOnline) === null || _result$current$lastO === void 0 ? void 0 : _result$current$lastO.toUTCString()).toBe(localStorage.getItem(lastOnlineKey));
387
- }); // not necessary
381
+ });
388
382
 
383
+ // not necessary
389
384
  it.skip("sets lastOnline on mount if it's not set", () => {
390
385
  var _result$current$lastO2;
391
-
392
386
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(false);
393
387
  const events = {};
394
388
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
395
389
  const {
396
390
  result
397
- } = (0, _reactHooks.renderHook)(function () {
391
+ } = (0, _react.renderHook)(function () {
398
392
  return (0, _networkStatus.useNetworkStatus)(...arguments);
399
393
  }, {
400
394
  initialProps: {
@@ -414,7 +408,7 @@ describe('it updates the lastOnline value in local storage', () => {
414
408
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
415
409
  const {
416
410
  result
417
- } = (0, _reactHooks.renderHook)(function () {
411
+ } = (0, _react.renderHook)(function () {
418
412
  return (0, _networkStatus.useNetworkStatus)(...arguments);
419
413
  }, {
420
414
  initialProps: {
@@ -423,7 +417,7 @@ describe('it updates the lastOnline value in local storage', () => {
423
417
  });
424
418
  expect(localStorage.getItem(lastOnlineKey)).toBe(testDateString);
425
419
  expect(result.current.lastOnline).toEqual(new Date(testDateString));
426
- (0, _reactHooks.act)(() => {
420
+ (0, _react.act)(() => {
427
421
  events.offline(new Event('offline'));
428
422
  });
429
423
  await wait(0);
@@ -439,9 +433,8 @@ describe('it updates the lastOnline value in local storage', () => {
439
433
  const events = {};
440
434
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
441
435
  const {
442
- result,
443
- waitForNextUpdate
444
- } = (0, _reactHooks.renderHook)(function () {
436
+ result
437
+ } = (0, _react.renderHook)(function () {
445
438
  return (0, _networkStatus.useNetworkStatus)(...arguments);
446
439
  }, {
447
440
  initialProps: {
@@ -450,60 +443,54 @@ describe('it updates the lastOnline value in local storage', () => {
450
443
  });
451
444
  expect(localStorage.getItem(lastOnlineKey)).toBe(testDateString);
452
445
  expect(result.current.lastOnline).toEqual(new Date(testDateString));
453
- (0, _reactHooks.act)(() => {
446
+ (0, _react.act)(() => {
454
447
  events.offline(new Event('online'));
455
- }); // Wait for debounce
456
-
457
- await waitForNextUpdate({
458
- timeout: 0
459
448
  });
449
+
450
+ // Wait for debounce
451
+ await wait(500);
460
452
  expect(result.current.online).toBe(true);
461
- expect(result.current.offline).toBe(false); // expect(localStorage.getItem(lastOnlineKey)).toBe(null)
453
+ expect(result.current.offline).toBe(false);
462
454
 
455
+ // expect(localStorage.getItem(lastOnlineKey)).toBe(null)
463
456
  expect(result.current.lastOnline).toBe(null);
464
457
  });
465
458
  it('tracks correctly when going offline and online', async () => {
466
459
  var _result$current$lastO3, _result$current$lastO4;
467
-
468
460
  jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
469
461
  const events = {};
470
462
  window.addEventListener = jest.fn((event, cb) => events[event] = cb);
471
463
  const {
472
- result,
473
- waitForNextUpdate
474
- } = (0, _reactHooks.renderHook)(function () {
464
+ result
465
+ } = (0, _react.renderHook)(function () {
475
466
  return (0, _networkStatus.useNetworkStatus)(...arguments);
476
467
  }, {
477
468
  initialProps: {
478
469
  debounceDelay: 0
479
470
  }
480
- }); // Correct initial state
471
+ });
481
472
 
473
+ // Correct initial state
482
474
  expect(localStorage.getItem(lastOnlineKey)).toBe(null);
483
475
  expect(result.current.lastOnline).toBe(null);
484
- (0, _reactHooks.act)(() => {
476
+ (0, _react.act)(() => {
485
477
  events.offline(new Event('offline'));
486
478
  });
487
- await waitForNextUpdate({
488
- timeout: 0
489
- });
479
+ await (0, _react.waitFor)(() => undefined);
490
480
  const firstDate = new Date(localStorage.getItem(lastOnlineKey));
491
481
  const firstValue = (_result$current$lastO3 = result.current.lastOnline) === null || _result$current$lastO3 === void 0 ? void 0 : _result$current$lastO3.valueOf();
492
- (0, _reactHooks.act)(() => {
482
+ (0, _react.act)(() => {
493
483
  events.offline(new Event('online'));
494
484
  });
495
- await waitForNextUpdate({
496
- timeout: 0
497
- });
498
- expect(result.current.lastOnline).toBe(null); // todo: this is an error from UTC strings' imprecision
485
+ await wait(500);
486
+ expect(result.current.lastOnline).toBe(null);
499
487
 
500
- await wait(1000);
501
- (0, _reactHooks.act)(() => {
488
+ // todo: this is an error from UTC strings' imprecision
489
+ await wait(500);
490
+ (0, _react.act)(() => {
502
491
  events.offline(new Event('offline'));
503
492
  });
504
- await waitForNextUpdate({
505
- timeout: 0
506
- });
493
+ await wait(500);
507
494
  expect(new Date(localStorage.getItem(lastOnlineKey))).not.toEqual(firstDate);
508
495
  expect((_result$current$lastO4 = result.current.lastOnline) === null || _result$current$lastO4 === void 0 ? void 0 : _result$current$lastO4.valueOf()).not.toEqual(firstValue);
509
496
  });