Skip to content

Commit 9a796c6

Browse files
committed
feat: Handle offline mode in Flagship app
We want mespapiers to be compatible with the new Flagship app's Offline mode When hosted in a Flagship app's WebView we now want to use FlagshipLink instead of StackLink in cozy-client This link will allow to redirect all queries to the Flagship app that will handle data access when offline but also when online Related PR: cozy/cozy-client#1507 Related PR: cozy/cozy-flagship-app#1239
1 parent 60a0038 commit 9a796c6

File tree

5 files changed

+82
-51
lines changed

5 files changed

+82
-51
lines changed

src/components/AppProviders.jsx

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import { launchMetadataMigrationJob } from 'src/helpers/migration/metadata'
1414

1515
import { BarProvider } from 'cozy-bar'
1616
import { CozyProvider } from 'cozy-client'
17-
import { WebviewIntentProvider } from 'cozy-intent'
1817
import AlertProvider from 'cozy-ui/transpiled/react/providers/Alert'
1918
import { BreakpointsProvider } from 'cozy-ui/transpiled/react/providers/Breakpoints'
2019
import CozyTheme from 'cozy-ui/transpiled/react/providers/CozyTheme'
@@ -45,43 +44,41 @@ export const AppProviders = ({ client, lang, polyglot, children }) => {
4544

4645
return (
4746
<ErrorProvider>
48-
<WebviewIntentProvider>
49-
<StylesProvider generateClassName={generateClassName}>
50-
<CozyProvider client={client}>
51-
<I18n lang={lang} polyglot={polyglot}>
52-
<CozyTheme>
53-
<BreakpointsProvider>
54-
<BarProvider>
55-
<PapersCreatedProvider>
56-
<AlertProvider>
57-
<PaywallProvider>
58-
<ScannerI18nProvider>
59-
<FileSharingProvider>
60-
<SearchProvider
61-
doctypes={[FILES_DOCTYPE, CONTACTS_DOCTYPE]}
62-
>
63-
<PapersDefinitionsProvider>
64-
<ModalProvider>
65-
<CreatePaperDataBackupProvider>
66-
<MultiSelectionProvider>
67-
{children}
68-
</MultiSelectionProvider>
69-
</CreatePaperDataBackupProvider>
70-
</ModalProvider>
71-
</PapersDefinitionsProvider>
72-
</SearchProvider>
73-
</FileSharingProvider>
74-
</ScannerI18nProvider>
75-
</PaywallProvider>
76-
</AlertProvider>
77-
</PapersCreatedProvider>
78-
</BarProvider>
79-
</BreakpointsProvider>
80-
</CozyTheme>
81-
</I18n>
82-
</CozyProvider>
83-
</StylesProvider>
84-
</WebviewIntentProvider>
47+
<StylesProvider generateClassName={generateClassName}>
48+
<CozyProvider client={client}>
49+
<I18n lang={lang} polyglot={polyglot}>
50+
<CozyTheme>
51+
<BreakpointsProvider>
52+
<BarProvider>
53+
<PapersCreatedProvider>
54+
<AlertProvider>
55+
<PaywallProvider>
56+
<ScannerI18nProvider>
57+
<FileSharingProvider>
58+
<SearchProvider
59+
doctypes={[FILES_DOCTYPE, CONTACTS_DOCTYPE]}
60+
>
61+
<PapersDefinitionsProvider>
62+
<ModalProvider>
63+
<CreatePaperDataBackupProvider>
64+
<MultiSelectionProvider>
65+
{children}
66+
</MultiSelectionProvider>
67+
</CreatePaperDataBackupProvider>
68+
</ModalProvider>
69+
</PapersDefinitionsProvider>
70+
</SearchProvider>
71+
</FileSharingProvider>
72+
</ScannerI18nProvider>
73+
</PaywallProvider>
74+
</AlertProvider>
75+
</PapersCreatedProvider>
76+
</BarProvider>
77+
</BreakpointsProvider>
78+
</CozyTheme>
79+
</I18n>
80+
</CozyProvider>
81+
</StylesProvider>
8582
</ErrorProvider>
8683
)
8784
}

