/* Copyright (C) 2025 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import React, { useState, useEffect } from 'react'; import { Modal, Button, Typography, Spin } from '@douyinfe/semi-ui'; import { IconExternalOpen, IconCopy } from '@douyinfe/semi-icons'; const { Text } = Typography; const ContentModal = ({ isModalOpen, setIsModalOpen, modalContent, isVideo, }) => { const [videoError, setVideoError] = useState(false); const [isLoading, setIsLoading] = useState(false); useEffect(() => { if (isModalOpen && isVideo) { setVideoError(false); setIsLoading(true); } }, [isModalOpen, isVideo]); const handleVideoError = () => { setVideoError(true); setIsLoading(false); }; const handleVideoLoaded = () => { setIsLoading(false); }; const handleCopyUrl = () => { navigator.clipboard.writeText(modalContent); }; const handleOpenInNewTab = () => { window.open(modalContent, '_blank'); }; const renderVideoContent = () => { if (videoError) { return (
视频无法在当前浏览器中播放,这可能是由于: • 视频服务商的跨域限制 • 需要特定的请求头或认证 • 防盗链保护机制
{modalContent}
); } return (
{isLoading && (
)}
); }; return ( setIsModalOpen(false)} onCancel={() => setIsModalOpen(false)} closable={null} bodyStyle={{ height: isVideo ? '450px' : '400px', overflow: 'auto', padding: isVideo && videoError ? '0' : '24px', }} width={800} > {isVideo ? ( renderVideoContent() ) : (

{modalContent}

)}
); }; export default ContentModal;