diff --git a/packages/eui/src/components/side_nav/side_nav.tsx b/packages/eui/src/components/side_nav/side_nav.tsx index 33b34a49d3bc..413bfcb0367e 100644 --- a/packages/eui/src/components/side_nav/side_nav.tsx +++ b/packages/eui/src/components/side_nav/side_nav.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import React, { Component, ReactNode, MouseEventHandler } from 'react'; +import React, { ReactNode, MouseEventHandler } from 'react'; import classNames from 'classnames'; import { CommonProps, PropsOf } from '../common'; @@ -15,8 +15,7 @@ import { EuiI18n } from '../i18n'; import { EuiBreakpointSize, htmlIdGenerator, - withEuiTheme, - WithEuiThemeProps, + useEuiTheme, } from '../../services'; import { EuiHideFor, EuiShowFor } from '../responsive'; @@ -74,17 +73,12 @@ export type EuiSideNavProps = T & truncate?: boolean; }; -export class EuiSideNavClass extends Component< - EuiSideNavProps & WithEuiThemeProps -> { - generateId = htmlIdGenerator('euiSideNav'); +export const EuiSideNav = (props: EuiSideNavProps) => { + const theme = useEuiTheme(); - static defaultProps = { - items: [], - mobileBreakpoints: ['xs', 's'], - }; + const generateId = htmlIdGenerator('euiSideNav'); - isItemOpen = (item: EuiSideNavItemType) => { + const isItemOpen = (item: EuiSideNavItemType) => { // The developer can force the item to be open. if (item.forceOpen) { return true; @@ -97,14 +91,14 @@ export class EuiSideNavClass extends Component< // The item has to be open if it has a child that's open. if (item.items) { - return item.items.some(this.isItemOpen); + return item.items.some(isItemOpen); } return false; }; - renderTree = (items: Array>, depth = 0) => { - const { renderItem, truncate } = this.props; + const renderTree = (items: Array>, depth = 0) => { + const { renderItem, truncate } = props; return items.map((item) => { const { @@ -120,12 +114,12 @@ export class EuiSideNavClass extends Component< } = item; // Root items are always open. - const isOpen = depth === 0 ? true : this.isItemOpen(item); + const isOpen = depth === 0 ? true : isItemOpen(item); let renderedItems; if (childItems) { - renderedItems = this.renderTree(childItems, depth + 1); + renderedItems = renderTree(childItems, depth + 1); } // Act as an accordion only if item is not linked but has children (and not the root) @@ -155,113 +149,108 @@ export class EuiSideNavClass extends Component< }); }; - render() { - const { - className, - items, - toggleOpenOnMobile, - isOpenOnMobile, - mobileTitle, - mobileBreakpoints, - // Extract this one out so it isn't passed to