Compare commits

...

1 Commits

Author SHA1 Message Date
Nick Fitzpatrick
403aff8e37 Removing useSearchListQuery 2024-12-02 14:40:44 -04:00
10 changed files with 27 additions and 203 deletions

View File

@@ -2,7 +2,7 @@ import { useMemo } from "react";
import { useSdkSelector } from "embedding-sdk/store";
import { getIsLoggedIn } from "embedding-sdk/store/selectors";
import { useSearchListQuery } from "metabase/common/hooks";
import { useSearchQuery } from "metabase/api";
export const useQuestionSearch = (searchQuery?: string) => {
const isLoggedIn = useSdkSelector(getIsLoggedIn);
@@ -18,8 +18,5 @@ export const useQuestionSearch = (searchQuery?: string) => {
};
}, [searchQuery]);
return useSearchListQuery({
query,
enabled: isLoggedIn,
});
return useSearchQuery(query, { skip: !isLoggedIn });
};

View File

@@ -1,7 +1,7 @@
import { useEffect, useMemo, useState } from "react";
import { t } from "ttag";
import { useSearchListQuery } from "metabase/common/hooks";
import { useListCollectionItemsQuery } from "metabase/api";
import {
Button,
Flex,
@@ -45,16 +45,14 @@ export function ModelUploadModal({
}) {
const [uploadMode, setUploadMode] = useState<UploadMode>(UploadMode.create);
const [tableId, setTableId] = useState<TableId | null>(null);
const models = useSearchListQuery({
query: {
collection: collectionId,
models: ["dataset"],
},
const { data: models } = useListCollectionItemsQuery({
id: collectionId,
models: ["dataset"],
});
const uploadableModels = useMemo(
() => models.data?.filter(model => !!model.based_on_upload) ?? [],
[models.data],
() => models?.data?.filter(model => !!model.based_on_upload) ?? [],
[models?.data],
);
useEffect(

View File

@@ -27,5 +27,6 @@ export const useAvailableData = ({ databaseId }: Props = {}) => {
hasQuestions,
hasModels,
hasMetrics,
availableModels,
};
};

View File

@@ -14,7 +14,6 @@ export * from "./use-group-list-query";
export * from "./use-question-list-query";
export * from "./use-question-query";
export * from "./use-revision-list-query";
export * from "./use-search-list-query";
export * from "./use-table-list-query";
export * from "./use-table-query";
export * from "./use-user-list-query";

View File

@@ -1 +0,0 @@
export * from "./use-search-list-query";

View File

@@ -1,31 +0,0 @@
import Search from "metabase/entities/search";
import type {
CollectionItem,
SearchRequest,
SearchResponse,
} from "metabase-types/api";
import type {
UseEntityListQueryProps,
UseEntityListQueryResult,
} from "../use-entity-list-query";
import { useEntityListQuery } from "../use-entity-list-query";
/**
* @deprecated use "metabase/api" instead
*/
export const useSearchListQuery = <
TItem = CollectionItem,
TResult = Omit<SearchResponse, "data">,
>(
props: UseEntityListQueryProps<SearchRequest> = {},
): UseEntityListQueryResult<TItem, TResult> => {
return useEntityListQuery(props, {
fetchList: Search.actions.fetchList,
getList: Search.selectors.getList,
getLoading: Search.selectors.getLoading,
getLoaded: Search.selectors.getLoaded,
getError: Search.selectors.getError,
getListMetadata: Search.selectors.getListMetadata,
});
};

View File

@@ -1,125 +0,0 @@
import { within } from "@testing-library/react";
import _ from "underscore";
import { setupSearchEndpoints } from "__support__/server-mocks";
import {
renderWithProviders,
screen,
waitForLoaderToBeRemoved,
} from "__support__/ui";
import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
import { checkNotNull } from "metabase/lib/types";
import {
createMockCollection,
createMockCollectionItem,
createMockSearchResult,
createMockSearchResults,
} from "metabase-types/api/mocks";
import { useSearchListQuery } from "./use-search-list-query";
const TEST_ITEM_MODEL = "card";
const TEST_ITEM = createMockCollectionItem({ model: TEST_ITEM_MODEL });
const TEST_COLLECTION = createMockCollection();
const TEST_TABLE_DB_ID = 1;
const TEST_SEARCH_RESULTS = createMockSearchResults({
items: [
createMockSearchResult({ collection: { ...TEST_COLLECTION, type: null } }),
],
options: { table_db_id: TEST_TABLE_DB_ID },
});
const TEST_SEARCH_METADATA = _.omit(TEST_SEARCH_RESULTS, "data");
const TestComponent = () => {
const {
data = [],
metadata,
isLoading,
error,
} = useSearchListQuery({
query: {
models: [TEST_ITEM_MODEL],
limit: TEST_SEARCH_METADATA.limit,
offset: TEST_SEARCH_METADATA.offset,
table_db_id: TEST_TABLE_DB_ID,
},
});
if (isLoading || error) {
return <LoadingAndErrorWrapper loading={isLoading} error={error} />;
}
return (
<div>
{data.map(item => (
<div key={item.id}>{item.name}</div>
))}
<div data-testid="metadata">
{metadata && (
<>
<div data-testid="available-models">
{(metadata.available_models || []).join(", ")}
</div>
<div data-testid="limit">{metadata.limit}</div>
<div data-testid="models">{(metadata.models || []).join(", ")}</div>
<div data-testid="offset">{metadata.offset}</div>
<div data-testid="table-db-id">{metadata.table_db_id}</div>
<div data-testid="total">{metadata.total}</div>
</>
)}
</div>
</div>
);
};
const setup = () => {
setupSearchEndpoints([TEST_ITEM]);
renderWithProviders(<TestComponent />);
};
describe("useSearchListQuery", () => {
it("should be initially loading", () => {
setup();
expect(screen.getByTestId("loading-indicator")).toBeInTheDocument();
});
it("should show data from the response", async () => {
setup();
await waitForLoaderToBeRemoved();
expect(screen.getByText(TEST_ITEM.name)).toBeInTheDocument();
});
it("should show metadata from the response", async () => {
setup();
await waitForLoaderToBeRemoved();
const metadata = within(screen.getByTestId("metadata"));
const availableModelTextContent = checkNotNull(
TEST_SEARCH_METADATA.available_models,
).join(", ");
const modelsTextContent = checkNotNull(TEST_SEARCH_METADATA.models).join(
", ",
);
expect(metadata.getByTestId("available-models")).toHaveTextContent(
availableModelTextContent,
);
expect(metadata.getByTestId("limit")).toHaveTextContent(
String(TEST_SEARCH_METADATA.limit),
);
expect(metadata.getByTestId("models")).toHaveTextContent(modelsTextContent);
expect(metadata.getByTestId("offset")).toHaveTextContent(
String(TEST_SEARCH_METADATA.offset),
);
expect(metadata.getByTestId("table-db-id")).toHaveTextContent(
String(TEST_SEARCH_METADATA.table_db_id),
);
expect(metadata.getByTestId("total")).toHaveTextContent(
String(TEST_SEARCH_METADATA.total),
);
});
});

View File

@@ -3,7 +3,7 @@ import { push } from "react-router-redux";
import { useDebounce } from "react-use";
import { t } from "ttag";
import { useSearchListQuery } from "metabase/common/hooks";
import { useSearchQuery } from "metabase/api";
import EmptyState from "metabase/components/EmptyState";
import Search from "metabase/entities/search";
import { useListKeyboardNavigation } from "metabase/hooks/use-list-keyboard-navigation";
@@ -98,16 +98,13 @@ export const SearchResults = ({
query.context = SearchContextTypes.SEARCH_BAR;
}
const {
data: list = [],
metadata,
isLoading,
} = useSearchListQuery({
query,
reload: true,
enabled: !!debouncedSearchText,
const { data, isLoading } = useSearchQuery(query, {
skip: !debouncedSearchText,
refetchOnMountOrArgChange: true,
});
const { data: list = [], ...metadata } = data || {};
const hasResults = list.length > 0;
const showFooter = hasResults && footerComponent && metadata;

View File

@@ -4,10 +4,8 @@ import type { WithRouterProps } from "react-router";
import { push } from "react-router-redux";
import { t } from "ttag";
import {
useDatabaseListQuery,
useSearchListQuery,
} from "metabase/common/hooks";
import { useListDatabasesQuery } from "metabase/api";
import { useAvailableData } from "metabase/common/components/DataPicker/hooks";
import Collections from "metabase/entities/collections/collections";
import { useDispatch, useSelector } from "metabase/lib/redux";
import * as Urls from "metabase/lib/urls";
@@ -28,19 +26,19 @@ export const useCommandPaletteBasicActions = ({
Collections.selectors.getInitialCollectionId(state, props),
);
const { data: databases = [] } = useDatabaseListQuery({
enabled: isLoggedIn,
});
const { data: models = [] } = useSearchListQuery({
query: { models: ["dataset"], limit: 1 },
enabled: isLoggedIn,
});
const { data: { data: databases = [] } = {} } = useListDatabasesQuery(
undefined,
{
skip: !isLoggedIn,
},
);
const { hasModels } = useAvailableData();
const hasDataAccess = getHasDataAccess(databases);
const hasNativeWrite = getHasNativeWrite(databases);
const hasDatabaseWithActionsEnabled =
getHasDatabaseWithActionsEnabled(databases);
const hasModels = models.length > 0;
const openNewModal = useCallback(
(modalId: string) => {

View File

@@ -1,7 +1,7 @@
/* eslint-disable react/prop-types */
import { useState } from "react";
import { useSearchListQuery } from "metabase/common/hooks";
import { useAvailableData } from "metabase/common/components/DataPicker/hooks";
import { getTranslatedEntityName } from "metabase/common/utils/model-names";
import { SearchFilterPopoverWrapper } from "metabase/search/components/SearchFilterPopoverWrapper";
import { enabledSearchTypes } from "metabase/search/constants";
@@ -9,23 +9,14 @@ import type { SearchFilterDropdown } from "metabase/search/types";
import { Checkbox, Stack } from "metabase/ui";
import type { EnabledSearchModel } from "metabase-types/api";
const EMPTY_SEARCH_QUERY = {
models: ["dataset" as const],
limit: 1,
calculate_available_models: true as const,
};
export const TypeFilterContent: SearchFilterDropdown<"type">["ContentComponent"] =
({ value, onChange, width }) => {
const { metadata, isLoading } = useSearchListQuery({
query: EMPTY_SEARCH_QUERY,
});
const { availableModels, isLoading } = useAvailableData();
const [selectedTypes, setSelectedTypes] = useState<EnabledSearchModel[]>(
value ?? [],
);
const availableModels = (metadata && metadata.available_models) ?? [];
const typeFilters = enabledSearchTypes.filter(type =>
availableModels.includes(type),
);