{error}
)} {success && ({success}
)} {loading && !error && (Загрузка профиля...
)} {/* Аватар (пока локально, без API) */}"use client"; import React, { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { FaUserCircle } from "react-icons/fa"; import TabBar from "../components/TabBar"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL; const ProfileSettingsPage = () => { const router = useRouter(); const [avatarUrl, setAvatarUrl] = useState(""); const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [email, setEmail] = useState(""); const [phone, setPhone] = useState(""); const [address, setAddress] = useState(""); const [city, setCity] = useState(""); const [bio, setBio] = useState(""); const [loading, setLoading] = useState(true); const [saveLoading, setSaveLoading] = useState(false); const [error, setError] = useState(""); const [success, setSuccess] = useState(""); useEffect(() => { const fetchProfile = async () => { if (!API_BASE) { setError("API_BASE_URL не задан"); setLoading(false); return; } const saved = typeof window !== "undefined" ? localStorage.getItem("authUser") : null; const authUser = saved ? JSON.parse(saved) : null; const accessToken = authUser?.accessToken; if (!accessToken) { setError("Вы не авторизованы"); setLoading(false); return; } try { const res = await fetch(`${API_BASE}/users/me`, { headers: { Accept: "application/json", Authorization: `Bearer ${accessToken}`, }, }); if (!res.ok) { let msg = "Не удалось загрузить профиль"; try { const data = await res.json(); if (data.error) msg = data.error; } catch { const text = await res.text(); if (text) msg = text; } setError(msg); setLoading(false); return; } const data = await res.json(); // UserProfile[file:519] setFirstName(data.first_name || ""); setLastName(data.last_name || ""); setEmail(data.email || ""); setPhone(data.phone || ""); setAddress(data.address || ""); setCity(data.city || ""); setBio(data.bio || ""); setAvatarUrl(data.avatar_url || ""); setLoading(false); } catch (e) { setError(e.message || "Ошибка сети"); setLoading(false); } }; fetchProfile(); }, []); const handleSave = async (e) => { e.preventDefault(); if (!API_BASE) return; setError(""); setSuccess(""); setSaveLoading(true); const saved = typeof window !== "undefined" ? localStorage.getItem("authUser") : null; const authUser = saved ? JSON.parse(saved) : null; const accessToken = authUser?.accessToken; if (!accessToken) { setError("Вы не авторизованы"); setSaveLoading(false); return; } const body = { first_name: firstName || undefined, last_name: lastName || undefined, phone: phone || undefined, bio: bio || undefined, address: address || undefined, city: city || undefined, }; try { const res = await fetch(`${API_BASE}/users/me`, { method: "PATCH", headers: { "Content-Type": "application/json", Accept: "application/json", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify(body), }); if (!res.ok) { let msg = "Не удалось сохранить профиль"; try { const data = await res.json(); if (data.error) msg = data.error; } catch { const text = await res.text(); if (text) msg = text; } setError(msg); setSaveLoading(false); return; } setSuccess("Профиль успешно сохранён"); setSaveLoading(false); } catch (err) { setError(err.message || "Ошибка сети"); setSaveLoading(false); } }; const fullName = [firstName, lastName].filter(Boolean).join(" "); return (
{error}
)} {success && ({success}
)} {loading && !error && (Загрузка профиля...
)} {/* Аватар (пока локально, без API) */}