import React from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import { useTranslation } from 'react-i18next' import useExpandCollapse from '../../../shared/hooks/use-expand-collapse' import Icon from '../../../shared/components/icon' function PreviewLogEntry({ file, line, message, content, column, humanReadableHintComponent, extraInfoURL, level, showLineAndNoLink = true, showCloseButton = false, onLogEntryLocationClick, onClose }) { const { t } = useTranslation() function handleLogEntryLinkClick() { onLogEntryLocationClick({ file, line, column }) } const logEntryDescription = t('log_entry_description', { level: level }) return (
{content ? ( ) : null}
) } function PreviewLogEntryHeader({ level, file, line, message, showLineAndNoLink = true, showCloseButton = false, onLogEntryLocationClick, onClose }) { const { t } = useTranslation() const logEntryHeaderClasses = classNames('log-entry-header', { 'log-entry-header-error': level === 'error', 'log-entry-header-warning': level === 'warning', 'log-entry-header-typesetting': level === 'typesetting' }) const headerLogLocationTitle = t('navigate_log_source', { location: file + (line ? `, ${line}` : '') }) return (

{message}

{showLineAndNoLink && file ? ( ) : null} {showCloseButton && file ? ( ) : null}
) } function PreviewLogEntryContent({ content, humanReadableHintComponent, extraInfoURL }) { const { isExpanded, expandableProps, toggleProps } = useExpandCollapse({ collapsedSize: 150, classes: { container: 'log-entry-content-raw-expandable-container' } }) const logContentClasses = classNames('log-entry-content-raw', { 'log-entry-content-raw-collapsed': !isExpanded }) const buttonContainerClasses = classNames( 'log-entry-content-button-container', { 'log-entry-content-button-container-collapsed': !isExpanded } ) const { t } = useTranslation() return (
{content.trim()}
{humanReadableHintComponent ? (
{humanReadableHintComponent}
) : null} {extraInfoURL ? (
{t('log_hint_extra_info')}
) : null}
) } PreviewLogEntryHeader.propTypes = { level: PropTypes.string.isRequired, file: PropTypes.string, line: PropTypes.any, message: PropTypes.string, showLineAndNoLink: PropTypes.bool, showCloseButton: PropTypes.bool, onLogEntryLocationClick: PropTypes.func, onClose: PropTypes.func } PreviewLogEntryContent.propTypes = { content: PropTypes.string.isRequired, humanReadableHintComponent: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.node), PropTypes.element ]), extraInfoURL: PropTypes.string } PreviewLogEntry.propTypes = { file: PropTypes.string, // `line should be either a number or null (i.e. not required), but currently sometimes we get // an empty string (from BibTeX errors), which is why we're using `any` here. We should revert // to PropTypes.number (not required) once we fix that. line: PropTypes.any, column: PropTypes.any, message: PropTypes.string, content: PropTypes.string, humanReadableHintComponent: PropTypes.node, extraInfoURL: PropTypes.string, level: PropTypes.oneOf(['error', 'warning', 'typesetting']).isRequired, showLineAndNoLink: PropTypes.bool, showCloseButton: PropTypes.bool, onLogEntryLocationClick: PropTypes.func, onClose: PropTypes.func } export default PreviewLogEntry