фикс
This commit is contained in:
parent
c761bc4b9c
commit
c9e107a4ec
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user