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 = (
{newNotice.extra}
);
}
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 (
{
changeReadState(item.id);
}}
onClear={(title, key) => clearReadState(title, key)}
loading={false}
clearText="清空"
viewMoreText="查看更多"
onViewMore={() => message.info("Click on view more")}
clearClose
>
);
};
export default NoticeIconView;