"use client"; import React, { useState, useEffect } from "react"; import { FaStar } from "react-icons/fa"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL; const RequestDetailsModal = ({ request, onClose }) => { const [details, setDetails] = useState(null); // RequestDetail const [loading, setLoading] = useState(true); const [loadError, setLoadError] = useState(""); const isDone = request.status === "Выполнена"; const isRejected = request.status === "Отклонена"; const [rating, setRating] = useState(0); const [review, setReview] = useState(""); const [rejectFeedback, setRejectFeedback] = useState(""); // для приёма отклика const [acceptLoading, setAcceptLoading] = useState(false); const [acceptError, setAcceptError] = useState(""); const [acceptSuccess, setAcceptSuccess] = useState(""); // подгружаем детальную заявку /requests/{id} useEffect(() => { const fetchDetails = async () => { if (!API_BASE) { setLoadError("API_BASE_URL не задан"); setLoading(false); return; } const saved = typeof window !== "undefined" ? localStorage.getItem("authUser") : null; const authUser = saved ? JSON.parse(saved) : null; const accessToken = authUser?.accessToken; if (!accessToken) { setLoadError("Вы не авторизованы"); setLoading(false); return; } try { const res = await fetch(`${API_BASE}/requests/${request.id}`, { headers: { Accept: "application/json", Authorization: `Bearer ${accessToken}`, }, }); if (!res.ok) { let msg = "Не удалось загрузить заявку"; try { const data = await res.json(); if (data.error) msg = data.error; } catch { const text = await res.text(); if (text) msg = text; } setLoadError(msg); setLoading(false); return; } const data = await res.json(); // RequestDetail setDetails(data); setLoading(false); } catch (e) { setLoadError(e.message || "Ошибка сети"); setLoading(false); } }; fetchDetails(); }, [request.id]); const handleStarClick = (value) => { setRating(value); }; const handleSubmit = () => { console.log("Оставить отзыв:", { id: request.id, status: request.status, rating, review, rejectFeedback, }); onClose(); }; // приём отклика волонтёра: POST /requests/{id}/responses/{response_id}/accept const handleAcceptResponse = async (responseId) => { if (!API_BASE || !request.id || !responseId) { setAcceptError("Некорректные данные для приёма отклика"); return; } const saved = typeof window !== "undefined" ? localStorage.getItem("authUser") : null; const authUser = saved ? JSON.parse(saved) : null; const accessToken = authUser?.accessToken; if (!accessToken) { setAcceptError("Вы не авторизованы"); return; } try { setAcceptLoading(true); setAcceptError(""); setAcceptSuccess(""); const res = await fetch( `${API_BASE}/requests/${request.id}/responses/${responseId}/accept`, { method: "POST", headers: { Accept: "application/json", Authorization: `Bearer ${accessToken}`, }, } ); if (!res.ok) { let msg = "Не удалось принять отклик"; try { const data = await res.json(); if (data.error) msg = data.error; } catch { const text = await res.text(); if (text) msg = text; } setAcceptError(msg); setAcceptLoading(false); return; } await res.json(); // { success, message, ... } setAcceptSuccess("Волонтёр принят на заявку"); setAcceptLoading(false); } catch (e) { setAcceptError(e.message || "Ошибка сети"); setAcceptLoading(false); } }; const fullDescription = details?.description || request.description || "Описание отсутствует"; const addressLine = details ? [details.address, details.city].filter(Boolean).join(", ") : null; const requesterName = details?.requester?.first_name ? `${details.requester.first_name} ${details.requester.last_name || ""}`.trim() : details?.requester?.email; const requestTypeName = details?.request_type?.name; // здесь предполагаем, что детали заявки содержат массив responses, // либо ты добавишь его на бэке к RequestDetail const responses = details?.responses || []; return (
Заявка от {request.createdAt}
{request.date}
{request.time}
{request.title}
{/* Блок с полной информацией о заявке */}Загрузка информации о заявке...
)} {loadError && !loading && ({loadError}
)} {!loading && !loadError && ( <> {requestTypeName && (Тип: {requestTypeName}
)} {addressLine && (Адрес: {addressLine}
)} {details?.urgency && (Срочность:{" "} {details.urgency}
)} {requesterName && (Заявитель:{" "} {requesterName}
)} {details?.contact_phone && (Телефон:{" "} {details.contact_phone}
)} {details?.contact_notes && (Комментарий к контакту:{" "} {details.contact_notes}
)}Описание:{" "} {fullDescription}
> )}Отклики волонтёров
{responses.map((resp) => (Волонтёр:{" "} {resp.volunteer_name || resp.volunteername || resp.volunteer?.name}
{resp.message && (Сообщение:{" "} {resp.message}
)}{acceptError}
)} {acceptSuccess && ({acceptSuccess}
)}Отзыв
Причина отказа
{request.rejectReason}
Ваш комментарий
Оценить волонтера