"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 : []; // RequestListItem: id, title, description, address, city, urgency, status, requester_name, request_type_name, created_at // оставляем только approved / rejected const filtered = list.filter( (item) => item.status === "approved" || item.status === "rejected" ); const mapped = filtered.map((item) => { const m = statusMap[item.status] || { label: item.status, 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, address: item.city ? `${item.city}, ${item.address}` : item.address, rawStatus: item.status, // "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 (
{/* Header */}

{moderatorName}

История заявок

{error && (

{error}

)} {/* Список заявок */}
{loading && (

Загрузка истории...

)} {!loading && requests.length === 0 && !error && (

История модерации пуста

)} {requests.map((req) => ( ))}
{selectedRequest && ( )}
); }; export default HistoryRequestModeratorPage;