/* * Copyright 2025 coze-dev Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { useEffect, useRef, useState } from 'react'; import { Spin } from '@coze-arch/coze-design'; interface IPreviewTxtProps { fileUrl: string; } function wait(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } export const PreviewTxt = (props: IPreviewTxtProps) => { const { fileUrl } = props; const [txtContent, setTxtContent] = useState(''); const [loading, setLoading] = useState(true); useEffect(() => { fetch(fileUrl) .then(res => res.text()) .then(text => { setLoading(false); setTxtContent(text); }); }, [fileUrl]); const ref = useRef(null); useEffect(() => { async function render() { if (ref.current) { for ( let i = 0, len = txtContent.length; i < Math.ceil(len / 50_000); i++ ) { await wait(10); if (ref.current) { ref.current.textContent += txtContent.slice( i * 50_000, (i + 1) * 50_000, ); } } if (ref.current) { ref.current.textContent = txtContent; } } } render(); }, [txtContent]); return (
          {/* {txtContent} */}
        
); };