Files
cn-rdms-web/src/service/request/shared.ts

88 lines
2.3 KiB
TypeScript
Raw Normal View History

2026-03-26 20:18:20 +08:00
import { useAuthStore } from '@/store/modules/auth';
import { localStg } from '@/utils/storage';
import { fetchRefreshToken } from '../api';
import { SESSION_EXPIRED_MESSAGE } from './error-message';
2026-03-26 20:18:20 +08:00
import type { RequestInstanceState } from './type';
export function getAuthorization() {
const token = localStg.get('token');
const Authorization = token ? `Bearer ${token}` : null;
return Authorization;
}
/** 刷新 token */
async function handleRefreshToken() {
const rToken = localStg.get('refreshToken') || '';
const { error, data } = await fetchRefreshToken(rToken);
if (!error) {
localStg.set('token', data.token);
localStg.set('refreshToken', data.refreshToken);
return true;
}
notifySessionExpired();
2026-03-26 20:18:20 +08:00
return false;
}
export async function handleExpiredRequest(state: RequestInstanceState) {
if (!state.refreshTokenPromise) {
state.refreshTokenPromise = handleRefreshToken();
2026-03-26 20:18:20 +08:00
}
const success = await state.refreshTokenPromise;
2026-03-26 20:18:20 +08:00
setTimeout(() => {
state.refreshTokenPromise = null;
2026-03-26 20:18:20 +08:00
}, 1000);
return success;
}
// 会话失效一次性锁:保证 N 个并发请求只弹一次 toast、只 resetStore 一次
let sessionExpiredNotified = false;
/**
* toast
*
* resetSessionExpiredFlag()
*/
export function notifySessionExpired() {
if (sessionExpiredNotified) return;
sessionExpiredNotified = true;
window.$message?.error(SESSION_EXPIRED_MESSAGE);
const { resetStore } = useAuthStore();
resetStore();
}
/** 登录成功后复位一次性锁,让下一次会话失效仍能正常提示 */
export function resetSessionExpiredFlag() {
sessionExpiredNotified = false;
}
2026-03-26 20:18:20 +08:00
export function showErrorMsg(state: RequestInstanceState, message: string) {
if (!state.errMsgStack?.length) {
state.errMsgStack = [];
}
const isExist = state.errMsgStack.includes(message);
if (!isExist) {
state.errMsgStack.push(message);
window.$message?.error({
message,
onClose: () => {
state.errMsgStack = state.errMsgStack.filter(msg => msg !== message);
setTimeout(() => {
state.errMsgStack = [];
}, 5000);
}
});
}
}