фикс
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 Toast from '@/components/Toast.vue';
|
||||
import toastService from '@/services/toastService';
|
||||
import { handleAccountBlocked, handleAccountUnblocked } from '@/auth';
|
||||
|
||||
const { user, isAuthenticated, logout, fetchUser } = useAuth();
|
||||
const route = useRoute();
|
||||
@ -162,6 +163,8 @@ watch(() => isAuthenticated.value, (newAuthStatus, oldAuthStatus) => {
|
||||
if (socket) {
|
||||
socket.off('getMessage', handleNewMessage);
|
||||
socket.off('messagesRead', handleMessagesRead);
|
||||
socket.off('accountBlocked');
|
||||
socket.off('accountUnblocked');
|
||||
// Use userData.value for _id as user.value is null on logout
|
||||
// userData.value holds the *previous* user data here
|
||||
if (userData.value?._id && !(userData.value?.isAdmin)) {
|
||||
@ -200,10 +203,27 @@ const setupSocketConnection = () => {
|
||||
socket = connectSocket();
|
||||
}
|
||||
if (socket) {
|
||||
// Отключаем старые обработчики
|
||||
socket.off('getMessage', handleNewMessage);
|
||||
socket.off('messagesRead', handleMessagesRead);
|
||||
socket.off('accountBlocked');
|
||||
socket.off('accountUnblocked');
|
||||
|
||||
// Подключаем обработчики сообщений
|
||||
socket.on('getMessage', handleNewMessage);
|
||||
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);
|
||||
console.log('[App.vue setupSocketConnection] Socket connection configured for user:', user.value._id);
|
||||
}
|
||||
@ -255,6 +275,8 @@ onUnmounted(() => {
|
||||
if (socket) {
|
||||
socket.off('getMessage', handleNewMessage);
|
||||
socket.off('messagesRead', handleMessagesRead);
|
||||
socket.off('accountBlocked');
|
||||
socket.off('accountUnblocked');
|
||||
if (user.value?._id && !currentUserIsAdmin.value) {
|
||||
socket.emit('leaveNotificationRoom', user.value._id);
|
||||
console.log('[App.vue onUnmounted] Left notification room for user:', user.value._id);
|
||||
|
59
src/auth.js
59
src/auth.js
@ -38,6 +38,45 @@ async function fetchUser() {
|
||||
console.log('Получены данные пользователя:', response.data);
|
||||
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;
|
||||
console.log('Пользователь успешно загружен:', user.value);
|
||||
@ -45,6 +84,21 @@ async function fetchUser() {
|
||||
console.log('Пользователь является администратором:', user.value.isAdmin ? 'Да' : 'Нет');
|
||||
} catch (error) {
|
||||
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, чтобы очистить всё
|
||||
}
|
||||
@ -280,4 +334,7 @@ export function useAuth() {
|
||||
handleAccountBlocked, // Добавляем функцию обработки блокировки аккаунта
|
||||
handleAccountUnblocked // Добавляем функцию обработки разблокировки аккаунта
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Экспортируем функции напрямую для использования в других частях приложения
|
||||
export { handleAccountBlocked, handleAccountUnblocked };
|
Loading…
x
Reference in New Issue
Block a user