src/components/AppRouter.jsx

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react'
1+
import React, { useEffect, useState } from 'react'
22
import {
33
Navigate,
44
Outlet,
@@ -24,6 +24,10 @@ import InformationEdit from 'src/components/Views/InformationEdit'
2424
import MultiselectView from 'src/components/Views/MultiselectView'
2525
import ConditionnalPapersList from 'src/components/Views/PapersList'
2626
import PlaceholdersSelector from 'src/components/Views/PlaceholdersSelector'
27+
import { makeClient } from 'src/targets/browser/makeClient'
28+
29+
import { isFlagshipApp } from 'cozy-device-helper'
30+
import { useWebviewIntent, WebviewIntentProvider } from 'cozy-intent'
2731

2832
const fileViewerRoutes = props => [
2933
{
@@ -165,7 +169,32 @@ const makeRoutes = props => [
165169
]
166170

167171
export const AppRouter = props => {
168-
const router = createHashRouter(makeRoutes(props))
172+
return (
173+
<WebviewIntentProvider>
174+
<AppSubRouter {...props} />
175+
</WebviewIntentProvider>
176+
)
177+
}
178+
179+
export const AppSubRouter = props => {
180+
const webviewIntent = useWebviewIntent()
181+
const [client, setClient] = useState(undefined)
182+
183+
useEffect(() => {
184+
if (isFlagshipApp() && !webviewIntent) return
185+
186+
const client = makeClient(webviewIntent)
187+
188+
setClient(client)
189+
}, [webviewIntent])
190+
191+
if (!client) {
192+
return null
193+
}
194+
195+
const propsWithClient = { ...props, client }
196+
197+
const router = createHashRouter(makeRoutes(propsWithClient))
169198

170199
return <RouterProvider router={router} />
171200
}

src/components/ModelSteps/Scan/ScanActions/ScanDesktopActions.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const ScanDesktopActions = ({ onOpenFilePickerModal, onChangeFile }) => {
3838
const showAlert = flag('mespapiers.aa-suggestion.disabled')
3939
? false
4040
: isLoadedSettings
41-
? settingsData[0].showScanDesktopActionsAlert ?? true
41+
? settingsData[0]?.showScanDesktopActionsAlert ?? true
4242
: true
4343

4444
const handleKeyDown = ({ key }) => {

src/targets/browser/makeClient.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
import schema from 'src/doctypes'
22

3-
import CozyClient from 'cozy-client'
3+
import CozyClient, { FlagshipLink } from 'cozy-client'
4+
import { isFlagshipApp, isFlagshipOfflineSupported } from 'cozy-device-helper'
5+
import flag from 'cozy-flags'
46
import { Intents } from 'cozy-interapp'
7+
import { RealtimePlugin } from 'cozy-realtime'
58

69
import manifest from '../../../manifest.webapp'
710

811
/**
912
* Make and returns cozy client instance
1013
* @returns {import('cozy-client/types/CozyClient').default} cozy client instance
1114
*/
12-
export const makeClient = () => {
15+
export const makeClient = intent => {
1316
const root = document.querySelector('[role=application]')
1417
const data = JSON.parse(root.dataset.cozy)
1518
const protocol = window.location.protocol
1619
const cozyUrl = `${protocol}//${data.domain}`
1720

21+
const shouldUseFlagshipLink = isFlagshipApp() && isFlagshipOfflineSupported()
22+
1823
const client = new CozyClient({
1924
uri: cozyUrl,
2025
token: data.token,
@@ -23,11 +28,17 @@ export const makeClient = () => {
2328
version: manifest.version
2429
},
2530
schema,
26-
store: true
31+
store: true,
32+
links: shouldUseFlagshipLink
33+
? new FlagshipLink({ webviewIntent: intent })
34+
: null
2735
})
2836

2937
const intents = new Intents({ client })
3038
client.intents = intents
3139

40+
client.registerPlugin(RealtimePlugin)
41+
client.registerPlugin(flag.plugin)
42+
3243
return client
3344
}

src/targets/browser/setupApp.jsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import { CaptureConsole } from '@sentry/integrations'
22
import * as Sentry from '@sentry/react'
33
import memoize from 'lodash/memoize'
4-
import { makeClient } from 'src/targets/browser/makeClient'
54

6-
import flag from 'cozy-flags'
7-
import { RealtimePlugin } from 'cozy-realtime'
85
import { initTranslation } from 'cozy-ui/transpiled/react/providers/I18n'
96

107
import manifest from '../../../manifest.webapp'
@@ -20,9 +17,6 @@ const setupApp = memoize(() => {
2017
const locale = JSON.parse(root.dataset.cozy)?.locale
2118
const lang = getDataOrDefault(locale, 'en')
2219
const polyglot = initTranslation(lang, lang => require(`locales/${lang}`))
23-
const client = makeClient()
24-
client.registerPlugin(RealtimePlugin)
25-
client.registerPlugin(flag.plugin)
2620

2721
Sentry.init({
2822
dsn: 'https://1b0c26c4c1474da4b7fb5fa9d1e57869@errors.cozycloud.cc/63',
@@ -37,7 +31,7 @@ const setupApp = memoize(() => {
3731
ignoreErrors: [/^Warning: /]
3832
})
3933

40-
return { root, client, lang, polyglot }
34+
return { root, lang, polyglot }
4135
})
4236

4337
export default setupApp

0 commit comments

Comments
 (0)