фикс бесконечной загрузки

This commit is contained in:
Professional 2025-05-23 23:28:06 +07:00
parent e9aaad9d7c
commit c761bc4b9c

View File

@ -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;
}
};