import { ConnectProps, ConnectState } from '@/models/connect'; import { NoticeItem } from '@/models/global'; import { CurrentUser } from '@/models/user'; import React, { Component } from 'react'; import { Spin, Tag, Menu, Icon, Avatar, Tooltip, message } from 'antd'; import { ClickParam } from 'antd/lib/menu'; import { FormattedMessage, formatMessage } from 'umi-plugin-react/locale'; import moment from 'moment'; import groupBy from 'lodash/groupBy'; import NoticeIcon from '../NoticeIcon'; import HeaderSearch from '../HeaderSearch'; import HeaderDropdown from '../HeaderDropdown'; import SelectLang from '../SelectLang'; import styles from './index.less'; import { connect } from 'dva'; import router from 'umi/router'; export type SiderTheme = 'light' | 'dark'; export interface GlobalHeaderRightProps extends ConnectProps { notices?: NoticeItem[]; currentUser?: CurrentUser; fetchingNotices?: boolean; onNoticeVisibleChange?: (visible: boolean) => void; onMenuClick?: (param: ClickParam) => void; onNoticeClear?: (tabName?: string) => void; theme?: SiderTheme; } class GlobalHeaderRight extends Component { getNoticeData = (): { [key: string]: NoticeItem[] } => { const { notices = [] } = this.props; if (notices.length === 0) { return {}; } const newNotices = notices.map(notice => { const newNotice = { ...notice }; if (newNotice.datetime) { newNotice.datetime = moment(notice.datetime as string).fromNow(); } if (newNotice.id) { newNotice.key = newNotice.id; } if (newNotice.extra && newNotice.status) { const color = { todo: '', processing: 'blue', urgent: 'red', doing: 'gold', }[newNotice.status]; newNotice.extra = ( {newNotice.extra} ); } return newNotice; }); return groupBy(newNotices, 'type'); }; getUnreadData = (noticeData: { [key: string]: NoticeItem[] }) => { const unreadMsg: { [key: string]: number } = {}; Object.entries(noticeData).forEach(([key, value]) => { if (!unreadMsg[key]) { unreadMsg[key] = 0; } if (Array.isArray(value)) { unreadMsg[key] = value.filter(item => !item.read).length; } }); return unreadMsg; }; changeReadState = (clickedItem: NoticeItem) => { const { id } = clickedItem; const { dispatch } = this.props; dispatch!({ type: 'global/changeNoticeReadState', payload: id, }); }; componentDidMount() { const { dispatch } = this.props; dispatch!({ type: 'global/fetchNotices', }); } handleNoticeClear = (title: string, key: string) => { const { dispatch } = this.props; message.success(`${formatMessage({ id: 'component.noticeIcon.cleared' })} ${title}`); if (dispatch) { dispatch({ type: 'global/clearNotices', payload: key, }); } }; onMenuClick = (event: ClickParam) => { const { onMenuClick } = this.props; if (onMenuClick) { onMenuClick(event); return; } const { key } = event; if (key === 'logout') { const { dispatch } = this.props; dispatch!({ type: 'login/logout', }); return; } router.push(`/account/${key}`); }; render() { const { currentUser, fetchingNotices, onNoticeVisibleChange, theme } = this.props; const menu = ( ); const noticeData = this.getNoticeData(); const unreadMsg = this.getUnreadData(noticeData); let className = styles.right; if (theme === 'dark') { className = `${styles.right} ${styles.dark}`; } return (
{ console.log('input', value); // tslint:disable-line no-console }} onPressEnter={value => { console.log('enter', value); // tslint:disable-line no-console }} /> { this.changeReadState(item as NoticeItem); }} loading={fetchingNotices} clearText={formatMessage({ id: 'component.noticeIcon.clear' })} viewMoreText={formatMessage({ id: 'component.noticeIcon.view-more' })} onClear={this.handleNoticeClear} onPopupVisibleChange={onNoticeVisibleChange} onViewMore={() => message.info('Click on view more')} clearClose > {currentUser && currentUser.name ? ( {currentUser.name} ) : ( )}
); } } export default connect(({ user, global, loading }: ConnectState) => ({ currentUser: user.currentUser, collapsed: global.collapsed, fetchingMoreNotices: loading.effects['global/fetchMoreNotices'], fetchingNotices: loading.effects['global/fetchNotices'], notices: global.notices, }))(GlobalHeaderRight);