import React, { FunctionComponent } from 'react'; import { css, SerializedStyles } from '@emotion/core'; import { Text } from '@rebass/emotion'; import { Link } from 'gatsby'; import { URLService } from 'lib'; import { NavigationItemProps } from './NavigationItem.types'; import { colors } from 'utils/theme'; import { HEADER } from 'utils/constants/layouts-names'; // Config layout styles. import * as DefaultStyles from './styles/NavigationItem.Default.styles'; import * as BegoniaFixedStyles from './styles/begonia/navgiation-item-begonia-fixed.styles'; import * as BegoniaFloatingStyles from './styles/begonia/navgiation-item-begonia-floating.styles'; import * as CosmosDefaultStyles from './styles/cosmos/navigation-item-cosmos-default.styles'; import { getTheme } from 'utils/styles/style-config-factory'; interface ItemCssProps { normal: SerializedStyles; active: SerializedStyles; } const renderLink = ({ label, slug }: NavigationItemProps, itemCss: any): JSX.Element|null => { return slug ? ( {label} ) : null; } const renderText = ({ label, onClick }: NavigationItemProps, itemCss: any): JSX.Element => { return ( {label} ); } const NavigationItem: FunctionComponent = (props): JSX.Element => { const { slug, position, headerLayoutOption } = props; const Styles = getTheme({ default: DefaultStyles, layoutThemes: [ {layoutId: HEADER.BEGONIA_FIXED, theme: BegoniaFixedStyles}, {layoutId: HEADER.BEGONIA_FLOATING, theme: BegoniaFloatingStyles}, {layoutId: HEADER.COSMOS_DEFAULT, theme: CosmosDefaultStyles} ] }, headerLayoutOption); const itemCss = getCssProps(position, Styles); const isActivePath = slug && (typeof window !== 'undefined') && URLService.isActivePath(window, slug); const linkContent = slug ? renderLink(props, isActivePath ? itemCss.active : itemCss.normal) : renderText(props, itemCss); return ( {linkContent} ); }; const getNormalStyle = (position: string, styles: any) => { switch (position) { case 'top': return styles.NavigationItemLinkTop; case 'left': return styles.NavigationItemLinkLeft; case 'mobile': return styles.NavigationItemLinkMobile; default: return styles.NavigationItemLinkTop; } }; const getActiveStyle = (position: string, styles: any) => { switch (position) { case 'top': return styles.NavigationItemLinkTopActive; case 'left': return styles.NavigationItemLinkLeftActive; case 'mobile': return styles.NavigationItemLinkMobileActive; default: return styles.NavigationItemLinkTopActive; } }; const getCssProps = (position: string, styles: any): ItemCssProps => ({ normal: getNormalStyle(position, styles), active: getActiveStyle(position, styles) }); NavigationItem.defaultProps = { textColor: colors.textDark }; export default NavigationItem;