Skip to content

Commit 439c77a

Browse files
author
Luke Pearson
authored
Merge pull request #57 from simonireilly/issue/56-nav-bar-refactor
Decompose Components into smaller functional components
2 parents 86947c5 + 2ed7e3f commit 439c77a

File tree

7 files changed

+146
-2
lines changed

7 files changed

+146
-2
lines changed

src/components/header/Header.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ import HeaderContext, { IHeaderContext } from './HeaderContext';
66
import Search from './components/Search';
77
import Nav from './components/Nav';
88
import NavItem from './components/NavItem';
9+
import NavItemList from './components/NavItemList';
10+
import NavMenuClose from './components/NavMenuClose';
911
import { Container } from '../layout';
1012
import Content from './components/Content';
1113
import MenuToggle from './components/MenuToggle';
1214
import TransactionalServiceName from './components/TransactionalServiceName';
15+
import NavTitle from './components/NavTitle';
16+
import NavContainer from './components/NavContainer';
1317

1418
const BaseHeaderLogo: React.FC<OrganisationalLogoProps & NHSLogoNavProps> = props => {
1519
const { orgName } = useContext<IHeaderContext>(HeaderContext);
@@ -46,8 +50,16 @@ class Header extends PureComponent<HeaderProps, HeaderState> {
4650

4751
static Nav = Nav;
4852

53+
static NavTitle = NavTitle;
54+
55+
static NavContainer = NavContainer;
56+
57+
static NavItemList = NavItemList;
58+
4959
static NavItem = NavItem;
5060

61+
static NavMenuClose = NavMenuClose;
62+
5163
static Container = HeaderContainer;
5264

5365
static Content = Content;

src/components/header/components/MenuToggle.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { HTMLProps, useContext, useEffect, MouseEvent } from 'react';
2-
import HeaderContext, { IHeaderContext } from '../HeaderContext';
32
import classNames from 'classnames';
3+
import HeaderContext, { IHeaderContext } from '../HeaderContext';
44

55
export interface MenuToggleProps extends HTMLProps<HTMLButtonElement> {
66
type?: 'button' | 'submit' | 'reset';
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React, { HTMLProps, useContext } from 'react';
2+
import classNames from 'classnames';
3+
import { Container } from '../../layout';
4+
import HeaderContext, { IHeaderContext } from '../HeaderContext';
5+
6+
const NavContainer: React.FC<HTMLProps<HTMLDivElement>> = ({
7+
className,
8+
children,
9+
open,
10+
...rest
11+
}) => {
12+
const { menuOpen } = useContext<IHeaderContext>(HeaderContext);
13+
14+
return (
15+
<nav
16+
className={classNames(
17+
'nhsuk-header__navigation',
18+
{ 'js-show': open !== undefined ? open : menuOpen },
19+
className,
20+
)}
21+
{...rest}
22+
>
23+
<Container>
24+
{children}
25+
</Container>
26+
</nav>
27+
);
28+
};
29+
30+
export default NavContainer;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React, { HTMLProps } from 'react';
2+
import classNames from 'classnames';
3+
4+
const NavItemList: React.FC<HTMLProps<HTMLUListElement>> = ({
5+
children,
6+
className,
7+
...rest
8+
}) => (
9+
<ul
10+
className={classNames(
11+
'nhsuk-header__navigation-list',
12+
className,
13+
)}
14+
{...rest}
15+
>
16+
{children}
17+
</ul>
18+
);
19+
20+
export default NavItemList;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React, { HTMLProps, useContext } from 'react';
2+
import classNames from 'classnames';
3+
import { Close as CloseIcon } from '../../icons';
4+
import HeaderContext, { IHeaderContext } from '../HeaderContext';
5+
6+
const NavMenuClose: React.FC<HTMLProps<HTMLButtonElement>> = ({
7+
className,
8+
...rest
9+
}) => {
10+
const { toggleMenu } = useContext<IHeaderContext>(HeaderContext);
11+
12+
return (
13+
<button
14+
className={
15+
classNames(
16+
'nhsuk-header__navigation-close',
17+
className,
18+
)
19+
}
20+
{...rest}
21+
type="button"
22+
onClick={toggleMenu}
23+
>
24+
<CloseIcon />
25+
<span className="nhsuk-u-visually-hidden">Close menu</span>
26+
</button>
27+
);
28+
};
29+
30+
export default NavMenuClose;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React, { HTMLProps } from 'react';
2+
import classNames from 'classnames';
3+
4+
const NavTitle: React.FC<HTMLProps<HTMLParagraphElement>> = ({
5+
children,
6+
className,
7+
...rest
8+
}) => (
9+
<p
10+
className={classNames(
11+
'nhsuk-header__navigation-title',
12+
className,
13+
)}
14+
{...rest}
15+
>
16+
{children}
17+
</p>
18+
);
19+
20+
export default NavTitle;

stories/Header.stories.tsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,36 @@ stories
163163
</Header.Nav>
164164
</Header>
165165
);
166-
});
166+
})
167+
.add('Header with custom NavMenuClose and NavItemList component', () => (
168+
<Header
169+
orgName="Anytown Anyplace"
170+
orgSplit="Anywhere"
171+
orgDescriptor="NHS Foundation Trust"
172+
white
173+
>
174+
<Header.Container>
175+
<Header.Logo href="/" />
176+
<Header.Content>
177+
<Header.MenuToggle />
178+
<Header.Search />
179+
</Header.Content>
180+
</Header.Container>
181+
<Header.NavContainer>
182+
<Header.NavTitle>
183+
<span>Menu</span>
184+
<Header.NavMenuClose />
185+
</Header.NavTitle>
186+
<Header.NavItemList>
187+
<Header.NavItem href="/" mobileOnly>
188+
Home
189+
</Header.NavItem>
190+
<Header.NavItem href="/conditions">Health A-Z</Header.NavItem>
191+
<Header.NavItem href="/live-well">Live Well</Header.NavItem>
192+
<Header.NavItem href="/social-care-and-support">Care and support</Header.NavItem>
193+
<Header.NavItem href="/news">Health news</Header.NavItem>
194+
<Header.NavItem href="/service-search">Services near you</Header.NavItem>
195+
</Header.NavItemList>
196+
</Header.NavContainer>
197+
</Header>
198+
));

0 commit comments

Comments
 (0)