Skip to content

Commit 1147af1

Browse files
authored
feat(react-query): add memoization for data in infinite source (#17)
1 parent 16aa3dd commit 1147af1

File tree

4 files changed

+23
-36
lines changed

4 files changed

+23
-36
lines changed

src/react-query/impl/infinite/hooks.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import {useMemo} from 'react';
2+
13
import {useInfiniteQuery} from '@tanstack/react-query';
24

35
import type {
@@ -6,9 +8,10 @@ import type {
68
DataSourceParams,
79
DataSourceState,
810
} from '../../../core';
11+
import {normalizeStatus} from '../../utils/normalizeStatus';
912

1013
import type {AnyInfiniteQueryDataSource} from './types';
11-
import {composeOptions, transformResult} from './utils';
14+
import {composeOptions} from './utils';
1215

1316
export const useInfiniteQueryData = <TDataSource extends AnyInfiniteQueryDataSource>(
1417
context: DataSourceContext<TDataSource>,
@@ -19,5 +22,16 @@ export const useInfiniteQueryData = <TDataSource extends AnyInfiniteQueryDataSou
1922
const composedOptions = composeOptions(context, dataSource, params, options);
2023
const result = useInfiniteQuery(composedOptions);
2124

22-
return transformResult(result);
25+
const transformedData = useMemo<DataSourceState<TDataSource>['data']>(
26+
() => result.data?.pages.flat(1) ?? [],
27+
[result.data],
28+
);
29+
30+
return {
31+
...result,
32+
status: normalizeStatus(result.status, result.fetchStatus),
33+
data: transformedData,
34+
originalStatus: result.status,
35+
originalData: result.data,
36+
} as DataSourceState<TDataSource>;
2337
};

src/react-query/impl/infinite/utils.ts

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {skipToken} from '@tanstack/react-query';
22
import type {
33
InfiniteData,
44
InfiniteQueryObserverOptions,
5-
InfiniteQueryObserverResult,
65
QueryFunctionContext,
76
} from '@tanstack/react-query';
87

@@ -15,13 +14,10 @@ import type {
1514
DataSourceOptions,
1615
DataSourceParams,
1716
DataSourceResponse,
18-
DataSourceState,
1917
} from '../../../core';
20-
import {normalizeStatus} from '../../utils/normalizeStatus';
2118

2219
import type {AnyInfiniteQueryDataSource, AnyPageParam} from './types';
2320

24-
const EMPTY_ARRAY: unknown[] = [];
2521
const EMPTY_OBJECT = {};
2622

2723
export const composeOptions = <TDataSource extends AnyInfiniteQueryDataSource>(
@@ -61,18 +57,3 @@ export const composeOptions = <TDataSource extends AnyInfiniteQueryDataSource>(
6157
...options,
6258
};
6359
};
64-
65-
export const transformResult = <TDataSource extends AnyInfiniteQueryDataSource>(
66-
result: InfiniteQueryObserverResult<
67-
InfiniteData<DataSourceData<TDataSource>, AnyPageParam>,
68-
DataSourceError<TDataSource>
69-
>,
70-
): DataSourceState<TDataSource> => {
71-
return {
72-
...result,
73-
status: normalizeStatus(result.status, result.fetchStatus),
74-
data: result.data?.pages.flat(1) ?? EMPTY_ARRAY,
75-
originalStatus: result.status,
76-
originalData: result.data,
77-
} as DataSourceState<TDataSource>;
78-
};

src/react-query/impl/plain/hooks.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import type {
66
DataSourceParams,
77
DataSourceState,
88
} from '../../../core';
9+
import {normalizeStatus} from '../../utils/normalizeStatus';
910

1011
import type {AnyPlainQueryDataSource} from './types';
11-
import {composeOptions, transformResult} from './utils';
12+
import {composeOptions} from './utils';
1213

1314
export const usePlainQueryData = <TDataSource extends AnyPlainQueryDataSource>(
1415
context: DataSourceContext<TDataSource>,
@@ -19,5 +20,9 @@ export const usePlainQueryData = <TDataSource extends AnyPlainQueryDataSource>(
1920
const composedOptions = composeOptions(context, dataSource, params, options);
2021
const result = useQuery(composedOptions);
2122

22-
return transformResult(result);
23+
return {
24+
...result,
25+
status: normalizeStatus(result.status, result.fetchStatus),
26+
originalStatus: result.status,
27+
} as DataSourceState<TDataSource>;
2328
};

src/react-query/impl/plain/utils.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import {
22
type QueryFunctionContext,
33
type QueryObserverOptions,
4-
type QueryObserverResult,
54
skipToken,
65
} from '@tanstack/react-query';
76

@@ -14,9 +13,7 @@ import type {
1413
DataSourceOptions,
1514
DataSourceParams,
1615
DataSourceResponse,
17-
DataSourceState,
1816
} from '../../../core';
19-
import {normalizeStatus} from '../../utils/normalizeStatus';
2017

2118
import type {AnyPlainQueryDataSource} from './types';
2219

@@ -52,13 +49,3 @@ export const composeOptions = <TDataSource extends AnyPlainQueryDataSource>(
5249
...options,
5350
};
5451
};
55-
56-
export const transformResult = <TDataSource extends AnyPlainQueryDataSource>(
57-
result: QueryObserverResult<DataSourceData<TDataSource>, DataSourceError<TDataSource>>,
58-
): DataSourceState<TDataSource> => {
59-
return {
60-
...result,
61-
status: normalizeStatus(result.status, result.fetchStatus),
62-
originalStatus: result.status,
63-
} as DataSourceState<TDataSource>;
64-
};

0 commit comments

Comments
 (0)