import * as React from 'react' import Menu from 'semantic-ui-react/dist/commonjs/collections/Menu' import { Mana } from '../Mana/Mana' import { Blockie } from '../Blockie/Blockie' import { Container } from '../Container/Container' import { Header } from '../Header/Header' import { Logo } from '../Logo/Logo' import { Mobile, NotMobile } from '../Media' import './Navbar.css' export type NavbarI18N = { menu: { marketplace: React.ReactNode docs: React.ReactNode events: React.ReactNode agora: React.ReactNode dao: React.ReactNode blog: React.ReactNode builder: React.ReactNode } account: { signIn: React.ReactNode connecting: React.ReactNode } } export type NavbarProps = { mana?: number address?: string activePage?: | 'marketplace' | 'docs' | 'events' | 'agora' | 'dao' | 'blog' | 'builder' | string leftMenu?: React.ReactNode middleMenu?: React.ReactNode rightMenu?: React.ReactNode i18n?: NavbarI18N isConnected?: boolean isConnecting?: boolean isSignIn?: boolean isFullscreen?: boolean isOverlay?: boolean className?: string onSignIn?: () => void onClickAccount?: () => void isFullWidth?: boolean } export type NavbarState = { toggle: boolean } export class Navbar extends React.PureComponent { static defaultProps: Partial = { mana: null, address: null, activePage: null, leftMenu: null, middleMenu: null, i18n: { menu: { marketplace: 'Marketplace', docs: 'Docs', events: 'Events', agora: 'Agora', dao: 'DAO', blog: 'Blog', builder: 'Builder' }, account: { signIn: 'Sign In', connecting: 'Connecting...' } }, isConnected: false, isConnecting: false, isFullscreen: false, isOverlay: false, isSignIn: false, onSignIn: null, onClickAccount: null, isFullWidth: false } public state = { toggle: false } componentDidMount(): void { document.addEventListener('click', this.handleDocumentClick) } componentWillUnmount(): void { document.removeEventListener('click', this.handleDocumentClick) } handleToggle = (event: React.MouseEvent): void => { this.setState({ toggle: !this.state.toggle }) event.stopPropagation() event.nativeEvent.stopImmediatePropagation() } handleDocumentClick = (): void => { this.setState({ toggle: false }) } renderLeftMenu(): React.ReactNode { const { activePage, i18n, leftMenu } = this.props if (leftMenu) { return leftMenu } return ( <> {i18n.menu.marketplace} {i18n.menu.builder} {i18n.menu.docs} {i18n.menu.events} {i18n.menu.dao} {i18n.menu.blog} ) } renderRightMenu(): React.ReactNode { const { rightMenu, middleMenu, isConnected, onClickAccount, mana, address, isConnecting, isSignIn, i18n, onSignIn } = this.props if (rightMenu) { return rightMenu } else if (isConnected) { return ( <> {middleMenu ? ( {middleMenu} ) : null} {mana != null ? ( {Number(mana.toFixed(2)).toLocaleString()} ) : null} {address != null ? : null} ) } else if (isConnecting && !isSignIn) { return ( {i18n.account.connecting} ) } else if (onSignIn || isSignIn) { return ( {i18n.account.signIn} ) } else { return null } } render(): JSX.Element { const { activePage, className, isSignIn, isFullscreen, isOverlay, isFullWidth } = this.props let classes = `dcl navbar` if (this.state.toggle) { classes += ' open' } if (isSignIn) { classes += ' sign-in' } if (isFullscreen) { classes += ' fullscreen' } if (isOverlay) { classes += ' overlay' } if (className) { classes += ` ${className}` } return (
{this.renderLeftMenu()}
{activePage}
{this.renderRightMenu()}
{this.renderLeftMenu()}
) } }