From c761bc4b9c5c359afdccc953415ce00097cac957 Mon Sep 17 00:00:00 2001 From: Professional Date: Fri, 23 May 2025 23:28:06 +0700 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D0=BE=D0=B9=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/ProfileView.vue | 129 ++++++++++++++++++++++++++------------ 1 file changed, 90 insertions(+), 39 deletions(-) diff --git a/src/views/ProfileView.vue b/src/views/ProfileView.vue index b8a3629..db01154 100644 --- a/src/views/ProfileView.vue +++ b/src/views/ProfileView.vue @@ -417,24 +417,67 @@ const mainPhoto = computed(() => { // Methods const toggleEditMode = async () => { - // Если выходим из режима редактирования + // Если сейчас в режиме редактирования и пользователь хочет вернуться в режим просмотра if (isEditMode.value) { - // Проверяем, были ли изменения - const hasChanges = checkForChanges(); + console.log('[ProfileView] Выход из режима редактирования'); - if (hasChanges) { - // Если были изменения, автоматически сохраняем профиль - await saveProfileChanges(); - } else { - // Если изменений не было, просто обновляем UI - console.log('[ProfileView] Изменений не обнаружено, пропускаем сохранение'); + try { + // Проверяем, были ли изменения + const hasChanges = checkForChanges(); + console.log('[ProfileView] Обнаружены изменения:', hasChanges); + + if (hasChanges) { + console.log('[ProfileView] Сохранение изменений...'); + profileLoading.value = true; // Используем только profileLoading для индикации + + // Подготавливаем данные для отправки на сервер + const dataToUpdate = { ...editableProfileData.value }; + + // Обрабатываем дату рождения + if (dataToUpdate.dateOfBirth) { + try { + // Получаем дату в формате ISO с поправкой на часовой пояс + const dateObj = new Date(dataToUpdate.dateOfBirth); + if (!isNaN(dateObj.getTime())) { // Проверяем, что дата валидна + dataToUpdate.dateOfBirth = dateObj.toISOString(); + } + } catch (e) { + console.error('[ProfileView] Ошибка обработки даты:', e); + } + } + + // Отправляем запрос на сервер + const response = await api.updateUserProfile(dataToUpdate); + console.log('[ProfileView] Ответ от сервера (профиль):', response.data); + + // Обновляем локальные данные напрямую, без вызова fetchUser + profileData.value = { ...profileData.value, ...dataToUpdate }; + + // Показываем сообщение об успешном сохранении + profileActionSuccess.value = 'Профиль успешно обновлен!'; + + // Автоматически скрываем сообщение через 3 секунды + setTimeout(() => { + profileActionSuccess.value = ''; + }, 3000); + } else { + console.log('[ProfileView] Нет изменений, сохранение не требуется'); + } + } catch (err) { + console.error('[ProfileView] Ошибка при сохранении профиля:', err); + profileActionError.value = err.response?.data?.message || + 'Произошла ошибка при обновлении профиля. Пожалуйста, попробуйте позже.'; + } finally { + // В любом случае переключаемся в режим просмотра и сбрасываем состояние загрузки + isEditMode.value = false; + profileLoading.value = false; + clearProfileMessages(); } - - // В любом случае переключаемся в режим просмотра - isEditMode.value = false; - clearProfileMessages(); } else { - // При входе в режим редактирования + // Если сейчас в режиме просмотра и пользователь хочет перейти в режим редактирования + console.log('[ProfileView] Вход в режим редактирования'); + + // Переключаемся в режим редактирования isEditMode.value = true; // Копируем данные профиля в редактируемый объект @@ -445,7 +488,7 @@ const toggleEditMode = async () => { const date = new Date(profileData.value.dateOfBirth); formattedDate = date.toISOString().split('T')[0]; // Получаем только yyyy-MM-dd часть } catch (e) { - console.error('Ошибка форматирования даты:', e); + console.error('[ProfileView] Ошибка форматирования даты:', e); formattedDate = ''; } } @@ -457,12 +500,12 @@ const toggleEditMode = async () => { gender: profileData.value?.gender || '', location: { city: profileData.value?.location?.city || '', - // Можно добавить другие поля местоположения, если они есть } }; - // Сохраняем оригинальные данные для последующего сравнения + // Важно! Сохраняем JSON-копию оригинальных данных для последующего сравнения originalProfileData = JSON.stringify(editableProfileData.value); + console.log('[ProfileView] Сохранены оригинальные данные для сравнения:', originalProfileData); // Устанавливаем поисковый запрос города if (profileData.value?.location?.city) { @@ -709,35 +752,43 @@ const clearMessages = () => { }; const fetchProfileDataLocal = async () => { - loading.value = true; + console.log('[ProfileView] Начало загрузки данных профиля...'); error.value = ''; + loading.value = true; + initialLoading.value = true; - if (!isAuthenticated.value || !token.value) { - error.value = "Вы не авторизованы для просмотра этой страницы."; - loading.value = false; - initialLoading.value = false; - return; - } - try { - await fetchUser(); - - // После выполнения fetchUser проверяем, что данные получены - if (!authUserFromStore.value) { - console.error('[ProfileView] Пользователь не загружен после fetchUser'); - error.value = 'Не удалось загрузить данные профиля. Попробуйте позже.'; - } else { - // Обновляем данные профиля из полученных данных пользователя - profileData.value = { ...authUserFromStore.value }; - console.log('[ProfileView] Данные профиля обновлены:', profileData.value); + // Проверяем авторизацию + if (!token.value) { + console.log('[ProfileView] Токен отсутствует, авторизация не выполнена'); + error.value = "Вы не авторизованы для просмотра этой страницы."; + return; } + + // Если у нас уже есть данные пользователя в хранилище, используем их + if (authUserFromStore.value && Object.keys(authUserFromStore.value).length > 0) { + console.log('[ProfileView] Использую данные профиля из хранилища:', authUserFromStore.value); + profileData.value = { ...authUserFromStore.value }; + } else { + // Иначе делаем прямой запрос к API, минуя fetchUser + console.log('[ProfileView] Данных в хранилище нет, делаю прямой запрос к API'); + const response = await api.getMe(); + console.log('[ProfileView] Ответ от API /auth/me:', response.data); + + // Сохраняем данные пользователя локально + profileData.value = response.data; + } + + console.log('[ProfileView] Данные профиля успешно загружены:', profileData.value); } catch (err) { - console.error('[ProfileView] Ошибка при вызове fetchUser:', err); + console.error('[ProfileView] Ошибка при загрузке профиля:', err); error.value = (err.response && err.response.data && err.response.data.message) - ? err.response.data.message - : 'Не удалось загрузить данные профиля. Попробуйте позже.'; + ? err.response.data.message + : 'Не удалось загрузить данные профиля. Попробуйте позже.'; } finally { - loading.value = false; + // Всегда сбрасываем индикаторы загрузки + console.log('[ProfileView] Завершение загрузки профиля, сброс индикаторов загрузки'); + loading.value = false; initialLoading.value = false; } };