import './LogsExplorerList.style.scss'; import { Card } from 'antd'; import LogDetail from 'components/LogDetail'; import { VIEW_TYPES } from 'components/LogDetail/constants'; // 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 EmptyLogsSearch from 'container/EmptyLogsSearch/EmptyLogsSearch'; import LogsError from 'container/LogsError/LogsError'; import { LogsLoading } from 'container/LogsLoading/LogsLoading'; import { useOptionsMenu } from 'container/OptionsMenu'; import { useActiveLog } from 'hooks/logs/useActiveLog'; import { useCopyLogLink } from 'hooks/logs/useCopyLogLink'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; 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 NoLogs from '../NoLogs/NoLogs'; 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, isFetching, currentStagedQueryData, logs, onEndReached, isError, isFilterApplied, }: LogsExplorerListProps): JSX.Element { const ref = useRef(null); const { initialDataSource } = useQueryBuilder(); const { activeLogId } = useCopyLogLink(); const { activeLog, onClearActiveLog, onAddToQuery, onSetActiveLog, } = useActiveLog(); const { options } = 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], ); const selectedFields = useMemo( () => convertKeysToColumnFields(options.selectColumns), [options], ); const getItemContent = useCallback( (_: number, log: ILog): JSX.Element => { if (options.format === 'raw') { return ( ); } return ( ); }, [ activeLog, 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 renderContent = useMemo(() => { const components = isLoading ? { Footer, } : {}; if (options.format === 'table') { return ( ); } return ( ); }, [isLoading, options, logs, onEndReached, getItemContent, selectedFields]); return (
{(isLoading || (isFetching && logs.length === 0)) && } {!isLoading && !isFetching && !isError && !isFilterApplied && logs.length === 0 && } {!isLoading && !isFetching && logs.length === 0 && !isError && isFilterApplied && } {isError && !isLoading && !isFetching && } {!isLoading && !isError && logs.length > 0 && ( <> {renderContent} )}
); } export default memo(LogsExplorerList);