import { Reducer } from 'redux'; import { Subscription, Effect } from 'dva';
import { NoticeIconData } from '@/components/NoticeIcon'; import { queryNotices } from '@/services/user'; import { ConnectState } from './connect.d';
export interface NoticeItem extends NoticeIconData { id: string; type: string; status: string; }
export interface GlobalModelState { collapsed: boolean; notices: NoticeItem[]; }
export interface GlobalModelType { namespace: 'global'; state: GlobalModelState; effects: { fetchNotices: Effect; clearNotices: Effect; changeNoticeReadState: Effect; }; reducers: { changeLayoutCollapsed: Reducer<GlobalModelState>; saveNotices: Reducer<GlobalModelState>; saveClearedNotices: Reducer<GlobalModelState>; }; subscriptions: { setup: Subscription }; }
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 { collapsed: false, ...state, notices: state.notices.filter((item): boolean => item.type !== payload), }; }, },
subscriptions: { setup({ history }): void { history.listen(({ pathname, search }): void => { if (typeof window.ga !== 'undefined') { window.ga('send', 'pageview', pathname + search); } }); }, }, };
export default GlobalModel;
|