import React, { useState, useEffect } from 'react'; import { useParams, Link } from 'react-router-dom'; import { Layout, Card, Typography, Space, Button, Result, Spin, App, Tag, Divider, Empty, Input } from 'antd'; import { LockOutlined, EyeOutlined, EyeInvisibleOutlined, CopyOutlined, CheckCircleOutlined, ShareAltOutlined, PlayCircleFilled, PauseCircleFilled, HomeOutlined, CalendarOutlined, LoginOutlined } from '@ant-design/icons'; import apiClient from '../utils/apiClient'; import { buildApiUrl, API_ENDPOINTS } from '../config/api'; import MarkdownRenderer from '../components/MarkdownRenderer'; import BrandLogo from '../components/BrandLogo'; import tools from '../utils/tools'; const { Header, Content } = Layout; const { Title, Text, Paragraph } = Typography; const MeetingPreview = () => { const { meeting_id } = useParams(); const { message } = App.useApp(); const [meeting, setMeeting] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [password, setPassword] = useState(''); const [isAuthorized, setIsAuthorized] = useState(false); useEffect(() => { fetchPreview(); }, [meeting_id]); const fetchPreview = async (pwd = null) => { setLoading(true); try { const url = buildApiUrl(`/api/meetings/preview/${meeting_id}${pwd ? `?password=${pwd}` : ''}`); const res = await apiClient.get(url); setMeeting(res.data); setIsAuthorized(true); setError(null); } catch (err) { if (err.response?.status === 401) { setIsAuthorized(false); } else { setError('无法加载会议预览'); } } finally { setLoading(false); } }; const handleVerify = () => { if (!password) { message.warning('请输入访问密码'); return; } fetchPreview(password); }; if (loading && !meeting) return