@cratis/scene.react 4.13.0 → 4.15.0

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.
Files changed (126) hide show
  1. package/dist/cjs/core/coreComponents.js +1 -1
  2. package/dist/cjs/index.js +16 -2
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/navigation/SceneNavigationContext.js.map +1 -1
  5. package/dist/cjs/navigation/SceneNavigationHost.js +19 -44
  6. package/dist/cjs/navigation/SceneNavigationHost.js.map +1 -1
  7. package/dist/cjs/navigation/createBrowserSceneHistory.js +39 -0
  8. package/dist/cjs/navigation/createBrowserSceneHistory.js.map +1 -0
  9. package/dist/cjs/navigation/createMemorySceneHistory.js +53 -0
  10. package/dist/cjs/navigation/createMemorySceneHistory.js.map +1 -0
  11. package/dist/cjs/navigation/matchSceneRoute.js +43 -0
  12. package/dist/cjs/navigation/matchSceneRoute.js.map +1 -0
  13. package/dist/cjs/navigation/resolveDestination.js +1 -0
  14. package/dist/cjs/navigation/resolveDestination.js.map +1 -1
  15. package/dist/cjs/navigation/sceneRoutesFrom.js +37 -0
  16. package/dist/cjs/navigation/sceneRoutesFrom.js.map +1 -0
  17. package/dist/cjs/navigation/useSceneHistoryNavigation.js +112 -0
  18. package/dist/cjs/navigation/useSceneHistoryNavigation.js.map +1 -0
  19. package/dist/cjs/packages/PackageHostConfiguration.js +18 -2
  20. package/dist/cjs/packages/PackageHostConfiguration.js.map +1 -1
  21. package/dist/cjs/packages/isNetworkAsset.js +18 -0
  22. package/dist/cjs/packages/isNetworkAsset.js.map +1 -0
  23. package/dist/cjs/renderer/RenderBindingScopeContext.js +15 -5
  24. package/dist/cjs/renderer/RenderBindingScopeContext.js.map +1 -1
  25. package/dist/cjs/renderer/useBoundQuery.js +50 -0
  26. package/dist/cjs/renderer/useBoundQuery.js.map +1 -0
  27. package/dist/esm/core/coreComponents.js +1 -1
  28. package/dist/esm/index.js +8 -1
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/navigation/DestinationResolution.d.ts +1 -0
  31. package/dist/esm/navigation/DestinationResolution.d.ts.map +1 -1
  32. package/dist/esm/navigation/DialogResult.d.ts +5 -0
  33. package/dist/esm/navigation/DialogResult.d.ts.map +1 -0
  34. package/dist/esm/navigation/DialogResult.js +2 -0
  35. package/dist/esm/navigation/DialogResult.js.map +1 -0
  36. package/dist/esm/navigation/SceneHistory.d.ts +10 -0
  37. package/dist/esm/navigation/SceneHistory.d.ts.map +1 -0
  38. package/dist/esm/navigation/SceneHistory.js +2 -0
  39. package/dist/esm/navigation/SceneHistory.js.map +1 -0
  40. package/dist/esm/navigation/SceneNavigationContext.d.ts +6 -1
  41. package/dist/esm/navigation/SceneNavigationContext.d.ts.map +1 -1
  42. package/dist/esm/navigation/SceneNavigationContext.js.map +1 -1
  43. package/dist/esm/navigation/SceneNavigationHost.d.ts +7 -2
  44. package/dist/esm/navigation/SceneNavigationHost.d.ts.map +1 -1
  45. package/dist/esm/navigation/SceneNavigationHost.js +20 -45
  46. package/dist/esm/navigation/SceneNavigationHost.js.map +1 -1
  47. package/dist/esm/navigation/SceneNavigationState.d.ts +8 -0
  48. package/dist/esm/navigation/SceneNavigationState.d.ts.map +1 -0
  49. package/dist/esm/navigation/SceneNavigationState.js +2 -0
  50. package/dist/esm/navigation/SceneNavigationState.js.map +1 -0
  51. package/dist/esm/navigation/SceneRoute.d.ts +6 -0
  52. package/dist/esm/navigation/SceneRoute.d.ts.map +1 -0
  53. package/dist/esm/navigation/SceneRoute.js +2 -0
  54. package/dist/esm/navigation/SceneRoute.js.map +1 -0
  55. package/dist/esm/navigation/createBrowserSceneHistory.d.ts +4 -0
  56. package/dist/esm/navigation/createBrowserSceneHistory.d.ts.map +1 -0
  57. package/dist/esm/navigation/createBrowserSceneHistory.js +37 -0
  58. package/dist/esm/navigation/createBrowserSceneHistory.js.map +1 -0
  59. package/dist/esm/navigation/createMemorySceneHistory.d.ts +7 -0
  60. package/dist/esm/navigation/createMemorySceneHistory.d.ts.map +1 -0
  61. package/dist/esm/navigation/createMemorySceneHistory.js +51 -0
  62. package/dist/esm/navigation/createMemorySceneHistory.js.map +1 -0
  63. package/dist/esm/navigation/index.d.ts +10 -1
  64. package/dist/esm/navigation/index.d.ts.map +1 -1
  65. package/dist/esm/navigation/index.js +10 -1
  66. package/dist/esm/navigation/index.js.map +1 -1
  67. package/dist/esm/navigation/matchSceneRoute.d.ts +7 -0
  68. package/dist/esm/navigation/matchSceneRoute.d.ts.map +1 -0
  69. package/dist/esm/navigation/matchSceneRoute.js +41 -0
  70. package/dist/esm/navigation/matchSceneRoute.js.map +1 -0
  71. package/dist/esm/navigation/resolveDestination.d.ts.map +1 -1
  72. package/dist/esm/navigation/resolveDestination.js +1 -0
  73. package/dist/esm/navigation/resolveDestination.js.map +1 -1
  74. package/dist/esm/navigation/sceneRoutesFrom.d.ts +4 -0
  75. package/dist/esm/navigation/sceneRoutesFrom.d.ts.map +1 -0
  76. package/dist/esm/navigation/sceneRoutesFrom.js +35 -0
  77. package/dist/esm/navigation/sceneRoutesFrom.js.map +1 -0
  78. package/dist/esm/navigation/useSceneHistoryNavigation.d.ts +6 -0
  79. package/dist/esm/navigation/useSceneHistoryNavigation.d.ts.map +1 -0
  80. package/dist/esm/navigation/useSceneHistoryNavigation.js +110 -0
  81. package/dist/esm/navigation/useSceneHistoryNavigation.js.map +1 -0
  82. package/dist/esm/packages/PackageHostConfiguration.d.ts +2 -0
  83. package/dist/esm/packages/PackageHostConfiguration.d.ts.map +1 -1
  84. package/dist/esm/packages/PackageHostConfiguration.js +19 -3
  85. package/dist/esm/packages/PackageHostConfiguration.js.map +1 -1
  86. package/dist/esm/packages/index.d.ts +1 -0
  87. package/dist/esm/packages/index.d.ts.map +1 -1
  88. package/dist/esm/packages/index.js +1 -0
  89. package/dist/esm/packages/index.js.map +1 -1
  90. package/dist/esm/packages/isNetworkAsset.d.ts +2 -0
  91. package/dist/esm/packages/isNetworkAsset.d.ts.map +1 -0
  92. package/dist/esm/packages/isNetworkAsset.js +16 -0
  93. package/dist/esm/packages/isNetworkAsset.js.map +1 -0
  94. package/dist/esm/renderer/RenderBindingScopeContext.d.ts.map +1 -1
  95. package/dist/esm/renderer/RenderBindingScopeContext.js +17 -7
  96. package/dist/esm/renderer/RenderBindingScopeContext.js.map +1 -1
  97. package/dist/esm/renderer/index.d.ts +1 -0
  98. package/dist/esm/renderer/index.d.ts.map +1 -1
  99. package/dist/esm/renderer/index.js +1 -0
  100. package/dist/esm/renderer/index.js.map +1 -1
  101. package/dist/esm/renderer/useBoundQuery.d.ts +3 -0
  102. package/dist/esm/renderer/useBoundQuery.d.ts.map +1 -0
  103. package/dist/esm/renderer/useBoundQuery.js +48 -0
  104. package/dist/esm/renderer/useBoundQuery.js.map +1 -0
  105. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  106. package/navigation/DestinationResolution.ts +3 -0
  107. package/navigation/DialogResult.ts +8 -0
  108. package/navigation/SceneHistory.ts +24 -0
  109. package/navigation/SceneNavigationContext.tsx +16 -1
  110. package/navigation/SceneNavigationHost.tsx +30 -40
  111. package/navigation/SceneNavigationState.ts +19 -0
  112. package/navigation/SceneRoute.ts +12 -0
  113. package/navigation/createBrowserSceneHistory.ts +40 -0
  114. package/navigation/createMemorySceneHistory.ts +44 -0
  115. package/navigation/index.ts +10 -1
  116. package/navigation/matchSceneRoute.ts +45 -0
  117. package/navigation/resolveDestination.ts +1 -0
  118. package/navigation/sceneRoutesFrom.ts +24 -0
  119. package/navigation/useSceneHistoryNavigation.ts +80 -0
  120. package/package.json +5 -5
  121. package/packages/PackageHostConfiguration.ts +26 -3
  122. package/packages/index.ts +1 -0
  123. package/packages/isNetworkAsset.ts +15 -0
  124. package/renderer/RenderBindingScopeContext.tsx +12 -8
  125. package/renderer/index.ts +1 -0
  126. package/renderer/useBoundQuery.ts +50 -0
