фикс
This commit is contained in:
parent
a74cf5cb6c
commit
5b671db612
22
src/App.vue
22
src/App.vue
@ -86,6 +86,7 @@ import api from '@/services/api';
|
|||||||
import { getSocket, connectSocket } from '@/services/socketService';
|
import { getSocket, connectSocket } from '@/services/socketService';
|
||||||
import Toast from '@/components/Toast.vue';
|
import Toast from '@/components/Toast.vue';
|
||||||
import toastService from '@/services/toastService';
|
import toastService from '@/services/toastService';
|
||||||
|
import { handleAccountBlocked, handleAccountUnblocked } from '@/auth';
|
||||||
|
|
||||||
const { user, isAuthenticated, logout, fetchUser } = useAuth();
|
const { user, isAuthenticated, logout, fetchUser } = useAuth();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
@ -162,6 +163,8 @@ watch(() => isAuthenticated.value, (newAuthStatus, oldAuthStatus) => {
|
|||||||
if (socket) {
|
if (socket) {
|
||||||
socket.off('getMessage', handleNewMessage);
|
socket.off('getMessage', handleNewMessage);
|
||||||
socket.off('messagesRead', handleMessagesRead);
|
socket.off('messagesRead', handleMessagesRead);
|
||||||
|
socket.off('accountBlocked');
|
||||||
|
socket.off('accountUnblocked');
|
||||||
// Use userData.value for _id as user.value is null on logout
|
// Use userData.value for _id as user.value is null on logout
|
||||||
// userData.value holds the *previous* user data here
|
// userData.value holds the *previous* user data here
|
||||||
if (userData.value?._id && !(userData.value?.isAdmin)) {
|
if (userData.value?._id && !(userData.value?.isAdmin)) {
|
||||||
@ -200,10 +203,27 @@ const setupSocketConnection = () => {
|
|||||||
socket = connectSocket();
|
socket = connectSocket();
|
||||||
}
|
}
|
||||||
if (socket) {
|
if (socket) {
|
||||||
|
// Отключаем старые обработчики
|
||||||
socket.off('getMessage', handleNewMessage);
|
socket.off('getMessage', handleNewMessage);
|
||||||
socket.off('messagesRead', handleMessagesRead);
|
socket.off('messagesRead', handleMessagesRead);
|
||||||
|
socket.off('accountBlocked');
|
||||||
|
socket.off('accountUnblocked');
|
||||||
|
|
||||||
|
// Подключаем обработчики сообщений
|
||||||
socket.on('getMessage', handleNewMessage);
|
socket.on('getMessage', handleNewMessage);
|
||||||
socket.on('messagesRead', handleMessagesRead);
|
socket.on('messagesRead', handleMessagesRead);
|
||||||
|
|
||||||
|
// Подключаем обработчики блокировки/разблокировки аккаунта
|
||||||
|
socket.on('accountBlocked', (data) => {
|
||||||
|
console.log('[App.vue] Получено событие блокировки аккаунта:', data);
|
||||||
|
handleAccountBlocked(data);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('accountUnblocked', (data) => {
|
||||||
|
console.log('[App.vue] Получено событие разблокировки аккаунта:', data);
|
||||||
|
handleAccountUnblocked(data);
|
||||||
|
});
|
||||||
|
|
||||||
socket.emit('joinNotificationRoom', user.value._id);
|
socket.emit('joinNotificationRoom', user.value._id);
|
||||||
console.log('[App.vue setupSocketConnection] Socket connection configured for user:', user.value._id);
|
console.log('[App.vue setupSocketConnection] Socket connection configured for user:', user.value._id);
|
||||||
}
|
}
|
||||||
@ -255,6 +275,8 @@ onUnmounted(() => {
|
|||||||
if (socket) {
|
if (socket) {
|
||||||
socket.off('getMessage', handleNewMessage);
|
socket.off('getMessage', handleNewMessage);
|
||||||
socket.off('messagesRead', handleMessagesRead);
|
socket.off('messagesRead', handleMessagesRead);
|
||||||
|
socket.off('accountBlocked');
|
||||||
|
socket.off('accountUnblocked');
|
||||||
if (user.value?._id && !currentUserIsAdmin.value) {
|
if (user.value?._id && !currentUserIsAdmin.value) {
|
||||||
socket.emit('leaveNotificationRoom', user.value._id);
|
socket.emit('leaveNotificationRoom', user.value._id);
|
||||||
console.log('[App.vue onUnmounted] Left notification room for user:', user.value._id);
|
console.log('[App.vue onUnmounted] Left notification room for user:', user.value._id);
|
||||||
|
57
src/auth.js
57
src/auth.js
@ -38,6 +38,45 @@ async function fetchUser() {
|
|||||||
console.log('Получены данные пользователя:', response.data);
|
console.log('Получены данные пользователя:', response.data);
|
||||||
console.log('Значение isAdmin в ответе:', response.data.isAdmin);
|
console.log('Значение isAdmin в ответе:', response.data.isAdmin);
|
||||||
|
|
||||||
|
// Проверяем, не заблокирован ли пользователь
|
||||||
|
if (response.data.blocked) {
|
||||||
|
console.log('[Auth] Пользователь заблокирован, выполняем принудительный выход');
|
||||||
|
|
||||||
|
// Сохраняем информацию о блокировке
|
||||||
|
const blockedInfo = {
|
||||||
|
blocked: true,
|
||||||
|
message: 'Ваш аккаунт заблокирован администратором.',
|
||||||
|
reason: response.data.blockReason || 'Нарушение правил сервиса',
|
||||||
|
timestamp: new Date().toISOString()
|
||||||
|
};
|
||||||
|
localStorage.setItem('accountBlockedInfo', JSON.stringify(blockedInfo));
|
||||||
|
|
||||||
|
// Выходим из системы
|
||||||
|
await logout();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем, была ли разблокировка (если есть информация о предыдущей блокировке)
|
||||||
|
const blockedInfoStr = localStorage.getItem('accountBlockedInfo');
|
||||||
|
if (blockedInfoStr) {
|
||||||
|
console.log('[Auth] Обнаружена предыдущая блокировка, пользователь теперь разблокирован');
|
||||||
|
|
||||||
|
// Удаляем информацию о блокировке
|
||||||
|
localStorage.removeItem('accountBlockedInfo');
|
||||||
|
|
||||||
|
// Показываем уведомление о разблокировке
|
||||||
|
setTimeout(() => {
|
||||||
|
const notificationEvent = new CustomEvent('show-toast', {
|
||||||
|
detail: {
|
||||||
|
message: 'Ваш аккаунт был разблокирован. Добро пожаловать обратно!',
|
||||||
|
type: 'success',
|
||||||
|
duration: 5000
|
||||||
|
}
|
||||||
|
});
|
||||||
|
window.dispatchEvent(notificationEvent);
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
// Сохраняем данные пользователя
|
// Сохраняем данные пользователя
|
||||||
user.value = response.data;
|
user.value = response.data;
|
||||||
console.log('Пользователь успешно загружен:', user.value);
|
console.log('Пользователь успешно загружен:', user.value);
|
||||||
@ -45,6 +84,21 @@ async function fetchUser() {
|
|||||||
console.log('Пользователь является администратором:', user.value.isAdmin ? 'Да' : 'Нет');
|
console.log('Пользователь является администратором:', user.value.isAdmin ? 'Да' : 'Нет');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Не удалось загрузить пользователя по токену:', error.response ? error.response.data : error.message);
|
console.error('Не удалось загрузить пользователя по токену:', error.response ? error.response.data : error.message);
|
||||||
|
|
||||||
|
// Проверяем, не связана ли ошибка с блокировкой
|
||||||
|
if (error.response && error.response.status === 403 && error.response.data.message && error.response.data.message.includes('заблокирован')) {
|
||||||
|
console.log('[Auth] Пользователь заблокирован согласно ответу сервера');
|
||||||
|
|
||||||
|
// Сохраняем информацию о блокировке
|
||||||
|
const blockedInfo = {
|
||||||
|
blocked: true,
|
||||||
|
message: error.response.data.message || 'Ваш аккаунт заблокирован администратором.',
|
||||||
|
reason: error.response.data.reason || 'Нарушение правил сервиса',
|
||||||
|
timestamp: new Date().toISOString()
|
||||||
|
};
|
||||||
|
localStorage.setItem('accountBlockedInfo', JSON.stringify(blockedInfo));
|
||||||
|
}
|
||||||
|
|
||||||
// Если токен невалиден, очищаем его и данные пользователя
|
// Если токен невалиден, очищаем его и данные пользователя
|
||||||
await logout(); // Вызываем logout, чтобы очистить всё
|
await logout(); // Вызываем logout, чтобы очистить всё
|
||||||
}
|
}
|
||||||
@ -281,3 +335,6 @@ export function useAuth() {
|
|||||||
handleAccountUnblocked // Добавляем функцию обработки разблокировки аккаунта
|
handleAccountUnblocked // Добавляем функцию обработки разблокировки аккаунта
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Экспортируем функции напрямую для использования в других частях приложения
|
||||||
|
export { handleAccountBlocked, handleAccountUnblocked };
|
Loading…
x
Reference in New Issue
Block a user