index.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import React, { PureComponent } from 'react';
  2. import { Menu, Icon, Spin, Tag, Dropdown, Avatar, Divider } from 'antd';
  3. import moment from 'moment';
  4. import groupBy from 'lodash/groupBy';
  5. import Debounce from 'lodash-decorators/debounce';
  6. import { Link } from 'dva/router';
  7. import NoticeIcon from '../NoticeIcon';
  8. import HeaderSearch from '../HeaderSearch';
  9. import styles from './index.less';
  10. export default class GlobalHeader extends PureComponent {
  11. componentWillUnmount() {
  12. this.triggerResizeEvent.cancel();
  13. }
  14. getNoticeData() {
  15. const { notices = [] } = this.props;
  16. if (notices.length === 0) {
  17. return {};
  18. }
  19. const newNotices = notices.map((notice) => {
  20. const newNotice = { ...notice };
  21. if (newNotice.datetime) {
  22. newNotice.datetime = moment(notice.datetime).fromNow();
  23. }
  24. // transform id to item key
  25. if (newNotice.id) {
  26. newNotice.key = newNotice.id;
  27. }
  28. if (newNotice.extra && newNotice.status) {
  29. const color = ({
  30. todo: '',
  31. processing: 'blue',
  32. urgent: 'red',
  33. doing: 'gold',
  34. })[newNotice.status];
  35. newNotice.extra = <Tag color={color} style={{ marginRight: 0 }}>{newNotice.extra}</Tag>;
  36. }
  37. return newNotice;
  38. });
  39. return groupBy(newNotices, 'type');
  40. }
  41. toggle = () => {
  42. const { collapsed, onCollapse } = this.props;
  43. onCollapse(!collapsed);
  44. this.triggerResizeEvent();
  45. }
  46. @Debounce(600)
  47. triggerResizeEvent() { // eslint-disable-line
  48. const event = document.createEvent('HTMLEvents');
  49. event.initEvent('resize', true, false);
  50. window.dispatchEvent(event);
  51. }
  52. render() {
  53. const {
  54. currentUser, collapsed, fetchingNotices, isMobile, logo,
  55. onNoticeVisibleChange, onMenuClick, onNoticeClear,
  56. } = this.props;
  57. const menu = (
  58. <Menu className={styles.menu} selectedKeys={[]} onClick={onMenuClick}>
  59. <Menu.Item disabled><Icon type="user" />个人中心</Menu.Item>
  60. <Menu.Item disabled><Icon type="setting" />设置</Menu.Item>
  61. <Menu.Item key="triggerError"><Icon type="close-circle" />触发报错</Menu.Item>
  62. <Menu.Divider />
  63. <Menu.Item key="logout"><Icon type="logout" />退出登录</Menu.Item>
  64. </Menu>
  65. );
  66. const noticeData = this.getNoticeData();
  67. return (
  68. <div className={styles.header}>
  69. {isMobile && (
  70. [
  71. (
  72. <Link to="/" className={styles.logo} key="logo">
  73. <img src={logo} alt="logo" width="32" />
  74. </Link>
  75. ),
  76. <Divider type="vertical" key="line" />,
  77. ]
  78. )}
  79. <Icon
  80. className={styles.trigger}
  81. type={collapsed ? 'menu-unfold' : 'menu-fold'}
  82. onClick={this.toggle}
  83. />
  84. <div className={styles.right}>
  85. <HeaderSearch
  86. className={`${styles.action} ${styles.search}`}
  87. placeholder="站内搜索"
  88. dataSource={['搜索提示一', '搜索提示二', '搜索提示三']}
  89. onSearch={(value) => {
  90. console.log('input', value); // eslint-disable-line
  91. }}
  92. onPressEnter={(value) => {
  93. console.log('enter', value); // eslint-disable-line
  94. }}
  95. />
  96. <NoticeIcon
  97. className={styles.action}
  98. count={currentUser.notifyCount}
  99. onItemClick={(item, tabProps) => {
  100. console.log(item, tabProps); // eslint-disable-line
  101. }}
  102. onClear={onNoticeClear}
  103. onPopupVisibleChange={onNoticeVisibleChange}
  104. loading={fetchingNotices}
  105. popupAlign={{ offset: [20, -16] }}
  106. >
  107. <NoticeIcon.Tab
  108. list={noticeData['通知']}
  109. title="通知"
  110. emptyText="你已查看所有通知"
  111. emptyImage="https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg"
  112. />
  113. <NoticeIcon.Tab
  114. list={noticeData['消息']}
  115. title="消息"
  116. emptyText="您已读完所有消息"
  117. emptyImage="https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg"
  118. />
  119. <NoticeIcon.Tab
  120. list={noticeData['待办']}
  121. title="待办"
  122. emptyText="你已完成所有待办"
  123. emptyImage="https://gw.alipayobjects.com/zos/rmsportal/HsIsxMZiWKrNUavQUXqx.svg"
  124. />
  125. </NoticeIcon>
  126. {currentUser.name ? (
  127. <Dropdown overlay={menu}>
  128. <span className={`${styles.action} ${styles.account}`}>
  129. <Avatar size="small" className={styles.avatar} src={currentUser.avatar} />
  130. <span className={styles.name}>{currentUser.name}</span>
  131. </span>
  132. </Dropdown>
  133. ) : <Spin size="small" style={{ marginLeft: 8 }} />}
  134. </div>
  135. </div>
  136. );
  137. }
  138. }