фикс
This commit is contained in:
parent
71b48b5d25
commit
f7d0d71858
10
src/auth.js
10
src/auth.js
@ -129,6 +129,8 @@ async function logout() {
|
|||||||
|
|
||||||
// Функция обработки события блокировки аккаунта
|
// Функция обработки события блокировки аккаунта
|
||||||
function handleAccountBlocked(data) {
|
function handleAccountBlocked(data) {
|
||||||
|
console.log('Обработка блокировки аккаунта:', data);
|
||||||
|
|
||||||
// Создаем объект с информацией о блокировке
|
// Создаем объект с информацией о блокировке
|
||||||
const blockInfo = {
|
const blockInfo = {
|
||||||
blocked: true,
|
blocked: true,
|
||||||
@ -140,11 +142,17 @@ function handleAccountBlocked(data) {
|
|||||||
// Сохраняем информацию о блокировке в localStorage для отображения на странице логина
|
// Сохраняем информацию о блокировке в localStorage для отображения на странице логина
|
||||||
localStorage.setItem('accountBlockedInfo', JSON.stringify(blockInfo));
|
localStorage.setItem('accountBlockedInfo', JSON.stringify(blockInfo));
|
||||||
|
|
||||||
// Выполняем выход пользователя
|
// Немедленно выполняем выход пользователя - сначала очищаем данные
|
||||||
user.value = null;
|
user.value = null;
|
||||||
token.value = null;
|
token.value = null;
|
||||||
localStorage.removeItem('userToken');
|
localStorage.removeItem('userToken');
|
||||||
|
|
||||||
|
// Удаляем токен из заголовков для будущих запросов API
|
||||||
|
api.setAuthToken(null);
|
||||||
|
|
||||||
|
// Принудительно прерываем все активные запросы API, если они есть
|
||||||
|
api.cancelActiveRequests && api.cancelActiveRequests();
|
||||||
|
|
||||||
// Перенаправляем на страницу входа с уведомлением о блокировке
|
// Перенаправляем на страницу входа с уведомлением о блокировке
|
||||||
router.push({
|
router.push({
|
||||||
name: 'Login',
|
name: 'Login',
|
||||||
|
@ -4,6 +4,9 @@ import { useAuth } from '../auth'; // Импортируем функцию ав
|
|||||||
// Создаем экземпляр Axios с базовым URL нашего API
|
// Создаем экземпляр Axios с базовым URL нашего API
|
||||||
// Настраиваем базовый URL в зависимости от окружения
|
// Настраиваем базовый URL в зависимости от окружения
|
||||||
|
|
||||||
|
// Храним токены отмены запросов для возможности отмены при блокировке
|
||||||
|
const cancelTokenSources = new Map();
|
||||||
|
|
||||||
// Определяем базовый URL в зависимости от среды выполнения
|
// Определяем базовый URL в зависимости от среды выполнения
|
||||||
const getBaseUrl = () => {
|
const getBaseUrl = () => {
|
||||||
// Всегда используем относительный путь /api.
|
// Всегда используем относительный путь /api.
|
||||||
@ -30,6 +33,20 @@ apiClient.interceptors.request.use(
|
|||||||
} else {
|
} else {
|
||||||
console.log('[API] Токен не найден для запроса:', config.url);
|
console.log('[API] Токен не найден для запроса:', config.url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Добавляем CancelToken к запросу для возможности отмены
|
||||||
|
const source = axios.CancelToken.source();
|
||||||
|
config.cancelToken = source.token;
|
||||||
|
|
||||||
|
// Сохраняем источник токена отмены в Map по URL запроса как ключу
|
||||||
|
const requestKey = `${config.method}-${config.url}`;
|
||||||
|
cancelTokenSources.set(requestKey, source);
|
||||||
|
|
||||||
|
// Добавляем обработчик, который удаляет источник токена отмены после завершения запроса
|
||||||
|
config.onFinally = () => {
|
||||||
|
cancelTokenSources.delete(requestKey);
|
||||||
|
};
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
},
|
},
|
||||||
(error) => {
|
(error) => {
|
||||||
@ -40,8 +57,19 @@ apiClient.interceptors.request.use(
|
|||||||
|
|
||||||
// (Опционально) Перехватчик ответов для обработки глобальных ошибок, например, 401
|
// (Опционально) Перехватчик ответов для обработки глобальных ошибок, например, 401
|
||||||
apiClient.interceptors.response.use(
|
apiClient.interceptors.response.use(
|
||||||
(response) => response,
|
(response) => {
|
||||||
|
// Удаляем источник токена отмены после успешного ответа
|
||||||
|
const requestKey = `${response.config.method}-${response.config.url}`;
|
||||||
|
cancelTokenSources.delete(requestKey);
|
||||||
|
return response;
|
||||||
|
},
|
||||||
(error) => {
|
(error) => {
|
||||||
|
// Удаляем источник токена отмены при ошибке
|
||||||
|
if (error.config) {
|
||||||
|
const requestKey = `${error.config.method}-${error.config.url}`;
|
||||||
|
cancelTokenSources.delete(requestKey);
|
||||||
|
}
|
||||||
|
|
||||||
if (error.response && error.response.status === 401) {
|
if (error.response && error.response.status === 401) {
|
||||||
console.error('[API] Неавторизованный запрос (401):', error.config.url);
|
console.error('[API] Неавторизованный запрос (401):', error.config.url);
|
||||||
|
|
||||||
@ -56,9 +84,31 @@ apiClient.interceptors.response.use(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Функция для отмены всех активных запросов
|
||||||
|
const cancelActiveRequests = () => {
|
||||||
|
console.log('[API] Отмена всех активных запросов. Количество: ' + cancelTokenSources.size);
|
||||||
|
cancelTokenSources.forEach((source, key) => {
|
||||||
|
source.cancel('Запрос отменен из-за блокировки аккаунта');
|
||||||
|
console.log(`[API] Запрос ${key} отменен`);
|
||||||
|
});
|
||||||
|
cancelTokenSources.clear();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Функция для явной установки токена аутентификации
|
||||||
|
const setAuthToken = (token) => {
|
||||||
|
if (token) {
|
||||||
|
apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}`;
|
||||||
|
} else {
|
||||||
|
delete apiClient.defaults.headers.common['Authorization'];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Экспортируем функции для конкретных эндпоинтов
|
// Экспортируем функции для конкретных эндпоинтов
|
||||||
export default {
|
export default {
|
||||||
|
// Добавляем новые утилитарные методы
|
||||||
|
cancelActiveRequests,
|
||||||
|
setAuthToken,
|
||||||
|
|
||||||
register(userData) {
|
register(userData) {
|
||||||
return apiClient.post('/auth/register', userData);
|
return apiClient.post('/auth/register', userData);
|
||||||
},
|
},
|
||||||
|
@ -49,25 +49,28 @@ export const connectSocket = () => {
|
|||||||
// Добавляем обработчик для события блокировки аккаунта
|
// Добавляем обработчик для события блокировки аккаунта
|
||||||
socket.on('account_blocked', (data) => {
|
socket.on('account_blocked', (data) => {
|
||||||
console.log('[SocketService] Получено уведомление о блокировке аккаунта:', data);
|
console.log('[SocketService] Получено уведомление о блокировке аккаунта:', data);
|
||||||
// Вызываем функцию обработки блокировки из auth.js тихо, без показа браузерного уведомления
|
|
||||||
// Отложенный вызов, чтобы избежать показа стандартного уведомления браузера
|
// Немедленно отключаем сокет
|
||||||
setTimeout(() => {
|
socket.disconnect();
|
||||||
|
console.log('[SocketService] Сокет принудительно отключен из-за блокировки аккаунта');
|
||||||
|
|
||||||
|
// Сразу вызываем функцию обработки блокировки из auth.js, без таймаута
|
||||||
handleAccountBlocked(data);
|
handleAccountBlocked(data);
|
||||||
}, 10);
|
|
||||||
|
// Разрываем все существующие соединения и очищаем состояние сокета
|
||||||
|
socket = null;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Добавляем обработчик для события разблокировки аккаунта
|
// Добавляем обработчик для события разблокировки аккаунта
|
||||||
socket.on('account_unblocked', (data) => {
|
socket.on('account_unblocked', (data) => {
|
||||||
console.log('[SocketService] Получено уведомление о разблокировке аккаунта:', data);
|
console.log('[SocketService] Получено уведомление о разблокировке аккаунта:', data);
|
||||||
// Аналогично блокировке, используем setTimeout для предотвращения браузерного уведомления
|
|
||||||
setTimeout(() => {
|
// Сразу вызываем обработчик разблокировки, без таймаута
|
||||||
// Если есть функция handleAccountUnblocked, вызываем её
|
|
||||||
if (typeof handleAccountUnblocked === 'function') {
|
if (typeof handleAccountUnblocked === 'function') {
|
||||||
handleAccountUnblocked(data);
|
handleAccountUnblocked(data);
|
||||||
} else {
|
} else {
|
||||||
console.log('[SocketService] Аккаунт разблокирован, но обработчик не определен');
|
console.log('[SocketService] Аккаунт разблокирован, но обработчик не определен');
|
||||||
}
|
}
|
||||||
}, 10);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Можно здесь же слушать глобальные события, если нужно
|
// Можно здесь же слушать глобальные события, если нужно
|
||||||
|
Loading…
x
Reference in New Issue
Block a user