| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- import type { Reducer, Effect } from 'umi';
- import type { NoticeIconData } from '@/components/NoticeIcon';
- import { queryNotices } from '@/services/user';
- import type { ConnectState } from './connect.d';
- export type NoticeItem = {
- id: string;
- type: string;
- status: string;
- } & NoticeIconData;
- export type GlobalModelState = {
- collapsed: boolean;
- notices: NoticeItem[];
- };
- export type GlobalModelType = {
- namespace: 'global';
- state: GlobalModelState;
- effects: {
- fetchNotices: Effect;
- clearNotices: Effect;
- changeNoticeReadState: Effect;
- };
- reducers: {
- changeLayoutCollapsed: Reducer<GlobalModelState>;
- saveNotices: Reducer<GlobalModelState>;
- saveClearedNotices: Reducer<GlobalModelState>;
- };
- };
- const GlobalModel: GlobalModelType = {
- namespace: 'global',
- state: {
- collapsed: false,
- notices: [],
- },
- effects: {
- *fetchNotices(_, { call, put, select }) {
- const data = yield call(queryNotices);
- yield put({
- type: 'saveNotices',
- payload: data,
- });
- const unreadCount: number = yield select(
- (state: ConnectState) => state.global.notices.filter((item) => !item.read).length,
- );
- yield put({
- type: 'user/changeNotifyCount',
- payload: {
- totalCount: data.length,
- unreadCount,
- },
- });
- },
- *clearNotices({ payload }, { put, select }) {
- yield put({
- type: 'saveClearedNotices',
- payload,
- });
- const count: number = yield select((state: ConnectState) => state.global.notices.length);
- const unreadCount: number = yield select(
- (state: ConnectState) => state.global.notices.filter((item) => !item.read).length,
- );
- yield put({
- type: 'user/changeNotifyCount',
- payload: {
- totalCount: count,
- unreadCount,
- },
- });
- },
- *changeNoticeReadState({ payload }, { put, select }) {
- const notices: NoticeItem[] = yield select((state: ConnectState) =>
- state.global.notices.map((item) => {
- const notice = { ...item };
- if (notice.id === payload) {
- notice.read = true;
- }
- return notice;
- }),
- );
- yield put({
- type: 'saveNotices',
- payload: notices,
- });
- yield put({
- type: 'user/changeNotifyCount',
- payload: {
- totalCount: notices.length,
- unreadCount: notices.filter((item) => !item.read).length,
- },
- });
- },
- },
- reducers: {
- changeLayoutCollapsed(state = { notices: [], collapsed: true }, { payload }): GlobalModelState {
- return {
- ...state,
- collapsed: payload,
- };
- },
- saveNotices(state, { payload }): GlobalModelState {
- return {
- collapsed: false,
- ...state,
- notices: payload,
- };
- },
- saveClearedNotices(state = { notices: [], collapsed: true }, { payload }): GlobalModelState {
- return {
- ...state,
- collapsed: false,
- notices: state.notices.filter((item): boolean => item.type !== payload),
- };
- },
- },
- };
- export default GlobalModel;
|