Загрузка профиля...
)} {!loading && ( <> {/* Аватар */}{error}
)} {saveMessage && ({saveMessage}
)} > )}"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 ModeratorProfileSettingsPage = () => { const router = useRouter(); const [avatarUrl, setAvatarUrl] = useState(""); const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [email, setEmail] = useState(""); const [phone, setPhone] = useState(""); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); const [saveMessage, setSaveMessage] = useState(""); const getAccessToken = () => { if (typeof window === "undefined") return null; const saved = localStorage.getItem("authUser"); const authUser = saved ? JSON.parse(saved) : null; return authUser?.accessToken || null; }; // загрузить профиль useEffect(() => { const fetchProfile = async () => { if (!API_BASE) { setError("API_BASE_URL не задан"); setLoading(false); return; } const token = getAccessToken(); if (!token) { setError("Вы не авторизованы"); setLoading(false); return; } try { const res = await fetch(`${API_BASE}/users/me`, { headers: { Accept: "application/json", Authorization: `Bearer ${token}`, }, }); 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[web:598] setFirstName(data.first_name || ""); setLastName(data.last_name || ""); setEmail(data.email || ""); setPhone(data.phone || ""); setAvatarUrl(data.avatar_url || ""); setLoading(false); } catch (e) { setError(e.message || "Ошибка сети"); setLoading(false); } }; fetchProfile(); }, []); const handleSave = async (e) => { e.preventDefault(); if (!API_BASE) return; const token = getAccessToken(); if (!token) { setError("Вы не авторизованы"); return; } try { setSaving(true); setError(""); setSaveMessage(""); const body = { first_name: firstName || null, last_name: lastName || null, phone: phone || null, }; // UpdateProfileInput[web:598] const res = await fetch(`${API_BASE}/users/me`, { method: "PATCH", headers: { "Content-Type": "application/json", Accept: "application/json", Authorization: `Bearer ${token}`, }, 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); setSaving(false); return; } const updated = await res.json(); setSaveMessage("Изменения сохранены"); setSaving(false); setFirstName(updated.first_name || ""); setLastName(updated.last_name || ""); setPhone(updated.phone || ""); } catch (e) { setError(e.message || "Ошибка сети"); setSaving(false); } }; const fullName = [firstName, lastName].filter(Boolean).join(" "); return (
Загрузка профиля...
)} {!loading && ( <> {/* Аватар */}{error}
)} {saveMessage && ({saveMessage}
)} > )}