-
Notifications
You must be signed in to change notification settings - Fork 8k
/
use_query.tsx
90 lines (80 loc) · 2.27 KB
/
use_query.tsx
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
86
87
88
89
90
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import React, { SetStateAction, useEffect, useState } from 'react';
import { fetchQueryAlerts } from './api';
import { AlertSearchResponse } from './types';
type Func = () => Promise<void>;
export interface ReturnQueryAlerts<Hit, Aggs> {
loading: boolean;
data: AlertSearchResponse<Hit, Aggs> | null;
setQuery: React.Dispatch<SetStateAction<object>>;
response: string;
request: string;
refetch: Func | null;
}
/**
* Hook for fetching Alerts from the Detection Engine API
*
* @param initialQuery query dsl object
*
*/
export const useQueryAlerts = <Hit, Aggs>(
initialQuery: object,
indexName?: string | null
): ReturnQueryAlerts<Hit, Aggs> => {
const [query, setQuery] = useState(initialQuery);
const [alerts, setAlerts] = useState<
Pick<ReturnQueryAlerts<Hit, Aggs>, 'data' | 'setQuery' | 'response' | 'request' | 'refetch'>
>({
data: null,
response: '',
request: '',
setQuery,
refetch: null,
});
const [loading, setLoading] = useState(true);
useEffect(() => {
let isSubscribed = true;
const abortCtrl = new AbortController();
async function fetchData() {
try {
setLoading(true);
const alertResponse = await fetchQueryAlerts<Hit, Aggs>({
query,
signal: abortCtrl.signal,
});
if (isSubscribed) {
setAlerts({
data: alertResponse,
response: JSON.stringify(alertResponse, null, 2),
request: JSON.stringify({ index: [indexName] ?? [''], body: query }, null, 2),
setQuery,
refetch: fetchData,
});
}
} catch (error) {
if (isSubscribed) {
setAlerts({
data: null,
response: '',
request: '',
setQuery,
refetch: fetchData,
});
}
}
if (isSubscribed) {
setLoading(false);
}
}
fetchData();
return () => {
isSubscribed = false;
abortCtrl.abort();
};
}, [query, indexName]);
return { loading, ...alerts };
};