import { useCallback, useEffect, useState } from 'react' import { Tag, message } from 'antd' import { groupBy } from 'lodash-es' import { useModel, history } from 'umi' import NoticeIcon from './NoticeIcon' import styles from './index.less' import dayjs from 'dayjs' import { queryNoticeList, updateNotice } from '@/services/login' import consts from '@/consts' import { useModal } from '@/components/ModalStore' export type GlobalHeaderRightProps = { fetchingNotices?: boolean onNoticeVisibleChange?: (visible: boolean) => void onNoticeClear?: (tabName?: string) => void } const getNoticeData = notices => { if (!notices || notices.length === 0 || !Array.isArray(notices)) { return {} } const newNotices = notices.map(notice => { const newNotice = { ...notice } if (newNotice.datetime) { newNotice.createTime = dayjs(notice.datetime as string).diff(dayjs(), 'date') } 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} ) as any } return newNotice }) return groupBy(newNotices, 'msgType') } const getUnreadData = (noticeData: Record) => { const unreadMsg: Record = {} Object.keys(noticeData).forEach(key => { const value = noticeData[key] if (!unreadMsg[key]) { unreadMsg[key] = 0 } if (Array.isArray(value)) { unreadMsg[key] = value.filter(item => !item.read).length } }) return unreadMsg } const NoticeIconView = () => { const { initialState, setInitialState } = useModel('@@initialState') const { currentUser } = initialState || {} const [notices, setNotices] = useState([]) const dispatchModal = useModal() const getNotices = useCallback(async () => { const { code = -1, data } = await queryNoticeList({ current: 1, pageSize: 50 }) if (code === consts.RET_CODE.SUCCESS) { setNotices(data.message) } }, []) useEffect(() => { getNotices() }, []) const noticeData = getNoticeData(notices) const unreadMsg = getUnreadData(noticeData || {}) const changeReadState = async item => { if (item.isRead) return const { code = -1 } = await updateNotice({ ids: [item.id] }) if (code === consts.RET_CODE.SUCCESS) { setNotices( notices.map(i => { const notice = { ...i } if (notice.id === item.id) { notice.isRead = true } return notice }) ) setInitialState({ ...initialState, currentUser: { ...currentUser, unreadCount: currentUser.unreadCount - 1 } }) } dispatchModal('D_NOTICE_DETAIL', { item }) } const clearReadState = async (title: string, key: string) => { if (initialState?.currentUser?.[`${title}HasClear`]) return const ids = [] setNotices( notices.map(item => { const notice = { ...item } if (notice.msgType === key) { notice.isRead = true ids.push(item.id) } return notice }) ) const { code = -1 } = await updateNotice({ ids }) if (code === consts.RET_CODE.SUCCESS) { message.success(`${'清空了'} ${title}`) setInitialState({ ...initialState, currentUser: { ...currentUser, unreadCount: currentUser.unreadCount - ids.length, [`${title}HasClear`]: true } }) } } return ( { changeReadState(item) }} onClear={(title: string, key: string) => clearReadState(title, key)} loading={false} clearText="清空" viewMoreText="查看更多" onViewMore={() => history.push('/hr/notification')} clearClose > {/* */} ) } export default NoticeIconView