@isograph/react 0.0.0-main-7cd549b8 → 0.0.0-main-79f9cbbb
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/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +9 -0
- package/dist/loadable-hooks/useImperativeLoadableField.js +15 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +2 -0
- package/dist/loadable-hooks/useSkipLimitPagination.js +12 -12
- package/dist/react/useImperativeReference.js +1 -0
- package/package.json +4 -4
- package/src/index.ts +1 -0
- package/src/loadable-hooks/useImperativeLoadableField.ts +26 -0
- package/src/loadable-hooks/useSkipLimitPagination.ts +14 -16
- package/src/react/useImperativeReference.ts +2 -0
package/dist/index.d.ts
CHANGED
@@ -17,3 +17,4 @@ export { useLazyReference } from './react/useLazyReference';
|
|
17
17
|
export { useRerenderOnChange } from './react/useRerenderOnChange';
|
18
18
|
export { useClientSideDefer } from './loadable-hooks/useClientSideDefer';
|
19
19
|
export { useSkipLimitPagination } from './loadable-hooks/useSkipLimitPagination';
|
20
|
+
export { useImperativeLoadableField } from './loadable-hooks/useImperativeLoadableField';
|
package/dist/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.useSkipLimitPagination = exports.useClientSideDefer = exports.useRerenderOnChange = exports.useLazyReference = exports.useSubscribeToMultiple = exports.useReadAndSubscribe = exports.useResult = exports.FragmentReader = exports.useImperativeReference = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.stableIdForFragmentReference = exports.readButDoNotEvaluate = exports.assertIsEntrypoint = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = exports.makeNetworkRequest = exports.normalizeData = exports.subscribe = exports.wrapPromise = exports.wrapResolvedValue = exports.getPromiseState = exports.readPromise = exports.garbageCollectEnvironment = exports.unretainQuery = exports.retainQuery = void 0;
|
3
|
+
exports.useImperativeLoadableField = exports.useSkipLimitPagination = exports.useClientSideDefer = exports.useRerenderOnChange = exports.useLazyReference = exports.useSubscribeToMultiple = exports.useReadAndSubscribe = exports.useResult = exports.FragmentReader = exports.useImperativeReference = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.stableIdForFragmentReference = exports.readButDoNotEvaluate = exports.assertIsEntrypoint = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = exports.makeNetworkRequest = exports.normalizeData = exports.subscribe = exports.wrapPromise = exports.wrapResolvedValue = exports.getPromiseState = exports.readPromise = exports.garbageCollectEnvironment = exports.unretainQuery = exports.retainQuery = void 0;
|
4
4
|
var garbageCollection_1 = require("./core/garbageCollection");
|
5
5
|
Object.defineProperty(exports, "retainQuery", { enumerable: true, get: function () { return garbageCollection_1.retainQuery; } });
|
6
6
|
Object.defineProperty(exports, "unretainQuery", { enumerable: true, get: function () { return garbageCollection_1.unretainQuery; } });
|
@@ -46,3 +46,5 @@ var useClientSideDefer_1 = require("./loadable-hooks/useClientSideDefer");
|
|
46
46
|
Object.defineProperty(exports, "useClientSideDefer", { enumerable: true, get: function () { return useClientSideDefer_1.useClientSideDefer; } });
|
47
47
|
var useSkipLimitPagination_1 = require("./loadable-hooks/useSkipLimitPagination");
|
48
48
|
Object.defineProperty(exports, "useSkipLimitPagination", { enumerable: true, get: function () { return useSkipLimitPagination_1.useSkipLimitPagination; } });
|
49
|
+
var useImperativeLoadableField_1 = require("./loadable-hooks/useImperativeLoadableField");
|
50
|
+
Object.defineProperty(exports, "useImperativeLoadableField", { enumerable: true, get: function () { return useImperativeLoadableField_1.useImperativeLoadableField; } });
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { FragmentReference } from '../core/FragmentReference';
|
2
|
+
import { UnassignedState } from '@isograph/react-disposable-state';
|
3
|
+
import { LoadableField } from '../core/reader';
|
4
|
+
type UseImperativeLoadableFieldReturn<TArgs, TResult> = {
|
5
|
+
fragmentReference: FragmentReference<any, TResult> | UnassignedState;
|
6
|
+
loadField: (args: TArgs) => void;
|
7
|
+
};
|
8
|
+
export declare function useImperativeLoadableField<TArgs, TResult>(loadableField: LoadableField<TArgs, TResult>): UseImperativeLoadableFieldReturn<TArgs, TResult>;
|
9
|
+
export {};
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useImperativeLoadableField = void 0;
|
4
|
+
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
5
|
+
function useImperativeLoadableField(loadableField) {
|
6
|
+
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
7
|
+
return {
|
8
|
+
loadField: (args) => {
|
9
|
+
const [_id, loader] = loadableField(args);
|
10
|
+
setState(loader());
|
11
|
+
},
|
12
|
+
fragmentReference: state,
|
13
|
+
};
|
14
|
+
}
|
15
|
+
exports.useImperativeLoadableField = useImperativeLoadableField;
|
@@ -21,6 +21,8 @@ type UseSkipLimitReturnValue<TArgs, TItem> = {
|
|
21
21
|
* This hook will suspend if any network request is in flight.
|
22
22
|
*
|
23
23
|
* Calling fetchMore before the hook mounts is a no-op.
|
24
|
+
*
|
25
|
+
* TODO subscribe to changes
|
24
26
|
*/
|
25
27
|
export declare function useSkipLimitPagination<TArgs extends {
|
26
28
|
skip: number | void | null;
|
@@ -26,6 +26,8 @@ function flatten(arr) {
|
|
26
26
|
* This hook will suspend if any network request is in flight.
|
27
27
|
*
|
28
28
|
* Calling fetchMore before the hook mounts is a no-op.
|
29
|
+
*
|
30
|
+
* TODO subscribe to changes
|
29
31
|
*/
|
30
32
|
function useSkipLimitPagination(loadableField) {
|
31
33
|
const networkRequestOptions = {
|
@@ -55,21 +57,19 @@ function useSkipLimitPagination(loadableField) {
|
|
55
57
|
// @ts-expect-error
|
56
58
|
const loadedField = loadableField(Object.assign(Object.assign({}, args), { skip: loadedSoFar, limit: count }))[1]();
|
57
59
|
const newPointer = (0, reference_counted_pointer_1.createReferenceCountedPointer)(loadedField);
|
58
|
-
const clonedPointers = [
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
throw new Error('This reference counted pointer has already been disposed. \
|
60
|
+
const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
|
61
|
+
const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
|
62
|
+
if (clonedRefCountedPointer == null) {
|
63
|
+
throw new Error('This reference counted pointer has already been disposed. \
|
63
64
|
This is indicative of a bug in useSkipLimitPagination.');
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
const allPointers = [...clonedPointers, newPointer];
|
65
|
+
}
|
66
|
+
return clonedRefCountedPointer;
|
67
|
+
});
|
68
|
+
clonedPointers.push(newPointer);
|
69
69
|
const totalItemCleanupPair = [
|
70
|
-
|
70
|
+
clonedPointers,
|
71
71
|
() => {
|
72
|
-
|
72
|
+
clonedPointers.forEach(([, dispose]) => {
|
73
73
|
dispose();
|
74
74
|
});
|
75
75
|
},
|
@@ -6,6 +6,7 @@ const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
|
6
6
|
const IsographEnvironment_1 = require("../core/IsographEnvironment");
|
7
7
|
const makeNetworkRequest_1 = require("../core/makeNetworkRequest");
|
8
8
|
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
9
|
+
// TODO rename this to useImperativelyLoadedEntrypoint
|
9
10
|
function useImperativeReference(entrypoint) {
|
10
11
|
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
11
12
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
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-79f9cbbb",
|
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-79f9cbbb",
|
21
|
+
"@isograph/react-disposable-state": "0.0.0-main-79f9cbbb",
|
22
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-79f9cbbb"
|
23
23
|
},
|
24
24
|
"peerDependencies": {
|
25
25
|
"react": "18.2.0"
|
package/src/index.ts
CHANGED
@@ -82,3 +82,4 @@ export { useRerenderOnChange } from './react/useRerenderOnChange';
|
|
82
82
|
|
83
83
|
export { useClientSideDefer } from './loadable-hooks/useClientSideDefer';
|
84
84
|
export { useSkipLimitPagination } from './loadable-hooks/useSkipLimitPagination';
|
85
|
+
export { useImperativeLoadableField } from './loadable-hooks/useImperativeLoadableField';
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import { FragmentReference } from '../core/FragmentReference';
|
2
|
+
import {
|
3
|
+
UnassignedState,
|
4
|
+
useUpdatableDisposableState,
|
5
|
+
} from '@isograph/react-disposable-state';
|
6
|
+
import { LoadableField } from '../core/reader';
|
7
|
+
|
8
|
+
type UseImperativeLoadableFieldReturn<TArgs, TResult> = {
|
9
|
+
fragmentReference: FragmentReference<any, TResult> | UnassignedState;
|
10
|
+
loadField: (args: TArgs) => void;
|
11
|
+
};
|
12
|
+
|
13
|
+
export function useImperativeLoadableField<TArgs, TResult>(
|
14
|
+
loadableField: LoadableField<TArgs, TResult>,
|
15
|
+
): UseImperativeLoadableFieldReturn<TArgs, TResult> {
|
16
|
+
const { state, setState } =
|
17
|
+
useUpdatableDisposableState<FragmentReference<any, TResult>>();
|
18
|
+
|
19
|
+
return {
|
20
|
+
loadField: (args: TArgs) => {
|
21
|
+
const [_id, loader] = loadableField(args);
|
22
|
+
setState(loader());
|
23
|
+
},
|
24
|
+
fragmentReference: state,
|
25
|
+
};
|
26
|
+
}
|
@@ -60,6 +60,8 @@ function flatten<T>(arr: ReadonlyArray<ReadonlyArray<T>>): ReadonlyArray<T> {
|
|
60
60
|
* This hook will suspend if any network request is in flight.
|
61
61
|
*
|
62
62
|
* Calling fetchMore before the hook mounts is a no-op.
|
63
|
+
*
|
64
|
+
* TODO subscribe to changes
|
63
65
|
*/
|
64
66
|
export function useSkipLimitPagination<
|
65
67
|
TArgs extends {
|
@@ -129,21 +131,17 @@ export function useSkipLimitPagination<
|
|
129
131
|
limit: count,
|
130
132
|
})[1]();
|
131
133
|
const newPointer = createReferenceCountedPointer(loadedField);
|
132
|
-
const clonedPointers = [
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
throw new Error(
|
138
|
-
'This reference counted pointer has already been disposed. \
|
134
|
+
const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
|
135
|
+
const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
|
136
|
+
if (clonedRefCountedPointer == null) {
|
137
|
+
throw new Error(
|
138
|
+
'This reference counted pointer has already been disposed. \
|
139
139
|
This is indicative of a bug in useSkipLimitPagination.',
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
const allPointers = [...clonedPointers, newPointer];
|
140
|
+
);
|
141
|
+
}
|
142
|
+
return clonedRefCountedPointer;
|
143
|
+
});
|
144
|
+
clonedPointers.push(newPointer);
|
147
145
|
|
148
146
|
const totalItemCleanupPair: ItemCleanupPair<
|
149
147
|
ReadonlyArray<
|
@@ -152,9 +150,9 @@ export function useSkipLimitPagination<
|
|
152
150
|
>
|
153
151
|
>
|
154
152
|
> = [
|
155
|
-
|
153
|
+
clonedPointers,
|
156
154
|
() => {
|
157
|
-
|
155
|
+
clonedPointers.forEach(([, dispose]) => {
|
158
156
|
dispose();
|
159
157
|
});
|
160
158
|
},
|
@@ -9,6 +9,8 @@ import { ROOT_ID } from '../core/IsographEnvironment';
|
|
9
9
|
import { makeNetworkRequest } from '../core/makeNetworkRequest';
|
10
10
|
import { wrapResolvedValue } from '../core/PromiseWrapper';
|
11
11
|
|
12
|
+
// TODO rename this to useImperativelyLoadedEntrypoint
|
13
|
+
|
12
14
|
export function useImperativeReference<
|
13
15
|
TReadFromStore extends Object,
|
14
16
|
TClientFieldValue,
|