"use client"; import React, { useEffect, useState } from "react"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL; const VolunteerRequestDetailsModal = ({ request, onClose }) => { const [details, setDetails] = useState(null); const [loading, setLoading] = useState(true); const [loadError, setLoadError] = useState(""); const normalizedStatus = String(request.rawStatus || request.status || "").toLowerCase(); const isAccepted = normalizedStatus === "accepted"; const isInProgress = normalizedStatus === "in_progress" || normalizedStatus === "inprogress" || isAccepted; const isDone = normalizedStatus === "completed"; 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.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.request_id, request.id]); if (loading) { return (

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

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

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

); } 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", }); } } const statusColorMap = { pending_moderation: "#E9D171", approved: "#94E067", in_progress: "#E971E1", completed: "#71A5E9", cancelled: "#FF8282", rejected: "#FF8282", }; const statusLabelMap = { pending_moderation: "На модерации", approved: "Принята", in_progress: "В процессе", completed: "Выполнена", cancelled: "Отменена", rejected: "Отклонена", }; const rawReqStatus = String(details.status || "").toLowerCase(); const badgeColor = statusColorMap[rawReqStatus] || "#E2E2E2"; const statusLabel = statusLabelMap[rawReqStatus] || "Неизвестен"; return (
{/* Хедер */}

Заявка от {createdDate}

{/* Карточка */}
{/* Статус + дата/время */}
{statusLabel}

{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}

)} {/* Доп. блоки для волонтёра по желанию: - данные назначенного волонтёра details.assigned_volunteer - статус отклика request.rawStatus / request.status */} {(isAccepted || isInProgress || isDone) && details.assigned_volunteer && (

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

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

)}
); }; export default VolunteerRequestDetailsModal;