import { FC, useEffect, useId, useLayoutEffect, useState } from "react"; import { Alert, Skeleton, Box, Group, Stack, Text } from "@mantine/core"; import { IconAlertTriangle, IconInfoCircle } from "@tabler/icons-react"; import { InstantQueryResult } from "../../api/responseTypes/query"; import { useAPIQuery } from "../../api/api"; import dayjs from "dayjs"; import timezone from "dayjs/plugin/timezone"; import { useAppDispatch, useAppSelector } from "../../state/hooks"; import { setVisualizer } from "../../state/queryPageSlice"; import TimeInput from "./TimeInput"; import DataTable from "./DataTable"; dayjs.extend(timezone); export interface TableTabProps { panelIdx: number; retriggerIdx: number; expr: string; } const TableTab: FC = ({ panelIdx, retriggerIdx, expr }) => { const [responseTime, setResponseTime] = useState(0); const [limitResults, setLimitResults] = useState(true); const { visualizer } = useAppSelector( (state) => state.queryPage.panels[panelIdx] ); const dispatch = useAppDispatch(); const { endTime, range } = visualizer; const { data, error, isFetching, refetch } = useAPIQuery({ key: [useId()], path: "/query", params: { query: expr, time: `${(endTime !== null ? endTime : Date.now()) / 1000}`, }, enabled: expr !== "", recordResponseTime: setResponseTime, }); useEffect(() => { expr !== "" && refetch(); }, [retriggerIdx, refetch, expr, endTime]); useLayoutEffect(() => { setLimitResults(true); }, [data, isFetching]); return ( dispatch( setVisualizer({ idx: panelIdx, visualizer: { ...visualizer, endTime: time }, }) ) } /> {!isFetching && data !== undefined && ( Load time: {responseTime}ms   Result series:{" "} {data.data.result.length} )} {isFetching ? ( {Array.from(Array(5), (_, i) => ( ))} ) : error !== null ? ( } > {error.message} ) : data === undefined ? ( No data queried yet ) : ( <> {data.data.result.length === 0 && ( }> This query returned no data. )} {data.warnings?.map((w, idx) => ( } > {w} ))} {data.infos?.map((w, idx) => ( } > {w} ))} )} ); }; export default TableTab;