import React, { useEffect, useState } from 'react'; import { vfsApi } from '../../api/client'; import type { AppComponentProps } from '../types'; import { Spin, Result, Button } from 'antd'; import { useSystemStatus } from '../../contexts/SystemContext'; export const OfficeViewerApp: React.FC = ({ filePath, onRequestClose }) => { const systemStatus = useSystemStatus(); const [url, setUrl] = useState(); const [loading, setLoading] = useState(true); const [err, setErr] = useState(); useEffect(() => { let cancelled = false; setLoading(true); setErr(undefined); setUrl(undefined); vfsApi.getTempLinkToken(filePath.replace(/^\/+/, '')) .then(res => { if (cancelled) return; const baseUrl = systemStatus?.file_domain || window.location.origin; const fullUrl = new URL(res.url, baseUrl).href; const officeUrl = `https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(fullUrl)}`; setUrl(officeUrl); }) .catch(e => { if (!cancelled) { setErr(e.message || '加载文档链接失败'); } }) .finally(() => { if (!cancelled) { setLoading(false); } }); return () => { cancelled = true; }; }, [filePath]); if (loading) { return (
); } if (err) { return ( 关闭} /> ); } return (
{url ? (