Загрузка заявок...
)} {!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 RequestDetailsModal from "../components/ValounterRequestDetailsModal"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL; const statusMap = { pending_moderation: { label: "На модерации", color: "#E9D171" }, approved: { label: "Принята", color: "#94E067" }, inprogress: { label: "В процессе", color: "#E971E1" }, completed: { label: "Выполнена", color: "#71A5E9" }, cancelled: { label: "Отменена", color: "#FF8282" }, rejected: { label: "Отклонена", color: "#FF8282" }, }; const HistoryRequestPage = () => { const [userName, setUserName] = useState("Волонтёр"); const [requests, setRequests] = useState([]); const [selectedRequest, setSelectedRequest] = useState(null); const [error, setError] = useState(""); const [loading, setLoading] = useState(true); 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; setUserName(fullName); } catch { // } }; fetchProfile(); }, []); // история откликов волонтёра: /responses/my useEffect(() => { const fetchVolunteerRequests = 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}/responses/my`, { 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: { response_status: "...", valid: true } const mapped = list.map((item) => { const rawStatus = String( item.status?.response_status || item.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.request_id ?? item.id, title: item.title, description: item.description, status: m.label, statusColor: m.color, date, time, createdAt: date, address: item.city ? `${item.city}, ${item.address}` : item.address, requesterName: item.requester_name, requestTypeName: item.request_type_name && typeof item.request_type_name === "object" ? item.request_type_name.name : item.request_type_name, rawStatus, // настоящий статус для модалки }; }); setRequests(mapped); setLoading(false); } catch (e) { setError(e.message || "Ошибка сети"); setLoading(false); } }; fetchVolunteerRequests(); }, []); const handleOpen = (req) => { // если модалке нужен сырой статус — пробрасываем его так же, как в референсе setSelectedRequest({ ...req, status: req.rawStatus, }); }; const handleClose = () => { setSelectedRequest(null); }; return (
{userName}
{error}
)} {/* Список заявок */}Загрузка заявок...
)} {!loading && requests.length === 0 && !error && (У вас пока нет заявок
)} {requests.map((req) => ( ))}