Skip to content

Commit 6b83c99

Browse files
authored
Add functionality for renderBack on menus, and fix implementations of renderHeader and renderFooter (#70)
1 parent 3296621 commit 6b83c99

File tree

6 files changed

+99
-7
lines changed

6 files changed

+99
-7
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-storefront",
3-
"version": "7.11.2",
3+
"version": "7.12.0",
44
"description": "Build and deploy e-commerce progressive web apps (PWAs) in record time.",
55
"module": "./index.js",
66
"license": "Apache-2.0",

src/menu/Menu.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const Menu = React.memo(props => {
2424
onClose,
2525
renderFooter,
2626
renderHeader,
27+
renderBack,
2728
renderItem,
2829
renderItemContent,
2930
renderDrawer,
@@ -84,6 +85,7 @@ const Menu = React.memo(props => {
8485
goBack,
8586
renderFooter,
8687
renderHeader,
88+
renderBack,
8789
renderItem,
8890
renderItemContent,
8991
close: onClose,
@@ -170,6 +172,16 @@ Menu.propTypes = {
170172
*/
171173
renderFooter: PropTypes.func,
172174

175+
/**
176+
* A function to render a custom back navigation for menu cards. It is passed
177+
* an object with:
178+
*
179+
* - item: The menu item record being rendered
180+
*
181+
* The function should return a React element or fragment.
182+
*/
183+
renderBack: PropTypes.func,
184+
173185
/**
174186
* Set to true to display the menu
175187
*/

src/menu/MenuBack.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { ListItem, ListItemIcon, ListItemText } from '@material-ui/core'
55
import { ChevronLeft } from '@material-ui/icons'
66

77
export default function MenuBack({ goBack, item, backButtonProps }) {
8-
const { classes } = useContext(MenuContext)
8+
const { classes, renderBack } = useContext(MenuContext)
99

1010
return (
1111
<ListItem divider button onClick={goBack} {...backButtonProps}>
@@ -14,7 +14,11 @@ export default function MenuBack({ goBack, item, backButtonProps }) {
1414
</ListItemIcon>
1515
<ListItemText
1616
classes={{ root: classes.headerText }}
17-
primary={<div className={classes.headerText}>{item.text} </div>}
17+
primary={
18+
<div className={classes.headerText}>
19+
{typeof renderBack === 'function' ? renderBack(item) : item.text}
20+
</div>
21+
}
1822
/>
1923
</ListItem>
2024
)

src/menu/MenuFooter.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect, useContext } from 'react'
22
import makeStyles from '@material-ui/core/styles/makeStyles'
33
import PropTypes from 'prop-types'
44
import CmsSlot from '../CmsSlot'
5+
import MenuContext from './MenuContext'
56

67
export const styles = theme => ({
78
root: {
@@ -12,16 +13,21 @@ const useStyles = makeStyles(styles, { name: 'RSFMenuFooter' })
1213

1314
export default function MenuFooter({ classes, item }) {
1415
classes = useStyles({ classes })
16+
const { renderFooter } = useContext(MenuContext)
17+
18+
if (typeof renderFooter === 'function') {
19+
return <div className={classes.root}>{renderFooter(item)}</div>
20+
}
1521

1622
if (item.footer) {
1723
return (
1824
<div className={classes.root}>
1925
<CmsSlot>{item.footer}</CmsSlot>
2026
</div>
2127
)
22-
} else {
23-
return null
2428
}
29+
30+
return null
2531
}
2632

2733
MenuFooter.propTypes = {

src/menu/MenuHeader.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect, useContext } from 'react'
22
import makeStyles from '@material-ui/core/styles/makeStyles'
33
import PropTypes from 'prop-types'
44
import CmsSlot from '../CmsSlot'
5+
import MenuContext from './MenuContext'
56

67
export const styles = theme => ({
78
root: {
@@ -13,16 +14,21 @@ const useStyles = makeStyles(styles, { name: 'RSFMenuHeader' })
1314

1415
export default function MenuHeader({ classes, item }) {
1516
classes = useStyles({ classes })
17+
const { renderHeader } = useContext(MenuContext)
18+
19+
if (typeof renderHeader === 'function') {
20+
return <div className={classes.root}>{renderHeader(item)}</div>
21+
}
1622

1723
if (item.header) {
1824
return (
1925
<div className={classes.root}>
2026
<CmsSlot>{item.header}</CmsSlot>
2127
</div>
2228
)
23-
} else {
24-
return null
2529
}
30+
31+
return null
2632
}
2733

2834
MenuHeader.propTypes = {

test/menu/Menu.test.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,19 @@ describe('Menu', () => {
3434
expect(wrapper.find(MenuFooter).length).toBe(1)
3535
})
3636

37+
it('should render custom footer', () => {
38+
wrapper = mount(
39+
<Menu
40+
root={{
41+
text: 'root',
42+
items: [{ text: 'item1', href: '/item1', as: '/item1', items: [] }],
43+
}}
44+
renderFooter={item => `${item.text} footer`}
45+
/>,
46+
)
47+
expect(wrapper.find(MenuFooter).text()).toBe('root footer')
48+
})
49+
3750
it('should render header', () => {
3851
wrapper = mount(
3952
<Menu
@@ -47,6 +60,19 @@ describe('Menu', () => {
4760
expect(wrapper.find(MenuHeader).length).toBe(1)
4861
})
4962

63+
it('should render custom header', () => {
64+
wrapper = mount(
65+
<Menu
66+
root={{
67+
text: 'root',
68+
items: [{ text: 'item1', href: '/item1', as: '/item1', items: [] }],
69+
}}
70+
renderHeader={item => `${item.text} header`}
71+
/>,
72+
)
73+
expect(wrapper.find(MenuHeader).text()).toBe('root header')
74+
})
75+
5076
it('should navigate to submenu', () => {
5177
wrapper = mount(
5278
<Menu
@@ -198,4 +224,42 @@ describe('Menu', () => {
198224
.simulate('click')
199225
expect(wrapper.find(ChevronLeft).length).toBe(1)
200226
})
227+
228+
it('should render custom text for back button in secondary menu', () => {
229+
wrapper = mount(
230+
<Menu
231+
open
232+
renderBack={() => 'Back'}
233+
root={{
234+
text: 'foo',
235+
items: [
236+
{
237+
text: 'foo',
238+
href: '/foo',
239+
as: '/foo',
240+
items: [
241+
{
242+
text: 'bar',
243+
href: '/bar',
244+
as: '/bar',
245+
items: [
246+
{
247+
text: 'foo3',
248+
href: '/foo3',
249+
as: '/foo3',
250+
},
251+
],
252+
},
253+
],
254+
},
255+
],
256+
}}
257+
/>,
258+
)
259+
wrapper
260+
.find(ListItem)
261+
.at(0)
262+
.simulate('click')
263+
expect(wrapper.find(MenuBack).text()).toBe('Back')
264+
})
201265
})

0 commit comments

Comments
 (0)