@dhis2/app-service-offline 3.4.4 → 3.6.0

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.
@@ -33,6 +33,12 @@ Object.defineProperty(exports, "useOnlineStatus", {
33
33
  return _onlineStatus.useOnlineStatus;
34
34
  }
35
35
  });
36
+ Object.defineProperty(exports, "useOnlineStatusMessage", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _onlineStatusMessage.useOnlineStatusMessage;
40
+ }
41
+ });
36
42
  Object.defineProperty(exports, "clearSensitiveCaches", {
37
43
  enumerable: true,
38
44
  get: function () {
@@ -48,4 +54,6 @@ var _cacheableSectionState = require("./lib/cacheable-section-state");
48
54
 
49
55
  var _onlineStatus = require("./lib/online-status");
50
56
 
57
+ var _onlineStatusMessage = require("./lib/online-status-message");
58
+
51
59
  var _clearSensitiveCaches = require("./lib/clear-sensitive-caches");
@@ -14,7 +14,6 @@ var _offlineProvider = require("../offline-provider");
14
14
 
15
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
16
 
17
- /* eslint-disable react/display-name, react/prop-types */
18
17
  // Suppress 'act' warning for these tests
19
18
  const originalError = console.error;
20
19
  beforeEach(() => {
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ var _reactHooks = require("@testing-library/react-hooks");
4
+
5
+ var _react = _interopRequireDefault(require("react"));
6
+
7
+ var _testMocks = require("../../utils/test-mocks");
8
+
9
+ var _offlineProvider = require("../offline-provider");
10
+
11
+ var _onlineStatusMessage = require("../online-status-message");
12
+
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+
15
+ describe('useOnlineStatusMessage', () => {
16
+ it('should allow the online status to be updated ', () => {
17
+ const wrapper = ({
18
+ children
19
+ }) => /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
20
+ offlineInterface: _testMocks.mockOfflineInterface
21
+ }, children);
22
+
23
+ const {
24
+ result
25
+ } = (0, _reactHooks.renderHook)(() => (0, _onlineStatusMessage.useOnlineStatusMessage)(), {
26
+ wrapper
27
+ });
28
+ expect(result.current.onlineStatusMessage).toBeUndefined();
29
+ (0, _reactHooks.act)(() => {
30
+ result.current.setOnlineStatusMessage('8 offline events');
31
+ });
32
+ expect(result.current.onlineStatusMessage).toEqual('8 offline events');
33
+ });
34
+ });
@@ -72,7 +72,9 @@ const useGlobalState = (selector = identity) => {
72
72
  const newSelectedState = selector(state); // Second condition handles case where a selected object gets
73
73
  // deleted, but state does not update
74
74
 
75
- if (!(0, _isEqual.default)(selectedState, newSelectedState) || selectedState === undefined) setSelectedState(newSelectedState);
75
+ if (!(0, _isEqual.default)(selectedState, newSelectedState) || selectedState === undefined) {
76
+ setSelectedState(newSelectedState);
77
+ }
76
78
  };
77
79
 
78
80
  store.subscribe(callback); // Make sure to update state when selector changes
@@ -13,6 +13,8 @@ var _cacheableSectionState = require("./cacheable-section-state");
13
13
 
14
14
  var _offlineInterface = require("./offline-interface");
15
15
 
16
+ var _onlineStatusMessage = require("./online-status-message");
17
+
16
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
19
 
18
20
  /** A context provider for all the relevant offline contexts */
@@ -28,7 +30,7 @@ function OfflineProvider({
28
30
 
29
31
  return /*#__PURE__*/_react.default.createElement(_offlineInterface.OfflineInterfaceProvider, {
30
32
  offlineInterface: offlineInterface
31
- }, /*#__PURE__*/_react.default.createElement(_cacheableSectionState.CacheableSectionProvider, null, children));
33
+ }, /*#__PURE__*/_react.default.createElement(_cacheableSectionState.CacheableSectionProvider, null, /*#__PURE__*/_react.default.createElement(_onlineStatusMessage.OnlineStatusMessageProvider, null, children)));
32
34
  }
33
35
 
34
36
  OfflineProvider.propTypes = {
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.OnlineStatusMessageProvider = exports.useOnlineStatusMessage = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
11
+
12
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
+
14
+ const defaultApi = {
15
+ onlineStatusMessage: undefined,
16
+ setOnlineStatusMessage: () => undefined
17
+ };
18
+
19
+ const OnlineStatusMessageContext = /*#__PURE__*/_react.default.createContext(defaultApi);
20
+
21
+ const useOnlineStatusMessage = () => {
22
+ const {
23
+ onlineStatusMessage,
24
+ setOnlineStatusMessage
25
+ } = (0, _react.useContext)(OnlineStatusMessageContext);
26
+ return {
27
+ onlineStatusMessage,
28
+ setOnlineStatusMessage
29
+ };
30
+ };
31
+
32
+ exports.useOnlineStatusMessage = useOnlineStatusMessage;
33
+
34
+ const OnlineStatusMessageProvider = ({
35
+ children
36
+ }) => {
37
+ const [onlineStatusMessage, setOnlineStatusMessage] = (0, _react.useState)();
38
+ return /*#__PURE__*/_react.default.createElement(OnlineStatusMessageContext.Provider, {
39
+ value: {
40
+ onlineStatusMessage,
41
+ setOnlineStatusMessage
42
+ }
43
+ }, children);
44
+ };
45
+
46
+ exports.OnlineStatusMessageProvider = OnlineStatusMessageProvider;
@@ -13,7 +13,10 @@ const RenderCounter = ({
13
13
  id,
14
14
  countsObj
15
15
  }) => {
16
- if (!(id in countsObj)) countsObj[id] = 0;
16
+ if (!(id in countsObj)) {
17
+ countsObj[id] = 0;
18
+ }
19
+
17
20
  return /*#__PURE__*/_react.default.createElement("div", {
18
21
  "data-testid": id
19
22
  }, ++countsObj[id]);
@@ -9,9 +9,15 @@ const successfulRecordingMock = jest.fn().mockImplementation(async ({
9
9
  onCompleted
10
10
  } = {}) => {
11
11
  // in 100ms, call 'onStarted' callback (allows 'pending' state)
12
- if (onStarted) setTimeout(onStarted, 100); // in 200ms, call 'onCompleted' callback
12
+ if (onStarted) {
13
+ setTimeout(onStarted, 100);
14
+ } // in 200ms, call 'onCompleted' callback
15
+
16
+
17
+ if (onCompleted) {
18
+ setTimeout(onCompleted, 200);
19
+ } // resolve
13
20
 
14
- if (onCompleted) setTimeout(onCompleted, 200); // resolve
15
21
 
16
22
  return Promise.resolve();
17
23
  });
@@ -21,7 +27,10 @@ const errorRecordingMock = jest.fn().mockImplementation(({
21
27
  onError
22
28
  } = {}) => {
23
29
  // in 100ms, call 'onStarted' callback (allows 'pending' state)
24
- if (onStarted) setTimeout(onStarted, 100); // in 200ms, call 'onError'
30
+ if (onStarted) {
31
+ setTimeout(onStarted, 100);
32
+ } // in 200ms, call 'onError'
33
+
25
34
 
26
35
  setTimeout(() => onError(new Error('test err')), 200); // resolve to signal successful initiation
27
36
 
package/build/es/index.js CHANGED
@@ -2,4 +2,5 @@ export { OfflineProvider } from './lib/offline-provider';
2
2
  export { CacheableSection, useCacheableSection } from './lib/cacheable-section';
3
3
  export { useCachedSections } from './lib/cacheable-section-state';
4
4
  export { useOnlineStatus } from './lib/online-status';
5
+ export { useOnlineStatusMessage } from './lib/online-status-message';
5
6
  export { clearSensitiveCaches } from './lib/clear-sensitive-caches';
@@ -1,4 +1,3 @@
1
- /* eslint-disable react/display-name, react/prop-types */
2
1
  import { AlertsProvider } from '@dhis2/app-service-alerts';
3
2
  import { renderHook, act } from '@testing-library/react-hooks';
4
3
  import React from 'react';
@@ -0,0 +1,25 @@
1
+ import { renderHook, act } from '@testing-library/react-hooks';
2
+ import React from 'react';
3
+ import { mockOfflineInterface } from '../../utils/test-mocks';
4
+ import { OfflineProvider } from '../offline-provider';
5
+ import { useOnlineStatusMessage } from '../online-status-message';
6
+ describe('useOnlineStatusMessage', () => {
7
+ it('should allow the online status to be updated ', () => {
8
+ const wrapper = ({
9
+ children
10
+ }) => /*#__PURE__*/React.createElement(OfflineProvider, {
11
+ offlineInterface: mockOfflineInterface
12
+ }, children);
13
+
14
+ const {
15
+ result
16
+ } = renderHook(() => useOnlineStatusMessage(), {
17
+ wrapper
18
+ });
19
+ expect(result.current.onlineStatusMessage).toBeUndefined();
20
+ act(() => {
21
+ result.current.setOnlineStatusMessage('8 offline events');
22
+ });
23
+ expect(result.current.onlineStatusMessage).toEqual('8 offline events');
24
+ });
25
+ });
@@ -50,7 +50,9 @@ export const useGlobalState = (selector = identity) => {
50
50
  const newSelectedState = selector(state); // Second condition handles case where a selected object gets
51
51
  // deleted, but state does not update
52
52
 
53
- if (!isEqual(selectedState, newSelectedState) || selectedState === undefined) setSelectedState(newSelectedState);
53
+ if (!isEqual(selectedState, newSelectedState) || selectedState === undefined) {
54
+ setSelectedState(newSelectedState);
55
+ }
54
56
  };
55
57
 
56
58
  store.subscribe(callback); // Make sure to update state when selector changes
@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
3
  import { CacheableSectionProvider } from './cacheable-section-state';
4
4
  import { OfflineInterfaceProvider } from './offline-interface';
5
+ import { OnlineStatusMessageProvider } from './online-status-message';
5
6
 
6
7
  /** A context provider for all the relevant offline contexts */
7
8
  export function OfflineProvider({
@@ -16,7 +17,7 @@ export function OfflineProvider({
16
17
 
17
18
  return /*#__PURE__*/React.createElement(OfflineInterfaceProvider, {
18
19
  offlineInterface: offlineInterface
19
- }, /*#__PURE__*/React.createElement(CacheableSectionProvider, null, children));
20
+ }, /*#__PURE__*/React.createElement(CacheableSectionProvider, null, /*#__PURE__*/React.createElement(OnlineStatusMessageProvider, null, children)));
20
21
  }
21
22
  OfflineProvider.propTypes = {
22
23
  children: PropTypes.node,
@@ -0,0 +1,27 @@
1
+ import React, { useContext, useState } from 'react';
2
+ const defaultApi = {
3
+ onlineStatusMessage: undefined,
4
+ setOnlineStatusMessage: () => undefined
5
+ };
6
+ const OnlineStatusMessageContext = /*#__PURE__*/React.createContext(defaultApi);
7
+ export const useOnlineStatusMessage = () => {
8
+ const {
9
+ onlineStatusMessage,
10
+ setOnlineStatusMessage
11
+ } = useContext(OnlineStatusMessageContext);
12
+ return {
13
+ onlineStatusMessage,
14
+ setOnlineStatusMessage
15
+ };
16
+ };
17
+ export const OnlineStatusMessageProvider = ({
18
+ children
19
+ }) => {
20
+ const [onlineStatusMessage, setOnlineStatusMessage] = useState();
21
+ return /*#__PURE__*/React.createElement(OnlineStatusMessageContext.Provider, {
22
+ value: {
23
+ onlineStatusMessage,
24
+ setOnlineStatusMessage
25
+ }
26
+ }, children);
27
+ };
@@ -3,7 +3,10 @@ export const RenderCounter = ({
3
3
  id,
4
4
  countsObj
5
5
  }) => {
6
- if (!(id in countsObj)) countsObj[id] = 0;
6
+ if (!(id in countsObj)) {
7
+ countsObj[id] = 0;
8
+ }
9
+
7
10
  return /*#__PURE__*/React.createElement("div", {
8
11
  "data-testid": id
9
12
  }, ++countsObj[id]);
@@ -3,9 +3,15 @@ export const successfulRecordingMock = jest.fn().mockImplementation(async ({
3
3
  onCompleted
4
4
  } = {}) => {
5
5
  // in 100ms, call 'onStarted' callback (allows 'pending' state)
6
- if (onStarted) setTimeout(onStarted, 100); // in 200ms, call 'onCompleted' callback
6
+ if (onStarted) {
7
+ setTimeout(onStarted, 100);
8
+ } // in 200ms, call 'onCompleted' callback
9
+
10
+
11
+ if (onCompleted) {
12
+ setTimeout(onCompleted, 200);
13
+ } // resolve
7
14
 
8
- if (onCompleted) setTimeout(onCompleted, 200); // resolve
9
15
 
10
16
  return Promise.resolve();
11
17
  });
@@ -14,7 +20,10 @@ export const errorRecordingMock = jest.fn().mockImplementation(({
14
20
  onError
15
21
  } = {}) => {
16
22
  // in 100ms, call 'onStarted' callback (allows 'pending' state)
17
- if (onStarted) setTimeout(onStarted, 100); // in 200ms, call 'onError'
23
+ if (onStarted) {
24
+ setTimeout(onStarted, 100);
25
+ } // in 200ms, call 'onError'
26
+
18
27
 
19
28
  setTimeout(() => onError(new Error('test err')), 200); // resolve to signal successful initiation
20
29
 
@@ -2,4 +2,5 @@ export { OfflineProvider } from './lib/offline-provider';
2
2
  export { CacheableSection, useCacheableSection } from './lib/cacheable-section';
3
3
  export { useCachedSections } from './lib/cacheable-section-state';
4
4
  export { useOnlineStatus } from './lib/online-status';
5
+ export { useOnlineStatusMessage } from './lib/online-status-message';
5
6
  export { clearSensitiveCaches } from './lib/clear-sensitive-caches';
@@ -0,0 +1,6 @@
1
+ import { ReactElement, ReactNode } from 'react';
2
+ import { OnlineStatusMessageContextAPI } from '../types';
3
+ export declare const useOnlineStatusMessage: () => OnlineStatusMessageContextAPI;
4
+ export declare const OnlineStatusMessageProvider: ({ children, }: {
5
+ children: ReactNode;
6
+ }) => ReactElement;
@@ -1,3 +1,4 @@
1
+ import { ReactNode } from 'react';
1
2
  export declare type RecordingState = 'default' | 'pending' | 'error' | 'recording';
2
3
  export interface GlobalStateStoreMutation {
3
4
  (state: any): any;
@@ -37,4 +38,8 @@ export interface OfflineInterface {
37
38
  getCachedSections: () => Promise<IndexedDBCachedSection[]>;
38
39
  removeSection: (id: string) => Promise<boolean>;
39
40
  }
41
+ export declare type OnlineStatusMessageContextAPI = {
42
+ onlineStatusMessage?: ReactNode;
43
+ setOnlineStatusMessage: (additionalInfo: ReactNode) => void;
44
+ };
40
45
  export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dhis2/app-service-offline",
3
3
  "description": "A runtime service for online/offline detection and offline caching",
4
- "version": "3.4.4",
4
+ "version": "3.6.0",
5
5
  "main": "./build/cjs/index.js",
6
6
  "module": "./build/es/index.js",
7
7
  "types": "build/types/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  "coverage": "yarn test --coverage"
34
34
  },
35
35
  "peerDependencies": {
36
- "@dhis2/app-service-alerts": "3.4.4",
36
+ "@dhis2/app-service-alerts": "3.6.0",
37
37
  "prop-types": "^15.7.2",
38
38
  "react": "^16.8.6",
39
39
  "react-dom": "^16.8.6"