This commit is contained in:
Professional 2025-05-23 23:37:15 +07:00
parent c761bc4b9c
commit c9e107a4ec

View File

@ -419,8 +419,6 @@ const mainPhoto = computed(() => {
const toggleEditMode = async () => { const toggleEditMode = async () => {
// Если сейчас в режиме редактирования и пользователь хочет вернуться в режим просмотра // Если сейчас в режиме редактирования и пользователь хочет вернуться в режим просмотра
if (isEditMode.value) { if (isEditMode.value) {
console.log('[ProfileView] Выход из режима редактирования');
try { try {
// Проверяем, были ли изменения // Проверяем, были ли изменения
const hasChanges = checkForChanges(); const hasChanges = checkForChanges();
@ -428,7 +426,7 @@ const toggleEditMode = async () => {
if (hasChanges) { if (hasChanges) {
console.log('[ProfileView] Сохранение изменений...'); console.log('[ProfileView] Сохранение изменений...');
profileLoading.value = true; // Используем только profileLoading для индикации profileLoading.value = true; // Устанавливаем индикатор загрузки формы
// Подготавливаем данные для отправки на сервер // Подготавливаем данные для отправки на сервер
const dataToUpdate = { ...editableProfileData.value }; const dataToUpdate = { ...editableProfileData.value };
@ -436,9 +434,8 @@ const toggleEditMode = async () => {
// Обрабатываем дату рождения // Обрабатываем дату рождения
if (dataToUpdate.dateOfBirth) { if (dataToUpdate.dateOfBirth) {
try { try {
// Получаем дату в формате ISO с поправкой на часовой пояс
const dateObj = new Date(dataToUpdate.dateOfBirth); const dateObj = new Date(dataToUpdate.dateOfBirth);
if (!isNaN(dateObj.getTime())) { // Проверяем, что дата валидна if (!isNaN(dateObj.getTime())) {
dataToUpdate.dateOfBirth = dateObj.toISOString(); dataToUpdate.dateOfBirth = dateObj.toISOString();
} }
} catch (e) { } catch (e) {
@ -448,12 +445,31 @@ const toggleEditMode = async () => {
// Отправляем запрос на сервер // Отправляем запрос на сервер
const response = await api.updateUserProfile(dataToUpdate); const response = await api.updateUserProfile(dataToUpdate);
console.log('[ProfileView] Ответ от сервера (профиль):', response.data); console.log('[ProfileView] Профиль успешно обновлен:', response.data);
// Обновляем локальные данные напрямую, без вызова fetchUser // Обновляем локальный profileData напрямую, не вызывая fetchUser()
profileData.value = { ...profileData.value, ...dataToUpdate }; profileData.value = {
...profileData.value,
name: dataToUpdate.name,
bio: dataToUpdate.bio,
dateOfBirth: dataToUpdate.dateOfBirth,
gender: dataToUpdate.gender,
location: dataToUpdate.location
};
// Обновляем authUserFromStore напрямую, если он доступен
if (authUserFromStore.value) {
// Копируем новые данные в хранилище авторизации
authUserFromStore.value = {
...authUserFromStore.value,
name: dataToUpdate.name,
bio: dataToUpdate.bio,
dateOfBirth: dataToUpdate.dateOfBirth,
gender: dataToUpdate.gender,
location: dataToUpdate.location
};
}
// Показываем сообщение об успешном сохранении
profileActionSuccess.value = 'Профиль успешно обновлен!'; profileActionSuccess.value = 'Профиль успешно обновлен!';
// Автоматически скрываем сообщение через 3 секунды // Автоматически скрываем сообщение через 3 секунды
@ -468,28 +484,25 @@ const toggleEditMode = async () => {
profileActionError.value = err.response?.data?.message || profileActionError.value = err.response?.data?.message ||
'Произошла ошибка при обновлении профиля. Пожалуйста, попробуйте позже.'; 'Произошла ошибка при обновлении профиля. Пожалуйста, попробуйте позже.';
} finally { } finally {
// В любом случае переключаемся в режим просмотра и сбрасываем состояние загрузки // Переключаемся в режим просмотра и сбрасываем состояние загрузки
isEditMode.value = false; isEditMode.value = false;
profileLoading.value = false; profileLoading.value = false;
clearProfileMessages(); // Гарантированно сбрасываем индикаторы загрузки
loading.value = false;
initialLoading.value = false;
} }
} else { } else {
// Если сейчас в режиме просмотра и пользователь хочет перейти в режим редактирования
console.log('[ProfileView] Вход в режим редактирования');
// Переключаемся в режим редактирования // Переключаемся в режим редактирования
isEditMode.value = true; isEditMode.value = true;
// Копируем данные профиля в редактируемый объект // Копируем данные профиля в редактируемый объект
// Преобразуем формат даты из ISO в yyyy-MM-dd
let formattedDate = ''; let formattedDate = '';
if (profileData.value && profileData.value.dateOfBirth) { if (profileData.value && profileData.value.dateOfBirth) {
try { try {
const date = new Date(profileData.value.dateOfBirth); const date = new Date(profileData.value.dateOfBirth);
formattedDate = date.toISOString().split('T')[0]; // Получаем только yyyy-MM-dd часть formattedDate = date.toISOString().split('T')[0];
} catch (e) { } catch (e) {
console.error('[ProfileView] Ошибка форматирования даты:', e); console.error('[ProfileView] Ошибка форматирования даты:', e);
formattedDate = '';
} }
} }
@ -499,22 +512,20 @@ const toggleEditMode = async () => {
dateOfBirth: formattedDate, dateOfBirth: formattedDate,
gender: profileData.value?.gender || '', gender: profileData.value?.gender || '',
location: { location: {
city: profileData.value?.location?.city || '', city: profileData.value?.location?.city || ''
} }
}; };
// Важно! Сохраняем JSON-копию оригинальных данных для последующего сравнения // Сохраняем копию для сравнения
originalProfileData = JSON.stringify(editableProfileData.value); originalProfileData = JSON.stringify(editableProfileData.value);
console.log('[ProfileView] Сохранены оригинальные данные для сравнения:', originalProfileData);
// Устанавливаем поисковый запрос города // Устанавливаем поля поиска
if (profileData.value?.location?.city) { if (profileData.value?.location?.city) {
citySearchQuery.value = profileData.value.location.city; citySearchQuery.value = profileData.value.location.city;
} else { } else {
citySearchQuery.value = ''; citySearchQuery.value = '';
} }
// Устанавливаем поисковый запрос пола
if (profileData.value?.gender) { if (profileData.value?.gender) {
const genderOption = genderOptions.value.find(option => option.value === profileData.value.gender); const genderOption = genderOptions.value.find(option => option.value === profileData.value.gender);
if (genderOption) { if (genderOption) {
@ -664,7 +675,8 @@ const uploadPhotos = async (files) => {
let errorCount = 0; let errorCount = 0;
photoActionLoading.value = true; photoActionLoading.value = true;
clearMessages(); clearMessages();
try {
try {
let imageCompression; let imageCompression;
try { try {
// Импортируем библиотеку для сжатия изображений динамически // Импортируем библиотеку для сжатия изображений динамически
@ -702,10 +714,37 @@ const uploadPhotos = async (files) => {
// Увеличиваем счетчик успешных загрузок // Увеличиваем счетчик успешных загрузок
successCount++; successCount++;
// Обновляем данные пользователя после каждой успешной загрузки // Вместо вызова fetchUser, получаем данные напрямую и обновляем локальный profileData
await fetchUser(); if (response.data && response.data.photos) {
// Обновляем фотографии в локальном profileData
profileData.value = {
...profileData.value,
photos: response.data.photos
};
// Обновляем глобальный authUserFromStore
if (authUserFromStore.value) {
authUserFromStore.value = {
...authUserFromStore.value,
photos: response.data.photos
};
}
} else {
// Если по какой-то причине фотографий нет в ответе, сделаем отдельный запрос
// для получения обновленных данных пользователя, но не через fetchUser
const userResponse = await api.getMe();
if (userResponse.data) {
profileData.value = userResponse.data;
// Также обновим глобальное хранилище
if (authUserFromStore.value) {
authUserFromStore.value = userResponse.data;
}
}
}
console.log(`[ProfileView] Данные пользователя обновлены после загрузки фото ${originalFile.name}`); console.log(`[ProfileView] Данные пользователя обновлены после загрузки фото ${originalFile.name}`);
} catch (err) { } catch (err) {
console.error(`[ProfileView] Ошибка при сжатии или загрузке фото ${originalFile.name}:`, err); console.error(`[ProfileView] Ошибка при сжатии или загрузке фото ${originalFile.name}:`, err);
errorCount++; errorCount++;
@ -714,6 +753,8 @@ const uploadPhotos = async (files) => {
photoActionError.value = 'Ошибка сети при загрузке фото. Пожалуйста, проверьте подключение к интернету.'; photoActionError.value = 'Ошибка сети при загрузке фото. Пожалуйста, проверьте подключение к интернету.';
} else if (err.response && err.response.status === 413) { } else if (err.response && err.response.status === 413) {
photoActionError.value = 'Файл слишком большой. Пожалуйста, выберите фото меньшего размера.'; photoActionError.value = 'Файл слишком большой. Пожалуйста, выберите фото меньшего размера.';
} else {
photoActionError.value = 'Произошла ошибка при загрузке фото';
} }
} }
} }
@ -809,13 +850,18 @@ const setAsMainPhoto = async (photoId) => {
// Обновляем локальные данные сразу для быстрого отклика // Обновляем локальные данные сразу для быстрого отклика
if (profileData.value && profileData.value.photos) { if (profileData.value && profileData.value.photos) {
// Сначала сбрасываем флаг isProfilePhoto для всех фото
profileData.value.photos.forEach(photo => { profileData.value.photos.forEach(photo => {
photo.isProfilePhoto = photo._id === photoId; photo.isProfilePhoto = photo._id === photoId;
}); });
}
// Затем получаем актуальные данные с сервера // Обновляем данные и в глобальном хранилище если оно доступно
await fetchUser(); if (authUserFromStore.value && authUserFromStore.value.photos) {
authUserFromStore.value.photos.forEach(photo => {
photo.isProfilePhoto = photo._id === photoId;
});
}
}
photoActionSuccess.value = response.data.message || 'Главное фото обновлено.'; photoActionSuccess.value = response.data.message || 'Главное фото обновлено.';
@ -861,10 +907,14 @@ const executeDeletePhoto = async () => {
profileData.value.photos = profileData.value.photos.filter( profileData.value.photos = profileData.value.photos.filter(
photo => photo._id !== photoToDeleteId.value photo => photo._id !== photoToDeleteId.value
); );
}
// Затем получаем актуальные данные с сервера // Также обновляем глобальное хранилище
await fetchUser(); if (authUserFromStore.value && authUserFromStore.value.photos) {
authUserFromStore.value.photos = authUserFromStore.value.photos.filter(
photo => photo._id !== photoToDeleteId.value
);
}
}
photoActionSuccess.value = response.data.message || 'Фотография удалена.'; photoActionSuccess.value = response.data.message || 'Фотография удалена.';
closeDeleteModal(); closeDeleteModal();