@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 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
- ...loadedReferences.map(([refCountedPointer]) => {
60
- const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
61
- if (clonedRefCountedPointer == null) {
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
- return clonedRefCountedPointer;
66
- }),
67
- ];
68
- const allPointers = [...clonedPointers, newPointer];
65
+ }
66
+ return clonedRefCountedPointer;
67
+ });
68
+ clonedPointers.push(newPointer);
69
69
  const totalItemCleanupPair = [
70
- allPointers,
70
+ clonedPointers,
71
71
  () => {
72
- allPointers.forEach(([, dispose]) => {
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-7cd549b8",
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-7cd549b8",
21
- "@isograph/react-disposable-state": "0.0.0-main-7cd549b8",
22
- "@isograph/reference-counted-pointer": "0.0.0-main-7cd549b8"
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
- ...loadedReferences.map(([refCountedPointer]) => {
134
- const clonedRefCountedPointer =
135
- refCountedPointer.cloneIfNotDisposed();
136
- if (clonedRefCountedPointer == null) {
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
- return clonedRefCountedPointer;
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
- allPointers,
153
+ clonedPointers,
156
154
  () => {
157
- allPointers.forEach(([, dispose]) => {
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,