blob: 20df49d163f68febee37972e7be4771d54fd1c15 [file] [log] [blame]
import React from 'react';
import PropTypes from 'prop-types';
import classnames from 'classnames';
import { autobind } from 'core-decorators';
import siteConfig from '../../../site_config/site';
import './index.scss';
const languageSwitch = [
{
text: 'δΈ­',
value: 'en-us',
},
{
text: 'En',
value: 'zh-cn',
},
];
const searchSwitch = {
baidu: {
logo: 'https://img.alicdn.com/tfs/TB1n6DQayLaK1RjSZFxXXamPFXa-300-300.png',
url: 'https://www.baidu.com/s?wd=',
},
google: {
logo: 'https://img.alicdn.com/tfs/TB1REfuaCzqK1RjSZFjXXblCFXa-300-300.jpg',
url: 'https://www.google.com/search?q=',
},
};
const noop = () => {};
const propTypes = {
currentKey: PropTypes.string,
logo: PropTypes.string.isRequired,
type: PropTypes.oneOf(['primary', 'normal']),
language: PropTypes.oneOf(['en-us', 'zh-cn']),
onLanguageChange: PropTypes.func,
};
const defaultProps = {
type: 'primary',
language: 'en-us',
onLanguageChange: noop,
};
@autobind
class Header extends React.Component {
constructor(props) {
super(props);
this.state = {
menuBodyVisible: false,
language: props.language,
search: siteConfig.defaultSearch,
searchValue: '',
inputVisible: false,
};
}
componentWillReceiveProps(nextProps) {
this.setState({
language: nextProps.language,
});
}
toggleMenu() {
this.setState({
menuBodyVisible: !this.state.menuBodyVisible,
});
}
switchLang() {
let language;
if (this.state.language === 'zh-cn') {
language = 'en-us';
} else {
language = 'zh-cn';
}
this.setState({
language,
});
this.props.onLanguageChange(language);
}
switchSearch() {
let search;
if (this.state.search === 'baidu') {
search = 'google';
} else {
search = 'baidu';
}
this.setState({
search,
});
}
toggleSearch() {
this.setState({
searchVisible: !this.state.searchVisible,
});
}
onInputChange(e) {
this.setState({
searchValue: e.target.value,
});
}
goSearch() {
const { search, searchValue } = this.state;
window.open(`${searchSwitch[search].url}${window.encodeURIComponent(`${searchValue} site:${siteConfig.domain}`)}`);
}
onKeyDown(e) {
if (e.keyCode === 13) {
this.goSearch();
}
}
render() {
const { type, logo, onLanguageChange, currentKey } = this.props;
const { menuBodyVisible, language, search, searchVisible } = this.state;
return (
<header
className={
classnames({
'header-container': true,
[`header-container-${type}`]: true,
})
}
>
<div className="header-body">
<a href={`${window.rootPath}/${language}/index.html`}>
<img className="logo" alt={siteConfig.name} title={siteConfig.name} src={logo} />
</a>
{
siteConfig.defaultSearch ?
(
<div
className={classnames({
search: true,
[`search-${type}`]: true,
})}
>
<span className="icon-search" onClick={this.toggleSearch} />
{
searchVisible ?
(
<div className="search-input">
<img src={searchSwitch[search].logo} onClick={this.switchSearch} />
<input autoFocus onChange={this.onInputChange} onKeyDown={this.onKeyDown} />
</div>
) : null
}
</div>
) : null
}
{
onLanguageChange !== noop ?
(<span
className={
classnames({
'language-switch': true,
[`language-switch-${type}`]: true,
})
}
onClick={this.switchLang}
>
{languageSwitch.find(lang => lang.value === language).text}
</span>)
:
null
}
<div
className={
classnames({
'header-menu': true,
'header-menu-open': menuBodyVisible,
})
}
>
<img
className="header-menu-toggle"
onClick={this.toggleMenu}
src={type === 'primary' ? `${window.rootPath}/img/menu_white.png` : `${window.rootPath}/img/menu_gray.png`}
/>
<ul>
{siteConfig[language].pageMenu.map(item => (
<li
className={classnames({
'menu-item': true,
[`menu-item-${type}`]: true,
[`menu-item-${type}-active`]: currentKey === item.key,
})}
key={item.key}
>
<a href={`${window.rootPath}${item.link}`}>{item.text}</a>
</li>))}
</ul>
</div>
</div>
</header>
);
}
}
Header.propTypes = propTypes;
Header.defaultProps = defaultProps;
export default Header;