import { Card, Typography } from 'antd'; // components 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 ExplorerControlPanel from 'container/ExplorerControlPanel'; import { Heading } from 'container/LogsTable/styles'; import { useOptionsMenu } from 'container/OptionsMenu'; import { useCopyLogLink } from 'hooks/logs/useCopyLogLink'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import useFontFaceObserver from 'hooks/useFontObserver'; import { memo, useCallback, useEffect, useMemo, useRef } from 'react'; import { Virtuoso, VirtuosoHandle } from 'react-virtuoso'; // interfaces import { ILog } from 'types/api/logs/log'; import { DataSource, StringOperators } from 'types/common/queryBuilder'; import InfinityTableView from './InfinityTableView'; import { LogsExplorerListProps } from './LogsExplorerList.interfaces'; import { InfinityWrapperStyled } from './styles'; import { convertKeysToColumnFields } from './utils'; function Footer(): JSX.Element { return ; } function LogsExplorerList({ isLoading, currentStagedQueryData, logs, onEndReached, }: LogsExplorerListProps): JSX.Element { const ref = useRef(null); const { initialDataSource } = useQueryBuilder(); const { activeLogId } = useCopyLogLink(); const { options, config } = useOptionsMenu({ storageKey: LOCALSTORAGE.LOGS_LIST_OPTIONS, dataSource: initialDataSource || DataSource.METRICS, aggregateOperator: currentStagedQueryData?.aggregateOperator || StringOperators.NOOP, }); const activeLogIndex = useMemo( () => logs.findIndex(({ id }) => id === activeLogId), [logs, activeLogId], ); useFontFaceObserver( [ { family: 'Fira Code', weight: '300', }, ], options.format === 'raw', { timeout: 5000, }, ); const selectedFields = useMemo( () => convertKeysToColumnFields(options.selectColumns), [options], ); const getItemContent = useCallback( (_: number, log: ILog): JSX.Element => { if (options.format === 'raw') { return ( ); } return ( ); }, [options.format, options.maxLines, selectedFields], ); useEffect(() => { if (!activeLogId || activeLogIndex < 0) return; ref?.current?.scrollToIndex({ index: activeLogIndex, align: 'start', behavior: 'smooth', }); }, [activeLogId, activeLogIndex]); const renderContent = useMemo(() => { const components = isLoading ? { Footer, } : {}; if (options.format === 'table') { return ( ); } return ( ); }, [isLoading, options, logs, onEndReached, getItemContent, selectedFields]); return ( <> {options.format !== 'table' && ( Event )} {!isLoading && logs.length === 0 && ( No logs lines found )} {renderContent} ); } export default memo(LogsExplorerList);