Skip to content

Commit

Permalink
chore: refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
Cayla Hamann committed Jun 22, 2020
1 parent ff4faea commit 17671e4
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 6 deletions.
49 changes: 43 additions & 6 deletions src/components/Navigation.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import cx from 'classnames';
import { BreadcrumbContext } from './BreadcrumbContext';
import FeatherIcon from './FeatherIcon';
import pages from '../data/sidenav.json';
import matchSearchString from '../utils/matchSearchString';

import styles from './Navigation.module.scss';

// recursively create navigation
const renderNav = (pages, depthLevel = 0) => {
const renderNav = (pages, searches, depthLevel = 0) => {
const crumbs = useContext(BreadcrumbContext).flatMap((x) => x.displayName);

const groupedPages = pages.reduce((groups, page) => {
Expand All @@ -28,15 +29,29 @@ const renderNav = (pages, depthLevel = 0) => {
)}
{pages.map((page) => {
const [isExpanded, setIsExpanded] = useState(
crumbs.length === depthLevel || crumbs.includes(page.displayName)
searches !== undefined ||
crumbs.includes(page.displayName) ||
crumbs.length === depthLevel
);

const isCurrentPage = crumbs[crumbs.length - 1] === page.displayName;

return (
<li
key={page.displayName}
data-depth={depthLevel}
className={cx({ [styles.isCurrentPage]: isCurrentPage })}
className={cx(
{ [styles.isCurrentPage]: isCurrentPage },
{
[styles.isNotSearch]:
searches && !searches.includes(page.displayName),
},
{
[styles.isSearch]:
searches && searches.includes(page.displayName),
},
{ [styles.isBeingSearched]: searches }
)}
>
{page.url ? (
<Link className={styles.navLink} to={page.url}>
Expand Down Expand Up @@ -65,7 +80,7 @@ const renderNav = (pages, depthLevel = 0) => {
[styles.isExpanded]: isExpanded,
})}
>
{renderNav(page.children, depthLevel + 1)}
{renderNav(page.children, searches, depthLevel + 1)}
</ul>
)}
</li>
Expand All @@ -75,20 +90,42 @@ const renderNav = (pages, depthLevel = 0) => {
));
};

const Navigation = ({ className }) => {
const searchPages = (pages, searchTerm, parent = []) => {
return [
...new Set(
pages.flatMap((page) => {
if (page.children) {
return searchPages(page.children, searchTerm, [
...parent,
page.displayName,
]);
} else if (matchSearchString(page.displayName, searchTerm)) {
return [...parent, page.displayName];
} else if (parent.some((el) => matchSearchString(el, searchTerm))) {
return [...parent];
}
})
),
];
};

const Navigation = ({ className, searchTerm }) => {
const searches =
searchTerm !== '' ? searchPages(pages, searchTerm) : undefined;
return (
<nav
className={cx(styles.container, className)}
role="navigation"
aria-label="Navigation"
>
<ul className={styles.listNav}>{renderNav(pages)}</ul>
<ul className={styles.listNav}>{renderNav(pages, searches)}</ul>
</nav>
);
};

Navigation.propTypes = {
className: PropTypes.string,
searchTerm: PropTypes.string,
};

export default Navigation;
14 changes: 14 additions & 0 deletions src/components/Navigation.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,17 @@ button.navLink {
.isCurrentPage {
font-weight: bold;
}

.isNotSearch {
display: none;
}

.isSearch {
display: block;
}

.isBeingSearched {
ul {
display: block;
}
}
5 changes: 5 additions & 0 deletions src/utils/matchSearchString.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const matchSearchString = (str, searchTerm) => {
return str.toLowerCase().includes(searchTerm.toLowerCase());
};

export default matchSearchString;

0 comments on commit 17671e4

Please sign in to comment.