From fd45657304fadfdacca56dafdc243efb9217e4ac Mon Sep 17 00:00:00 2001 From: Iron_Felix Date: Sat, 20 Dec 2025 03:45:01 +0300 Subject: [PATCH] fix --- .../src/pages/SettingsPage/SettingsPage.tsx | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/modules/frontend/src/pages/SettingsPage/SettingsPage.tsx b/modules/frontend/src/pages/SettingsPage/SettingsPage.tsx index c10085a..f525baf 100644 --- a/modules/frontend/src/pages/SettingsPage/SettingsPage.tsx +++ b/modules/frontend/src/pages/SettingsPage/SettingsPage.tsx @@ -38,7 +38,8 @@ export const SettingsPage: React.FC = () => { setDispName(res.data.disp_name || ""); setUserDesc(res.data.user_desc || ""); setAvatarId(res.data.image?.id ?? null); - setAvatarUrl(res.data.image?.image_path ?? null); + const path = res.data.image?.image_path; + setAvatarUrl(path ? (path.startsWith('http') ? path : `/media/${path}`) : null); } } catch (err) { console.error("Failed to fetch user:", err); @@ -54,40 +55,46 @@ const handleFileChange = async (e: React.ChangeEvent) => { setUploading(true); setError(null); + setSuccess(null); - // Создаем стандартный объект FormData const formData = new FormData(); - // Ключ "image" соответствует вашему OpenAPI formData.append("image", file); try { - // Используем нативный fetch вместо сгенерированного postMediaUpload - const response = await fetch("/api/v1/media/upload", { + // 1. Загружаем файл на сервер (POST) + const uploadRes = await fetch("/api/v1/media/upload", { method: "POST", body: formData, headers: { - // Важно: НЕ УКАЗЫВАЕМ Content-Type. - // Браузер сам добавит multipart/form-data и сгенерирует boundary. "X-XSRF-TOKEN": xsrfToken || "", }, }); - if (!response.ok) { - const errorText = await response.text(); - throw new Error(errorText || "Upload failed"); - } + if (!uploadRes.ok) throw new Error("Failed to upload image to storage"); - // Ответ должен соответствовать схеме Image.yaml - const data = await response.json(); + const uploadData = await uploadRes.json(); + const newAvatarId = uploadData.id; - if (data && data.id) { - setAvatarId(data.id); - setAvatarUrl(data.image_path ?? null); - setSuccess("Image uploaded!"); + if (newAvatarId) { + // 2. СРАЗУ отправляем PATCH запрос для обновления профиля пользователя + await updateUser({ + path: { user_id: userId }, + body: { + avatar_id: newAvatarId, // Привязываем новый ID к юзеру + }, + headers: { "X-XSRF-TOKEN": xsrfToken }, + }); + + // 3. Обновляем локальный стейт для отображения + setAvatarId(newAvatarId); + const path = uploadData.image_path; + setAvatarUrl(path ? (path.startsWith("/") ? path : `/media/${path}`) : null); + + setSuccess("Avatar updated successfully!"); } } catch (err: any) { - console.error("Upload error:", err); - setError(err.message || "Failed to upload image"); + console.error("Upload & Patch error:", err); + setError(err.message || "Failed to update avatar"); } finally { setUploading(false); }