Skip to content

Commit 62a142b

Browse files
authored
fix(shared): Re-use common type for infinite Pagination params (clerk#2759)
1 parent fde58eb commit 62a142b

File tree

5 files changed

+54
-79
lines changed

5 files changed

+54
-79
lines changed

.changeset/orange-eyes-nail.md

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

packages/shared/src/react/hooks/useOrganization.tsx

+5-26
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,14 @@ import {
1717
useOrganizationContext,
1818
useSessionContext,
1919
} from '../contexts';
20-
import type { PaginatedResources, PaginatedResourcesWithDefault } from '../types';
20+
import type { PaginatedHookConfig, PaginatedResources, PaginatedResourcesWithDefault } from '../types';
2121
import { usePagesOrInfinite, useWithSafeValues } from './usePagesOrInfinite';
2222

2323
type UseOrganizationParams = {
24-
domains?:
25-
| true
26-
| (GetDomainsParams & {
27-
infinite?: boolean;
28-
keepPreviousData?: boolean;
29-
});
30-
membershipRequests?:
31-
| true
32-
| (GetMembershipRequestParams & {
33-
infinite?: boolean;
34-
keepPreviousData?: boolean;
35-
});
36-
memberships?:
37-
| true
38-
| (GetMembersParams & {
39-
infinite?: boolean;
40-
keepPreviousData?: boolean;
41-
});
42-
43-
invitations?:
44-
| true
45-
| (GetInvitationsParams & {
46-
infinite?: boolean;
47-
keepPreviousData?: boolean;
48-
});
24+
domains?: true | PaginatedHookConfig<GetDomainsParams>;
25+
membershipRequests?: true | PaginatedHookConfig<GetMembershipRequestParams>;
26+
memberships?: true | PaginatedHookConfig<GetMembersParams>;
27+
invitations?: true | PaginatedHookConfig<GetInvitationsParams>;
4928
};
5029

5130
type UseOrganization = <T extends UseOrganizationParams>(

packages/shared/src/react/hooks/useOrganizationList.tsx

+4-19
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,13 @@ import type {
1212
} from '@clerk/types';
1313

1414
import { useAssertWrappedByClerkProvider, useClerkInstanceContext, useUserContext } from '../contexts';
15-
import type { PaginatedResources, PaginatedResourcesWithDefault } from '../types';
15+
import type { PaginatedHookConfig, PaginatedResources, PaginatedResourcesWithDefault } from '../types';
1616
import { usePagesOrInfinite, useWithSafeValues } from './usePagesOrInfinite';
1717

1818
type UseOrganizationListParams = {
19-
userMemberships?:
20-
| true
21-
| (GetUserOrganizationMembershipParams & {
22-
infinite?: boolean;
23-
keepPreviousData?: boolean;
24-
});
25-
userInvitations?:
26-
| true
27-
| (GetUserOrganizationInvitationsParams & {
28-
infinite?: boolean;
29-
keepPreviousData?: boolean;
30-
});
31-
userSuggestions?:
32-
| true
33-
| (GetUserOrganizationSuggestionsParams & {
34-
infinite?: boolean;
35-
keepPreviousData?: boolean;
36-
});
19+
userMemberships?: true | PaginatedHookConfig<GetUserOrganizationMembershipParams>;
20+
userInvitations?: true | PaginatedHookConfig<GetUserOrganizationInvitationsParams>;
21+
userSuggestions?: true | PaginatedHookConfig<GetUserOrganizationSuggestionsParams>;
3722
};
3823

3924
const undefinedPaginatedResource = {

packages/shared/src/react/hooks/usePagesOrInfinite.ts

+14-34
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@
33
import { useCallback, useMemo, useRef, useState } from 'react';
44

55
import { useSWR, useSWRInfinite } from '../clerk-swr';
6-
import type { CacheSetter, PaginatedResources, ValueOrSetter } from '../types';
6+
import type {
7+
CacheSetter,
8+
PagesOrInfiniteConfig,
9+
PagesOrInfiniteOptions,
10+
PaginatedResources,
11+
ValueOrSetter,
12+
} from '../types';
713

814
function getDifferentKeys(obj1: Record<string, unknown>, obj2: Record<string, unknown>): Record<string, unknown> {
915
const keysSet = new Set(Object.keys(obj2));
@@ -18,17 +24,6 @@ function getDifferentKeys(obj1: Record<string, unknown>, obj2: Record<string, un
1824
return differentKeysObject;
1925
}
2026

21-
type PagesOrInfiniteOptions = {
22-
/**
23-
* This the starting point for your fetched results. The initial value persists between re-renders
24-
*/
25-
initialPage?: number;
26-
/**
27-
* Maximum number of items returned per request. The initial value persists between re-renders
28-
*/
29-
pageSize?: number;
30-
};
31-
3227
export const useWithSafeValues = <T extends PagesOrInfiniteOptions>(params: T | true | undefined, defaultValues: T) => {
3328
const shouldUseDefaults = typeof params === 'boolean' && params;
3429

@@ -59,26 +54,11 @@ const cachingSWROptions = {
5954
type ArrayType<DataArray> = DataArray extends Array<infer ElementType> ? ElementType : never;
6055
type ExtractData<Type> = Type extends { data: infer Data } ? ArrayType<Data> : Type;
6156

62-
type DefaultOptions = {
63-
/**
64-
* Persists the previous pages with new ones in the same array
65-
*/
66-
infinite?: boolean;
67-
/**
68-
* Return the previous key's data until the new data has been loaded
69-
*/
70-
keepPreviousData?: boolean;
71-
/**
72-
* Should a request be triggered
73-
*/
74-
enabled?: boolean;
75-
};
76-
7757
type UsePagesOrInfinite = <
7858
Params extends PagesOrInfiniteOptions,
7959
FetcherReturnData extends Record<string, any>,
8060
CacheKeys = Record<string, unknown>,
81-
TOptions extends DefaultOptions = DefaultOptions,
61+
TConfig extends PagesOrInfiniteConfig = PagesOrInfiniteConfig,
8262
>(
8363
/**
8464
* The parameters will be passed to the fetcher
@@ -91,20 +71,20 @@ type UsePagesOrInfinite = <
9171
/**
9272
* Internal configuration of the hook
9373
*/
94-
options: TOptions,
74+
config: TConfig,
9575
cacheKeys: CacheKeys,
96-
) => PaginatedResources<ExtractData<FetcherReturnData>, TOptions['infinite']>;
76+
) => PaginatedResources<ExtractData<FetcherReturnData>, TConfig['infinite']>;
9777

98-
export const usePagesOrInfinite: UsePagesOrInfinite = (params, fetcher, options, cacheKeys) => {
78+
export const usePagesOrInfinite: UsePagesOrInfinite = (params, fetcher, config, cacheKeys) => {
9979
const [paginatedPage, setPaginatedPage] = useState(params.initialPage ?? 1);
10080

10181
// Cache initialPage and initialPageSize until unmount
10282
const initialPageRef = useRef(params.initialPage ?? 1);
10383
const pageSizeRef = useRef(params.pageSize ?? 10);
10484

105-
const enabled = options.enabled ?? true;
106-
const triggerInfinite = options.infinite ?? false;
107-
const keepPreviousData = options.keepPreviousData ?? false;
85+
const enabled = config.enabled ?? true;
86+
const triggerInfinite = config.infinite ?? false;
87+
const keepPreviousData = config.keepPreviousData ?? false;
10888

10989
const pagesCacheKey = {
11090
...cacheKeys,

packages/shared/src/react/types.ts

+29
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,32 @@ export type PaginatedResources<T = unknown, Infinite = false> = {
3131
export type PaginatedResourcesWithDefault<T> = {
3232
[K in keyof PaginatedResources<T>]: PaginatedResources<T>[K] extends boolean ? false : undefined;
3333
};
34+
35+
export type PaginatedHookConfig<T> = T & {
36+
/**
37+
* Persists the previous pages with new ones in the same array
38+
*/
39+
infinite?: boolean;
40+
/**
41+
* Return the previous key's data until the new data has been loaded
42+
*/
43+
keepPreviousData?: boolean;
44+
};
45+
46+
export type PagesOrInfiniteConfig = PaginatedHookConfig<{
47+
/**
48+
* Should a request be triggered
49+
*/
50+
enabled?: boolean;
51+
}>;
52+
53+
export type PagesOrInfiniteOptions = {
54+
/**
55+
* This the starting point for your fetched results. The initial value persists between re-renders
56+
*/
57+
initialPage?: number;
58+
/**
59+
* Maximum number of items returned per request. The initial value persists between re-renders
60+
*/
61+
pageSize?: number;
62+
};

0 commit comments

Comments
 (0)