@orchestrator-ui/orchestrator-ui-components
Version:
Library of UI Components used to display the workflow orchestrator frontend
83 lines (71 loc) • 2.8 kB
text/typescript
import { useEffect, useState } from 'react';
import { Query } from '@elastic/eui';
import { useSearchMutation } from '@/rtk/endpoints';
import { EntityKind, Group, PaginatedSearchResults } from '@/types';
export const useSearch = (
query: Query | string,
entityType: EntityKind,
filterGroup?: Group,
limit?: number,
) => {
const [results, setResults] = useState<PaginatedSearchResults>({
data: [],
page_info: { has_next_page: false, next_page_cursor: null },
search_metadata: { search_type: null, description: null },
});
const [triggerSearch, { isLoading, isError }] = useSearchMutation();
useEffect(() => {
const queryText =
typeof query === 'string' ? query : query.text?.trim() || '';
const hasFilters = filterGroup && filterGroup.children.length > 0;
if (queryText.length < 2 && !hasFilters) {
setResults({
data: [],
page_info: { has_next_page: false, next_page_cursor: null },
search_metadata: { search_type: null, description: null },
});
return;
}
const performSearch = async () => {
try {
const result = await triggerSearch({
entity_type: entityType,
query: queryText,
filters:
filterGroup && filterGroup.children.length > 0
? filterGroup
: undefined,
limit: limit,
}).unwrap();
setResults({
data: result.data || [],
page_info: {
has_next_page: result.page_info?.has_next_page || false,
next_page_cursor:
result.page_info?.next_page_cursor || null,
},
search_metadata: {
search_type:
result.search_metadata?.search_type || null,
description:
result.search_metadata?.description || null,
},
});
} catch (error) {
console.error('Search error:', error);
setResults({
data: [],
page_info: { has_next_page: false, next_page_cursor: null },
search_metadata: { search_type: null, description: null },
});
}
};
performSearch();
}, [query, entityType, filterGroup, limit, triggerSearch]);
return {
results,
loading: isLoading,
error: isError ? 'Search failed' : null,
setResults,
};
};