From 0bb22059d0163881717829ea9fcb36b06e7468c6 Mon Sep 17 00:00:00 2001 From: alisaza Date: Sat, 5 Sep 2026 15:15:35 +0330 Subject: [PATCH] fix --- config/axios.ts | 30 +++++++++++++++++++++++------- package.json | 2 +- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/config/axios.ts b/config/axios.ts index 4b53636..06fb988 100644 --- a/config/axios.ts +++ b/config/axios.ts @@ -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 { 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 { } if (!shouldTryRefreshFor401(error, config)) { + // قبلاً فقط reject می‌شد → داشبورد ارور می‌دید ولی لاگ‌اوت نمی‌شد + // (مثلاً 401 بدون توکن، یا retry بعد از refresh که باز هم UNAUTHORIZED بود). + // OTP_INVALID و سایر 401های کسب‌وکاری نباید نشست را پاک کنند. + if (isSessionAuthFailure(error)) { + return handleSessionExpired() + } + return Promise.reject(error) } diff --git a/package.json b/package.json index 1d8c85c..cf246fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghabilee-admin", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "private": true, "scripts": {