import React from 'react'; import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router'; import enquire from 'enquire.js'; import debounce from 'lodash.debounce'; import classNames from 'classnames'; import { Select, Menu, Row, Col, Icon, Button } from 'antd'; const Option = Select.Option; export default class Header extends React.Component { static contextTypes = { router: React.PropTypes.object.isRequired, intl: React.PropTypes.object.isRequired, } constructor(props) { super(props); this.onScroll = debounce(() => { const scrollTop = document.body.scrollTop || document.documentElement.scrollTop; const clientHeight = document.documentElement.clientHeight; if (scrollTop >= clientHeight) { this.setState({ isFirstFrame: false }); } else { this.setState({ isFirstFrame: true }); } }, 100); this.onDocumentClick = (e) => { if (document.querySelector('#header .nav').contains(e.target)) { return; } this.setState({ menuVisible: false, }); }; this.state = { menuVisible: false, menuMode: 'horizontal', isFirstFrame: true, }; } componentDidMount() { window.addEventListener('scroll', this.onScroll); document.addEventListener('click', this.onDocumentClick); document.addEventListener('touchstart', this.onDocumentClick); enquire.register('only screen and (min-width: 320px) and (max-width: 767px)', { match: () => { this.setState({ menuMode: 'inline' }); }, unmatch: () => { this.setState({ menuMode: 'horizontal' }); }, }); } componentWillUnmount() { window.removeEventListener('scroll', this.onScroll); document.removeEventListener('click', this.onDocumentClick); document.removeEventListener('touchstart', this.onDocumentClick); } handleMenuIconClick = (e) => { e.stopPropagation(); e.nativeEvent.stopImmediatePropagation(); this.setState({ menuVisible: true, }); } handleSearch = (value) => { this.context.router.push({ pathname: `${value}/` }); } handleSelectFilter = (value, option) => { return option.props['data-label'].indexOf(value.toLowerCase()) > -1; } handleLangChange = () => { if (typeof localStorage !== 'undefined') { const locale = this.context.intl.locale === 'zh-CN' ? 'en-US' : 'zh-CN'; localStorage.setItem('locale', locale); location.reload(); } } render() { const { location, picked } = this.props; const components = picked.components; const module = location.pathname.replace(/\/$/, '') .split('/').slice(0, -1) .join('/'); let activeMenuItem = module || 'home'; if (activeMenuItem === 'components' || location.pathname === 'changelog') { activeMenuItem = 'docs/react'; } const options = components .map(({ meta }) => { const pathSnippet = meta.filename.split('/')[1]; const url = `/components/${pathSnippet}`; return ( ); }); const headerClassName = classNames({ clearfix: true, 'home-nav-white': !this.state.isFirstFrame, }); const searchPlaceholder = this.context.intl.locale === 'zh-CN' ? '搜索组件...' : 'Search...'; return ( ); } }