@isograph/react 0.0.0-main-6bd3135f → 0.0.0-main-eca51643
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/reader.d.ts +3 -3
- package/dist/core/util.d.ts +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/loadable-hooks/useClientSideDefer.d.ts +2 -2
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +7 -8
- package/dist/loadable-hooks/useConnectionSpecPagination.js +9 -6
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +11 -10
- package/dist/loadable-hooks/useSkipLimitPagination.js +20 -5
- package/dist/react/FragmentReader.d.ts +1 -1
- package/package.json +4 -4
- package/src/core/reader.ts +4 -4
- package/src/core/util.ts +4 -0
- package/src/index.ts +1 -0
- package/src/loadable-hooks/useClientSideDefer.ts +15 -3
- package/src/loadable-hooks/useConnectionSpecPagination.ts +18 -24
- package/src/loadable-hooks/useImperativeLoadableField.ts +5 -1
- package/src/loadable-hooks/useSkipLimitPagination.ts +63 -18
- package/src/react/FragmentReader.tsx +1 -1
- package/src/tests/__isograph/Query/meName/param_type.ts +1 -1
- package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +1 -1
- package/src/tests/__isograph/iso.ts +1 -1
package/dist/core/reader.d.ts
CHANGED
@@ -6,7 +6,7 @@ import { Arguments } from './util';
|
|
6
6
|
export type TopLevelReaderArtifact<TReadFromStore extends {
|
7
7
|
parameters: object;
|
8
8
|
data: object;
|
9
|
-
}, TClientFieldValue, TComponentProps extends Record<
|
9
|
+
}, TClientFieldValue, TComponentProps extends Record<PropertyKey, never>> = EagerReaderArtifact<TReadFromStore, TClientFieldValue> | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
|
10
10
|
export type EagerReaderArtifact<TReadFromStore extends {
|
11
11
|
parameters: object;
|
12
12
|
data: object;
|
@@ -18,7 +18,7 @@ export type EagerReaderArtifact<TReadFromStore extends {
|
|
18
18
|
export type ComponentReaderArtifact<TReadFromStore extends {
|
19
19
|
parameters: object;
|
20
20
|
data: object;
|
21
|
-
}, TComponentProps extends Record<string, unknown> = Record<
|
21
|
+
}, TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>> = {
|
22
22
|
readonly kind: 'ComponentReaderArtifact';
|
23
23
|
readonly componentName: ComponentOrFieldName;
|
24
24
|
readonly readerAst: ReaderAst<TReadFromStore>;
|
@@ -77,5 +77,5 @@ type StableId = string;
|
|
77
77
|
export type LoadableField<TReadFromStore extends {
|
78
78
|
data: object;
|
79
79
|
parameters: object;
|
80
|
-
}, TResult,
|
80
|
+
}, TResult, TArgs = ExtractParameters<TReadFromStore>> = (args: TArgs | void) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
|
81
81
|
export {};
|
package/dist/core/util.d.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends (arg1: any, arg2: infer P) => any ? P : never;
|
2
|
+
export type CombineWithIntrinsicAttributes<T> = T extends Record<PropertyKey, never> ? JSX.IntrinsicAttributes : T & JSX.IntrinsicAttributes;
|
2
3
|
export type Arguments = Argument[];
|
3
4
|
export type Argument = [ArgumentName, ArgumentValue];
|
4
5
|
export type ArgumentName = string;
|
package/dist/index.d.ts
CHANGED
@@ -6,7 +6,7 @@ export { ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, typ
|
|
6
6
|
export { type EagerReaderArtifact, type ComponentReaderArtifact, type RefetchReaderArtifact, type ReaderAst, type ReaderAstNode, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField, type TopLevelReaderArtifact, type LoadableField, type ResolverFirstParameter, } from './core/reader';
|
7
7
|
export { type NormalizationAst, type NormalizationAstNode, type NormalizationLinkedField, type NormalizationScalarField, type IsographEntrypoint, assertIsEntrypoint, type RefetchQueryNormalizationArtifact, type RefetchQueryNormalizationArtifactWrapper, type ExtractProps, type ExtractReadFromStore, type ExtractResolverResult, } from './core/entrypoint';
|
8
8
|
export { readButDoNotEvaluate } from './core/read';
|
9
|
-
export { type ExtractSecondParam, type Argument, type ArgumentName, type ArgumentValue, type Arguments, } from './core/util';
|
9
|
+
export { type ExtractSecondParam, type CombineWithIntrinsicAttributes, type Argument, type ArgumentName, type ArgumentValue, type Arguments, } from './core/util';
|
10
10
|
export { type FragmentReference, type Variables, type ExtractParameters, type ExtractData, stableIdForFragmentReference, } from './core/FragmentReference';
|
11
11
|
export { type LogMessage, type LogFunction, logMessage, registerLogger, } from './core/logging';
|
12
12
|
export { IsographEnvironmentProvider, useIsographEnvironment, type IsographEnvironmentProviderProps, } from './react/IsographEnvironmentProvider';
|
@@ -3,12 +3,12 @@ import { LoadableField } from '../core/reader';
|
|
3
3
|
export declare function useClientSideDefer<TReadFromStore extends {
|
4
4
|
data: object;
|
5
5
|
parameters: object;
|
6
|
-
}, TResult>(loadableField: LoadableField<TReadFromStore, TResult
|
6
|
+
}, TResult>(loadableField: LoadableField<TReadFromStore, TResult, ExtractParameters<TReadFromStore>>): {
|
7
7
|
fragmentReference: FragmentReference<TReadFromStore, TResult>;
|
8
8
|
};
|
9
9
|
export declare function useClientSideDefer<TReadFromStore extends {
|
10
10
|
data: object;
|
11
11
|
parameters: object;
|
12
|
-
}, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult,
|
12
|
+
}, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult, Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>>, args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>): {
|
13
13
|
fragmentReference: FragmentReference<TReadFromStore, TResult>;
|
14
14
|
};
|
@@ -1,7 +1,5 @@
|
|
1
1
|
import { FragmentReference } from '../core/FragmentReference';
|
2
2
|
import { LoadableField } from '../core/reader';
|
3
|
-
type FirstOrAfter = 'first' | 'after';
|
4
|
-
type OmitFirstAfter<TArgs> = keyof Omit<TArgs, FirstOrAfter> extends never ? void | Record<string, never> : Omit<TArgs, FirstOrAfter>;
|
5
3
|
type UsePaginationReturnValue<TReadFromStore extends {
|
6
4
|
parameters: object;
|
7
5
|
data: object;
|
@@ -11,7 +9,7 @@ type UsePaginationReturnValue<TReadFromStore extends {
|
|
11
9
|
results: ReadonlyArray<TItem>;
|
12
10
|
} | {
|
13
11
|
kind: 'Complete';
|
14
|
-
fetchMore: (
|
12
|
+
fetchMore: (count: number) => void;
|
15
13
|
results: ReadonlyArray<TItem>;
|
16
14
|
hasNextPage: boolean;
|
17
15
|
};
|
@@ -23,11 +21,12 @@ type Connection<T> = {
|
|
23
21
|
readonly edges: ReadonlyArray<T> | null;
|
24
22
|
readonly pageInfo: PageInfo;
|
25
23
|
};
|
24
|
+
type UseConnectionSpecPaginationArgs = {
|
25
|
+
first: number;
|
26
|
+
after: string | null;
|
27
|
+
};
|
26
28
|
export declare function useConnectionSpecPagination<TReadFromStore extends {
|
27
|
-
parameters:
|
28
|
-
readonly first?: number | void | null;
|
29
|
-
readonly after?: string | void | null;
|
30
|
-
};
|
29
|
+
parameters: object;
|
31
30
|
data: object;
|
32
|
-
}, TItem>(loadableField: LoadableField<TReadFromStore, Connection<TItem
|
31
|
+
}, TItem>(loadableField: LoadableField<TReadFromStore, Connection<TItem>, UseConnectionSpecPaginationArgs>, pageInfo?: PageInfo): UsePaginationReturnValue<TReadFromStore, TItem>;
|
33
32
|
export {};
|
@@ -19,7 +19,8 @@ function flatten(arr) {
|
|
19
19
|
}
|
20
20
|
return outArray;
|
21
21
|
}
|
22
|
-
function useConnectionSpecPagination(loadableField) {
|
22
|
+
function useConnectionSpecPagination(loadableField, pageInfo) {
|
23
|
+
var _a, _b;
|
23
24
|
const networkRequestOptions = {
|
24
25
|
suspendIfInFlight: true,
|
25
26
|
throwOnNetworkError: true,
|
@@ -64,9 +65,11 @@ function useConnectionSpecPagination(loadableField) {
|
|
64
65
|
};
|
65
66
|
});
|
66
67
|
}
|
67
|
-
const getFetchMore = (after) => (
|
68
|
-
|
69
|
-
|
68
|
+
const getFetchMore = (after) => (count) => {
|
69
|
+
const loadedField = loadableField({
|
70
|
+
after: after,
|
71
|
+
first: count,
|
72
|
+
})[1]();
|
70
73
|
const newPointer = (0, reference_counted_pointer_1.createReferenceCountedPointer)(loadedField);
|
71
74
|
const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
|
72
75
|
const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
|
@@ -113,9 +116,9 @@ function useConnectionSpecPagination(loadableField) {
|
|
113
116
|
if (!networkRequestStatus) {
|
114
117
|
return {
|
115
118
|
kind: 'Complete',
|
116
|
-
fetchMore: getFetchMore(null),
|
119
|
+
fetchMore: getFetchMore((_a = pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.endCursor) !== null && _a !== void 0 ? _a : null),
|
117
120
|
results: [],
|
118
|
-
hasNextPage: true,
|
121
|
+
hasNextPage: (_b = pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.hasNextPage) !== null && _b !== void 0 ? _b : true,
|
119
122
|
};
|
120
123
|
}
|
121
124
|
switch (networkRequestStatus.kind) {
|
@@ -11,5 +11,5 @@ type UseImperativeLoadableFieldReturn<TReadFromStore extends {
|
|
11
11
|
export declare function useImperativeLoadableField<TReadFromStore extends {
|
12
12
|
data: object;
|
13
13
|
parameters: object;
|
14
|
-
}, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult, TProvidedArgs
|
14
|
+
}, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult, Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>>): UseImperativeLoadableFieldReturn<TReadFromStore, TResult, TProvidedArgs>;
|
15
15
|
export {};
|
@@ -1,24 +1,25 @@
|
|
1
1
|
import { LoadableField } from '../core/reader';
|
2
2
|
import { FragmentReference } from '../core/FragmentReference';
|
3
|
-
type SkipOrLimit = 'skip' | 'limit';
|
4
|
-
type OmitSkipLimit<TArgs> = keyof Omit<TArgs, SkipOrLimit> extends never ? void | Record<string, never> : Omit<TArgs, SkipOrLimit>;
|
5
3
|
type UseSkipLimitReturnValue<TReadFromStore extends {
|
6
4
|
data: object;
|
7
5
|
parameters: object;
|
8
|
-
},
|
6
|
+
}, TItem> = {
|
9
7
|
readonly kind: 'Complete';
|
10
|
-
readonly fetchMore: (
|
8
|
+
readonly fetchMore: (count: number) => void;
|
11
9
|
readonly results: ReadonlyArray<TItem>;
|
12
10
|
} | {
|
13
11
|
readonly kind: 'Pending';
|
14
12
|
readonly results: ReadonlyArray<TItem>;
|
15
13
|
readonly pendingFragment: FragmentReference<TReadFromStore, ReadonlyArray<TItem>>;
|
16
14
|
};
|
17
|
-
|
18
|
-
skip: number
|
19
|
-
limit: number
|
20
|
-
}
|
21
|
-
|
15
|
+
type UseSkipLimitPaginationArgs = {
|
16
|
+
skip: number;
|
17
|
+
limit: number;
|
18
|
+
};
|
19
|
+
export declare function useSkipLimitPagination<TItem, TReadFromStore extends {
|
20
|
+
parameters: object;
|
22
21
|
data: object;
|
23
|
-
}>(loadableField: LoadableField<TReadFromStore, ReadonlyArray<TItem
|
22
|
+
}>(loadableField: LoadableField<TReadFromStore, ReadonlyArray<TItem>, UseSkipLimitPaginationArgs>, initialArgs?: {
|
23
|
+
skip?: number | void | null;
|
24
|
+
}): UseSkipLimitReturnValue<TReadFromStore, TItem>;
|
24
25
|
export {};
|
@@ -19,7 +19,8 @@ function flatten(arr) {
|
|
19
19
|
}
|
20
20
|
return outArray;
|
21
21
|
}
|
22
|
-
function useSkipLimitPagination(loadableField) {
|
22
|
+
function useSkipLimitPagination(loadableField, initialArgs) {
|
23
|
+
var _a;
|
23
24
|
const networkRequestOptions = {
|
24
25
|
suspendIfInFlight: true,
|
25
26
|
throwOnNetworkError: true,
|
@@ -57,9 +58,11 @@ function useSkipLimitPagination(loadableField) {
|
|
57
58
|
};
|
58
59
|
});
|
59
60
|
}
|
60
|
-
const getFetchMore = (loadedSoFar) => (
|
61
|
-
|
62
|
-
|
61
|
+
const getFetchMore = (loadedSoFar) => (count) => {
|
62
|
+
const loadedField = loadableField({
|
63
|
+
skip: loadedSoFar,
|
64
|
+
limit: count,
|
65
|
+
})[1]();
|
63
66
|
const newPointer = (0, reference_counted_pointer_1.createReferenceCountedPointer)(loadedField);
|
64
67
|
const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
|
65
68
|
const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
|
@@ -106,7 +109,7 @@ function useSkipLimitPagination(loadableField) {
|
|
106
109
|
if (!networkRequestStatus) {
|
107
110
|
return {
|
108
111
|
kind: 'Complete',
|
109
|
-
fetchMore: getFetchMore(0),
|
112
|
+
fetchMore: getFetchMore((_a = initialArgs === null || initialArgs === void 0 ? void 0 : initialArgs.skip) !== null && _a !== void 0 ? _a : 0),
|
110
113
|
results: [],
|
111
114
|
};
|
112
115
|
}
|
@@ -135,3 +138,15 @@ function useSkipLimitPagination(loadableField) {
|
|
135
138
|
}
|
136
139
|
}
|
137
140
|
}
|
141
|
+
// @ts-ignore
|
142
|
+
function tsTests() {
|
143
|
+
let basicLoadable;
|
144
|
+
useSkipLimitPagination(basicLoadable);
|
145
|
+
useSkipLimitPagination(basicLoadable, {});
|
146
|
+
useSkipLimitPagination(basicLoadable, { skip: 10 });
|
147
|
+
let unprovidedSearchLoadable;
|
148
|
+
// @ts-expect-error
|
149
|
+
useSkipLimitPagination(unprovidedSearchLoadable);
|
150
|
+
let providedSearchLoadable;
|
151
|
+
useSkipLimitPagination(providedSearchLoadable);
|
152
|
+
}
|
@@ -2,7 +2,7 @@ import * as React from 'react';
|
|
2
2
|
import { ExtractReadFromStore, IsographEntrypoint } from '../core/entrypoint';
|
3
3
|
import { FragmentReference } from '../core/FragmentReference';
|
4
4
|
import { NetworkRequestReaderOptions } from '../core/read';
|
5
|
-
export declare function FragmentReader<TProps extends Record<any, any>, TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>>(props: TProps extends Record<
|
5
|
+
export declare function FragmentReader<TProps extends Record<any, any>, TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>>(props: TProps extends Record<PropertyKey, never> ? {
|
6
6
|
fragmentReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<{}>>;
|
7
7
|
additionalProps?: TProps;
|
8
8
|
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@isograph/react",
|
3
|
-
"version": "0.0.0-main-
|
3
|
+
"version": "0.0.0-main-eca51643",
|
4
4
|
"description": "Use Isograph with React",
|
5
5
|
"homepage": "https://isograph.dev",
|
6
6
|
"main": "dist/index.js",
|
@@ -17,9 +17,9 @@
|
|
17
17
|
"tsc": "tsc"
|
18
18
|
},
|
19
19
|
"dependencies": {
|
20
|
-
"@isograph/disposable-types": "0.0.0-main-
|
21
|
-
"@isograph/react-disposable-state": "0.0.0-main-
|
22
|
-
"@isograph/reference-counted-pointer": "0.0.0-main-
|
20
|
+
"@isograph/disposable-types": "0.0.0-main-eca51643",
|
21
|
+
"@isograph/react-disposable-state": "0.0.0-main-eca51643",
|
22
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-eca51643"
|
23
23
|
},
|
24
24
|
"peerDependencies": {
|
25
25
|
"react": "18.3.1"
|
package/src/core/reader.ts
CHANGED
@@ -20,7 +20,7 @@ import { Arguments } from './util';
|
|
20
20
|
export type TopLevelReaderArtifact<
|
21
21
|
TReadFromStore extends { parameters: object; data: object },
|
22
22
|
TClientFieldValue,
|
23
|
-
TComponentProps extends Record<
|
23
|
+
TComponentProps extends Record<PropertyKey, never>,
|
24
24
|
> =
|
25
25
|
| EagerReaderArtifact<TReadFromStore, TClientFieldValue>
|
26
26
|
| ComponentReaderArtifact<TReadFromStore, TComponentProps>;
|
@@ -38,7 +38,7 @@ export type EagerReaderArtifact<
|
|
38
38
|
|
39
39
|
export type ComponentReaderArtifact<
|
40
40
|
TReadFromStore extends { parameters: object; data: object },
|
41
|
-
TComponentProps extends Record<string, unknown> = Record<
|
41
|
+
TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>,
|
42
42
|
> = {
|
43
43
|
readonly kind: 'ComponentReaderArtifact';
|
44
44
|
readonly componentName: ComponentOrFieldName;
|
@@ -144,7 +144,7 @@ type StableId = string;
|
|
144
144
|
export type LoadableField<
|
145
145
|
TReadFromStore extends { data: object; parameters: object },
|
146
146
|
TResult,
|
147
|
-
|
147
|
+
TArgs = ExtractParameters<TReadFromStore>,
|
148
148
|
> = (
|
149
|
-
args:
|
149
|
+
args: TArgs | void,
|
150
150
|
) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
|
package/src/core/util.ts
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> =
|
2
2
|
T extends (arg1: any, arg2: infer P) => any ? P : never;
|
3
|
+
export type CombineWithIntrinsicAttributes<T> =
|
4
|
+
T extends Record<PropertyKey, never>
|
5
|
+
? JSX.IntrinsicAttributes
|
6
|
+
: T & JSX.IntrinsicAttributes;
|
3
7
|
|
4
8
|
export type Arguments = Argument[];
|
5
9
|
export type Argument = [ArgumentName, ArgumentValue];
|
package/src/index.ts
CHANGED
@@ -11,7 +11,11 @@ export function useClientSideDefer<
|
|
11
11
|
TReadFromStore extends { data: object; parameters: object },
|
12
12
|
TResult,
|
13
13
|
>(
|
14
|
-
loadableField: LoadableField<
|
14
|
+
loadableField: LoadableField<
|
15
|
+
TReadFromStore,
|
16
|
+
TResult,
|
17
|
+
ExtractParameters<TReadFromStore>
|
18
|
+
>,
|
15
19
|
): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
|
16
20
|
|
17
21
|
export function useClientSideDefer<
|
@@ -19,7 +23,11 @@ export function useClientSideDefer<
|
|
19
23
|
TResult,
|
20
24
|
TProvidedArgs extends object,
|
21
25
|
>(
|
22
|
-
loadableField: LoadableField<
|
26
|
+
loadableField: LoadableField<
|
27
|
+
TReadFromStore,
|
28
|
+
TResult,
|
29
|
+
Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
|
30
|
+
>,
|
23
31
|
args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>,
|
24
32
|
): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
|
25
33
|
|
@@ -28,7 +36,11 @@ export function useClientSideDefer<
|
|
28
36
|
TResult,
|
29
37
|
TProvidedArgs extends object,
|
30
38
|
>(
|
31
|
-
loadableField: LoadableField<
|
39
|
+
loadableField: LoadableField<
|
40
|
+
TReadFromStore,
|
41
|
+
TResult,
|
42
|
+
Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
|
43
|
+
>,
|
32
44
|
args?: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>,
|
33
45
|
): { fragmentReference: FragmentReference<TReadFromStore, TResult> } {
|
34
46
|
const [id, loader] = loadableField(args);
|
@@ -20,11 +20,6 @@ import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
|
|
20
20
|
import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
|
21
21
|
import { maybeUnwrapNetworkRequest } from '../react/useResult';
|
22
22
|
|
23
|
-
type FirstOrAfter = 'first' | 'after';
|
24
|
-
type OmitFirstAfter<TArgs> = keyof Omit<TArgs, FirstOrAfter> extends never
|
25
|
-
? void | Record<string, never>
|
26
|
-
: Omit<TArgs, FirstOrAfter>;
|
27
|
-
|
28
23
|
type UsePaginationReturnValue<
|
29
24
|
TReadFromStore extends { parameters: object; data: object },
|
30
25
|
TItem,
|
@@ -36,10 +31,7 @@ type UsePaginationReturnValue<
|
|
36
31
|
}
|
37
32
|
| {
|
38
33
|
kind: 'Complete';
|
39
|
-
fetchMore: (
|
40
|
-
args: OmitFirstAfter<TReadFromStore['parameters']>,
|
41
|
-
first: number,
|
42
|
-
) => void;
|
34
|
+
fetchMore: (count: number) => void;
|
43
35
|
results: ReadonlyArray<TItem>;
|
44
36
|
hasNextPage: boolean;
|
45
37
|
};
|
@@ -81,17 +73,24 @@ type NonNullConnection<T> = {
|
|
81
73
|
readonly pageInfo: PageInfo;
|
82
74
|
};
|
83
75
|
|
76
|
+
type UseConnectionSpecPaginationArgs = {
|
77
|
+
first: number;
|
78
|
+
after: string | null;
|
79
|
+
};
|
80
|
+
|
84
81
|
export function useConnectionSpecPagination<
|
85
82
|
TReadFromStore extends {
|
86
|
-
parameters:
|
87
|
-
readonly first?: number | void | null;
|
88
|
-
readonly after?: string | void | null;
|
89
|
-
};
|
83
|
+
parameters: object;
|
90
84
|
data: object;
|
91
85
|
},
|
92
86
|
TItem,
|
93
87
|
>(
|
94
|
-
loadableField: LoadableField<
|
88
|
+
loadableField: LoadableField<
|
89
|
+
TReadFromStore,
|
90
|
+
Connection<TItem>,
|
91
|
+
UseConnectionSpecPaginationArgs
|
92
|
+
>,
|
93
|
+
pageInfo?: PageInfo,
|
95
94
|
): UsePaginationReturnValue<TReadFromStore, TItem> {
|
96
95
|
const networkRequestOptions = {
|
97
96
|
suspendIfInFlight: true,
|
@@ -178,16 +177,11 @@ export function useConnectionSpecPagination<
|
|
178
177
|
}
|
179
178
|
|
180
179
|
const getFetchMore =
|
181
|
-
(after: string | null
|
182
|
-
(
|
183
|
-
args: OmitFirstAfter<TReadFromStore['parameters']>,
|
184
|
-
first: number,
|
185
|
-
): void => {
|
186
|
-
// @ts-expect-error
|
180
|
+
(after: string | null) =>
|
181
|
+
(count: number): void => {
|
187
182
|
const loadedField = loadableField({
|
188
|
-
...args,
|
189
183
|
after: after,
|
190
|
-
first:
|
184
|
+
first: count,
|
191
185
|
})[1]();
|
192
186
|
const newPointer = createReferenceCountedPointer(loadedField);
|
193
187
|
const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
|
@@ -278,9 +272,9 @@ export function useConnectionSpecPagination<
|
|
278
272
|
if (!networkRequestStatus) {
|
279
273
|
return {
|
280
274
|
kind: 'Complete',
|
281
|
-
fetchMore: getFetchMore(null),
|
275
|
+
fetchMore: getFetchMore(pageInfo?.endCursor ?? null),
|
282
276
|
results: [],
|
283
|
-
hasNextPage: true,
|
277
|
+
hasNextPage: pageInfo?.hasNextPage ?? true,
|
284
278
|
};
|
285
279
|
}
|
286
280
|
|
@@ -26,7 +26,11 @@ export function useImperativeLoadableField<
|
|
26
26
|
TResult,
|
27
27
|
TProvidedArgs extends object,
|
28
28
|
>(
|
29
|
-
loadableField: LoadableField<
|
29
|
+
loadableField: LoadableField<
|
30
|
+
TReadFromStore,
|
31
|
+
TResult,
|
32
|
+
Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
|
33
|
+
>,
|
30
34
|
): UseImperativeLoadableFieldReturn<TReadFromStore, TResult, TProvidedArgs> {
|
31
35
|
const { state, setState } =
|
32
36
|
useUpdatableDisposableState<FragmentReference<TReadFromStore, TResult>>();
|
@@ -18,19 +18,13 @@ import { getPromiseState, readPromise } from '../core/PromiseWrapper';
|
|
18
18
|
import { type WithEncounteredRecords } from '../core/read';
|
19
19
|
import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
|
20
20
|
|
21
|
-
type SkipOrLimit = 'skip' | 'limit';
|
22
|
-
type OmitSkipLimit<TArgs> = keyof Omit<TArgs, SkipOrLimit> extends never
|
23
|
-
? void | Record<string, never>
|
24
|
-
: Omit<TArgs, SkipOrLimit>;
|
25
|
-
|
26
21
|
type UseSkipLimitReturnValue<
|
27
22
|
TReadFromStore extends { data: object; parameters: object },
|
28
|
-
TArgs,
|
29
23
|
TItem,
|
30
24
|
> =
|
31
25
|
| {
|
32
26
|
readonly kind: 'Complete';
|
33
|
-
readonly fetchMore: (
|
27
|
+
readonly fetchMore: (count: number) => void;
|
34
28
|
readonly results: ReadonlyArray<TItem>;
|
35
29
|
}
|
36
30
|
| {
|
@@ -69,16 +63,27 @@ function flatten<T>(arr: ReadonlyArray<ReadonlyArray<T>>): ReadonlyArray<T> {
|
|
69
63
|
return outArray;
|
70
64
|
}
|
71
65
|
|
66
|
+
type UseSkipLimitPaginationArgs = {
|
67
|
+
skip: number;
|
68
|
+
limit: number;
|
69
|
+
};
|
70
|
+
|
72
71
|
export function useSkipLimitPagination<
|
73
|
-
TArgs extends {
|
74
|
-
skip: number | void | null;
|
75
|
-
limit: number | void | null;
|
76
|
-
},
|
77
72
|
TItem,
|
78
|
-
TReadFromStore extends {
|
73
|
+
TReadFromStore extends {
|
74
|
+
parameters: object;
|
75
|
+
data: object;
|
76
|
+
},
|
79
77
|
>(
|
80
|
-
loadableField: LoadableField<
|
81
|
-
|
78
|
+
loadableField: LoadableField<
|
79
|
+
TReadFromStore,
|
80
|
+
ReadonlyArray<TItem>,
|
81
|
+
UseSkipLimitPaginationArgs
|
82
|
+
>,
|
83
|
+
initialArgs?: {
|
84
|
+
skip?: number | void | null;
|
85
|
+
},
|
86
|
+
): UseSkipLimitReturnValue<TReadFromStore, TItem> {
|
82
87
|
const networkRequestOptions = {
|
83
88
|
suspendIfInFlight: true,
|
84
89
|
throwOnNetworkError: true,
|
@@ -158,10 +163,8 @@ export function useSkipLimitPagination<
|
|
158
163
|
|
159
164
|
const getFetchMore =
|
160
165
|
(loadedSoFar: number) =>
|
161
|
-
(
|
162
|
-
// @ts-expect-error
|
166
|
+
(count: number): void => {
|
163
167
|
const loadedField = loadableField({
|
164
|
-
...args,
|
165
168
|
skip: loadedSoFar,
|
166
169
|
limit: count,
|
167
170
|
})[1]();
|
@@ -252,7 +255,7 @@ export function useSkipLimitPagination<
|
|
252
255
|
if (!networkRequestStatus) {
|
253
256
|
return {
|
254
257
|
kind: 'Complete',
|
255
|
-
fetchMore: getFetchMore(0),
|
258
|
+
fetchMore: getFetchMore(initialArgs?.skip ?? 0),
|
256
259
|
results: [],
|
257
260
|
};
|
258
261
|
}
|
@@ -285,3 +288,45 @@ export function useSkipLimitPagination<
|
|
285
288
|
}
|
286
289
|
}
|
287
290
|
}
|
291
|
+
|
292
|
+
// @ts-ignore
|
293
|
+
function tsTests() {
|
294
|
+
type Parameters = {
|
295
|
+
readonly search: string;
|
296
|
+
readonly skip: number;
|
297
|
+
readonly limit: number;
|
298
|
+
};
|
299
|
+
|
300
|
+
let basicLoadable!: LoadableField<
|
301
|
+
{
|
302
|
+
readonly data: object;
|
303
|
+
readonly parameters: Omit<Parameters, 'search'>;
|
304
|
+
},
|
305
|
+
object[]
|
306
|
+
>;
|
307
|
+
|
308
|
+
useSkipLimitPagination(basicLoadable);
|
309
|
+
useSkipLimitPagination(basicLoadable, {});
|
310
|
+
useSkipLimitPagination(basicLoadable, { skip: 10 });
|
311
|
+
|
312
|
+
let unprovidedSearchLoadable!: LoadableField<
|
313
|
+
{
|
314
|
+
readonly data: object;
|
315
|
+
readonly parameters: Parameters;
|
316
|
+
},
|
317
|
+
object[]
|
318
|
+
>;
|
319
|
+
// @ts-expect-error
|
320
|
+
useSkipLimitPagination(unprovidedSearchLoadable);
|
321
|
+
|
322
|
+
let providedSearchLoadable!: LoadableField<
|
323
|
+
{
|
324
|
+
readonly data: object;
|
325
|
+
readonly parameters: Parameters;
|
326
|
+
},
|
327
|
+
object[],
|
328
|
+
Omit<Parameters, 'search'>
|
329
|
+
>;
|
330
|
+
|
331
|
+
useSkipLimitPagination(providedSearchLoadable);
|
332
|
+
}
|
@@ -8,7 +8,7 @@ export function FragmentReader<
|
|
8
8
|
TProps extends Record<any, any>,
|
9
9
|
TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>,
|
10
10
|
>(
|
11
|
-
props: TProps extends Record<
|
11
|
+
props: TProps extends Record<PropertyKey, never>
|
12
12
|
? {
|
13
13
|
fragmentReference: FragmentReference<
|
14
14
|
ExtractReadFromStore<TEntrypoint>,
|
@@ -23,7 +23,7 @@ type IdentityWithParam<TParam extends object> = <TClientFieldReturn>(
|
|
23
23
|
// whenever the @component field is rendered.
|
24
24
|
type IdentityWithParamComponent<TParam extends object> = <
|
25
25
|
TClientFieldReturn,
|
26
|
-
TComponentProps = Record<
|
26
|
+
TComponentProps = Record<PropertyKey, never>,
|
27
27
|
>(
|
28
28
|
clientComponentField: (data: TParam, componentProps: TComponentProps) => TClientFieldReturn
|
29
29
|
) => (data: TParam, componentProps: TComponentProps) => TClientFieldReturn;
|