@dhis2/app-service-offline 3.10.0-alpha.6 → 3.10.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.
- package/build/cjs/index.js +12 -0
- package/build/cjs/lib/dhis2-connection-status/dhis2-connection-status.js +24 -11
- package/build/cjs/lib/dhis2-connection-status/dhis2-connection-status.test.js +3 -3
- package/build/cjs/lib/online-status-message.js +35 -25
- package/build/es/index.js +1 -1
- package/build/es/lib/dhis2-connection-status/dhis2-connection-status.js +24 -11
- package/build/es/lib/dhis2-connection-status/dhis2-connection-status.test.js +3 -3
- package/build/es/lib/online-status-message.js +24 -20
- package/build/types/index.d.ts +1 -1
- package/build/types/lib/online-status-message.d.ts +9 -3
- package/build/types/types.d.ts +0 -5
- package/package.json +2 -2
package/build/cjs/index.js
CHANGED
|
@@ -51,6 +51,18 @@ Object.defineProperty(exports, "useOnlineStatusMessage", {
|
|
|
51
51
|
return _onlineStatusMessage.useOnlineStatusMessage;
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
|
+
Object.defineProperty(exports, "useOnlineStatusMessageValue", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _onlineStatusMessage.useOnlineStatusMessageValue;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
Object.defineProperty(exports, "useSetOnlineStatusMessage", {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
get: function () {
|
|
63
|
+
return _onlineStatusMessage.useSetOnlineStatusMessage;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
54
66
|
|
|
55
67
|
var _offlineProvider = require("./lib/offline-provider");
|
|
56
68
|
|
|
@@ -186,6 +186,16 @@ const Dhis2ConnectionStatusProvider = (_ref) => {
|
|
|
186
186
|
};
|
|
187
187
|
}, [pingAndHandleStatus, serverVersion]);
|
|
188
188
|
(0, _react.useEffect)(() => {
|
|
189
|
+
if (!offlineInterface.subscribeToDhis2ConnectionStatus) {
|
|
190
|
+
var _smartIntervalRef$cur3;
|
|
191
|
+
|
|
192
|
+
// Missing this functionality from the offline interface --
|
|
193
|
+
// use a ping on startup to get the status
|
|
194
|
+
(_smartIntervalRef$cur3 = smartIntervalRef.current) === null || _smartIntervalRef$cur3 === void 0 ? void 0 : _smartIntervalRef$cur3.invokeCallbackImmediately();
|
|
195
|
+
console.warn('Please upgrade to @dhis2/cli-app-scripts@>10.3.8 for full connection status features');
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
|
|
189
199
|
const unsubscribe = offlineInterface.subscribeToDhis2ConnectionStatus({
|
|
190
200
|
onUpdate
|
|
191
201
|
});
|
|
@@ -194,18 +204,21 @@ const Dhis2ConnectionStatusProvider = (_ref) => {
|
|
|
194
204
|
};
|
|
195
205
|
}, [offlineInterface, onUpdate]); // Memoize this value to prevent unnecessary rerenders of context provider
|
|
196
206
|
|
|
197
|
-
const contextValue = (0, _react.useMemo)(() =>
|
|
207
|
+
const contextValue = (0, _react.useMemo)(() => {
|
|
198
208
|
// in the unlikely circumstance that offlineInterface.latestIsConnected
|
|
199
|
-
// is `null` when this initializes, fail safe by defaulting to
|
|
200
|
-
// `isConnected:
|
|
201
|
-
isConnected:
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
+
// is `null` or `undefined` when this initializes, fail safe by defaulting to
|
|
210
|
+
// `isConnected: true`. A ping or SW update should update the status shortly.
|
|
211
|
+
const validatedIsConnected = isConnected !== null && isConnected !== void 0 ? isConnected : true;
|
|
212
|
+
return {
|
|
213
|
+
isConnected: validatedIsConnected,
|
|
214
|
+
isDisconnected: !validatedIsConnected,
|
|
215
|
+
lastConnected: validatedIsConnected ? null : // Only evaluate if disconnected, since local storage
|
|
216
|
+
// is synchronous and disk-based.
|
|
217
|
+
// If lastConnected is not set in localStorage though, set it.
|
|
218
|
+
// (relevant on startup)
|
|
219
|
+
getLastConnected(appName) || updateLastConnected(appName)
|
|
220
|
+
};
|
|
221
|
+
}, [isConnected, appName]);
|
|
209
222
|
return /*#__PURE__*/_react.default.createElement(Dhis2ConnectionStatusContext.Provider, {
|
|
210
223
|
value: contextValue
|
|
211
224
|
}, children);
|
|
@@ -162,9 +162,9 @@ describe('initialization to the right values based on offline interface', () =>
|
|
|
162
162
|
} = (0, _reactHooks.renderHook)(() => (0, _dhis2ConnectionStatus.useDhis2ConnectionStatus)(), {
|
|
163
163
|
wrapper: customWrapper
|
|
164
164
|
});
|
|
165
|
-
expect(result.current.isConnected).toBe(
|
|
166
|
-
expect(result.current.isDisconnected).toBe(
|
|
167
|
-
expect(result.current.lastConnected).
|
|
165
|
+
expect(result.current.isConnected).toBe(true);
|
|
166
|
+
expect(result.current.isDisconnected).toBe(false);
|
|
167
|
+
expect(result.current.lastConnected).toBe(null);
|
|
168
168
|
});
|
|
169
169
|
});
|
|
170
170
|
describe('interval behavior', () => {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.useOnlineStatusMessage = exports.OnlineStatusMessageProvider = void 0;
|
|
6
|
+
exports.useSetOnlineStatusMessage = exports.useOnlineStatusMessageValue = exports.useOnlineStatusMessage = exports.OnlineStatusMessageProvider = void 0;
|
|
7
7
|
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
|
|
@@ -11,37 +11,47 @@ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return
|
|
|
11
11
|
|
|
12
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
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
// 'get' and 'set' contexts are separated so 'setter' consumers that don't
|
|
15
|
+
// actually need the value don't have to rerender when the value changes:
|
|
16
|
+
const OnlineStatusMessageValueContext = /*#__PURE__*/_react.default.createContext(undefined);
|
|
17
|
+
|
|
18
|
+
const SetOnlineStatusMessageContext = /*#__PURE__*/_react.default.createContext(() => undefined);
|
|
19
|
+
|
|
20
|
+
const OnlineStatusMessageProvider = (_ref) => {
|
|
21
|
+
let {
|
|
22
|
+
children
|
|
23
|
+
} = _ref;
|
|
24
|
+
const [onlineStatusMessage, setOnlineStatusMessage] = (0, _react.useState)(); // note: not undefined
|
|
25
|
+
|
|
26
|
+
return /*#__PURE__*/_react.default.createElement(OnlineStatusMessageValueContext.Provider, {
|
|
27
|
+
value: onlineStatusMessage
|
|
28
|
+
}, /*#__PURE__*/_react.default.createElement(SetOnlineStatusMessageContext.Provider, {
|
|
29
|
+
value: setOnlineStatusMessage
|
|
30
|
+
}, children));
|
|
17
31
|
};
|
|
18
32
|
|
|
19
|
-
|
|
33
|
+
exports.OnlineStatusMessageProvider = OnlineStatusMessageProvider;
|
|
34
|
+
|
|
35
|
+
const useOnlineStatusMessageValue = () => {
|
|
36
|
+
return (0, _react.useContext)(OnlineStatusMessageValueContext);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
exports.useOnlineStatusMessageValue = useOnlineStatusMessageValue;
|
|
40
|
+
|
|
41
|
+
const useSetOnlineStatusMessage = () => {
|
|
42
|
+
return (0, _react.useContext)(SetOnlineStatusMessageContext);
|
|
43
|
+
}; // combination of both getter and setter (also provides backward compatability)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
exports.useSetOnlineStatusMessage = useSetOnlineStatusMessage;
|
|
20
47
|
|
|
21
48
|
const useOnlineStatusMessage = () => {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
setOnlineStatusMessage
|
|
25
|
-
} = (0, _react.useContext)(OnlineStatusMessageContext);
|
|
49
|
+
const onlineStatusMessage = useOnlineStatusMessageValue();
|
|
50
|
+
const setOnlineStatusMessage = useSetOnlineStatusMessage();
|
|
26
51
|
return {
|
|
27
52
|
onlineStatusMessage,
|
|
28
53
|
setOnlineStatusMessage
|
|
29
54
|
};
|
|
30
55
|
};
|
|
31
56
|
|
|
32
|
-
exports.useOnlineStatusMessage = useOnlineStatusMessage;
|
|
33
|
-
|
|
34
|
-
const OnlineStatusMessageProvider = (_ref) => {
|
|
35
|
-
let {
|
|
36
|
-
children
|
|
37
|
-
} = _ref;
|
|
38
|
-
const [onlineStatusMessage, setOnlineStatusMessage] = (0, _react.useState)();
|
|
39
|
-
return /*#__PURE__*/_react.default.createElement(OnlineStatusMessageContext.Provider, {
|
|
40
|
-
value: {
|
|
41
|
-
onlineStatusMessage,
|
|
42
|
-
setOnlineStatusMessage
|
|
43
|
-
}
|
|
44
|
-
}, children);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
exports.OnlineStatusMessageProvider = OnlineStatusMessageProvider;
|
|
57
|
+
exports.useOnlineStatusMessage = useOnlineStatusMessage;
|
package/build/es/index.js
CHANGED
|
@@ -3,6 +3,6 @@ export { CacheableSection, useCacheableSection } from './lib/cacheable-section';
|
|
|
3
3
|
export { useCachedSections } from './lib/cacheable-section-state'; // Use "useOnlineStatus" name for backwards compatibility
|
|
4
4
|
|
|
5
5
|
export { useNetworkStatus as useOnlineStatus } from './lib/network-status';
|
|
6
|
-
export { useOnlineStatusMessage } from './lib/online-status-message';
|
|
6
|
+
export { useOnlineStatusMessage, useSetOnlineStatusMessage, useOnlineStatusMessageValue } from './lib/online-status-message';
|
|
7
7
|
export { clearSensitiveCaches } from './lib/clear-sensitive-caches';
|
|
8
8
|
export { useDhis2ConnectionStatus } from './lib/dhis2-connection-status';
|
|
@@ -160,6 +160,16 @@ export const Dhis2ConnectionStatusProvider = (_ref) => {
|
|
|
160
160
|
};
|
|
161
161
|
}, [pingAndHandleStatus, serverVersion]);
|
|
162
162
|
useEffect(() => {
|
|
163
|
+
if (!offlineInterface.subscribeToDhis2ConnectionStatus) {
|
|
164
|
+
var _smartIntervalRef$cur3;
|
|
165
|
+
|
|
166
|
+
// Missing this functionality from the offline interface --
|
|
167
|
+
// use a ping on startup to get the status
|
|
168
|
+
(_smartIntervalRef$cur3 = smartIntervalRef.current) === null || _smartIntervalRef$cur3 === void 0 ? void 0 : _smartIntervalRef$cur3.invokeCallbackImmediately();
|
|
169
|
+
console.warn('Please upgrade to @dhis2/cli-app-scripts@>10.3.8 for full connection status features');
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
163
173
|
const unsubscribe = offlineInterface.subscribeToDhis2ConnectionStatus({
|
|
164
174
|
onUpdate
|
|
165
175
|
});
|
|
@@ -168,18 +178,21 @@ export const Dhis2ConnectionStatusProvider = (_ref) => {
|
|
|
168
178
|
};
|
|
169
179
|
}, [offlineInterface, onUpdate]); // Memoize this value to prevent unnecessary rerenders of context provider
|
|
170
180
|
|
|
171
|
-
const contextValue = useMemo(() =>
|
|
181
|
+
const contextValue = useMemo(() => {
|
|
172
182
|
// in the unlikely circumstance that offlineInterface.latestIsConnected
|
|
173
|
-
// is `null` when this initializes, fail safe by defaulting to
|
|
174
|
-
// `isConnected:
|
|
175
|
-
isConnected:
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
+
// is `null` or `undefined` when this initializes, fail safe by defaulting to
|
|
184
|
+
// `isConnected: true`. A ping or SW update should update the status shortly.
|
|
185
|
+
const validatedIsConnected = isConnected !== null && isConnected !== void 0 ? isConnected : true;
|
|
186
|
+
return {
|
|
187
|
+
isConnected: validatedIsConnected,
|
|
188
|
+
isDisconnected: !validatedIsConnected,
|
|
189
|
+
lastConnected: validatedIsConnected ? null : // Only evaluate if disconnected, since local storage
|
|
190
|
+
// is synchronous and disk-based.
|
|
191
|
+
// If lastConnected is not set in localStorage though, set it.
|
|
192
|
+
// (relevant on startup)
|
|
193
|
+
getLastConnected(appName) || updateLastConnected(appName)
|
|
194
|
+
};
|
|
195
|
+
}, [isConnected, appName]);
|
|
183
196
|
return /*#__PURE__*/React.createElement(Dhis2ConnectionStatusContext.Provider, {
|
|
184
197
|
value: contextValue
|
|
185
198
|
}, children);
|
|
@@ -152,9 +152,9 @@ describe('initialization to the right values based on offline interface', () =>
|
|
|
152
152
|
} = renderHook(() => useDhis2ConnectionStatus(), {
|
|
153
153
|
wrapper: customWrapper
|
|
154
154
|
});
|
|
155
|
-
expect(result.current.isConnected).toBe(
|
|
156
|
-
expect(result.current.isDisconnected).toBe(
|
|
157
|
-
expect(result.current.lastConnected).
|
|
155
|
+
expect(result.current.isConnected).toBe(true);
|
|
156
|
+
expect(result.current.isDisconnected).toBe(false);
|
|
157
|
+
expect(result.current.lastConnected).toBe(null);
|
|
158
158
|
});
|
|
159
159
|
});
|
|
160
160
|
describe('interval behavior', () => {
|
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
import React, { useContext, useState } from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
// 'get' and 'set' contexts are separated so 'setter' consumers that don't
|
|
3
|
+
// actually need the value don't have to rerender when the value changes:
|
|
4
|
+
const OnlineStatusMessageValueContext = /*#__PURE__*/React.createContext(undefined);
|
|
5
|
+
const SetOnlineStatusMessageContext = /*#__PURE__*/React.createContext(() => undefined);
|
|
6
|
+
export const OnlineStatusMessageProvider = (_ref) => {
|
|
7
|
+
let {
|
|
8
|
+
children
|
|
9
|
+
} = _ref;
|
|
10
|
+
const [onlineStatusMessage, setOnlineStatusMessage] = useState(); // note: not undefined
|
|
11
|
+
|
|
12
|
+
return /*#__PURE__*/React.createElement(OnlineStatusMessageValueContext.Provider, {
|
|
13
|
+
value: onlineStatusMessage
|
|
14
|
+
}, /*#__PURE__*/React.createElement(SetOnlineStatusMessageContext.Provider, {
|
|
15
|
+
value: setOnlineStatusMessage
|
|
16
|
+
}, children));
|
|
17
|
+
};
|
|
18
|
+
export const useOnlineStatusMessageValue = () => {
|
|
19
|
+
return useContext(OnlineStatusMessageValueContext);
|
|
5
20
|
};
|
|
6
|
-
const
|
|
21
|
+
export const useSetOnlineStatusMessage = () => {
|
|
22
|
+
return useContext(SetOnlineStatusMessageContext);
|
|
23
|
+
}; // combination of both getter and setter (also provides backward compatability)
|
|
24
|
+
|
|
7
25
|
export const useOnlineStatusMessage = () => {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
setOnlineStatusMessage
|
|
11
|
-
} = useContext(OnlineStatusMessageContext);
|
|
26
|
+
const onlineStatusMessage = useOnlineStatusMessageValue();
|
|
27
|
+
const setOnlineStatusMessage = useSetOnlineStatusMessage();
|
|
12
28
|
return {
|
|
13
29
|
onlineStatusMessage,
|
|
14
30
|
setOnlineStatusMessage
|
|
15
31
|
};
|
|
16
|
-
};
|
|
17
|
-
export const OnlineStatusMessageProvider = (_ref) => {
|
|
18
|
-
let {
|
|
19
|
-
children
|
|
20
|
-
} = _ref;
|
|
21
|
-
const [onlineStatusMessage, setOnlineStatusMessage] = useState();
|
|
22
|
-
return /*#__PURE__*/React.createElement(OnlineStatusMessageContext.Provider, {
|
|
23
|
-
value: {
|
|
24
|
-
onlineStatusMessage,
|
|
25
|
-
setOnlineStatusMessage
|
|
26
|
-
}
|
|
27
|
-
}, children);
|
|
28
32
|
};
|
package/build/types/index.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ 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 { useNetworkStatus as useOnlineStatus } from './lib/network-status';
|
|
5
|
-
export { useOnlineStatusMessage } from './lib/online-status-message';
|
|
5
|
+
export { useOnlineStatusMessage, useSetOnlineStatusMessage, useOnlineStatusMessageValue, } from './lib/online-status-message';
|
|
6
6
|
export { clearSensitiveCaches } from './lib/clear-sensitive-caches';
|
|
7
7
|
export { useDhis2ConnectionStatus } from './lib/dhis2-connection-status';
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import { ReactElement, ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
export declare const useOnlineStatusMessage: () => OnlineStatusMessageContextAPI;
|
|
1
|
+
import React, { ReactElement, ReactNode } from 'react';
|
|
2
|
+
declare type SetOnlineStatusMessage = (message: ReactNode) => void;
|
|
4
3
|
export declare const OnlineStatusMessageProvider: ({ children, }: {
|
|
5
4
|
children: ReactNode;
|
|
6
5
|
}) => ReactElement;
|
|
6
|
+
export declare const useOnlineStatusMessageValue: () => React.ReactNode;
|
|
7
|
+
export declare const useSetOnlineStatusMessage: () => SetOnlineStatusMessage;
|
|
8
|
+
export declare const useOnlineStatusMessage: () => {
|
|
9
|
+
onlineStatusMessage: React.ReactNode;
|
|
10
|
+
setOnlineStatusMessage: SetOnlineStatusMessage;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
package/build/types/types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
1
|
export declare type RecordingState = 'default' | 'pending' | 'error' | 'recording';
|
|
3
2
|
export interface GlobalStateStoreMutation {
|
|
4
3
|
(state: any): any;
|
|
@@ -44,8 +43,4 @@ export interface OfflineInterface {
|
|
|
44
43
|
getCachedSections: () => Promise<IndexedDBCachedSection[]>;
|
|
45
44
|
removeSection: (id: string) => Promise<boolean>;
|
|
46
45
|
}
|
|
47
|
-
export declare type OnlineStatusMessageContextAPI = {
|
|
48
|
-
onlineStatusMessage?: ReactNode;
|
|
49
|
-
setOnlineStatusMessage: (additionalInfo: ReactNode) => void;
|
|
50
|
-
};
|
|
51
46
|
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.10.
|
|
4
|
+
"version": "3.10.1",
|
|
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-config": "3.10.
|
|
36
|
+
"@dhis2/app-service-config": "3.10.1",
|
|
37
37
|
"prop-types": "^15.7.2",
|
|
38
38
|
"react": "^16.8.6",
|
|
39
39
|
"react-dom": "^16.8.6"
|