|
| 1 | +import React, { forwardRef } from 'react'; |
| 2 | + |
| 3 | +import { |
| 4 | + CompoundComponent, |
| 5 | + filterChildren, |
| 6 | + findChild, |
| 7 | +} from '@leafygreen-ui/compound-component'; |
| 8 | +import LeafyGreenProvider, { |
| 9 | + useDarkMode, |
| 10 | +} from '@leafygreen-ui/leafygreen-provider'; |
| 11 | + |
| 12 | +import { getContainerStyles } from './ChatSideNav.styles'; |
| 13 | +import { |
| 14 | + type ChatSideNavProps, |
| 15 | + ChatSideNavSubcomponentProperty, |
| 16 | +} from './ChatSideNav.types'; |
| 17 | +import { ChatSideNavContent } from './ChatSideNavContent'; |
| 18 | +import { ChatSideNavFooter } from './ChatSideNavFooter'; |
| 19 | +import { ChatSideNavHeader } from './ChatSideNavHeader'; |
| 20 | + |
| 21 | +export const ChatSideNav = CompoundComponent( |
| 22 | + forwardRef<HTMLElement, ChatSideNavProps>( |
| 23 | + ({ children, className, darkMode: darkModeProp, ...rest }, ref) => { |
| 24 | + const { darkMode, theme } = useDarkMode(darkModeProp); |
| 25 | + // Find subcomponents |
| 26 | + const header = findChild( |
| 27 | + children, |
| 28 | + ChatSideNavSubcomponentProperty.Header, |
| 29 | + ); |
| 30 | + const content = findChild( |
| 31 | + children, |
| 32 | + ChatSideNavSubcomponentProperty.Content, |
| 33 | + ); |
| 34 | + |
| 35 | + // Filter out subcomponents from remaining children |
| 36 | + const remainingChildren = filterChildren( |
| 37 | + children, |
| 38 | + Object.values(ChatSideNavSubcomponentProperty), |
| 39 | + ); |
| 40 | + |
| 41 | + return ( |
| 42 | + <LeafyGreenProvider darkMode={darkMode}> |
| 43 | + <nav |
| 44 | + ref={ref} |
| 45 | + className={getContainerStyles({ className, theme })} |
| 46 | + aria-label="Side navigation" |
| 47 | + {...rest} |
| 48 | + > |
| 49 | + {header} |
| 50 | + {content} |
| 51 | + {remainingChildren} |
| 52 | + <ChatSideNavFooter /> |
| 53 | + </nav> |
| 54 | + </LeafyGreenProvider> |
| 55 | + ); |
| 56 | + }, |
| 57 | + ), |
| 58 | + { |
| 59 | + displayName: 'ChatSideNav', |
| 60 | + Header: ChatSideNavHeader, |
| 61 | + Content: ChatSideNavContent, |
| 62 | + }, |
| 63 | +); |
0 commit comments