Skip to content

Commit e61cf28

Browse files
committed
feat: implement useSchemaSearch hook for improved dataset navigation and filtering
1 parent c6bf251 commit e61cf28

File tree

4 files changed

+79
-40
lines changed

4 files changed

+79
-40
lines changed

src/hooks/useSchemaSearch.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { useNavigate, useSearch } from '@tanstack/react-router';
2+
import {
3+
encodeSchemaFilters,
4+
SchemaFilter,
5+
} from '@/modules/datasets/schemaFilters';
6+
import useUserStore from '@/stores/useUser.store';
7+
import { getChainFromId } from '@/utils/chain.utils';
8+
9+
type SchemaField = { path?: string | null; type?: string | null };
10+
11+
export function useSchemaSearch() {
12+
const navigate = useNavigate();
13+
const search = useSearch({ strict: false });
14+
const { chainId } = useUserStore();
15+
16+
const navigateToDatasets = (schemaFields: SchemaField[]) => {
17+
const schemaFilters: SchemaFilter[] = schemaFields
18+
.filter(
19+
(field): field is { path: string; type: string } =>
20+
field.path != null && field.type != null
21+
)
22+
.map((field) => ({ path: field.path, type: field.type }));
23+
24+
const encoded = encodeSchemaFilters(schemaFilters);
25+
navigate({
26+
to: `/${getChainFromId(chainId)?.slug}/datasets`,
27+
search: { ...search, schema: encoded },
28+
replace: false,
29+
resetScroll: true,
30+
});
31+
};
32+
33+
const updateCurrentPage = (
34+
schemaFilters: SchemaFilter[],
35+
setCurrentPage?: (page: number) => void
36+
) => {
37+
navigate({
38+
search: { ...search, schema: encodeSchemaFilters(schemaFilters) },
39+
replace: false,
40+
resetScroll: true,
41+
});
42+
setCurrentPage?.(0);
43+
};
44+
45+
return {
46+
navigateToDatasets,
47+
updateCurrentPage,
48+
};
49+
}

src/modules/datasets/DatasetsPreviewTable.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ import { ChainLink } from '@/components/ChainLink';
77
import { DataTable } from '@/components/DataTable';
88
import DatasetIcon from '@/components/icons/DatasetIcon';
99
import { Button } from '@/components/ui/button';
10+
import { useSchemaSearch } from '@/hooks/useSchemaSearch';
1011
import useUserStore from '@/stores/useUser.store';
1112
import { createPlaceholderDataFnForQueryKey } from '@/utils/createPlaceholderDataFnForQueryKey';
1213
import { ErrorAlert } from '../ErrorAlert';
1314
import { datasetsQuery } from './datasetsQuery';
14-
import { columns } from './datasetsTable/columns';
15+
import { createColumns } from './datasetsTable/columns';
1516
import { useDatasetsSchemas } from './hooks/useDatasetsSchemas';
1617

