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