import { useState, useEffect, SyntheticEvent } from 'react' import { Typography } from '@mui/material' import Highlight from 'react-highlight' import { ErrorOutline, Warning } from '@mui/icons-material' import ContentCopyIcon from '@mui/icons-material/ContentCopy' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import CheckIcon from '@mui/icons-material/Check' import FileDownloadIcon from '@mui/icons-material/FileDownload' import { defaultChunkSize, parseErrorsAndWarnings, LogInstance, clearErrorsAndWarningsHtmlWrapping, download } from '../../../../../utils' import { logStyles } from './logComponent' import classes from './log.module.css' interface LogChunkProps { id: number text: string expanded: boolean logLineCount: number onClick: (evt: any, id: number) => void scrollToLogInstance?: LogInstance updated: number } const LogChunk = (props: LogChunkProps) => { const { id, text, logLineCount } = props const [scrollToLogInstance, setScrollToLogInstance] = useState( props.scrollToLogInstance ) const rowText = clearErrorsAndWarningsHtmlWrapping(text) const styles = logStyles() const [expanded, setExpanded] = useState(props.expanded) const [copied, setCopied] = useState(false) useEffect(() => { setExpanded(props.expanded) }, [props.expanded]) useEffect(() => { if (props.expanded !== expanded) { setExpanded(props.expanded) } if ( props.scrollToLogInstance && props.scrollToLogInstance !== scrollToLogInstance ) { setScrollToLogInstance(props.scrollToLogInstance) } }, [props]) useEffect(() => { if (expanded && scrollToLogInstance) { const { type, id } = scrollToLogInstance const line = document.getElementById(`${type}_${id}`) const logWrapper: HTMLDivElement | null = document.querySelector(`#logWrapper`) const logContainer: HTMLHeadElement | null = document.querySelector(`#log_container`) if (line && logWrapper && logContainer) { line.className = classes.HighlightedLine line.scrollIntoView({ behavior: 'smooth', block: 'start' }) setTimeout(() => { line.classList.remove(classes.HighlightedLine) setScrollToLogInstance(undefined) }, 3000) } } }, [expanded, scrollToLogInstance, props]) const { errors, warnings } = parseErrorsAndWarnings(text) const getLineRange = (separator = ' ... ') => `${id * defaultChunkSize}${separator}${ (id + 1) * defaultChunkSize < logLineCount ? (id + 1) * defaultChunkSize : logLineCount }` return (
props.onClick(evt, id)}>
{ evt.stopPropagation() }} >
{expanded ? text : ''}
) } export default LogChunk