+ {showClear ? (
+
+ {clearText} {title}
+
+ ) : null}
+ {showViewMore ? (
+
{
+ if (onViewMore) {
+ onViewMore(e);
+ }
+ }}
+ >
+ {viewMoreText}
+
+ ) : null}
+
+
+ );
+};
+
+export default NoticeList;
diff --git a/code/app/src/components/NoticeIcon/index.less b/code/app/src/components/NoticeIcon/index.less
new file mode 100644
index 0000000..45251cd
--- /dev/null
+++ b/code/app/src/components/NoticeIcon/index.less
@@ -0,0 +1,35 @@
+@import '~antd/es/style/themes/default.less';
+
+.popover {
+ position: relative;
+ width: 336px;
+}
+
+.noticeButton {
+ display: inline-block;
+ cursor: pointer;
+ transition: all 0.3s;
+}
+.icon {
+ padding: 4px;
+ vertical-align: middle;
+}
+
+.badge {
+ font-size: 16px;
+}
+
+.tabs {
+ :global {
+ .ant-tabs-nav-list {
+ margin: auto;
+ }
+
+ .ant-tabs-nav-scroll {
+ text-align: center;
+ }
+ .ant-tabs-bar {
+ margin-bottom: 0;
+ }
+ }
+}
diff --git a/code/app/src/components/NoticeIcon/index.tsx b/code/app/src/components/NoticeIcon/index.tsx
new file mode 100644
index 0000000..b4d1176
--- /dev/null
+++ b/code/app/src/components/NoticeIcon/index.tsx
@@ -0,0 +1,153 @@
+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/api/api';
+
+import NoticeIcon from './NoticeIcon';
+import styles from './index.less';
+
+export type GlobalHeaderRightProps = {
+ fetchingNotices?: boolean;
+ onNoticeVisibleChange?: (visible: boolean) => void;
+ onNoticeClear?: (tabName?: string) => void;
+};
+
+const getNoticeData = (notices: API.NoticeIconItem[]): Record