Загрузка истории...
)} {!loading && requests.length === 0 && !error && (История модерации пуста
)} {requests.map((req) => ( ))}"use client"; import React, { useEffect, useState } from "react"; import { FaBell, FaUser } from "react-icons/fa"; import TabBar from "../components/TabBar"; import ModeratorRequestModal from "../components/ModeratorRequestDetailsModal"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL; const statusMap = { approved: { label: "Принята", color: "#94E067" }, rejected: { label: "Отклонена", color: "#E06767" }, }; const HistoryRequestModeratorPage = () => { const [requests, setRequests] = useState([]); const [selectedRequest, setSelectedRequest] = useState(null); const [moderatorName, setModeratorName] = useState("Модератор"); const [loading, setLoading] = useState(true); const [error, setError] = 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) return; const token = getAccessToken(); if (!token) return; try { const res = await fetch(`${API_BASE}/users/me`, { headers: { Accept: "application/json", Authorization: `Bearer ${token}`, }, }); if (!res.ok) return; const data = await res.json(); const fullName = [data.first_name, data.last_name].filter(Boolean).join(" ").trim() || data.email; setModeratorName(fullName); } catch { // дефолт остаётся } }; fetchProfile(); }, []); // история модерации: только approved / rejected useEffect(() => { const fetchHistory = 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}/moderation/requests/my`, { method: "GET", headers: { Accept: "application/json", Authorization: `Bearer ${token}`, }, }); const text = await res.text(); let data = null; if (text) { try { data = JSON.parse(text); } catch { data = null; } } if (!res.ok) { let msg = "Не удалось загрузить историю заявок"; if (data && typeof data === "object" && data.error) { msg = data.error; } else if (text) { msg = text; } setError(msg); setLoading(false); return; } const list = Array.isArray(data) ? data : []; // status: { request_status: "approved" | "rejected", valid: true } const filtered = list.filter((item) => { const s = String(item.status?.request_status || "").toLowerCase(); return s === "approved" || s === "rejected"; }); const mapped = filtered.map((item) => { const rawStatus = String( item.status?.request_status || "" ).toLowerCase(); const m = statusMap[rawStatus] || { label: rawStatus || "Неизвестен", color: "#E2E2E2", }; const created = new Date(item.created_at); const date = created.toLocaleDateString("ru-RU"); const time = created.toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit", }); return { id: item.id, title: item.title, description: item.description, status: m.label, statusColor: m.color, date, time, createdAt: date, fullName: item.requester_name, rejectReason: item.moderation_comment || "", address: item.city ? `${item.city}, ${item.address}` : item.address, rawStatus, // "approved" | "rejected" }; }); setRequests(mapped); setLoading(false); } catch (e) { setError(e.message || "Ошибка сети"); setLoading(false); } }; fetchHistory(); }, []); const handleOpen = (req) => { // пробрасываем rawStatus, чтобы модалка знала настоящий статус setSelectedRequest({ ...req, status: req.rawStatus, }); }; const handleClose = () => { setSelectedRequest(null); }; const handleModeratedUpdate = (updated) => { setRequests((prev) => prev.map((r) => r.id === updated.id ? { ...r, rawStatus: updated.status } : r ) ); }; return (
{moderatorName}
{error}
)} {/* Список заявок */}Загрузка истории...
)} {!loading && requests.length === 0 && !error && (История модерации пуста
)} {requests.map((req) => ( ))}