chore: logs viewer flicker

This commit is contained in:
jialin
2024-09-14 17:45:46 +08:00
parent c1c24b9e5b
commit b8a20dbf68
+9 -15
View File
@@ -4,7 +4,7 @@ import { Terminal } from '@xterm/xterm';
import '@xterm/xterm/css/xterm.css'; import '@xterm/xterm/css/xterm.css';
import classNames from 'classnames'; import classNames from 'classnames';
import _ from 'lodash'; import _ from 'lodash';
import { memo, useCallback, useEffect, useRef, useState } from 'react'; import { memo, useCallback, useEffect, useRef } from 'react';
import './index.less'; import './index.less';
import useSize from './use-size'; import useSize from './use-size';
@@ -16,12 +16,11 @@ interface LogsViewerProps {
} }
const LogsViewer: React.FC<LogsViewerProps> = (props) => { const LogsViewer: React.FC<LogsViewerProps> = (props) => {
const { height, content, url } = props; const { height, content, url } = props;
const [nowrap, setNowrap] = useState(false);
const { setChunkRequest } = useSetChunkRequest(); const { setChunkRequest } = useSetChunkRequest();
const chunkRequedtRef = useRef<any>(null); const chunkRequedtRef = useRef<any>(null);
const scroller = useRef<any>(null); const scroller = useRef<any>(null);
const termRef = useRef<any>(null); const termRef = useRef<any>(null);
const termInsRef = useRef<any>(null); const termwrapRef = useRef<any>(null);
const fitAddonRef = useRef<any>(null); const fitAddonRef = useRef<any>(null);
const cacheDatARef = useRef<any>(null); const cacheDatARef = useRef<any>(null);
const size = useSize(scroller); const size = useSize(scroller);
@@ -29,9 +28,9 @@ const LogsViewer: React.FC<LogsViewerProps> = (props) => {
const updateContent = useCallback( const updateContent = useCallback(
_.throttle((data: string) => { _.throttle((data: string) => {
cacheDatARef.current = data; cacheDatARef.current = data;
termRef.current?.reset(); termRef.current?.clear?.();
termRef.current?.write?.(data); termRef.current?.write?.(data);
}, 600), }, 100),
[] []
); );
@@ -65,15 +64,10 @@ const LogsViewer: React.FC<LogsViewerProps> = (props) => {
foreground: 'rgba(255,255,255,0.8)' foreground: 'rgba(255,255,255,0.8)'
}, },
cursorInactiveStyle: 'none' cursorInactiveStyle: 'none'
// windowOptions: {
// setWinPosition: true,
// setWinSizePixels: true,
// refreshWin: true
// }
}); });
fitAddonRef.current = new FitAddon(); fitAddonRef.current = new FitAddon();
termRef.current.loadAddon(fitAddonRef.current); termRef.current.loadAddon(fitAddonRef.current);
termRef.current.open(termInsRef.current); termRef.current.open(termwrapRef.current);
fitAddonRef.current?.fit(); fitAddonRef.current?.fit();
}; };
@@ -89,10 +83,10 @@ const LogsViewer: React.FC<LogsViewerProps> = (props) => {
}, [url, props.params]); }, [url, props.params]);
useEffect(() => { useEffect(() => {
if (termInsRef.current) { if (termwrapRef.current) {
initTerm(); initTerm();
} }
}, [termInsRef.current]); }, [termwrapRef.current]);
useEffect(() => { useEffect(() => {
handleResize(); handleResize();
@@ -101,8 +95,8 @@ const LogsViewer: React.FC<LogsViewerProps> = (props) => {
return ( return (
<div className="logs-viewer-wrap-w2"> <div className="logs-viewer-wrap-w2">
<div className="wrap" style={{ height: height }} ref={scroller}> <div className="wrap" style={{ height: height }} ref={scroller}>
<div className={classNames('content', { 'line-break': nowrap })}> <div className={classNames('content')}>
<div className="text" ref={termInsRef}></div> <div className="text" ref={termwrapRef}></div>
</div> </div>
</div> </div>
</div> </div>