import { queryCurrentUser, queryPermData } from './services/user'
import type { RequestConfig } from 'umi'
import { ErrorShowType } from 'umi'
import { history } from 'umi'
import RightContent from '@/components/RightContent'
import { message, notification } from 'antd'
import logo from '../public/logo.svg'
import { getToken } from '@/utils/auth'
import { tryChangeWorkStatus } from './components/RightContent/Book'
import { getAuthCache, setAuthCache } from './utils/auth'
import { LAYOUT_COLLAPSED_KEY } from './utils/cache/cacheEnum'
import consts from './consts'
import ModalStore from './components/ModalStore/import'
import { stringify } from 'qs'
import MessageDetail from './pages/Hr/Notification/components/MessageDetail'
const loginPath = '/user/login'
export async function getInitialState() {
// 如果是登录页面,不执行
const fetchUserInfo = async () => {
try {
const res = await queryCurrentUser()
return res.data
} catch (error) {
history.push(loginPath)
}
return undefined
}
const fetchPermData = async () => {
try {
const res = await queryPermData()
return res.data
} catch (error) {
message.error('获取数据权限失败,请联系管理员')
}
return {}
}
// 如果是登录页面,不执行
if (history.location.pathname !== loginPath) {
const userInfo = (await fetchUserInfo()) || {}
const permData = (await fetchPermData()) || {}
const collapsed = getAuthCache(LAYOUT_COLLAPSED_KEY) || false
return {
fetchUserInfo,
fetchPermData,
permData,
...userInfo,
settings: { collapsed, defaultCollapsed: collapsed }
}
}
return {
fetchUserInfo,
fetchPermData,
settings: {}
}
}
export const layout = ({ initialState, setInitialState }) => {
const onCollapse = collapsed => {
setInitialState({ ...initialState, settings: { ...initialState.settings, collapsed } })
setAuthCache(LAYOUT_COLLAPSED_KEY, collapsed)
}
return {
logo,
rightContentRender: () => (
),
disableContentMargin: false,
waterMarkProps: initialState.currentUser && {
fontColor: 'rgba(0,0,0,.1)',
offsetTop: 200,
content: `${initialState.currentUser?.username} ${initialState.currentUser?.telephone.slice(-4)}`
},
onPageChange: async location => {
// 如果没有登录,重定向到 login
if (!initialState?.currentUser?.staffId && location.pathname !== loginPath) {
history.replace({
pathname: loginPath,
search: stringify({
redirect: history.location.pathname
})
})
} else {
location.pathname !== loginPath &&
tryChangeWorkStatus(initialState?.currentUser?.staffId, location.pathname)
}
},
childrenRender: children => {children},
...initialState?.settings,
breakpoint: false,
onCollapse
}
}
let notificationLimit = 0 // 最大1
const errorHandler = error => {
const { data, info } = error
if (info) {
const { errorMessage = '请求失败', showType, errorCode } = info
if (consts.TOKEN_INVALID_CODE.includes(errorCode) && window.location.pathname !== loginPath) {
history.replace({
pathname: loginPath,
search: stringify({
redirect: window.location.pathname
})
})
}
switch (showType) {
case ErrorShowType.ERROR_MESSAGE:
message.error(errorMessage)
break
case ErrorShowType.WARN_MESSAGE:
message.warn(errorMessage)
break
case ErrorShowType.NOTIFICATION:
if (!notificationLimit) {
const title = consts.TOKEN_INVALID_CODE.includes(errorCode) ? '用户信息过期' : '请求失败'
notification.error({
message: title,
description: errorMessage
})
notificationLimit++
}
break
default:
break
}
return Promise.reject(data)
} else {
notification.error({
description: '您的网络发生异常,无法连接服务器',
message: '网络异常'
})
}
return Promise.reject(error)
}
const authHeaderInterceptor = (url, options) => {
const token = getToken()
if (token) {
// 在白名单里的请求放过
if (consts.TOKEN_WHITE_LIST.includes(url)) {
return { url, options }
}
// eslint-disable-next-line no-param-reassign
options.headers[consts.TOKEN_HEADER] = `bearer ${token}`
return { url, options }
}
return { url, options }
}
export const request: RequestConfig = {
errorHandler,
prefix: '/api',
// 默认错误处理
credentials: 'include', // 默认请求是否带上cookie
prefix: consts.PREFIX_URL,
cache: 'no-cache',
errorConfig: {
adaptor: resData => {
if (notificationLimit !== 0 && resData.code === consts.RET_CODE.SUCCESS) {
notificationLimit = 0
}
return {
success: resData.code === consts.RET_CODE.SUCCESS,
errorMessage: resData.msg,
errorCode: resData.code,
showType: resData.showType
}
}
},
requestInterceptors: [authHeaderInterceptor]
}