-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathuseTopicProbeQuery.ts
More file actions
85 lines (74 loc) · 2.82 KB
/
Copy pathuseTopicProbeQuery.ts
File metadata and controls
85 lines (74 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import React from 'react';
import {skipToken} from '@reduxjs/toolkit/query';
import {isNil} from 'lodash';
import {topicApi} from '../../../../store/reducers/topic/topic';
import type {TopicDataRequest, TopicDataResponse} from '../../../../types/api/topic';
import {safeParseNumber} from '../../../../utils/utils';
interface UseTopicProbeQueryParams {
path: string;
database: string;
selectedPartition: string | null | undefined;
selectedOffset: number | null | undefined;
startTimestamp: number | null | undefined;
setBoundOffsets: (props: {startOffset: number; endOffset: number}) => void;
}
interface UseTopicProbeQueryResult {
error: unknown;
isFetching: boolean;
emptyData: boolean;
currentData: TopicDataResponse | undefined;
}
export function useTopicProbeQuery({
path,
database,
selectedPartition,
selectedOffset,
startTimestamp,
setBoundOffsets,
}: UseTopicProbeQueryParams): UseTopicProbeQueryResult {
const [emptyData, setEmptyData] = React.useState(false);
const queryParams = React.useMemo(() => {
if (isNil(selectedPartition)) {
return skipToken;
}
const params: TopicDataRequest = {database, path, partition: selectedPartition, limit: 1};
if (startTimestamp) {
params.read_timestamp = startTimestamp;
} else if (isNil(selectedOffset)) {
return skipToken;
} else {
params.offset = Number(selectedOffset);
}
return params;
}, [selectedPartition, selectedOffset, startTimestamp, database, path]);
const isProbeSkipped = queryParams === skipToken;
const {currentData, error, isFetching} = topicApi.useGetTopicDataQuery(queryParams);
// Reset emptyData when the probe query is skipped (e.g. filters cleared via "show all")
// to prevent stale isEmpty flag from blocking the table fetch
React.useEffect(() => {
if (isProbeSkipped) {
setEmptyData(false);
}
}, [isProbeSkipped]);
React.useEffect(() => {
// values should be recalculated only when data is fetched
if (isFetching || (!currentData && !error)) {
return;
}
// When there's an error (e.g. 403), don't mark as empty —
// let the table fetch data itself so it can display the error properly
if (error) {
setEmptyData(false);
return;
}
const hasMessages = Boolean(currentData?.Messages?.length);
setEmptyData(!hasMessages);
if (currentData) {
setBoundOffsets({
startOffset: safeParseNumber(currentData.StartOffset),
endOffset: safeParseNumber(currentData.EndOffset),
});
}
}, [isFetching, currentData, error, setBoundOffsets]);
return {error, isFetching, emptyData, currentData};
}