"use client"; import { useEffect, useState, useRef } from "react"; import { createPortal } from "react-dom"; import PropTypes from "prop-types"; import { marked } from "marked"; import { GITHUB_CONFIG } from "@/shared/constants/config"; marked.setOptions({ gfm: true, breaks: true }); export default function ChangelogModal({ isOpen, onClose }) { const [html, setHtml] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const modalRef = useRef(null); useEffect(() => { if (!isOpen || html) return; setLoading(true); setError(""); fetch(GITHUB_CONFIG.changelogUrl) .then((res) => { if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.text(); }) .then((md) => setHtml(marked.parse(md))) .catch((err) => setError(err.message || "Failed to load")) .finally(() => setLoading(false)); }, [isOpen, html]); useEffect(() => { const handleClickOutside = (e) => { if (modalRef.current && !modalRef.current.contains(e.target)) { onClose(); } }; if (isOpen) { document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); } }, [isOpen, onClose]); if (!isOpen || typeof document === "undefined") return null; return createPortal(