import React from 'react'; export default function ComfyUI() { const [isDark, setIsDark] = React.useState(true); const [available, setAvailable] = React.useState(false); const [message, setMessage] = React.useState('正在检查外部 ComfyUI...'); const iframeRef = React.useRef(null); const openFullscreen = () => { window.open('/api/comfyui/proxy/', '_blank', 'noopener,noreferrer'); }; const reloadFrame = () => { if (iframeRef.current) { iframeRef.current.src = '/api/comfyui/proxy/'; } }; React.useEffect(() => { const el = document.documentElement; const check = () => setIsDark(el.getAttribute('data-theme') !== 'light'); check(); const mo = new MutationObserver(check); mo.observe(el, { attributes: true, attributeFilter: ['data-theme'] }); return () => mo.disconnect(); }, []); React.useEffect(() => { let cancelled = false; const controller = new AbortController(); void fetch('/api/comfyui/proxy/', { method: 'GET', signal: controller.signal }) .then((response) => { if (cancelled) return; setAvailable(response.ok); setMessage(response.ok ? '' : '外部 ComfyUI 不可达。请在 config.toml 中配置 comfyui.base_url,或使用工作流。'); }) .catch((err) => { if (cancelled || err?.name === 'AbortError') return; setAvailable(false); setMessage('外部 ComfyUI 不可达。请在 config.toml 中配置 comfyui.base_url,或使用工作流。'); }); return () => { cancelled = true; controller.abort(); }; }, []); return (
外部 ComfyUI
{available ? (