diff --git a/modules/frontend/src/pages/SettingsPage/SettingsPage.tsx b/modules/frontend/src/pages/SettingsPage/SettingsPage.tsx index f525baf..c10085a 100644 --- a/modules/frontend/src/pages/SettingsPage/SettingsPage.tsx +++ b/modules/frontend/src/pages/SettingsPage/SettingsPage.tsx @@ -38,8 +38,7 @@ export const SettingsPage: React.FC = () => { setDispName(res.data.disp_name || ""); setUserDesc(res.data.user_desc || ""); setAvatarId(res.data.image?.id ?? null); - const path = res.data.image?.image_path; - setAvatarUrl(path ? (path.startsWith('http') ? path : `/media/${path}`) : null); + setAvatarUrl(res.data.image?.image_path ?? null); } } catch (err) { console.error("Failed to fetch user:", err); @@ -55,46 +54,40 @@ const handleFileChange = async (e: React.ChangeEvent) => { setUploading(true); setError(null); - setSuccess(null); + // Создаем стандартный объект FormData const formData = new FormData(); + // Ключ "image" соответствует вашему OpenAPI formData.append("image", file); try { - // 1. Загружаем файл на сервер (POST) - const uploadRes = await fetch("/api/v1/media/upload", { + // Используем нативный fetch вместо сгенерированного postMediaUpload + const response = await fetch("/api/v1/media/upload", { method: "POST", body: formData, headers: { + // Важно: НЕ УКАЗЫВАЕМ Content-Type. + // Браузер сам добавит multipart/form-data и сгенерирует boundary. "X-XSRF-TOKEN": xsrfToken || "", }, }); - if (!uploadRes.ok) throw new Error("Failed to upload image to storage"); + if (!response.ok) { + const errorText = await response.text(); + throw new Error(errorText || "Upload failed"); + } - const uploadData = await uploadRes.json(); - const newAvatarId = uploadData.id; + // Ответ должен соответствовать схеме Image.yaml + const data = await response.json(); - 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!"); + if (data && data.id) { + setAvatarId(data.id); + setAvatarUrl(data.image_path ?? null); + setSuccess("Image uploaded!"); } } catch (err: any) { - console.error("Upload & Patch error:", err); - setError(err.message || "Failed to update avatar"); + console.error("Upload error:", err); + setError(err.message || "Failed to upload image"); } finally { setUploading(false); }