blob: 31d93632b7ec60894813961471673f194119fafa [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 { getLink } from '../../../utils';
import Menu from 'antd/lib/menu';
import 'antd/lib/menu/style/index.css';
import './index.scss';
const { SubMenu } = Menu;
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', 'dark']),
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 = {
current: props.currentKey,
menuBodyVisible: false,
language: props.language,
search: siteConfig.defaultSearch,
searchValue: '',
};
}
componentDidMount() {
const parts = window.location.pathname.split('/');
if (!parts[2] || parts[2] === 'index.html') {
this.setCurrent('home');
} else if (siteConfig[this.state.language].pageMenu.some(menu => menu.key === parts[2]) && (parts[2] !== 'docs' || parts[3] === 'latest')) {
if (parts[2] !== 'docs') {
this.setCurrent(parts[2]);
} else if (parts[3] === 'latest') {
this.setCurrent('docs0');
}
} else if (localStorage.getItem('currents')) {
this.setCurrent(localStorage.getItem('currents'));
}
}
componentWillReceiveProps(nextProps) {
this.setState({
language: nextProps.language,
});
}
setCurrent = (key) => {
localStorage.setItem('currents', key);
this.setState({
current: key,
});
}
handleClick = (e) => {
const key = e.key === 'docs' ? 'docs0' : e.key;
this.setCurrent(key);
}
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 } = this.props;
const { menuBodyVisible, language, search, searchVisible } = this.state;
const dataSource = siteConfig[language];
return (
<header
className={
classnames({
'header-container': true,
[`header-container-${type}`]: true,
})
}
>
<div
className={
classnames({
'meetup-container': true,
[`meetup-container-${type}`]: true,
})
}
>
<a href="https://www.meetup.com/dolphinscheduler/events/277413098/">
<p>{dataSource.meetup.text}</p>
</a>
</div>
<div className="header-body">
<a href={getLink(`/${language}/index.html`)}>
<img className="logo" alt={siteConfig.name} title={siteConfig.name} src={getLink(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 === 'normal' ? getLink('/img/system/menu_gray.png') : getLink('/img/system/menu_white.png')}
/>
<div>
<Menu className={type === 'normal' ? 'blackClass' : 'whiteClass'} onClick={this.handleClick} selectedKeys={[this.state.current]} mode="horizontal" forceSubMenuRender>
{siteConfig[language].pageMenu.map(item => (
item.children ?
<SubMenu
key={item.key}
className={this.state.current === item.key ? 'ant-menu-item-selected' : ''}
title={
<span className="submenu-title-wrapper">
<a href={getLink(item.link)} target={item.target || '_self'}>{item.text}</a>
<ul style={{ display: 'none' }}>
{item.children.map(items => (
<li key={items.key} ><a href={getLink(items.link)} target={items.target || '_self'}>{items.text}</a></li>
))}
</ul>
</span>
}
>
<Menu.ItemGroup>
{item.children.map(items => (
<Menu.Item key={items.key} ><a href={getLink(items.link)} target={items.target || '_self'}>{items.text}</a></Menu.Item>
))}
</Menu.ItemGroup>
</SubMenu> :
<Menu.Item key={item.key}>
<a href={getLink(item.link)} target={item.target || '_self'}>{item.text}</a>
</Menu.Item>
))}
</Menu>
</div>
</div>
</div>
</header>
);
}
}
Header.propTypes = propTypes;
Header.defaultProps = defaultProps;
export default Header;