mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
8232b6ebbc
* Fixes under public/app/plugins * Fixes under public/app/plugins/datasource * Fixes under public/app/features * Fixes under public/app/features * Fixes under public/app/features * Fixes under public/app/components * Fix PanelNotSupported test * Fix one more warning * Fix warning in usePanelSave * Fix traceview empty response * Azure monitor fixes * More fixes * Fix tests for azure monitor * Fixes after merging master * Add comment for disabled rules * Fixes after merging master * Fixes after merging master * Adress review comments * Fix azure tests * Address review feedbacks
52 lines
1.8 KiB
TypeScript
52 lines
1.8 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { useDebounce } from 'react-use';
|
|
import { SearchSrv } from 'app/core/services/search_srv';
|
|
import { backendSrv } from 'app/core/services/backend_srv';
|
|
import { FETCH_RESULTS, FETCH_ITEMS, TOGGLE_SECTION, SEARCH_START, FETCH_ITEMS_START } from '../reducers/actionTypes';
|
|
import { DashboardSection, UseSearch } from '../types';
|
|
import { hasId, getParsedQuery } from '../utils';
|
|
|
|
const searchSrv = new SearchSrv();
|
|
|
|
/**
|
|
* Base hook for search functionality.
|
|
* Returns state and dispatch, among others, from 'reducer' param, so it can be
|
|
* further extended.
|
|
* @param query
|
|
* @param reducer - return result of useReducer
|
|
* @param params - custom params
|
|
*/
|
|
export const useSearch: UseSearch = (query, reducer, params = {}) => {
|
|
const { queryParsing } = params;
|
|
const [state, dispatch] = reducer;
|
|
|
|
const search = () => {
|
|
dispatch({ type: SEARCH_START });
|
|
const parsedQuery = getParsedQuery(query, queryParsing);
|
|
searchSrv.search(parsedQuery).then((results) => {
|
|
dispatch({ type: FETCH_RESULTS, payload: results });
|
|
});
|
|
};
|
|
|
|
// Set loading state before debounced search
|
|
useEffect(() => {
|
|
dispatch({ type: SEARCH_START });
|
|
}, [query.tag, query.sort, query.starred, query.layout, dispatch]);
|
|
|
|
useDebounce(search, 300, [query, queryParsing]);
|
|
|
|
const onToggleSection = (section: DashboardSection) => {
|
|
if (hasId(section.title) && !section.items.length) {
|
|
dispatch({ type: FETCH_ITEMS_START, payload: section.id });
|
|
backendSrv.search({ folderIds: [section.id] }).then((items) => {
|
|
dispatch({ type: FETCH_ITEMS, payload: { section, items } });
|
|
dispatch({ type: TOGGLE_SECTION, payload: section });
|
|
});
|
|
} else {
|
|
dispatch({ type: TOGGLE_SECTION, payload: section });
|
|
}
|
|
};
|
|
|
|
return { state, dispatch, onToggleSection };
|
|
};
|