@isograph/react 0.0.0-main-ae8aa2fe → 0.0.0-main-fbe23de7
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/FragmentReference.d.ts +2 -0
- package/dist/core/PromiseWrapper.d.ts +17 -4
- package/dist/core/PromiseWrapper.js +35 -10
- package/dist/core/cache.d.ts +2 -2
- package/dist/core/cache.js +31 -4
- package/dist/core/componentCache.d.ts +2 -1
- package/dist/core/componentCache.js +2 -2
- package/dist/core/entrypoint.d.ts +2 -0
- package/dist/core/makeNetworkRequest.d.ts +2 -2
- package/dist/core/makeNetworkRequest.js +6 -2
- package/dist/core/read.d.ts +5 -1
- package/dist/core/read.js +32 -10
- package/dist/index.d.ts +6 -6
- package/dist/index.js +6 -3
- package/dist/loadable-hooks/useClientSideDefer.js +0 -1
- package/dist/react/{FragmentReferenceReader.d.ts → FragmentReader.d.ts} +4 -1
- package/dist/react/{FragmentReferenceReader.js → FragmentReader.js} +5 -4
- package/dist/react/useImperativeReference.d.ts +1 -1
- package/dist/react/useImperativeReference.js +3 -2
- package/dist/react/useLazyReference.js +2 -3
- package/dist/react/useReadAndSubscribe.d.ts +2 -2
- package/dist/react/useReadAndSubscribe.js +5 -3
- package/dist/react/useRerenderOnChange.d.ts +1 -2
- package/dist/react/useRerenderOnChange.js +3 -1
- package/dist/react/useResult.d.ts +4 -1
- package/dist/react/useResult.js +17 -4
- package/package.json +3 -3
- package/src/core/FragmentReference.ts +2 -0
- package/src/core/PromiseWrapper.ts +58 -12
- package/src/core/cache.ts +80 -57
- package/src/core/componentCache.ts +6 -1
- package/src/core/entrypoint.ts +1 -0
- package/src/core/makeNetworkRequest.ts +11 -6
- package/src/core/read.ts +52 -7
- package/src/index.ts +35 -25
- package/src/loadable-hooks/useClientSideDefer.ts +1 -1
- package/src/react/{FragmentReferenceReader.tsx → FragmentReader.tsx} +8 -2
- package/src/react/useImperativeReference.ts +4 -3
- package/src/react/useLazyReference.ts +2 -3
- package/src/react/useReadAndSubscribe.ts +8 -5
- package/src/react/useRerenderOnChange.ts +2 -2
- package/src/react/useResult.ts +28 -1
@@ -2,8 +2,9 @@ import * as React from 'react';
|
|
2
2
|
import { ExtractReadFromStore, IsographEntrypoint } from '../core/entrypoint';
|
3
3
|
import { FragmentReference } from '../core/FragmentReference';
|
4
4
|
import { useResult } from './useResult';
|
5
|
+
import { NetworkRequestReaderOptions } from '../core/read';
|
5
6
|
|
6
|
-
export function
|
7
|
+
export function FragmentReader<
|
7
8
|
TProps extends Record<any, any>,
|
8
9
|
TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>,
|
9
10
|
>(
|
@@ -14,6 +15,7 @@ export function FragmentReferenceReader<
|
|
14
15
|
React.FC<{}>
|
15
16
|
>;
|
16
17
|
additionalProps?: TProps;
|
18
|
+
networkRequestOptions?: NetworkRequestReaderOptions;
|
17
19
|
}
|
18
20
|
: {
|
19
21
|
fragmentReference: FragmentReference<
|
@@ -21,8 +23,12 @@ export function FragmentReferenceReader<
|
|
21
23
|
React.FC<TProps>
|
22
24
|
>;
|
23
25
|
additionalProps: TProps;
|
26
|
+
networkRequestOptions?: NetworkRequestReaderOptions;
|
24
27
|
},
|
25
28
|
): React.ReactNode {
|
26
|
-
const Component = useResult(
|
29
|
+
const Component = useResult(
|
30
|
+
props.fragmentReference,
|
31
|
+
props.networkRequestOptions ?? {},
|
32
|
+
);
|
27
33
|
return <Component {...props.additionalProps} />;
|
28
34
|
}
|
@@ -17,7 +17,7 @@ export function useImperativeReference<
|
|
17
17
|
fragmentReference:
|
18
18
|
| FragmentReference<TReadFromStore, TClientFieldValue>
|
19
19
|
| UnassignedState;
|
20
|
-
|
20
|
+
loadFragmentReference: (variables: Variables) => void;
|
21
21
|
} {
|
22
22
|
const { state, setState } =
|
23
23
|
useUpdatableDisposableState<
|
@@ -26,8 +26,8 @@ export function useImperativeReference<
|
|
26
26
|
const environment = useIsographEnvironment();
|
27
27
|
return {
|
28
28
|
fragmentReference: state,
|
29
|
-
|
30
|
-
const [
|
29
|
+
loadFragmentReference: (variables: Variables) => {
|
30
|
+
const [networkRequest, disposeNetworkRequest] = makeNetworkRequest(
|
31
31
|
environment,
|
32
32
|
entrypoint,
|
33
33
|
variables,
|
@@ -39,6 +39,7 @@ export function useImperativeReference<
|
|
39
39
|
root: ROOT_ID,
|
40
40
|
variables,
|
41
41
|
nestedRefetchQueries: entrypoint.nestedRefetchQueries,
|
42
|
+
networkRequest,
|
42
43
|
},
|
43
44
|
() => {
|
44
45
|
disposeNetworkRequest();
|
@@ -17,9 +17,7 @@ export function useLazyReference<
|
|
17
17
|
const environment = useIsographEnvironment();
|
18
18
|
const cache = getOrCreateCacheForArtifact(environment, entrypoint, variables);
|
19
19
|
|
20
|
-
|
21
|
-
// @ts-ignore(6133)
|
22
|
-
const _data = useLazyDisposableState(cache).state;
|
20
|
+
const networkRequest = useLazyDisposableState(cache).state;
|
23
21
|
|
24
22
|
return {
|
25
23
|
fragmentReference: {
|
@@ -28,6 +26,7 @@ export function useLazyReference<
|
|
28
26
|
root: ROOT_ID,
|
29
27
|
variables,
|
30
28
|
nestedRefetchQueries: entrypoint.nestedRefetchQueries,
|
29
|
+
networkRequest,
|
31
30
|
},
|
32
31
|
};
|
33
32
|
}
|
@@ -1,22 +1,25 @@
|
|
1
1
|
import { useState } from 'react';
|
2
2
|
import { FragmentReference } from '../core/FragmentReference';
|
3
|
-
import {
|
4
|
-
|
3
|
+
import {
|
4
|
+
NetworkRequestReaderOptions,
|
5
|
+
readButDoNotEvaluate,
|
6
|
+
} from '../core/read';
|
5
7
|
import { useRerenderOnChange } from './useRerenderOnChange';
|
8
|
+
import { useIsographEnvironment } from './IsographEnvironmentProvider';
|
6
9
|
|
7
10
|
/**
|
8
11
|
* Read the data from a fragment reference and subscribe to updates.
|
9
12
|
* Does not pass the data to the fragment reference's resolver function.
|
10
13
|
*/
|
11
14
|
export function useReadAndSubscribe<TReadFromStore extends Object>(
|
12
|
-
environment: IsographEnvironment,
|
13
15
|
fragmentReference: FragmentReference<TReadFromStore, any>,
|
16
|
+
networkRequestOptions: NetworkRequestReaderOptions,
|
14
17
|
): TReadFromStore {
|
18
|
+
const environment = useIsographEnvironment();
|
15
19
|
const [readOutDataAndRecords, setReadOutDataAndRecords] = useState(() =>
|
16
|
-
readButDoNotEvaluate(environment, fragmentReference),
|
20
|
+
readButDoNotEvaluate(environment, fragmentReference, networkRequestOptions),
|
17
21
|
);
|
18
22
|
useRerenderOnChange(
|
19
|
-
environment,
|
20
23
|
readOutDataAndRecords,
|
21
24
|
fragmentReference,
|
22
25
|
setReadOutDataAndRecords,
|
@@ -1,19 +1,19 @@
|
|
1
1
|
import { useEffect } from 'react';
|
2
|
-
import { IsographEnvironment } from '../core/IsographEnvironment';
|
3
2
|
import { subscribe } from '../core/cache';
|
4
3
|
import { WithEncounteredRecords } from '../core/read';
|
5
4
|
import { FragmentReference } from '../core/FragmentReference';
|
5
|
+
import { useIsographEnvironment } from './IsographEnvironmentProvider';
|
6
6
|
|
7
7
|
// TODO add unit tests for this. Add integration tests that test
|
8
8
|
// behavior when the encounteredRecords underneath a fragment change.
|
9
9
|
export function useRerenderOnChange<TReadFromStore extends Object>(
|
10
|
-
environment: IsographEnvironment,
|
11
10
|
encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>,
|
12
11
|
fragmentReference: FragmentReference<any, any>,
|
13
12
|
setEncounteredDataAndRecords: (
|
14
13
|
data: WithEncounteredRecords<TReadFromStore>,
|
15
14
|
) => void,
|
16
15
|
) {
|
16
|
+
const environment = useIsographEnvironment();
|
17
17
|
useEffect(() => {
|
18
18
|
return subscribe(
|
19
19
|
environment,
|
package/src/react/useResult.ts
CHANGED
@@ -2,12 +2,20 @@ import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
|
|
2
2
|
import { FragmentReference } from '../core/FragmentReference';
|
3
3
|
import { getOrCreateCachedComponent } from '../core/componentCache';
|
4
4
|
import { useReadAndSubscribe } from './useReadAndSubscribe';
|
5
|
+
import { NetworkRequestReaderOptions } from '../core/read';
|
6
|
+
import { getPromiseState, PromiseWrapper } from '../core/PromiseWrapper';
|
5
7
|
|
6
8
|
export function useResult<TReadFromStore extends Object, TClientFieldValue>(
|
7
9
|
fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>,
|
10
|
+
networkRequestOptions: NetworkRequestReaderOptions,
|
8
11
|
): TClientFieldValue {
|
9
12
|
const environment = useIsographEnvironment();
|
10
13
|
|
14
|
+
maybeUnwrapNetworkRequest(
|
15
|
+
fragmentReference.networkRequest,
|
16
|
+
networkRequestOptions,
|
17
|
+
);
|
18
|
+
|
11
19
|
switch (fragmentReference.readerArtifact.kind) {
|
12
20
|
case 'ComponentReaderArtifact': {
|
13
21
|
// @ts-expect-error
|
@@ -15,11 +23,30 @@ export function useResult<TReadFromStore extends Object, TClientFieldValue>(
|
|
15
23
|
environment,
|
16
24
|
fragmentReference.readerArtifact.componentName,
|
17
25
|
fragmentReference,
|
26
|
+
networkRequestOptions,
|
18
27
|
);
|
19
28
|
}
|
20
29
|
case 'EagerReaderArtifact': {
|
21
|
-
const data = useReadAndSubscribe(
|
30
|
+
const data = useReadAndSubscribe(
|
31
|
+
fragmentReference,
|
32
|
+
networkRequestOptions,
|
33
|
+
);
|
22
34
|
return fragmentReference.readerArtifact.resolver(data);
|
23
35
|
}
|
24
36
|
}
|
25
37
|
}
|
38
|
+
|
39
|
+
export function maybeUnwrapNetworkRequest(
|
40
|
+
networkRequest: PromiseWrapper<void, any>,
|
41
|
+
networkRequestOptions: NetworkRequestReaderOptions,
|
42
|
+
) {
|
43
|
+
const state = getPromiseState(networkRequest);
|
44
|
+
if (state.kind === 'Err' && networkRequestOptions.throwOnNetworkError) {
|
45
|
+
throw state.error;
|
46
|
+
} else if (
|
47
|
+
state.kind === 'Pending' &&
|
48
|
+
networkRequestOptions.suspendIfInFlight
|
49
|
+
) {
|
50
|
+
throw state.promise;
|
51
|
+
}
|
52
|
+
}
|