UNPKG

@hackplan/polaris

Version:

Shopify’s product component library

68 lines (67 loc) 2.99 kB
import React from 'react'; import { MobileHamburgerMajorMonotone } from '@shopify/polaris-icons'; import { classNames } from '../../utilities/css'; import { getWidth } from '../../utilities/getWidth'; import { withAppProvider } from '../AppProvider'; import Icon from '../Icon'; import Image from '../Image'; import UnstyledLink from '../UnstyledLink'; import { SearchField, UserMenu, Search, Menu } from './components'; import styles from './TopBar.scss'; export class TopBar extends React.PureComponent { constructor() { super(...arguments); this.state = { focused: false, }; this.handleFocus = () => { this.setState({ focused: true }); }; this.handleBlur = () => { this.setState({ focused: false }); }; } render() { const { showNavigationToggle, userMenu, searchResults, searchField, secondaryMenu, searchResultsVisible, onNavigationToggle, onSearchResultsDismiss, contextControl, polaris: { intl, theme }, } = this.props; const logo = theme && theme.logo; const { focused } = this.state; const className = classNames(styles.NavigationIcon, focused && styles.focused); const navigationButtonMarkup = showNavigationToggle ? (<button type="button" className={className} onClick={onNavigationToggle} onFocus={this.handleFocus} onBlur={this.handleBlur} aria-label={intl.translate('Polaris.TopBar.toggleMenuLabel')}> <Icon source={MobileHamburgerMajorMonotone} color="white"/> </button>) : null; const width = getWidth(logo, 104); let contextMarkup; if (contextControl) { contextMarkup = (<div testID="ContextControl" className={styles.ContextControl}> {contextControl} </div>); } else if (logo) { contextMarkup = (<div className={styles.LogoContainer}> <UnstyledLink url={logo.url || ''} className={styles.LogoLink} style={{ width }}> <Image source={logo.topBarSource || ''} alt={logo.accessibilityLabel || ''} className={styles.Logo} style={{ width }}/> </UnstyledLink> </div>); } const searchResultsMarkup = searchResults && searchResultsVisible ? (<Search visible={searchResultsVisible} onDismiss={onSearchResultsDismiss}> {searchResults} </Search>) : null; const searchMarkup = searchField ? (<React.Fragment> {searchField} {searchResultsMarkup} </React.Fragment>) : null; return (<div className={styles.TopBar}> {navigationButtonMarkup} {contextMarkup} <div className={styles.Contents}> <div className={styles.SearchField}>{searchMarkup}</div> <div className={styles.SecondaryMenu}>{secondaryMenu}</div> {userMenu} </div> </div>); } } TopBar.UserMenu = UserMenu; TopBar.SearchField = SearchField; TopBar.Menu = Menu; export default withAppProvider()(TopBar);