import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { askQuestion } from "../api/standards"; import "./StandardModal.css"; export default function StandardModal({ standard, onClose }) { const { t } = useTranslation(); const modalRef = useRef(null); const closeBtnRef = useRef(null); const inputRef = useRef(null); const [question, setQuestion] = useState(""); const [messages, setMessages] = useState([]); const [asking, setAsking] = useState(false); const [aiError, setAiError] = useState(null); const chatEndRef = useRef(null); useEffect(() => { closeBtnRef.current?.focus(); const onKey = (e) => e.key === "Escape" && onClose(); document.addEventListener("keydown", onKey); document.body.style.overflow = "hidden"; return () => { document.removeEventListener("keydown", onKey); document.body.style.overflow = ""; }; }, [onClose]); useEffect(() => { chatEndRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages, asking]); const handleBackdrop = (e) => { if (e.target === e.currentTarget) onClose(); }; const handleAsk = async (e) => { e.preventDefault(); const q = question.trim(); if (!q || asking) return; setMessages((prev) => [...prev, { role: "user", text: q }]); setQuestion(""); setAsking(true); setAiError(null); try { const { answer } = await askQuestion({ standard_id: standard.standard_id, question: q }); setMessages((prev) => [...prev, { role: "ai", text: answer }]); } catch (err) { setAiError(err.message || t("common.serverError")); } finally { setAsking(false); setTimeout(() => inputRef.current?.focus(), 50); } }; if (!standard) return null; const sections = Object.entries(standard.key_sections || {}); return (
{t("modal.summary")}
{standard.summary}
{t("modal.keywords")}
{t("modal.keySections")}
{name}
{text}
{t("modal.askAI")}
{messages.length > 0 && ({m.text}
{aiError}
)}