"use client"; import React, { useEffect, useState } from "react"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL; // Статус ИМЕННО ОТКЛИКА волонтёра (ResponseStatus) const responseStatusMap = { pending: { label: "Ожидает ответа", color: "#E9D171" }, accepted: { label: "Принят", color: "#94E067" }, rejected: { label: "Отклонён", color: "#FF8282" }, cancelled: { label: "Отменён", color: "#FF8282" }, }; const VolunteerRequestDetailsModal = ({ request, onClose }) => { const [details, setDetails] = useState(null); const [loading, setLoading] = useState(true); const [loadError, setLoadError] = useState(""); // статус отклика (из списка /responses/my) const responseRawStatus = String( request.rawStatus || request.status || "" ).toLowerCase(); const responseStatus = responseStatusMap[responseRawStatus] || { label: "Неизвестен", color: "#E2E2E2" }; const isAccepted = responseRawStatus === "accepted"; const isDone = false; // для волонтёра нет completed в ResponseStatus const isInProgress = isAccepted; // принятый отклик ~ «в процессе» 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 fetchDetails = async () => { if (!API_BASE) { setLoadError("API_BASE_URL не задан"); setLoading(false); return; } const token = getAccessToken(); if (!token) { setLoadError("Вы не авторизованы"); setLoading(false); return; } try { const res = await fetch( `${API_BASE}/requests/${request.requestId || request.request_id || request.id}`, { 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; } setLoadError(msg); setLoading(false); return; } setDetails(data); setLoading(false); } catch (e) { setLoadError(e.message || "Ошибка сети"); setLoading(false); } }; fetchDetails(); }, [request.requestId, request.request_id, request.id]); if (loading) { return (

Загрузка заявки...

); } if (loadError || !details) { return (

{loadError || "Заявка не найдена"}

); } // Тип заявки из RequestDetail const requestTypeName = details.request_type?.name || "Не указан"; const urgencyText = (() => { switch (details.urgency) { case "low": return "Низкая"; case "medium": return "Средняя"; case "high": return "Высокая"; case "urgent": return "Срочно"; default: return null; } })(); const place = [details.address, details.city].filter(Boolean).join(", "); const requesterName = (details.requester && [details.requester.first_name, details.requester.last_name] .filter(Boolean) .join(" ") .trim()) || details.requester?.email || "Заявитель"; const created = details.created_at ? new Date(details.created_at) : null; const createdDate = created ? created.toLocaleDateString("ru-RU") : ""; const createdTime = created ? created.toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit", }) : ""; let deadlineText = "Не указано"; if (details.desired_completion_date) { const d = new Date(details.desired_completion_date); if (!Number.isNaN(d.getTime())) { deadlineText = d.toLocaleDateString("ru-RU", { day: "2-digit", month: "2-digit", year: "numeric", }); } } return (
{/* Хедер */}

Заявка от {createdDate}

{/* Карточка */}
{/* Статус ОТКЛИКА + дата/время */}
{responseStatus.label}

{createdDate}

{createdTime}

{/* Название задачи */}

{details.title}

{/* Полная информация о заявке */}

Тип: {requestTypeName}

Заявитель: {requesterName}

Адрес: {place || "Не указан"}

{urgencyText &&

Срочность: {urgencyText}

} {details.contact_phone &&

Телефон: {details.contact_phone}

} {details.contact_notes && (

Комментарий к контакту: {details.contact_notes}

)}

Выполнить до: {deadlineText}

{/* Описание */} {details.description && (

{details.description}

)} {/* Блок для принятых откликов */} {(isAccepted || isInProgress || isDone) && details.assigned_volunteer && (

Вы назначены волонтёром

Контакты заявителя: {details.contact_phone || "не указаны"}

)}
); }; export default VolunteerRequestDetailsModal;