diff --git a/backend/controllers/adminController.js b/backend/controllers/adminController.js index 75b5943..d62d77e 100644 --- a/backend/controllers/adminController.js +++ b/backend/controllers/adminController.js @@ -268,6 +268,7 @@ const toggleUserActive = async (req, res) => { res.json({ message: user.blocked ? 'Пользователь заблокирован' : 'Пользователь разблокирован', blocked: user.blocked, + isActive: !user.blocked, // Добавляем isActive для совместимости с клиентом blockReason: user.blockReason }); } catch (error) { diff --git a/src/views/admin/AdminUserDetail.vue b/src/views/admin/AdminUserDetail.vue index 50174f4..39d8d11 100644 --- a/src/views/admin/AdminUserDetail.vue +++ b/src/views/admin/AdminUserDetail.vue @@ -199,8 +199,6 @@ export default { // Изменение статуса пользователя (блокировка/разблокировка) const toggleUserStatus = async () => { try { - const originalStatus = user.value.isActive; - const token = localStorage.getItem('userToken'); const response = await axios.put( `/api/admin/users/${props.id}/toggle-active`, @@ -212,20 +210,20 @@ export default { } ); - // Принудительно обновляем статус пользователя для реактивности + // Обновляем объект пользователя напрямую из ответа сервера if (response.data && typeof response.data.isActive !== 'undefined') { - user.value.isActive = response.data.isActive; - user.value.blocked = !response.data.isActive; - - // Форсируем реактивное обновление - user.value = { ...user.value }; + user.value = { + ...user.value, + isActive: response.data.isActive, + blocked: response.data.blocked + }; } // Показываем уведомление об успехе - const actionText = user.value.isActive ? 'разблокирован' : 'заблокирован'; + const actionText = response.data.isActive ? 'разблокирован' : 'заблокирован'; toastService.add( response.data.message || `Пользователь успешно ${actionText}`, - user.value.isActive ? 'success' : 'warning', + response.data.isActive ? 'success' : 'warning', 3000 ); } catch (err) { diff --git a/src/views/admin/AdminUsers.vue b/src/views/admin/AdminUsers.vue index 80f3747..9fc016b 100644 --- a/src/views/admin/AdminUsers.vue +++ b/src/views/admin/AdminUsers.vue @@ -252,13 +252,9 @@ export default { // Изменение статуса пользователя (блокировка/разблокировка) const toggleUserStatus = async (userId, currentStatus) => { try { - // Показываем индикатор загрузки для конкретного пользователя const userIndex = users.value.findIndex(user => user._id === userId); if (userIndex === -1) return; - // Временно отключаем кнопку, чтобы предотвратить множественные клики - const originalStatus = users.value[userIndex].isActive; - const token = localStorage.getItem('userToken'); const response = await axios.put( `/api/admin/users/${userId}/toggle-active`, @@ -270,14 +266,17 @@ export default { } ); - // Обновляем статус пользователя в списке с использованием реактивности Vue - if (userIndex !== -1 && response.data) { - // Принудительно обновляем свойство для реактивности - users.value[userIndex].isActive = response.data.isActive; - users.value[userIndex].blocked = !response.data.isActive; + // Обновляем пользователя в списке напрямую из ответа сервера + if (response.data && typeof response.data.isActive !== 'undefined') { + // Создаем новый объект пользователя с обновленными данными + const updatedUser = { + ...users.value[userIndex], + isActive: response.data.isActive, + blocked: response.data.blocked + }; - // Форсируем реактивное обновление Vue - users.value = [...users.value]; + // Заменяем пользователя в массиве + users.value.splice(userIndex, 1, updatedUser); } // Показываем уведомление об успехе @@ -290,13 +289,6 @@ export default { } catch (err) { console.error('Ошибка при изменении статуса пользователя:', err); - // Восстанавливаем исходный статус в случае ошибки - const userIndex = users.value.findIndex(user => user._id === userId); - if (userIndex !== -1) { - users.value[userIndex].isActive = currentStatus; - users.value = [...users.value]; - } - // Показываем ошибку const errorMessage = err.response?.data?.message || 'Ошибка при изменении статуса пользователя'; toastService.add(errorMessage, 'error', 5000);