1718
export function DatasetsPreviewTable({ className }: { className?: string }) {
1819
const { chainId } = useUserStore();
20+
const { navigateToDatasets } = useSchemaSearch();
1921

2022
const queryKey = [chainId, 'datasets_preview'];
2123
const datasets = useQuery({
@@ -38,6 +40,8 @@ export function DatasetsPreviewTable({ className }: { className?: string }) {
3840
chainId!
3941
);
4042

43+
const columns = createColumns(navigateToDatasets);
44+
4145
const formattedData =
4246
datasets.data?.datasets.map((dataset) => ({
4347
...dataset,

src/routes/$chainSlug/_layout/dataset/$datasetAddress.tsx

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,22 @@ import { TABLE_LENGTH, TABLE_REFETCH_INTERVAL } from '@/config';
22
import { execute as executeDp } from '@/graphql/dataprotector/execute';
33
import { execute } from '@/graphql/poco/execute';
44
import { useQuery } from '@tanstack/react-query';
5-
import {
6-
createFileRoute,
7-
useNavigate,
8-
useSearch,
9-
} from '@tanstack/react-router';
5+
import { createFileRoute } from '@tanstack/react-router';
106
import { LoaderCircle } from 'lucide-react';
117
import DatasetIcon from '@/components/icons/DatasetIcon';
128
import { BackButton } from '@/components/ui/BackButton';
9+
import { useSchemaSearch } from '@/hooks/useSchemaSearch';
1310
import { DetailsTable } from '@/modules/DetailsTable';
1411
import { ErrorAlert } from '@/modules/ErrorAlert';
1512
import { DatasetBreadcrumbs } from '@/modules/datasets/dataset/DatasetBreadcrumbs';
1613
import { DatasetDealsTable } from '@/modules/datasets/dataset/DatasetDealsTable';
1714
import { buildDatasetDetails } from '@/modules/datasets/dataset/buildDatasetDetails';
1815
import { datasetQuery } from '@/modules/datasets/dataset/datasetQuery';
1916
import { datasetSchemaQuery } from '@/modules/datasets/dataset/schema/datasetSchemaDpQuery';
20-
import {
21-
encodeSchemaFilters,
22-
SchemaFilter,
23-
} from '@/modules/datasets/schemaFilters';
2417
import { SearcherBar } from '@/modules/search/SearcherBar';
2518
import useUserStore from '@/stores/useUser.store';
2619
import { NotFoundError } from '@/utils/NotFoundError';
2720
import { isValidAddress } from '@/utils/addressOrIdCheck';
28-
import { getChainFromId } from '@/utils/chain.utils';
2921
import { createPlaceholderDataFnForQueryKey } from '@/utils/createPlaceholderDataFnForQueryKey';
3022

3123
export const Route = createFileRoute(
@@ -96,30 +88,19 @@ function useDatasetData(datasetAddress: string, chainId: number) {
9688
function DatasetsRoute() {
9789
const { chainId } = useUserStore();
9890
const { datasetAddress } = Route.useParams();
99-
const navigate = useNavigate();
100-
const search = useSearch({ strict: false });
91+
const { navigateToDatasets } = useSchemaSearch();
10192

10293
const { dataset, schema } = useDatasetData(
10394
(datasetAddress as string).toLowerCase(),
10495
chainId!
10596
);
10697

107-
const handleSchemaSearch = (schemaFilters: SchemaFilter[]) => {
108-
const encoded = encodeSchemaFilters(schemaFilters);
109-
navigate({
110-
to: `/${getChainFromId(chainId)?.slug}/datasets`,
111-
search: { ...search, schema: encoded },
112-
replace: false,
113-
resetScroll: true,
114-
});
115-
};
116-
11798
const datasetDetails = dataset.data
11899
? buildDatasetDetails({
119100
dataset: dataset.data,
120101
schema: schema.data,
121102
isSchemaLoading: schema.isLoading,
122-
onSchemaSearch: handleSchemaSearch,
103+
onSchemaSearch: navigateToDatasets,
123104
})
124105
: undefined;
125106

src/routes/$chainSlug/_layout/datasets.tsx

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { PaginatedNavigation } from '@/components/PaginatedNavigation';
1616
import DatasetIcon from '@/components/icons/DatasetIcon';
1717
import { BackButton } from '@/components/ui/BackButton';
1818
import { usePageParam } from '@/hooks/usePageParam';
19+
import { useSchemaSearch } from '@/hooks/useSchemaSearch';
1920
import { ErrorAlert } from '@/modules/ErrorAlert';
2021
import { DatasetBreadcrumbsList } from '@/modules/datasets/DatasetBreadcrumbs';
2122
import { SchemaSearch } from '@/modules/datasets/SchemaSearch';
@@ -122,6 +123,7 @@ function DatasetsRoute() {
122123
const navigate = useNavigate();
123124
const filters: SchemaFilter[] = decodeSchemaFilters(search?.schema);
124125
const { chainId } = useUserStore();
126+
const { updateCurrentPage } = useSchemaSearch();
125127

126128
useEffect(() => {
127129
if (!isSchemaSearchOpen && filters.length > 0) {
@@ -166,20 +168,15 @@ function DatasetsRoute() {
166168
setCurrentPage(0);
167169
};
168170

169-
const handleSchemaSearch = (schemaFilters: any) => {
170-
navigate({
171-
search: { ...search, schema: encodeSchemaFilters(schemaFilters) },
172-
replace: false,
173-
resetScroll: true,
174-
});
175-
setCurrentPage(0);
171+
const handleSchemaSearch = (schemaFields: SchemaFilter[]) => {
172+
updateCurrentPage(schemaFields, setCurrentPage);
176173

177174
if (!isSchemaSearchOpen) {
178175
setIsSchemaSearchOpen(true);
179176
}
180177
};
181178

182-
const useSchemaSearch = filters.length > 0;
179+
const hasSchemaFilters = filters.length > 0;
183180

184181
const datasetsData = useDatasetsData(currentPage - 1);
185182

@@ -211,29 +208,37 @@ function DatasetsRoute() {
211208
};
212209
},
213210
refetchInterval: TABLE_REFETCH_INTERVAL,
214-
enabled: !!chainId && useSchemaSearch,
211+
enabled: !!chainId && hasSchemaFilters,
215212
placeholderData: {
216213
protectedDatas: [],
217214
protectedDatasHasNext: [],
218215
protectedDatasHasNextNext: [],
219216
},
220217
});
221218

222-
const data = useSchemaSearch
223-
? (schemaResult.data?.protectedDatas ?? []).map(formatDataset)
219+
const data = hasSchemaFilters
220+
? (schemaResult.data?.protectedDatas ?? []).map((dataset) =>
221+
formatDataset({
222+
dataset,
223+
schema: dataset,
224+
isSchemasLoading: false,
225+
})
226+
)
224227
: datasetsData.data;
225228

226-
const isLoading = useSchemaSearch
229+
const isLoading = hasSchemaFilters
227230
? schemaResult.isLoading
228231
: datasetsData.isLoading;
229-
const isRefetching = useSchemaSearch
232+
const isRefetching = hasSchemaFilters
230233
? schemaResult.isRefetching
231234
: datasetsData.isRefetching;
232-
const isError = useSchemaSearch ? schemaResult.isError : datasetsData.isError;
233-
const hasPastError = useSchemaSearch
235+
const isError = hasSchemaFilters
236+
? schemaResult.isError
237+
: datasetsData.isError;
238+
const hasPastError = hasSchemaFilters
234239
? schemaResult.isError || schemaResult.errorUpdateCount > 0
235240
: datasetsData.hasPastError;
236-
const additionalPages = useSchemaSearch
241+
const additionalPages = hasSchemaFilters
237242
? getAdditionalPages(
238243
Boolean(schemaResult.data?.protectedDatasHasNext?.length),
239244
Boolean(schemaResult.data?.protectedDatasHasNextNext?.length)

0 commit comments

Comments
 (0)