cozy-bar 8.3.0 → 8.4.2
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/dist/cozy-bar.min.js +26 -32
- package/dist/cozy-bar.min.js.map +1 -1
- package/package.json +8 -5
- package/src/components/Apps/AppNavButtons.jsx +8 -14
- package/src/components/Apps/ButtonCozyHome.jsx +30 -0
- package/src/components/Apps/ButtonCozyHome.spec.jsx +53 -0
- package/src/components/Bar.jsx +12 -3
- package/src/components/Bar.spec.jsx +4 -2
- package/src/components/__snapshots__/Bar.spec.jsx.snap +1 -0
- package/src/index.jsx +3 -1
- package/src/index.spec.jsx +6 -0
- package/src/lib/api/index.jsx +12 -2
- package/src/lib/reducers/index.js +11 -3
- package/src/lib/reducers/unserializable.js +26 -0
- package/src/styles/apps.css +6 -1
- package/transpiled/components/Apps/AppNavButtons.js +7 -14
- package/transpiled/components/Apps/ButtonCozyHome.js +25 -0
- package/transpiled/components/Apps/ButtonCozyHome.spec.jsx +53 -0
- package/transpiled/components/Bar.js +14 -4
- package/transpiled/components/Bar.spec.jsx +4 -2
- package/transpiled/components/__snapshots__/Bar.spec.jsx.snap +1 -0
- package/transpiled/cozy-bar.css +6 -1
- package/transpiled/index.js +3 -2
- package/transpiled/index.spec.jsx +6 -0
- package/transpiled/lib/api/index.js +6 -2
- package/transpiled/lib/reducers/index.js +9 -5
- package/transpiled/lib/reducers/unserializable.js +31 -0
- package/transpiled/styles/apps.css +6 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cozy-bar",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.4.2",
|
|
4
4
|
"description": "cozy-bar.js library, a small lib provided by cozy-stack to inject the Cozy-bar component into each app",
|
|
5
5
|
"main": "dist/cozy-bar.js",
|
|
6
6
|
"author": "Cozy Cloud <contact@cozycloud.cc> (https://cozy.io/)",
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"babel-preset-cozy-app": "^1.9.0",
|
|
54
54
|
"bundlesize": "0.18.0",
|
|
55
55
|
"cozy-authentication": "1.19.1",
|
|
56
|
+
"cozy-intent": "^1.7.0",
|
|
56
57
|
"css-loader": "1.0.1",
|
|
57
58
|
"css-mqpacker": "7.0.0",
|
|
58
59
|
"cssnano-preset-advanced": "4.0.7",
|
|
@@ -66,13 +67,14 @@
|
|
|
66
67
|
"foreman": "3.0.1",
|
|
67
68
|
"identity-obj-proxy": "3.0.0",
|
|
68
69
|
"jest": "24.9.0",
|
|
70
|
+
"jest-fetch-mock": "^3.0.3",
|
|
69
71
|
"json-loader": "0.5.7",
|
|
70
72
|
"mini-css-extract-plugin": "0.8.0",
|
|
71
73
|
"my-react": "npm:react@16.13.1",
|
|
72
74
|
"my-react-dom": "npm:react-dom@16.13.1",
|
|
73
75
|
"npm-run-all": "4.1.5",
|
|
74
76
|
"parcel": "1.12.3",
|
|
75
|
-
"postcss": "
|
|
77
|
+
"postcss": "8.2.13",
|
|
76
78
|
"postcss-discard-duplicates": "4.0.2",
|
|
77
79
|
"postcss-discard-empty": "4.0.1",
|
|
78
80
|
"postcss-import": "12.0.1",
|
|
@@ -94,8 +96,8 @@
|
|
|
94
96
|
},
|
|
95
97
|
"dependencies": {
|
|
96
98
|
"@cozy/minilog": "^1.0.0",
|
|
97
|
-
"cozy-client": "
|
|
98
|
-
"cozy-device-helper": "1.
|
|
99
|
+
"cozy-client": "^27.14.4",
|
|
100
|
+
"cozy-device-helper": "^1.16.1",
|
|
99
101
|
"cozy-flags": "2.4.1",
|
|
100
102
|
"cozy-interapp": "0.4.9",
|
|
101
103
|
"cozy-realtime": "3.2.1",
|
|
@@ -112,7 +114,8 @@
|
|
|
112
114
|
"semver-compare": "^1.0.0"
|
|
113
115
|
},
|
|
114
116
|
"peerDependencies": {
|
|
115
|
-
"cozy-client": "*"
|
|
117
|
+
"cozy-client": "*",
|
|
118
|
+
"cozy-intent": ">=1.7.0"
|
|
116
119
|
},
|
|
117
120
|
"bundlesize": [
|
|
118
121
|
{
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import React, { Component } from 'react'
|
|
2
2
|
import { connect } from 'react-redux'
|
|
3
3
|
|
|
4
|
-
import { getHomeApp } from 'lib/reducers'
|
|
5
|
-
import TopIcon from 'cozy-ui/react/Icons/Top'
|
|
6
4
|
import BottomIcon from 'cozy-ui/react/Icons/Bottom'
|
|
7
|
-
|
|
8
|
-
import { translate } from 'cozy-ui/react/I18n'
|
|
9
5
|
import Icon from 'cozy-ui/react/Icon'
|
|
10
|
-
import
|
|
6
|
+
import TopIcon from 'cozy-ui/react/Icons/Top'
|
|
7
|
+
import { translate } from 'cozy-ui/react/I18n'
|
|
8
|
+
|
|
9
|
+
import { ButtonCozyHome } from 'components/Apps/ButtonCozyHome'
|
|
10
|
+
import { getHomeApp } from 'lib/reducers'
|
|
11
11
|
import { isFetchingApps } from 'lib/reducers'
|
|
12
12
|
|
|
13
13
|
class AppNavButton extends Component {
|
|
@@ -52,16 +52,10 @@ class AppNavButton extends Component {
|
|
|
52
52
|
|
|
53
53
|
return (
|
|
54
54
|
<div className={`coz-nav-apps-btns${isHomeApp ? ' --currentHome' : ''}`}>
|
|
55
|
-
{homeHref
|
|
56
|
-
|
|
57
|
-
<HomeIcon className="coz-nav-apps-btns-home-svg" />
|
|
58
|
-
</a>
|
|
59
|
-
) : (
|
|
60
|
-
<span className="coz-nav-apps-btns-home">
|
|
61
|
-
<HomeIcon className="coz-nav-apps-btns-home-svg" />
|
|
62
|
-
</span>
|
|
63
|
-
)}
|
|
55
|
+
<ButtonCozyHome homeHref={homeHref} />
|
|
56
|
+
|
|
64
57
|
{!isHomeApp && <span className="coz-nav-apps-btns-sep" />}
|
|
58
|
+
|
|
65
59
|
<button
|
|
66
60
|
type="button"
|
|
67
61
|
onClick={isPublic ? null : handleClick}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import IconCozyHome from './IconCozyHome'
|
|
4
|
+
|
|
5
|
+
export const ButtonCozyHome = ({ webviewContext, homeHref }) => {
|
|
6
|
+
if (webviewContext)
|
|
7
|
+
return (
|
|
8
|
+
<button
|
|
9
|
+
onClick={() => {
|
|
10
|
+
webviewContext.call('backToHome')
|
|
11
|
+
}}
|
|
12
|
+
className="coz-nav-apps-btns-home --flagship"
|
|
13
|
+
>
|
|
14
|
+
<IconCozyHome className="coz-nav-apps-btns-home-svg" />
|
|
15
|
+
</button>
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
if (homeHref)
|
|
19
|
+
return (
|
|
20
|
+
<a href={homeHref} className="coz-nav-apps-btns-home">
|
|
21
|
+
<IconCozyHome className="coz-nav-apps-btns-home-svg" />
|
|
22
|
+
</a>
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<span className="coz-nav-apps-btns-home">
|
|
27
|
+
<IconCozyHome className="coz-nav-apps-btns-home-svg" />
|
|
28
|
+
</span>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { shallow } from 'enzyme'
|
|
3
|
+
|
|
4
|
+
import { ButtonCozyHome } from 'components/Apps/ButtonCozyHome'
|
|
5
|
+
|
|
6
|
+
const homeHref = 'foo'
|
|
7
|
+
const expectedCall = 'backToHome'
|
|
8
|
+
const webviewContext = {
|
|
9
|
+
call: jest.fn()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('ButtonCozyHome', () => {
|
|
13
|
+
it('should render a span with no props', () => {
|
|
14
|
+
const render = shallow(<ButtonCozyHome />)
|
|
15
|
+
const element = render.getElement()
|
|
16
|
+
|
|
17
|
+
expect(element.type).toBe('span')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should render an anchor with correct href when homeHref', () => {
|
|
21
|
+
const render = shallow(<ButtonCozyHome homeHref={homeHref} />)
|
|
22
|
+
const element = render.getElement()
|
|
23
|
+
|
|
24
|
+
expect(element.type).toBe('a')
|
|
25
|
+
expect(element.props.href).toBe(homeHref)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('should render a button when webviewContext', () => {
|
|
29
|
+
const render = shallow(<ButtonCozyHome webviewContext={webviewContext} />)
|
|
30
|
+
const element = render.getElement()
|
|
31
|
+
|
|
32
|
+
expect(element.type).toBe('button')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('should give priority to button if both webviewContext and homeHref are present', () => {
|
|
36
|
+
const render = shallow(
|
|
37
|
+
<ButtonCozyHome homeHref={homeHref} webviewContext={webviewContext} />
|
|
38
|
+
)
|
|
39
|
+
const element = render.getElement()
|
|
40
|
+
|
|
41
|
+
expect(element.type).toBe('button')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('should call the correct context method on click', () => {
|
|
45
|
+
const render = shallow(
|
|
46
|
+
<ButtonCozyHome homeHref={homeHref} webviewContext={webviewContext} />
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
render.simulate('click')
|
|
50
|
+
|
|
51
|
+
expect(webviewContext.call).toBeCalledWith(expectedCall)
|
|
52
|
+
})
|
|
53
|
+
})
|
package/src/components/Bar.jsx
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from 'cozy-ui/react/helpers/tracker'
|
|
13
13
|
import { isMobileApp } from 'cozy-device-helper'
|
|
14
14
|
|
|
15
|
+
import { ButtonCozyHome } from 'components/Apps/ButtonCozyHome'
|
|
15
16
|
import Banner from 'components/Banner'
|
|
16
17
|
import Drawer from 'components/Drawer'
|
|
17
18
|
import Settings from 'components/Settings'
|
|
@@ -27,7 +28,8 @@ import {
|
|
|
27
28
|
fetchApps,
|
|
28
29
|
fetchContext,
|
|
29
30
|
fetchSettingsData,
|
|
30
|
-
shouldEnableClaudy
|
|
31
|
+
shouldEnableClaudy,
|
|
32
|
+
getWebviewContext
|
|
31
33
|
} from 'lib/reducers'
|
|
32
34
|
|
|
33
35
|
/* Generated with node_modules/.bin/svgr src/assets/sprites/icon-apps.svg */
|
|
@@ -163,7 +165,12 @@ export class Bar extends Component {
|
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
renderLeft = () => {
|
|
166
|
-
const { t, isPublic } = this.props
|
|
168
|
+
const { t, isPublic, webviewContext } = this.props
|
|
169
|
+
|
|
170
|
+
if (webviewContext) {
|
|
171
|
+
return <ButtonCozyHome webviewContext={webviewContext} />
|
|
172
|
+
}
|
|
173
|
+
|
|
167
174
|
// data-tutorial attribute allows to be targeted in an application tutorial
|
|
168
175
|
return !isPublic ? (
|
|
169
176
|
<button
|
|
@@ -197,6 +204,7 @@ export class Bar extends Component {
|
|
|
197
204
|
supportDisplayed,
|
|
198
205
|
usageTracker
|
|
199
206
|
} = this.state
|
|
207
|
+
|
|
200
208
|
const {
|
|
201
209
|
theme,
|
|
202
210
|
themeOverrides,
|
|
@@ -269,7 +277,8 @@ export const mapStateToProps = state => ({
|
|
|
269
277
|
barSearch: getContent(state, 'search'),
|
|
270
278
|
isDrive: isCurrentApp(state, { slug: 'drive' }),
|
|
271
279
|
claudyEnabled: shouldEnableClaudy(state),
|
|
272
|
-
hasFetchedApps: hasFetched(state)
|
|
280
|
+
hasFetchedApps: hasFetched(state),
|
|
281
|
+
webviewContext: getWebviewContext(state)
|
|
273
282
|
})
|
|
274
283
|
|
|
275
284
|
export const mapDispatchToProps = dispatch => ({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { shallow } from 'enzyme'
|
|
3
|
-
import { isMobileApp } from 'cozy-device-helper'
|
|
3
|
+
import { isFlagshipApp, isMobileApp } from 'cozy-device-helper'
|
|
4
4
|
import toJson from 'enzyme-to-json'
|
|
5
5
|
import reducers from 'lib/reducers'
|
|
6
6
|
import CozyClient from 'cozy-client'
|
|
@@ -9,7 +9,8 @@ import { Bar, mapStateToProps, mapDispatchToProps } from './Bar'
|
|
|
9
9
|
|
|
10
10
|
jest.mock('cozy-device-helper', () => ({
|
|
11
11
|
...require.requireActual('cozy-device-helper'),
|
|
12
|
-
isMobileApp: jest.fn()
|
|
12
|
+
isMobileApp: jest.fn(),
|
|
13
|
+
isFlagshipApp: jest.fn()
|
|
13
14
|
}))
|
|
14
15
|
|
|
15
16
|
describe('Bar', () => {
|
|
@@ -32,6 +33,7 @@ describe('Bar', () => {
|
|
|
32
33
|
|
|
33
34
|
afterEach(() => {
|
|
34
35
|
Bar.prototype.fetchApps.mockRestore()
|
|
36
|
+
isFlagshipApp.mockClear()
|
|
35
37
|
})
|
|
36
38
|
|
|
37
39
|
it('should fetch data when mounted', () => {
|
package/src/index.jsx
CHANGED
|
@@ -218,7 +218,8 @@ const {
|
|
|
218
218
|
BarRight,
|
|
219
219
|
BarLeft,
|
|
220
220
|
BarSearch,
|
|
221
|
-
setTheme
|
|
221
|
+
setTheme,
|
|
222
|
+
setWebviewContext
|
|
222
223
|
} = proxiedAPI
|
|
223
224
|
|
|
224
225
|
const version = __VERSION__
|
|
@@ -235,6 +236,7 @@ export {
|
|
|
235
236
|
BarCenter,
|
|
236
237
|
BarSearch,
|
|
237
238
|
setTheme,
|
|
239
|
+
setWebviewContext,
|
|
238
240
|
setLocale,
|
|
239
241
|
updateAccessToken
|
|
240
242
|
}
|
package/src/index.spec.jsx
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import CozyClient from 'cozy-client'
|
|
2
|
+
import jestFetchMock from 'jest-fetch-mock'
|
|
3
|
+
|
|
2
4
|
import * as cozyBar from './index'
|
|
3
5
|
|
|
4
6
|
describe('init', () => {
|
|
7
|
+
beforeAll(() => {
|
|
8
|
+
global.fetch = jestFetchMock
|
|
9
|
+
})
|
|
10
|
+
|
|
5
11
|
beforeEach(() => {
|
|
6
12
|
jest.spyOn(console, 'error')
|
|
7
13
|
const div = document.createElement('div')
|
package/src/lib/api/index.jsx
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import React, { Component } from 'react'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
setContent,
|
|
4
|
+
unsetContent,
|
|
5
|
+
setLocale,
|
|
6
|
+
setTheme,
|
|
7
|
+
setWebviewContext
|
|
8
|
+
} from 'lib/reducers'
|
|
3
9
|
|
|
4
10
|
import { locations, getJsApiName, getReactApiName } from 'lib/api/helpers'
|
|
5
11
|
|
|
@@ -90,6 +96,10 @@ export const createBarAPI = store => {
|
|
|
90
96
|
store.dispatch(setTheme(...args))
|
|
91
97
|
}
|
|
92
98
|
|
|
99
|
+
methods.setWebviewContext = (...args) => {
|
|
100
|
+
store.dispatch(setWebviewContext(...args))
|
|
101
|
+
}
|
|
102
|
+
|
|
93
103
|
return methods
|
|
94
104
|
}
|
|
95
105
|
|
|
@@ -128,7 +138,7 @@ export const createBarProxiedAPI = exposedAPI => {
|
|
|
128
138
|
}
|
|
129
139
|
})
|
|
130
140
|
|
|
131
|
-
for (let fnName of ['setLocale', 'setTheme']) {
|
|
141
|
+
for (let fnName of ['setLocale', 'setTheme', 'setWebviewContext']) {
|
|
132
142
|
apiReferences[fnName] = makeProxyMethodToAPI(exposedAPI, fnName)
|
|
133
143
|
}
|
|
134
144
|
return apiReferences
|
|
@@ -2,6 +2,7 @@ import { combineReducers } from 'redux'
|
|
|
2
2
|
import * as content from 'lib/reducers/content'
|
|
3
3
|
import * as locale from 'lib/reducers/locale'
|
|
4
4
|
import * as theme from 'lib/reducers/theme'
|
|
5
|
+
import * as unserializable from 'lib/reducers/unserializable'
|
|
5
6
|
import appsReducer, * as apps from 'lib/reducers/apps'
|
|
6
7
|
import settingsReducer, * as settings from 'lib/reducers/settings'
|
|
7
8
|
import contextReducer, * as context from 'lib/reducers/context'
|
|
@@ -16,6 +17,7 @@ const setContent = content.setContent
|
|
|
16
17
|
const unsetContent = content.unsetContent
|
|
17
18
|
const setLocale = locale.setLocale
|
|
18
19
|
const setTheme = theme.setTheme
|
|
20
|
+
const setWebviewContext = unserializable.setWebviewContext
|
|
19
21
|
const fetchApps = apps.fetchApps
|
|
20
22
|
const setInfos = apps.setInfos
|
|
21
23
|
const fetchSettingsData = settings.fetchSettingsData
|
|
@@ -26,6 +28,7 @@ export {
|
|
|
26
28
|
unsetContent,
|
|
27
29
|
setLocale,
|
|
28
30
|
setTheme,
|
|
31
|
+
setWebviewContext,
|
|
29
32
|
fetchApps,
|
|
30
33
|
setInfos,
|
|
31
34
|
fetchSettingsData,
|
|
@@ -48,18 +51,23 @@ export const isFetchingSettings = proxy('settings', settings.isFetchingSettings)
|
|
|
48
51
|
export const getHelpLink = proxy('context', context.getHelpLink)
|
|
49
52
|
export const getClaudyActions = proxy('context', context.getClaudyActions)
|
|
50
53
|
export const shouldEnableClaudy = proxy('context', context.shouldEnableClaudy)
|
|
54
|
+
export const getWebviewContext = proxy(
|
|
55
|
+
'unserializable',
|
|
56
|
+
unserializable.getWebviewContext
|
|
57
|
+
)
|
|
51
58
|
|
|
52
59
|
// realtime handlers
|
|
53
60
|
export const onRealtimeCreate = apps.receiveApp
|
|
54
61
|
export const onRealtimeDelete = apps.deleteApp
|
|
55
62
|
|
|
56
63
|
export const reducers = {
|
|
64
|
+
apps: appsReducer,
|
|
57
65
|
content: content.reducer,
|
|
66
|
+
context: contextReducer,
|
|
58
67
|
locale: locale.reducer,
|
|
59
|
-
theme: theme.reducer,
|
|
60
|
-
apps: appsReducer,
|
|
61
68
|
settings: settingsReducer,
|
|
62
|
-
|
|
69
|
+
theme: theme.reducer,
|
|
70
|
+
unserializable: unserializable.reducer
|
|
63
71
|
}
|
|
64
72
|
|
|
65
73
|
export default combineReducers(reducers)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const SET_WEBVIEW_CONTEXT = 'SET_WEBVIEW_CONTEXT'
|
|
2
|
+
|
|
3
|
+
// selectors
|
|
4
|
+
export const getWebviewContext = state => {
|
|
5
|
+
return state.webviewContext
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// actions
|
|
9
|
+
export const setWebviewContext = payload => ({
|
|
10
|
+
type: SET_WEBVIEW_CONTEXT,
|
|
11
|
+
payload
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
// reducers
|
|
15
|
+
const defaultState = {
|
|
16
|
+
webviewContext: undefined
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const reducer = (state = defaultState, action) => {
|
|
20
|
+
switch (action.type) {
|
|
21
|
+
case SET_WEBVIEW_CONTEXT:
|
|
22
|
+
return { ...state, webviewContext: action.payload }
|
|
23
|
+
default:
|
|
24
|
+
return state
|
|
25
|
+
}
|
|
26
|
+
}
|
package/src/styles/apps.css
CHANGED
|
@@ -46,11 +46,16 @@
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
[role=banner] .coz-nav-apps-btns-home {
|
|
49
|
-
width: 2rem;
|
|
50
49
|
height: 2rem;
|
|
51
50
|
margin-right: .75rem;
|
|
52
51
|
}
|
|
53
52
|
|
|
53
|
+
[role=banner] .coz-nav-apps-btns-home.--flagship {
|
|
54
|
+
background: none;
|
|
55
|
+
border: 0;
|
|
56
|
+
height: 100%;
|
|
57
|
+
}
|
|
58
|
+
|
|
54
59
|
[role=banner] .coz-nav-apps-btns-home-svg {
|
|
55
60
|
max-width: 2rem;
|
|
56
61
|
max-height: 2rem;
|
|
@@ -10,12 +10,12 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
|
|
|
10
10
|
|
|
11
11
|
import React, { Component } from 'react';
|
|
12
12
|
import { connect } from 'react-redux';
|
|
13
|
-
import { getHomeApp } from "../../lib/reducers";
|
|
14
|
-
import TopIcon from "cozy-ui/transpiled/react/Icons/Top";
|
|
15
13
|
import BottomIcon from "cozy-ui/transpiled/react/Icons/Bottom";
|
|
16
|
-
import { translate } from "cozy-ui/transpiled/react/I18n";
|
|
17
14
|
import Icon from "cozy-ui/transpiled/react/Icon";
|
|
18
|
-
import
|
|
15
|
+
import TopIcon from "cozy-ui/transpiled/react/Icons/Top";
|
|
16
|
+
import { translate } from "cozy-ui/transpiled/react/I18n";
|
|
17
|
+
import { ButtonCozyHome } from "./ButtonCozyHome";
|
|
18
|
+
import { getHomeApp } from "../../lib/reducers";
|
|
19
19
|
import { isFetchingApps } from "../../lib/reducers";
|
|
20
20
|
|
|
21
21
|
var AppNavButton = /*#__PURE__*/function (_Component) {
|
|
@@ -65,16 +65,9 @@ var AppNavButton = /*#__PURE__*/function (_Component) {
|
|
|
65
65
|
var homeHref = !isPublic && homeApp && homeApp.href;
|
|
66
66
|
return /*#__PURE__*/React.createElement("div", {
|
|
67
67
|
className: "coz-nav-apps-btns".concat(isHomeApp ? ' --currentHome' : '')
|
|
68
|
-
},
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}, /*#__PURE__*/React.createElement(HomeIcon, {
|
|
72
|
-
className: "coz-nav-apps-btns-home-svg"
|
|
73
|
-
})) : /*#__PURE__*/React.createElement("span", {
|
|
74
|
-
className: "coz-nav-apps-btns-home"
|
|
75
|
-
}, /*#__PURE__*/React.createElement(HomeIcon, {
|
|
76
|
-
className: "coz-nav-apps-btns-home-svg"
|
|
77
|
-
})), !isHomeApp && /*#__PURE__*/React.createElement("span", {
|
|
68
|
+
}, /*#__PURE__*/React.createElement(ButtonCozyHome, {
|
|
69
|
+
homeHref: homeHref
|
|
70
|
+
}), !isHomeApp && /*#__PURE__*/React.createElement("span", {
|
|
78
71
|
className: "coz-nav-apps-btns-sep"
|
|
79
72
|
}), /*#__PURE__*/React.createElement("button", {
|
|
80
73
|
type: "button",
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import IconCozyHome from "./IconCozyHome";
|
|
3
|
+
export var ButtonCozyHome = function ButtonCozyHome(_ref) {
|
|
4
|
+
var webviewContext = _ref.webviewContext,
|
|
5
|
+
homeHref = _ref.homeHref;
|
|
6
|
+
if (webviewContext) return /*#__PURE__*/React.createElement("button", {
|
|
7
|
+
onClick: function onClick() {
|
|
8
|
+
webviewContext.call('backToHome');
|
|
9
|
+
},
|
|
10
|
+
className: "coz-nav-apps-btns-home --flagship"
|
|
11
|
+
}, /*#__PURE__*/React.createElement(IconCozyHome, {
|
|
12
|
+
className: "coz-nav-apps-btns-home-svg"
|
|
13
|
+
}));
|
|
14
|
+
if (homeHref) return /*#__PURE__*/React.createElement("a", {
|
|
15
|
+
href: homeHref,
|
|
16
|
+
className: "coz-nav-apps-btns-home"
|
|
17
|
+
}, /*#__PURE__*/React.createElement(IconCozyHome, {
|
|
18
|
+
className: "coz-nav-apps-btns-home-svg"
|
|
19
|
+
}));
|
|
20
|
+
return /*#__PURE__*/React.createElement("span", {
|
|
21
|
+
className: "coz-nav-apps-btns-home"
|
|
22
|
+
}, /*#__PURE__*/React.createElement(IconCozyHome, {
|
|
23
|
+
className: "coz-nav-apps-btns-home-svg"
|
|
24
|
+
}));
|
|
25
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { shallow } from 'enzyme'
|
|
3
|
+
|
|
4
|
+
import { ButtonCozyHome } from 'components/Apps/ButtonCozyHome'
|
|
5
|
+
|
|
6
|
+
const homeHref = 'foo'
|
|
7
|
+
const expectedCall = 'backToHome'
|
|
8
|
+
const webviewContext = {
|
|
9
|
+
call: jest.fn()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('ButtonCozyHome', () => {
|
|
13
|
+
it('should render a span with no props', () => {
|
|
14
|
+
const render = shallow(<ButtonCozyHome />)
|
|
15
|
+
const element = render.getElement()
|
|
16
|
+
|
|
17
|
+
expect(element.type).toBe('span')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should render an anchor with correct href when homeHref', () => {
|
|
21
|
+
const render = shallow(<ButtonCozyHome homeHref={homeHref} />)
|
|
22
|
+
const element = render.getElement()
|
|
23
|
+
|
|
24
|
+
expect(element.type).toBe('a')
|
|
25
|
+
expect(element.props.href).toBe(homeHref)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('should render a button when webviewContext', () => {
|
|
29
|
+
const render = shallow(<ButtonCozyHome webviewContext={webviewContext} />)
|
|
30
|
+
const element = render.getElement()
|
|
31
|
+
|
|
32
|
+
expect(element.type).toBe('button')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('should give priority to button if both webviewContext and homeHref are present', () => {
|
|
36
|
+
const render = shallow(
|
|
37
|
+
<ButtonCozyHome homeHref={homeHref} webviewContext={webviewContext} />
|
|
38
|
+
)
|
|
39
|
+
const element = render.getElement()
|
|
40
|
+
|
|
41
|
+
expect(element.type).toBe('button')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('should call the correct context method on click', () => {
|
|
45
|
+
const render = shallow(
|
|
46
|
+
<ButtonCozyHome homeHref={homeHref} webviewContext={webviewContext} />
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
render.simulate('click')
|
|
50
|
+
|
|
51
|
+
expect(webviewContext.call).toBeCalledWith(expectedCall)
|
|
52
|
+
})
|
|
53
|
+
})
|
|
@@ -19,6 +19,7 @@ import { translate } from "cozy-ui/transpiled/react/I18n";
|
|
|
19
19
|
import Icon from "cozy-ui/transpiled/react/Icon";
|
|
20
20
|
import { shouldEnableTracking, getTracker, configureTracker } from "cozy-ui/transpiled/react/helpers/tracker";
|
|
21
21
|
import { isMobileApp } from 'cozy-device-helper';
|
|
22
|
+
import { ButtonCozyHome } from "./Apps/ButtonCozyHome";
|
|
22
23
|
import Banner from "./Banner";
|
|
23
24
|
import Drawer from "./Drawer";
|
|
24
25
|
import Settings from "./Settings";
|
|
@@ -26,7 +27,7 @@ import Apps from "./Apps";
|
|
|
26
27
|
import SearchBar from "./SearchBar";
|
|
27
28
|
import Claudy from "./Claudy";
|
|
28
29
|
import SupportModal from "./SupportModal";
|
|
29
|
-
import { getTheme, hasFetched, getContent, isCurrentApp, fetchApps as _fetchApps, fetchContext as _fetchContext, fetchSettingsData as _fetchSettingsData, shouldEnableClaudy } from "../lib/reducers";
|
|
30
|
+
import { getTheme, hasFetched, getContent, isCurrentApp, fetchApps as _fetchApps, fetchContext as _fetchContext, fetchSettingsData as _fetchSettingsData, shouldEnableClaudy, getWebviewContext } from "../lib/reducers";
|
|
30
31
|
/* Generated with node_modules/.bin/svgr src/assets/sprites/icon-apps.svg */
|
|
31
32
|
|
|
32
33
|
function SvgIconApps(props) {
|
|
@@ -102,7 +103,15 @@ export var Bar = /*#__PURE__*/function (_Component) {
|
|
|
102
103
|
_defineProperty(_assertThisInitialized(_this), "renderLeft", function () {
|
|
103
104
|
var _this$props = _this.props,
|
|
104
105
|
t = _this$props.t,
|
|
105
|
-
isPublic = _this$props.isPublic
|
|
106
|
+
isPublic = _this$props.isPublic,
|
|
107
|
+
webviewContext = _this$props.webviewContext;
|
|
108
|
+
|
|
109
|
+
if (webviewContext) {
|
|
110
|
+
return /*#__PURE__*/React.createElement(ButtonCozyHome, {
|
|
111
|
+
webviewContext: webviewContext
|
|
112
|
+
});
|
|
113
|
+
} // data-tutorial attribute allows to be targeted in an application tutorial
|
|
114
|
+
|
|
106
115
|
|
|
107
116
|
return !isPublic ? /*#__PURE__*/React.createElement("button", {
|
|
108
117
|
type: "button",
|
|
@@ -174,7 +183,7 @@ export var Bar = /*#__PURE__*/function (_Component) {
|
|
|
174
183
|
}, {
|
|
175
184
|
key: "initPiwikTracker",
|
|
176
185
|
value: function initPiwikTracker() {
|
|
177
|
-
var trackerInstance = getTracker("\"https://
|
|
186
|
+
var trackerInstance = getTracker("\"https://matomo.cozycloud.cc\"", 8, false, false);
|
|
178
187
|
configureTracker({
|
|
179
188
|
appDimensionId: 1,
|
|
180
189
|
app: 'Cozy Bar',
|
|
@@ -300,7 +309,8 @@ export var mapStateToProps = function mapStateToProps(state) {
|
|
|
300
309
|
slug: 'drive'
|
|
301
310
|
}),
|
|
302
311
|
claudyEnabled: shouldEnableClaudy(state),
|
|
303
|
-
hasFetchedApps: hasFetched(state)
|
|
312
|
+
hasFetchedApps: hasFetched(state),
|
|
313
|
+
webviewContext: getWebviewContext(state)
|
|
304
314
|
};
|
|
305
315
|
};
|
|
306
316
|
export var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { shallow } from 'enzyme'
|
|
3
|
-
import { isMobileApp } from 'cozy-device-helper'
|
|
3
|
+
import { isFlagshipApp, isMobileApp } from 'cozy-device-helper'
|
|
4
4
|
import toJson from 'enzyme-to-json'
|
|
5
5
|
import reducers from 'lib/reducers'
|
|
6
6
|
import CozyClient from 'cozy-client'
|
|
@@ -9,7 +9,8 @@ import { Bar, mapStateToProps, mapDispatchToProps } from './Bar'
|
|
|
9
9
|
|
|
10
10
|
jest.mock('cozy-device-helper', () => ({
|
|
11
11
|
...require.requireActual('cozy-device-helper'),
|
|
12
|
-
isMobileApp: jest.fn()
|
|
12
|
+
isMobileApp: jest.fn(),
|
|
13
|
+
isFlagshipApp: jest.fn()
|
|
13
14
|
}))
|
|
14
15
|
|
|
15
16
|
describe('Bar', () => {
|
|
@@ -32,6 +33,7 @@ describe('Bar', () => {
|
|
|
32
33
|
|
|
33
34
|
afterEach(() => {
|
|
34
35
|
Bar.prototype.fetchApps.mockRestore()
|
|
36
|
+
isFlagshipApp.mockClear()
|
|
35
37
|
})
|
|
36
38
|
|
|
37
39
|
it('should fetch data when mounted', () => {
|
package/transpiled/cozy-bar.css
CHANGED
|
@@ -416,11 +416,16 @@
|
|
|
416
416
|
}
|
|
417
417
|
|
|
418
418
|
[role=banner] .coz-nav-apps-btns-home {
|
|
419
|
-
width: 2rem;
|
|
420
419
|
height: 2rem;
|
|
421
420
|
margin-right: .75rem;
|
|
422
421
|
}
|
|
423
422
|
|
|
423
|
+
[role=banner] .coz-nav-apps-btns-home.--flagship {
|
|
424
|
+
background: none;
|
|
425
|
+
border: 0;
|
|
426
|
+
height: 100%;
|
|
427
|
+
}
|
|
428
|
+
|
|
424
429
|
[role=banner] .coz-nav-apps-btns-home-svg {
|
|
425
430
|
max-width: 2rem;
|
|
426
431
|
max-height: 2rem;
|
package/transpiled/index.js
CHANGED
|
@@ -240,6 +240,7 @@ var setBarCenter = proxiedAPI.setBarCenter,
|
|
|
240
240
|
BarRight = proxiedAPI.BarRight,
|
|
241
241
|
BarLeft = proxiedAPI.BarLeft,
|
|
242
242
|
BarSearch = proxiedAPI.BarSearch,
|
|
243
|
-
setTheme = proxiedAPI.setTheme
|
|
243
|
+
setTheme = proxiedAPI.setTheme,
|
|
244
|
+
setWebviewContext = proxiedAPI.setWebviewContext;
|
|
244
245
|
var version = "\"0.0.0-development\"";
|
|
245
|
-
export { init, version, setBarCenter, setBarLeft, setBarRight, setBarSearch, BarLeft, BarRight, BarCenter, BarSearch, setTheme, setLocale, updateAccessToken };
|
|
246
|
+
export { init, version, setBarCenter, setBarLeft, setBarRight, setBarSearch, BarLeft, BarRight, BarCenter, BarSearch, setTheme, setWebviewContext, setLocale, updateAccessToken };
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import CozyClient from 'cozy-client'
|
|
2
|
+
import jestFetchMock from 'jest-fetch-mock'
|
|
3
|
+
|
|
2
4
|
import * as cozyBar from './index'
|
|
3
5
|
|
|
4
6
|
describe('init', () => {
|
|
7
|
+
beforeAll(() => {
|
|
8
|
+
global.fetch = jestFetchMock
|
|
9
|
+
})
|
|
10
|
+
|
|
5
11
|
beforeEach(() => {
|
|
6
12
|
jest.spyOn(console, 'error')
|
|
7
13
|
const div = document.createElement('div')
|