"use client"; import React, { useState } from "react"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL; const ModeratorRequestModal = ({ request, onClose, onModerated }) => { const [showRejectPopup, setShowRejectPopup] = useState(false); const [rejectReason, setRejectReason] = useState(""); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(""); // request.status: "pending_moderation" | "approved" | "rejected" const isApproved = request.status === "approved"; const isRejected = request.status === "rejected"; const isPending = request.status === "pending_moderation"; const getAccessToken = () => { if (typeof window === "undefined") return null; const saved = localStorage.getItem("authUser"); const authUser = saved ? JSON.parse(saved) : null; return authUser?.accessToken || null; }; const formatDate = (iso) => { if (!iso) return ""; const d = new Date(iso); return d.toLocaleDateString("ru-RU"); }; const formatTime = (iso) => { if (!iso) return ""; const d = new Date(iso); return d.toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit", }); }; const createdDate = request.date || ""; const createdTime = request.time || ""; const deadlineDate = request.deadlineDate || request.date || ""; const deadlineTime = request.deadlineTime || request.time || ""; const handleApprove = async () => { if (!API_BASE || submitting) return; const token = getAccessToken(); if (!token) { setError("Вы не авторизованы"); return; } console.log("[MODERATION] APPROVE start", { requestId: request.id, statusBefore: request.status, }); try { setSubmitting(true); setError(""); const res = await fetch( `${API_BASE}/moderation/requests/${request.id}/approve`, { method: "POST", headers: { Accept: "application/json", Authorization: `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ comment: null }), } ); console.log("[MODERATION] APPROVE response status", res.status); const text = await res.text(); let data = null; if (text) { try { data = JSON.parse(text); } catch { data = null; } } console.log("[MODERATION] APPROVE response body", data || text); if (!res.ok) { let msg = "Не удалось одобрить заявку"; if (data && typeof data === "object" && data.error) { msg = data.error; } else if (text) { msg = text; } console.log("[MODERATION] APPROVE error", msg); setError(msg); setSubmitting(false); return; } onModerated?.({ ...request, status: "approved", moderationResult: data, }); console.log("[MODERATION] APPROVE success", { requestId: request.id, newStatus: "approved", }); setSubmitting(false); onClose(); } catch (e) { console.log("[MODERATION] APPROVE exception", e); setError(e.message || "Ошибка сети"); setSubmitting(false); } }; const handleRejectConfirm = async () => { if (!API_BASE || submitting) return; const token = getAccessToken(); if (!token) { setError("Вы не авторизованы"); return; } if (!rejectReason.trim()) { setError("Укажите причину отклонения"); return; } console.log("[MODERATION] REJECT start", { requestId: request.id, statusBefore: request.status, reason: rejectReason, }); try { setSubmitting(true); setError(""); const res = await fetch( `${API_BASE}/moderation/requests/${request.id}/reject`, { method: "POST", headers: { Accept: "application/json", Authorization: `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ comment: rejectReason }), } ); console.log("[MODERATION] REJECT response status", res.status); const text = await res.text(); let data = null; if (text) { try { data = JSON.parse(text); } catch { data = null; } } console.log("[MODERATION] REJECT response body", data || text); if (!res.ok) { let msg = "Не удалось отклонить заявку"; if (data && typeof data === "object" && data.error) { msg = data.error; } else if (text) { msg = text; } console.log("[MODERATION] REJECT error", msg); setError(msg); setSubmitting(false); return; } onModerated?.({ ...request, status: "rejected", rejectReason, moderationResult: data, }); console.log("[MODERATION] REJECT success", { requestId: request.id, newStatus: "rejected", }); setShowRejectPopup(false); setSubmitting(false); onClose(); } catch (e) { console.log("[MODERATION] REJECT exception", e); setError(e.message || "Ошибка сети"); setSubmitting(false); } }; return ( <>

Заявка от {createdDate || "—"}

Описание
Дата {createdDate || "—"}
Время {createdTime || "—"}
ФИО

{request.requesterName || "Заявитель"}

{request.address ? `${request.city ? request.city + ", " : ""}${request.address}` : "Адрес не указан"}

{isApproved ? "Принята" : isRejected ? "Отклонена" : "Модерация"}
До {deadlineDate || "—"} {deadlineTime || "—"}

{request.title || "Задача"}

{request.description && (

{request.description}

)} {isRejected && (

Причина отклонения

{request.rejectReason && request.rejectReason.trim().length > 0 ? request.rejectReason : "Причина не указана"}

)} {error && (

{error}

)}
{showRejectPopup && (

Причина