import { Card, Typography } from 'antd'; import LogDetail from 'components/LogDetail'; import { VIEW_TYPES } from 'components/LogDetail/constants'; import ListLogView from 'components/Logs/ListLogView'; import RawLogView from 'components/Logs/RawLogView'; import Spinner from 'components/Spinner'; import { CARD_BODY_STYLE } from 'constants/card'; import { LOCALSTORAGE } from 'constants/localStorage'; import { OptionFormatTypes } from 'constants/optionsFormatTypes'; import InfinityTableView from 'container/LogsExplorerList/InfinityTableView'; import { InfinityWrapperStyled } from 'container/LogsExplorerList/styles'; import { convertKeysToColumnFields } from 'container/LogsExplorerList/utils'; import { Heading } from 'container/LogsTable/styles'; import { useOptionsMenu } from 'container/OptionsMenu'; import { useActiveLog } from 'hooks/logs/useActiveLog'; import { useCopyLogLink } from 'hooks/logs/useCopyLogLink'; import { useEventSource } from 'providers/EventSource'; import { memo, useCallback, useEffect, useMemo, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { Virtuoso, VirtuosoHandle } from 'react-virtuoso'; // interfaces import { ILog } from 'types/api/logs/log'; import { DataSource, StringOperators } from 'types/common/queryBuilder'; import { LiveLogsListProps } from './types'; function LiveLogsList({ logs }: LiveLogsListProps): JSX.Element { const ref = useRef(null); const { t } = useTranslation(['logs']); const { isConnectionLoading } = useEventSource(); const { activeLogId } = useCopyLogLink(); const { activeLog, onClearActiveLog, onAddToQuery, onSetActiveLog, } = useActiveLog(); const { options } = useOptionsMenu({ storageKey: LOCALSTORAGE.LOGS_LIST_OPTIONS, dataSource: DataSource.LOGS, aggregateOperator: StringOperators.NOOP, }); const activeLogIndex = useMemo( () => logs.findIndex(({ id }) => id === activeLogId), [logs, activeLogId], ); const selectedFields = convertKeysToColumnFields(options.selectColumns); const getItemContent = useCallback( (_: number, log: ILog): JSX.Element => { if (options.format === 'raw') { return ( ); } return ( ); }, [ onAddToQuery, onSetActiveLog, options.format, options.maxLines, selectedFields, ], ); useEffect(() => { if (!activeLogId || activeLogIndex < 0) return; ref?.current?.scrollToIndex({ index: activeLogIndex, align: 'start', behavior: 'smooth', }); }, [activeLogId, activeLogIndex]); const isLoadingList = isConnectionLoading && logs.length === 0; if (isLoadingList) { return ; } return ( <> {options.format !== OptionFormatTypes.TABLE && ( Event )} {logs.length === 0 && {t('fetching_log_lines')}} {logs.length !== 0 && ( {options.format === OptionFormatTypes.TABLE ? ( ) : ( )} )} ); } export default memo(LiveLogsList);