import { useEffect, useState } from "react"; import { Tag, message } from "antd"; import { groupBy } from "lodash"; import moment from "moment"; import { useModel, useRequest } from "umi"; import { getNotices } from "@/services/ant-design-pro/api"; import NoticeIcon from "./NoticeIcon"; import styles from "./index.less"; const getNoticeData = (notices) => { if (!notices || notices.length === 0 || !Array.isArray(notices)) { return {}; } const newNotices = notices.map((notice) => { const newNotice = { ...notice }; if (newNotice.datetime) { newNotice.datetime = moment(notice.datetime).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 = ( <Tag color={color} style={{ marginRight: 0, }} > {newNotice.extra} </Tag> ); } return newNotice; }); return groupBy(newNotices, "type"); }; const getUnreadData = (noticeData) => { const unreadMsg = {}; 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 } = useModel("@@initialState"); const { currentUser } = initialState || {}; const [notices, setNotices] = useState([]); const { data } = useRequest(getNotices); useEffect(() => { setNotices(data || []); }, [data]); const noticeData = getNoticeData(notices); const unreadMsg = getUnreadData(noticeData || {}); const changeReadState = (id) => { setNotices( notices.map((item) => { const notice = { ...item }; if (notice.id === id) { notice.read = true; } return notice; }) ); }; const clearReadState = (title, key) => { setNotices( notices.map((item) => { const notice = { ...item }; if (notice.type === key) { notice.read = true; } return notice; }) ); message.success(`${"清空了"} ${title}`); }; return ( <NoticeIcon className={styles.action} count={currentUser && currentUser.unreadCount} onItemClick={(item) => { changeReadState(item.id); }} onClear={(title, key) => clearReadState(title, key)} loading={false} clearText="清空" viewMoreText="查看更多" onViewMore={() => message.info("Click on view more")} clearClose > <NoticeIcon.Tab tabKey="notification" count={unreadMsg.notification} list={noticeData.notification} title="通知" emptyText="你已查看所有通知" showViewMore /> <NoticeIcon.Tab tabKey="message" count={unreadMsg.message} list={noticeData.message} title="消息" emptyText="您已读完所有消息" showViewMore /> <NoticeIcon.Tab tabKey="event" title="待办" emptyText="你已完成所有待办" count={unreadMsg.event} list={noticeData.event} showViewMore /> </NoticeIcon> ); }; export default NoticeIconView;