You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.1 KiB
154 lines
4.1 KiB
import React, { PureComponent } from 'react';
|
|
import { Layout, message } from 'antd';
|
|
import Animate from 'rc-animate';
|
|
import { connect } from 'dva';
|
|
import { routerRedux } from 'dva/router';
|
|
import GlobalHeader from '../components/GlobalHeader/index';
|
|
import TopNavHeader from '../components/TopNavHeader/index';
|
|
import styles from './Header.less';
|
|
import Authorized from '../utils/Authorized';
|
|
|
|
const { Header } = Layout;
|
|
|
|
class HeaderView extends PureComponent {
|
|
state = {
|
|
visible: true,
|
|
};
|
|
|
|
componentDidMount() {
|
|
document.addEventListener('scroll', this.handScroll, { passive: true });
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
document.removeEventListener('scroll', this.handScroll);
|
|
}
|
|
|
|
getHeadWidth = () => {
|
|
const { isMobile, collapsed, setting } = this.props;
|
|
const { fixedHeader, layout } = setting;
|
|
if (isMobile || !fixedHeader || layout === 'topmenu') {
|
|
return '100%';
|
|
}
|
|
return collapsed ? 'calc(100% - 80px)' : 'calc(100% - 256px)';
|
|
};
|
|
|
|
handleNoticeClear = type => {
|
|
message.success(`清空了${type}`);
|
|
const { dispatch } = this.props;
|
|
dispatch({
|
|
type: 'global/clearNotices',
|
|
payload: type,
|
|
});
|
|
};
|
|
|
|
handleMenuClick = ({ key }) => {
|
|
const { dispatch } = this.props;
|
|
if (key === 'userCenter') {
|
|
dispatch(routerRedux.push('/account/center'));
|
|
return;
|
|
}
|
|
if (key === 'triggerError') {
|
|
dispatch(routerRedux.push('/exception/trigger'));
|
|
return;
|
|
}
|
|
if (key === 'userinfo') {
|
|
dispatch(routerRedux.push('/account/settings/base'));
|
|
return;
|
|
}
|
|
if (key === 'logout') {
|
|
dispatch({
|
|
type: 'login/logout',
|
|
});
|
|
}
|
|
};
|
|
|
|
handleNoticeVisibleChange = visible => {
|
|
if (visible) {
|
|
const { dispatch } = this.props;
|
|
dispatch({
|
|
type: 'global/fetchNotices',
|
|
});
|
|
}
|
|
};
|
|
|
|
handScroll = e => {
|
|
const { autoHideHeader } = this.props;
|
|
const { visible } = this.state;
|
|
if (!autoHideHeader) {
|
|
return;
|
|
}
|
|
const scrollTop = document.body.scrollTop + document.documentElement.scrollTop;
|
|
if (!this.ticking) {
|
|
requestAnimationFrame(() => {
|
|
if (this.oldScrollTop > scrollTop) {
|
|
this.setState({
|
|
visible: true,
|
|
});
|
|
this.scrollTop = scrollTop;
|
|
return;
|
|
}
|
|
if (scrollTop > 400 && visible) {
|
|
this.setState({
|
|
visible: false,
|
|
});
|
|
}
|
|
if (scrollTop < 400 && !visible) {
|
|
this.setState({
|
|
visible: true,
|
|
});
|
|
}
|
|
this.oldScrollTop = scrollTop;
|
|
this.ticking = false;
|
|
return;
|
|
});
|
|
}
|
|
this.ticking = false;
|
|
};
|
|
|
|
render() {
|
|
const { isMobile, handleMenuCollapse, setting } = this.props;
|
|
const { silderTheme, layout, fixedHeader } = setting;
|
|
const { visible } = this.state;
|
|
const isTop = layout === 'topmenu';
|
|
const HeaderDom = visible ? (
|
|
<Header
|
|
style={{ padding: 0, width: this.getHeadWidth() }}
|
|
className={fixedHeader ? styles.fixedHeader : ''}
|
|
>
|
|
{isTop && !isMobile ? (
|
|
<TopNavHeader
|
|
theme={silderTheme}
|
|
mode="horizontal"
|
|
Authorized={Authorized}
|
|
onCollapse={handleMenuCollapse}
|
|
onNoticeClear={this.handleNoticeClear}
|
|
onMenuClick={this.handleMenuClick}
|
|
onNoticeVisibleChange={this.handleNoticeVisibleChange}
|
|
{...this.props}
|
|
/>
|
|
) : (
|
|
<GlobalHeader
|
|
onCollapse={handleMenuCollapse}
|
|
onNoticeClear={this.handleNoticeClear}
|
|
onMenuClick={this.handleMenuClick}
|
|
onNoticeVisibleChange={this.handleNoticeVisibleChange}
|
|
{...this.props}
|
|
/>
|
|
)}
|
|
</Header>
|
|
) : null;
|
|
return (
|
|
<Animate component="" transitionName="fade">
|
|
{HeaderDom}
|
|
</Animate>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default connect(({ user, global, setting, loading }) => ({
|
|
currentUser: user.currentUser,
|
|
collapsed: global.collapsed,
|
|
fetchingNotices: loading.effects['global/fetchNotices'],
|
|
notices: global.notices,
|
|
setting,
|
|
}))(HeaderView);
|
|
|