fix
This commit is contained in:
parent
f9a9afc697
commit
0bb22059d0
@ -32,7 +32,6 @@ const AUTH_CONFIG = {
|
||||
|
||||
const TOKEN_MESSAGES = {
|
||||
accessInvalid: new Set(['ACCESS_TOKEN_INVALID', 'ACCESS_TOKEN_EXPIRED', 'UNAUTHORIZED']),
|
||||
refreshInvalid: new Set(['REFRESH_TOKEN_INVALID', 'REFRESH_TOKEN_EXPIRED', 'UNAUTHORIZED']),
|
||||
}
|
||||
|
||||
type RequestConfigWithRetry = InternalAxiosRequestConfig & { _retry?: boolean }
|
||||
@ -419,23 +418,33 @@ const getErrorMessage = (error: AxiosError): string => {
|
||||
return data?.code ?? data?.message ?? ''
|
||||
}
|
||||
|
||||
const isSessionAuthFailure = (error: AxiosError): boolean => {
|
||||
const message = getErrorMessage(error)
|
||||
|
||||
// Bare 401 (no code/message) is treated as a dead session.
|
||||
if (!message) return true
|
||||
|
||||
return TOKEN_MESSAGES.accessInvalid.has(message) || message === 'Unauthorized'
|
||||
}
|
||||
|
||||
const shouldTryRefreshFor401 = (error: AxiosError, config: RequestConfigWithRetry): boolean => {
|
||||
if (isRefreshTokenRequest(config)) return false
|
||||
if (config._retry) return false
|
||||
if (!canAttemptTokenRefresh()) return false
|
||||
if (!isSessionAuthFailure(error)) return false
|
||||
|
||||
const message = getErrorMessage(error)
|
||||
|
||||
if (TOKEN_MESSAGES.refreshInvalid.has(message) && isRefreshTokenRequest(config)) return false
|
||||
if (!message) return true
|
||||
|
||||
return TOKEN_MESSAGES.accessInvalid.has(message) || message === 'Unauthorized'
|
||||
return true
|
||||
}
|
||||
|
||||
async function handle401Response(error: AxiosError): Promise<AxiosResponse> {
|
||||
const config = error.config as RequestConfigWithRetry | undefined
|
||||
|
||||
if (!config) {
|
||||
// بدون config نمیتوان retry کرد؛ 401 نشست را expire کن، بقیه (مثلاً OTP) را رد کن.
|
||||
if (isSessionAuthFailure(error)) {
|
||||
return handleSessionExpired()
|
||||
}
|
||||
|
||||
return Promise.reject(error)
|
||||
}
|
||||
|
||||
@ -444,6 +453,13 @@ async function handle401Response(error: AxiosError): Promise<AxiosResponse> {
|
||||
}
|
||||
|
||||
if (!shouldTryRefreshFor401(error, config)) {
|
||||
// قبلاً فقط reject میشد → داشبورد ارور میدید ولی لاگاوت نمیشد
|
||||
// (مثلاً 401 بدون توکن، یا retry بعد از refresh که باز هم UNAUTHORIZED بود).
|
||||
// OTP_INVALID و سایر 401های کسبوکاری نباید نشست را پاک کنند.
|
||||
if (isSessionAuthFailure(error)) {
|
||||
return handleSessionExpired()
|
||||
}
|
||||
|
||||
return Promise.reject(error)
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ghabilee-admin",
|
||||
"version": "0.1.0",
|
||||
"version": "0.1.1",
|
||||
"license": "MIT",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user