Skip to content

Commit f22e1f3

Browse files
authored
feat: offline status messaging (#1258)
1 parent 12de86c commit f22e1f3

File tree

8 files changed

+109
-27
lines changed

8 files changed

+109
-27
lines changed

examples/cra/yarn.lock

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,26 +1054,26 @@
10541054
integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==
10551055

10561056
"@dhis2/app-runtime@file:../../runtime":
1057-
version "3.4.3"
1057+
version "3.5.0"
10581058
dependencies:
1059-
"@dhis2/app-service-alerts" "3.4.3"
1060-
"@dhis2/app-service-config" "3.4.3"
1061-
"@dhis2/app-service-data" "3.4.3"
1062-
"@dhis2/app-service-offline" "3.4.3"
1059+
"@dhis2/app-service-alerts" "3.5.0"
1060+
"@dhis2/app-service-config" "3.5.0"
1061+
"@dhis2/app-service-data" "3.5.0"
1062+
"@dhis2/app-service-offline" "3.5.0"
10631063

1064-
"@dhis2/app-service-alerts@3.4.3", "@dhis2/app-service-alerts@file:../../services/alerts":
1065-
version "3.4.3"
1064+
"@dhis2/app-service-alerts@3.5.0", "@dhis2/app-service-alerts@file:../../services/alerts":
1065+
version "3.5.0"
10661066

1067-
"@dhis2/app-service-config@3.4.3", "@dhis2/app-service-config@file:../../services/config":
1068-
version "3.4.3"
1067+
"@dhis2/app-service-config@3.5.0", "@dhis2/app-service-config@file:../../services/config":
1068+
version "3.5.0"
10691069

1070-
"@dhis2/app-service-data@3.4.3", "@dhis2/app-service-data@file:../../services/data":
1071-
version "3.4.3"
1070+
"@dhis2/app-service-data@3.5.0", "@dhis2/app-service-data@file:../../services/data":
1071+
version "3.5.0"
10721072
dependencies:
10731073
react-query "^3.13.11"
10741074

1075-
"@dhis2/app-service-offline@3.4.3", "@dhis2/app-service-offline@file:../../services/offline":
1076-
version "3.4.3"
1075+
"@dhis2/app-service-offline@3.5.0", "@dhis2/app-service-offline@file:../../services/offline":
1076+
version "3.5.0"
10771077
dependencies:
10781078
lodash "^4.17.21"
10791079

examples/query-playground/yarn.lock

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,26 +1790,26 @@
17901790
moment "^2.24.0"
17911791

17921792
"@dhis2/app-runtime@*", "@dhis2/app-runtime@^2.2.2", "@dhis2/app-runtime@file:../../runtime":
1793-
version "3.4.3"
1793+
version "3.5.0"
17941794
dependencies:
1795-
"@dhis2/app-service-alerts" "3.4.3"
1796-
"@dhis2/app-service-config" "3.4.3"
1797-
"@dhis2/app-service-data" "3.4.3"
1798-
"@dhis2/app-service-offline" "3.4.3"
1795+
"@dhis2/app-service-alerts" "3.5.0"
1796+
"@dhis2/app-service-config" "3.5.0"
1797+
"@dhis2/app-service-data" "3.5.0"
1798+
"@dhis2/app-service-offline" "3.5.0"
17991799

1800-
"@dhis2/app-service-alerts@3.4.3", "@dhis2/app-service-alerts@file:../../services/alerts":
1801-
version "3.4.3"
1800+
"@dhis2/app-service-alerts@3.5.0", "@dhis2/app-service-alerts@file:../../services/alerts":
1801+
version "3.5.0"
18021802

1803-
"@dhis2/app-service-config@3.4.3", "@dhis2/app-service-config@file:../../services/config":
1804-
version "3.4.3"
1803+
"@dhis2/app-service-config@3.5.0", "@dhis2/app-service-config@file:../../services/config":
1804+
version "3.5.0"
18051805

1806-
"@dhis2/app-service-data@3.4.3", "@dhis2/app-service-data@file:../../services/data":
1807-
version "3.4.3"
1806+
"@dhis2/app-service-data@3.5.0", "@dhis2/app-service-data@file:../../services/data":
1807+
version "3.5.0"
18081808
dependencies:
18091809
react-query "^3.13.11"
18101810

1811-
"@dhis2/app-service-offline@3.4.3", "@dhis2/app-service-offline@file:../../services/offline":
1812-
version "3.4.3"
1811+
"@dhis2/app-service-offline@3.5.0", "@dhis2/app-service-offline@file:../../services/offline":
1812+
version "3.5.0"
18131813
dependencies:
18141814
lodash "^4.17.21"
18151815

runtime/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export { useAlerts, useAlert } from '@dhis2/app-service-alerts'
1414

1515
export {
1616
useOnlineStatus,
17+
useOnlineStatusMessage,
1718
useCacheableSection,
1819
CacheableSection,
1920
useCachedSections,

services/offline/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export { OfflineProvider } from './lib/offline-provider'
22
export { CacheableSection, useCacheableSection } from './lib/cacheable-section'
33
export { useCachedSections } from './lib/cacheable-section-state'
44
export { useOnlineStatus } from './lib/online-status'
5+
export { useOnlineStatusMessage } from './lib/online-status-message'
56
export { clearSensitiveCaches } from './lib/clear-sensitive-caches'
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { renderHook, act } from '@testing-library/react-hooks'
2+
import React, { FC } from 'react'
3+
import { mockOfflineInterface } from '../../utils/test-mocks'
4+
import { OfflineProvider } from '../offline-provider'
5+
import { useOnlineStatusMessage } from '../online-status-message'
6+
7+
describe('useOnlineStatusMessage', () => {
8+
it('should allow the online status to be updated ', () => {
9+
const wrapper: FC = ({ children }) => (
10+
<OfflineProvider offlineInterface={mockOfflineInterface}>
11+
{children}
12+
</OfflineProvider>
13+
)
14+
15+
const { result } = renderHook(() => useOnlineStatusMessage(), {
16+
wrapper,
17+
})
18+
19+
expect(result.current.onlineStatusMessage).toBeUndefined()
20+
21+
act(() => {
22+
result.current.setOnlineStatusMessage('8 offline events')
23+
})
24+
25+
expect(result.current.onlineStatusMessage).toEqual('8 offline events')
26+
})
27+
})

services/offline/src/lib/offline-provider.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React from 'react'
33
import { OfflineInterface } from '../types'
44
import { CacheableSectionProvider } from './cacheable-section-state'
55
import { OfflineInterfaceProvider } from './offline-interface'
6+
import { OnlineStatusMessageProvider } from './online-status-message'
67

78
interface OfflineProviderInput {
89
offlineInterface?: OfflineInterface
@@ -22,7 +23,11 @@ export function OfflineProvider({
2223

2324
return (
2425
<OfflineInterfaceProvider offlineInterface={offlineInterface}>
25-
<CacheableSectionProvider>{children}</CacheableSectionProvider>
26+
<CacheableSectionProvider>
27+
<OnlineStatusMessageProvider>
28+
{children}
29+
</OnlineStatusMessageProvider>
30+
</CacheableSectionProvider>
2631
</OfflineInterfaceProvider>
2732
)
2833
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import React, { ReactElement, ReactNode, useContext, useState } from 'react'
2+
import { OnlineStatusMessageContextAPI } from '../types'
3+
4+
const defaultApi: OnlineStatusMessageContextAPI = {
5+
onlineStatusMessage: undefined,
6+
setOnlineStatusMessage: () => undefined,
7+
}
8+
9+
const OnlineStatusMessageContext =
10+
React.createContext<OnlineStatusMessageContextAPI>(defaultApi)
11+
12+
export const useOnlineStatusMessage = (): OnlineStatusMessageContextAPI => {
13+
const { onlineStatusMessage, setOnlineStatusMessage } =
14+
useContext<OnlineStatusMessageContextAPI>(OnlineStatusMessageContext)
15+
16+
return {
17+
onlineStatusMessage,
18+
setOnlineStatusMessage,
19+
}
20+
}
21+
22+
export const OnlineStatusMessageProvider = ({
23+
children,
24+
}: {
25+
children: ReactNode
26+
}): ReactElement => {
27+
const [onlineStatusMessage, setOnlineStatusMessage] = useState<ReactNode>()
28+
29+
return (
30+
<OnlineStatusMessageContext.Provider
31+
value={{
32+
onlineStatusMessage,
33+
setOnlineStatusMessage,
34+
}}
35+
>
36+
{children}
37+
</OnlineStatusMessageContext.Provider>
38+
)
39+
}

services/offline/src/types.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { ReactNode } from 'react'
2+
13
// Cacheable Section types
24

35
export type RecordingState = 'default' | 'pending' | 'error' | 'recording'
@@ -58,3 +60,10 @@ export interface OfflineInterface {
5860
getCachedSections: () => Promise<IndexedDBCachedSection[]>
5961
removeSection: (id: string) => Promise<boolean>
6062
}
63+
64+
// Online status types
65+
66+
export type OnlineStatusMessageContextAPI = {
67+
onlineStatusMessage?: ReactNode
68+
setOnlineStatusMessage: (additionalInfo: ReactNode) => void
69+
}

0 commit comments

Comments
 (0)