package/renderer/index.ts CHANGED
@@ -6,5 +6,6 @@ export * from './BindingOutputContext';
6
6
  export * from './ComponentRegistry';
7
7
  export * from './RenderBindingScopeContext';
8
8
  export * from './UnresolvedComponent';
9
+ export * from './useBoundQuery';
9
10
  export * from './createReactRenderer';
10
11
  export * from './InteractiveComponent';
@@ -0,0 +1,50 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { useEffect, useMemo, useRef, useState } from 'react';
5
+ import { QueryBindingState } from '@cratis/scene.engine';
6
+ import { QueryPerformer } from './AbortableQueryRunner';
7
+
8
+ /**
9
+ * Runs a bound query whenever its arguments change and returns the accepted query results.
10
+ *
11
+ * Each change of arguments rebinds the query: the previous run is aborted and, should its answer still
12
+ * arrive, discarded by `QueryBindingState` - a slow result for a previous selection never replaces the
13
+ * current one. Arguments of `undefined` mean the binding is cleared, as when a selection is cleared, so the
14
+ * result is removed, and so is it when the current run fails - a failed rebind must not leave the previous
15
+ * selection's data on screen. The results are keyed by `query`, ready to pass as a scope's `queryResults`.
16
+ */
17
+ export function useBoundQuery(query: string, argumentsValue: unknown, perform: QueryPerformer): Record<string, unknown> {
18
+ const state = useMemo(() => new QueryBindingState(), []);
19
+ const [results, setResults] = useState<Record<string, unknown>>({});
20
+ const key = argumentsValue === undefined ? undefined : JSON.stringify(argumentsValue);
21
+ const latestArguments = useRef(argumentsValue);
22
+ latestArguments.current = argumentsValue;
23
+
24
+ // The arguments are compared by value through `key`; the effect reads them from `latestArguments`.
25
+ useEffect(() => {
26
+ const argumentsForRun = latestArguments.current;
27
+ if (argumentsForRun === undefined) {
28
+ state.clear(query);
29
+ setResults(state.queryResults);
30
+ return undefined;
31
+ }
32
+
33
+ const controller = new AbortController();
34
+ const ticket = state.begin(query);
35
+ perform(query, argumentsForRun, controller.signal).then(
36
+ result => {
37
+ if (state.complete(ticket, result)) setResults(state.queryResults);
38
+ },
39
+ () => {
40
+ if (controller.signal.aborted || !state.complete(ticket, undefined)) return;
41
+ state.clear(query);
42
+ setResults(state.queryResults);
43
+ },
44
+ );
45
+
46
+ return () => controller.abort();
47
+ }, [key, perform, query, state]);
48
+
49
+ return results;
50
+ }