import type { Reducer } from 'redux' ; import type { Subscription , Effect } from 'dva' ; 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 > ; } ; subscriptions : { setup : Subscription ; } ; } ; const GlobalModel = { namespace : 'global' , state : { collapsed : false , notices : [ ] , } , effects : { * fetchNotices ( _ , { call , put , select } ) { const data = yield call ( queryNotices ) ; yield put ( { type : 'saveNotices' , payload : data , } ) ; const unreadCount = yield select ( ( state ) => 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 = yield select ( ( state ) => state . global . notices . length ) ; const unreadCount = yield select ( ( state ) => state . global . notices . filter ( ( item ) => ! item . read ) . length ) ; yield put ( { type : 'user/changeNotifyCount' , payload : { totalCount : count , unreadCount , } , } ) ; } , * changeNoticeReadState ( { payload } , { put , select } ) { const notices = yield select ( ( state ) => 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 } ) { return { ... state , collapsed : payload , } ; } , saveNotices ( state , { payload } ) { return { collapsed : false , ... state , notices : payload , } ; } , saveClearedNotices ( state = { notices : [ ] , collapsed : true } , { payload } ) { return { collapsed : false , ... state , notices : state . notices . filter ( ( item ) : boolean => item . type !== payload ) , } ; } , } , subscriptions : { setup ( { history } ) { history . listen ( ( { pathname , search } ) : void => { if ( typeof window . ga !== 'undefined' ) { window . ga ( 'send' , 'pageview' , pathname + search ) ; } } ) ; } , } , } ; export default GlobalModel ;