fix: use Virtuoso followOutput and always update logs state

This commit is contained in:
Memory 2026-03-09 22:44:27 +08:00 committed by GitHub
parent b9a7e04eee
commit 34fc4d2d96
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -46,7 +46,6 @@ const Logs: React.FC = () => {
const [trace, setTrace] = useState(true)
const virtuosoRef = useRef<VirtuosoHandle>(null)
const traceRef = useRef(trace)
const filteredLogs = useMemo(() => {
if (filter === '') return logs
@ -59,29 +58,10 @@ const Logs: React.FC = () => {
localStorage.setItem(LOGS_FILTER_KEY, filter)
}, [filter])
useEffect(() => {
traceRef.current = trace
if (trace) {
setLogs([...cachedLogs.log])
}
}, [trace])
useEffect(() => {
if (!trace) return
virtuosoRef.current?.scrollToIndex({
index: filteredLogs.length - 1,
behavior: 'smooth',
align: 'end',
offset: 0
})
}, [filteredLogs, trace])
useEffect(() => {
const old = cachedLogs.trigger
cachedLogs.trigger = (a): void => {
if (traceRef.current) {
setLogs([...a])
}
setLogs([...a])
}
return (): void => {
cachedLogs.trigger = old
@ -132,6 +112,8 @@ const Logs: React.FC = () => {
<Virtuoso
ref={virtuosoRef}
data={filteredLogs}
initialTopMostItemIndex={filteredLogs.length - 1}
followOutput={trace}
itemContent={(i, log) => (
<LogItem index={i} time={log.time} type={log.type} payload={log.payload} />
)}