@fluidframework/react 0.41.4 → 2.63.0-358419

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 (342) hide show
  1. package/.eslintrc.cjs +11 -0
  2. package/.mocharc.cjs +15 -0
  3. package/CHANGELOG.md +282 -0
  4. package/README.md +122 -273
  5. package/api-extractor/api-extractor-lint-alpha.cjs.json +5 -0
  6. package/api-extractor/api-extractor-lint-alpha.esm.json +5 -0
  7. package/api-extractor/api-extractor-lint-beta.cjs.json +5 -0
  8. package/api-extractor/api-extractor-lint-beta.esm.json +5 -0
  9. package/api-extractor/api-extractor-lint-bundle.json +5 -0
  10. package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
  11. package/api-extractor/api-extractor-lint-public.esm.json +5 -0
  12. package/api-extractor-lint.json +4 -0
  13. package/api-extractor.json +2 -2
  14. package/api-report/react.alpha.api.md +114 -0
  15. package/api-report/react.beta.api.md +7 -0
  16. package/api-report/react.public.api.md +7 -0
  17. package/biome.jsonc +4 -0
  18. package/dist/alpha.d.ts +45 -0
  19. package/dist/beta.d.ts +15 -0
  20. package/dist/index.d.ts +11 -7
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +19 -17
  23. package/dist/index.js.map +1 -1
  24. package/dist/package.json +4 -0
  25. package/dist/propNode.d.ts +114 -0
  26. package/dist/propNode.d.ts.map +1 -0
  27. package/dist/propNode.js +43 -0
  28. package/dist/propNode.js.map +1 -0
  29. package/dist/public.d.ts +15 -0
  30. package/dist/reactSharedTreeView.d.ts +119 -0
  31. package/dist/reactSharedTreeView.d.ts.map +1 -0
  32. package/dist/reactSharedTreeView.js +206 -0
  33. package/dist/reactSharedTreeView.js.map +1 -0
  34. package/dist/simpleIdentifier.d.ts +19 -0
  35. package/dist/simpleIdentifier.d.ts.map +1 -0
  36. package/dist/simpleIdentifier.js +33 -0
  37. package/dist/simpleIdentifier.js.map +1 -0
  38. package/dist/useObservation.d.ts +83 -0
  39. package/dist/useObservation.d.ts.map +1 -0
  40. package/dist/useObservation.js +295 -0
  41. package/dist/useObservation.js.map +1 -0
  42. package/dist/useTree.d.ts +80 -0
  43. package/dist/useTree.d.ts.map +1 -0
  44. package/dist/useTree.js +137 -0
  45. package/dist/useTree.js.map +1 -0
  46. package/lib/alpha.d.ts +45 -0
  47. package/lib/beta.d.ts +15 -0
  48. package/lib/index.d.ts +16 -0
  49. package/lib/index.d.ts.map +1 -0
  50. package/lib/index.js +4 -7
  51. package/lib/index.js.map +1 -1
  52. package/lib/package.json +4 -0
  53. package/lib/propNode.d.ts +114 -0
  54. package/lib/propNode.d.ts.map +1 -0
  55. package/lib/propNode.js +36 -0
  56. package/lib/propNode.js.map +1 -0
  57. package/lib/public.d.ts +15 -0
  58. package/lib/reactSharedTreeView.d.ts +119 -0
  59. package/lib/reactSharedTreeView.d.ts.map +1 -0
  60. package/lib/reactSharedTreeView.js +176 -0
  61. package/lib/reactSharedTreeView.js.map +1 -0
  62. package/lib/simpleIdentifier.d.ts +19 -0
  63. package/lib/simpleIdentifier.d.ts.map +1 -0
  64. package/lib/simpleIdentifier.js +29 -0
  65. package/lib/simpleIdentifier.js.map +1 -0
  66. package/lib/test/propNode.spec.js +120 -0
  67. package/lib/test/propNode.spec.js.map +1 -0
  68. package/lib/test/reactSharedTreeView.spec.js +71 -0
  69. package/lib/test/reactSharedTreeView.spec.js.map +1 -0
  70. package/lib/test/simpleIdentifier.spec.js +18 -0
  71. package/lib/test/simpleIdentifier.spec.js.map +1 -0
  72. package/lib/test/useObservation.spec.js +162 -0
  73. package/lib/test/useObservation.spec.js.map +1 -0
  74. package/lib/test/useTree.spec.js +165 -0
  75. package/lib/test/useTree.spec.js.map +1 -0
  76. package/lib/tsdoc-metadata.json +11 -0
  77. package/lib/useObservation.d.ts +83 -0
  78. package/lib/useObservation.d.ts.map +1 -0
  79. package/lib/useObservation.js +266 -0
  80. package/lib/useObservation.js.map +1 -0
  81. package/lib/useTree.d.ts +80 -0
  82. package/lib/useTree.d.ts.map +1 -0
  83. package/lib/useTree.js +105 -0
  84. package/lib/useTree.js.map +1 -0
  85. package/package.json +150 -51
  86. package/react.test-files.tar +0 -0
  87. package/src/index.ts +42 -7
  88. package/src/propNode.ts +164 -0
  89. package/src/reactSharedTreeView.tsx +327 -0
  90. package/src/simpleIdentifier.ts +31 -0
  91. package/src/useObservation.ts +376 -0
  92. package/src/useTree.ts +147 -0
  93. package/tsconfig.cjs.json +7 -0
  94. package/tsconfig.json +12 -15
  95. package/tsdoc.json +4 -0
  96. package/.eslintrc.js +0 -11
  97. package/dist/createContextFluid.d.ts +0 -7
  98. package/dist/createContextFluid.d.ts.map +0 -1
  99. package/dist/createContextFluid.js +0 -46
  100. package/dist/createContextFluid.js.map +0 -1
  101. package/dist/helpers/generateFluidObjectSchema.d.ts +0 -16
  102. package/dist/helpers/generateFluidObjectSchema.d.ts.map +0 -1
  103. package/dist/helpers/generateFluidObjectSchema.js +0 -75
  104. package/dist/helpers/generateFluidObjectSchema.js.map +0 -1
  105. package/dist/helpers/getFluidFromView.d.ts +0 -15
  106. package/dist/helpers/getFluidFromView.d.ts.map +0 -1
  107. package/dist/helpers/getFluidFromView.js +0 -30
  108. package/dist/helpers/getFluidFromView.js.map +0 -1
  109. package/dist/helpers/getFluidState.d.ts +0 -15
  110. package/dist/helpers/getFluidState.d.ts.map +0 -1
  111. package/dist/helpers/getFluidState.js +0 -47
  112. package/dist/helpers/getFluidState.js.map +0 -1
  113. package/dist/helpers/getSchema.d.ts +0 -13
  114. package/dist/helpers/getSchema.d.ts.map +0 -1
  115. package/dist/helpers/getSchema.js +0 -15
  116. package/dist/helpers/getSchema.js.map +0 -1
  117. package/dist/helpers/getViewFromFluid.d.ts +0 -18
  118. package/dist/helpers/getViewFromFluid.d.ts.map +0 -1
  119. package/dist/helpers/getViewFromFluid.js +0 -47
  120. package/dist/helpers/getViewFromFluid.js.map +0 -1
  121. package/dist/helpers/index.d.ts +0 -16
  122. package/dist/helpers/index.d.ts.map +0 -1
  123. package/dist/helpers/index.js +0 -28
  124. package/dist/helpers/index.js.map +0 -1
  125. package/dist/helpers/initializeState.d.ts +0 -22
  126. package/dist/helpers/initializeState.d.ts.map +0 -1
  127. package/dist/helpers/initializeState.js +0 -77
  128. package/dist/helpers/initializeState.js.map +0 -1
  129. package/dist/helpers/internalInterface.d.ts +0 -15
  130. package/dist/helpers/internalInterface.d.ts.map +0 -1
  131. package/dist/helpers/internalInterface.js +0 -7
  132. package/dist/helpers/internalInterface.js.map +0 -1
  133. package/dist/helpers/rootCallbackListener.d.ts +0 -24
  134. package/dist/helpers/rootCallbackListener.d.ts.map +0 -1
  135. package/dist/helpers/rootCallbackListener.js +0 -55
  136. package/dist/helpers/rootCallbackListener.js.map +0 -1
  137. package/dist/helpers/setComponentSchema.d.ts +0 -14
  138. package/dist/helpers/setComponentSchema.d.ts.map +0 -1
  139. package/dist/helpers/setComponentSchema.js +0 -18
  140. package/dist/helpers/setComponentSchema.js.map +0 -1
  141. package/dist/helpers/setFluidState.d.ts +0 -20
  142. package/dist/helpers/setFluidState.d.ts.map +0 -1
  143. package/dist/helpers/setFluidState.js +0 -94
  144. package/dist/helpers/setFluidState.js.map +0 -1
  145. package/dist/helpers/syncState.d.ts +0 -25
  146. package/dist/helpers/syncState.d.ts.map +0 -1
  147. package/dist/helpers/syncState.js +0 -98
  148. package/dist/helpers/syncState.js.map +0 -1
  149. package/dist/helpers/updateStateAndFluidObjectMap.d.ts +0 -29
  150. package/dist/helpers/updateStateAndFluidObjectMap.d.ts.map +0 -1
  151. package/dist/helpers/updateStateAndFluidObjectMap.js +0 -30
  152. package/dist/helpers/updateStateAndFluidObjectMap.js.map +0 -1
  153. package/dist/helpers/utils.d.ts +0 -12
  154. package/dist/helpers/utils.d.ts.map +0 -1
  155. package/dist/helpers/utils.js +0 -74
  156. package/dist/helpers/utils.js.map +0 -1
  157. package/dist/interface.d.ts +0 -444
  158. package/dist/interface.d.ts.map +0 -1
  159. package/dist/interface.js +0 -18
  160. package/dist/interface.js.map +0 -1
  161. package/dist/reactView.d.ts +0 -32
  162. package/dist/reactView.d.ts.map +0 -1
  163. package/dist/reactView.js +0 -79
  164. package/dist/reactView.js.map +0 -1
  165. package/dist/syncedDataObject.d.ts +0 -80
  166. package/dist/syncedDataObject.d.ts.map +0 -1
  167. package/dist/syncedDataObject.js +0 -249
  168. package/dist/syncedDataObject.js.map +0 -1
  169. package/dist/syncedObjects/array/fluidSyncedArray.d.ts +0 -11
  170. package/dist/syncedObjects/array/fluidSyncedArray.d.ts.map +0 -1
  171. package/dist/syncedObjects/array/fluidSyncedArray.js +0 -78
  172. package/dist/syncedObjects/array/fluidSyncedArray.js.map +0 -1
  173. package/dist/syncedObjects/array/index.d.ts +0 -7
  174. package/dist/syncedObjects/array/index.d.ts.map +0 -1
  175. package/dist/syncedObjects/array/index.js +0 -19
  176. package/dist/syncedObjects/array/index.js.map +0 -1
  177. package/dist/syncedObjects/array/interface.d.ts +0 -33
  178. package/dist/syncedObjects/array/interface.d.ts.map +0 -1
  179. package/dist/syncedObjects/array/interface.js +0 -3
  180. package/dist/syncedObjects/array/interface.js.map +0 -1
  181. package/dist/syncedObjects/array/syncedArray.d.ts +0 -30
  182. package/dist/syncedObjects/array/syncedArray.d.ts.map +0 -1
  183. package/dist/syncedObjects/array/syncedArray.js +0 -42
  184. package/dist/syncedObjects/array/syncedArray.js.map +0 -1
  185. package/dist/syncedObjects/counter/fluidSyncedCounter.d.ts +0 -11
  186. package/dist/syncedObjects/counter/fluidSyncedCounter.d.ts.map +0 -1
  187. package/dist/syncedObjects/counter/fluidSyncedCounter.js +0 -79
  188. package/dist/syncedObjects/counter/fluidSyncedCounter.js.map +0 -1
  189. package/dist/syncedObjects/counter/index.d.ts +0 -7
  190. package/dist/syncedObjects/counter/index.d.ts.map +0 -1
  191. package/dist/syncedObjects/counter/index.js +0 -19
  192. package/dist/syncedObjects/counter/index.js.map +0 -1
  193. package/dist/syncedObjects/counter/interface.d.ts +0 -32
  194. package/dist/syncedObjects/counter/interface.d.ts.map +0 -1
  195. package/dist/syncedObjects/counter/interface.js +0 -3
  196. package/dist/syncedObjects/counter/interface.js.map +0 -1
  197. package/dist/syncedObjects/counter/syncedCounter.d.ts +0 -29
  198. package/dist/syncedObjects/counter/syncedCounter.d.ts.map +0 -1
  199. package/dist/syncedObjects/counter/syncedCounter.js +0 -36
  200. package/dist/syncedObjects/counter/syncedCounter.js.map +0 -1
  201. package/dist/syncedObjects/index.d.ts +0 -9
  202. package/dist/syncedObjects/index.d.ts.map +0 -1
  203. package/dist/syncedObjects/index.js +0 -21
  204. package/dist/syncedObjects/index.js.map +0 -1
  205. package/dist/syncedObjects/object/index.d.ts +0 -7
  206. package/dist/syncedObjects/object/index.d.ts.map +0 -1
  207. package/dist/syncedObjects/object/index.js +0 -19
  208. package/dist/syncedObjects/object/index.js.map +0 -1
  209. package/dist/syncedObjects/object/interface.d.ts +0 -13
  210. package/dist/syncedObjects/object/interface.d.ts.map +0 -1
  211. package/dist/syncedObjects/object/interface.js +0 -7
  212. package/dist/syncedObjects/object/interface.js.map +0 -1
  213. package/dist/syncedObjects/object/syncedObject.d.ts +0 -22
  214. package/dist/syncedObjects/object/syncedObject.d.ts.map +0 -1
  215. package/dist/syncedObjects/object/syncedObject.js +0 -46
  216. package/dist/syncedObjects/object/syncedObject.js.map +0 -1
  217. package/dist/syncedObjects/string/index.d.ts +0 -7
  218. package/dist/syncedObjects/string/index.d.ts.map +0 -1
  219. package/dist/syncedObjects/string/index.js +0 -19
  220. package/dist/syncedObjects/string/index.js.map +0 -1
  221. package/dist/syncedObjects/string/interface.d.ts +0 -16
  222. package/dist/syncedObjects/string/interface.d.ts.map +0 -1
  223. package/dist/syncedObjects/string/interface.js +0 -7
  224. package/dist/syncedObjects/string/interface.js.map +0 -1
  225. package/dist/syncedObjects/string/syncedString.d.ts +0 -25
  226. package/dist/syncedObjects/string/syncedString.d.ts.map +0 -1
  227. package/dist/syncedObjects/string/syncedString.js +0 -53
  228. package/dist/syncedObjects/string/syncedString.js.map +0 -1
  229. package/dist/useReducerFluid.d.ts +0 -7
  230. package/dist/useReducerFluid.d.ts.map +0 -1
  231. package/dist/useReducerFluid.js +0 -219
  232. package/dist/useReducerFluid.js.map +0 -1
  233. package/dist/useStateFluid.d.ts +0 -10
  234. package/dist/useStateFluid.d.ts.map +0 -1
  235. package/dist/useStateFluid.js +0 -67
  236. package/dist/useStateFluid.js.map +0 -1
  237. package/lib/createContextFluid.js +0 -23
  238. package/lib/createContextFluid.js.map +0 -1
  239. package/lib/helpers/generateFluidObjectSchema.js +0 -71
  240. package/lib/helpers/generateFluidObjectSchema.js.map +0 -1
  241. package/lib/helpers/getFluidFromView.js +0 -26
  242. package/lib/helpers/getFluidFromView.js.map +0 -1
  243. package/lib/helpers/getFluidState.js +0 -43
  244. package/lib/helpers/getFluidState.js.map +0 -1
  245. package/lib/helpers/getSchema.js +0 -11
  246. package/lib/helpers/getSchema.js.map +0 -1
  247. package/lib/helpers/getViewFromFluid.js +0 -43
  248. package/lib/helpers/getViewFromFluid.js.map +0 -1
  249. package/lib/helpers/index.js +0 -16
  250. package/lib/helpers/index.js.map +0 -1
  251. package/lib/helpers/initializeState.js +0 -73
  252. package/lib/helpers/initializeState.js.map +0 -1
  253. package/lib/helpers/internalInterface.js +0 -6
  254. package/lib/helpers/internalInterface.js.map +0 -1
  255. package/lib/helpers/rootCallbackListener.js +0 -51
  256. package/lib/helpers/rootCallbackListener.js.map +0 -1
  257. package/lib/helpers/setComponentSchema.js +0 -14
  258. package/lib/helpers/setComponentSchema.js.map +0 -1
  259. package/lib/helpers/setFluidState.js +0 -90
  260. package/lib/helpers/setFluidState.js.map +0 -1
  261. package/lib/helpers/syncState.js +0 -94
  262. package/lib/helpers/syncState.js.map +0 -1
  263. package/lib/helpers/updateStateAndFluidObjectMap.js +0 -26
  264. package/lib/helpers/updateStateAndFluidObjectMap.js.map +0 -1
  265. package/lib/helpers/utils.js +0 -67
  266. package/lib/helpers/utils.js.map +0 -1
  267. package/lib/interface.js +0 -8
  268. package/lib/interface.js.map +0 -1
  269. package/lib/reactView.js +0 -56
  270. package/lib/reactView.js.map +0 -1
  271. package/lib/syncedDataObject.js +0 -245
  272. package/lib/syncedDataObject.js.map +0 -1
  273. package/lib/syncedObjects/array/fluidSyncedArray.js +0 -72
  274. package/lib/syncedObjects/array/fluidSyncedArray.js.map +0 -1
  275. package/lib/syncedObjects/array/index.js +0 -7
  276. package/lib/syncedObjects/array/index.js.map +0 -1
  277. package/lib/syncedObjects/array/interface.js +0 -2
  278. package/lib/syncedObjects/array/interface.js.map +0 -1
  279. package/lib/syncedObjects/array/syncedArray.js +0 -37
  280. package/lib/syncedObjects/array/syncedArray.js.map +0 -1
  281. package/lib/syncedObjects/counter/fluidSyncedCounter.js +0 -73
  282. package/lib/syncedObjects/counter/fluidSyncedCounter.js.map +0 -1
  283. package/lib/syncedObjects/counter/index.js +0 -7
  284. package/lib/syncedObjects/counter/index.js.map +0 -1
  285. package/lib/syncedObjects/counter/interface.js +0 -2
  286. package/lib/syncedObjects/counter/interface.js.map +0 -1
  287. package/lib/syncedObjects/counter/syncedCounter.js +0 -31
  288. package/lib/syncedObjects/counter/syncedCounter.js.map +0 -1
  289. package/lib/syncedObjects/index.js +0 -9
  290. package/lib/syncedObjects/index.js.map +0 -1
  291. package/lib/syncedObjects/object/index.js +0 -7
  292. package/lib/syncedObjects/object/index.js.map +0 -1
  293. package/lib/syncedObjects/object/interface.js +0 -6
  294. package/lib/syncedObjects/object/interface.js.map +0 -1
  295. package/lib/syncedObjects/object/syncedObject.js +0 -41
  296. package/lib/syncedObjects/object/syncedObject.js.map +0 -1
  297. package/lib/syncedObjects/string/index.js +0 -7
  298. package/lib/syncedObjects/string/index.js.map +0 -1
  299. package/lib/syncedObjects/string/interface.js +0 -6
  300. package/lib/syncedObjects/string/interface.js.map +0 -1
  301. package/lib/syncedObjects/string/syncedString.js +0 -48
  302. package/lib/syncedObjects/string/syncedString.js.map +0 -1
  303. package/lib/useReducerFluid.js +0 -196
  304. package/lib/useReducerFluid.js.map +0 -1
  305. package/lib/useStateFluid.js +0 -44
  306. package/lib/useStateFluid.js.map +0 -1
  307. package/src/createContextFluid.tsx +0 -33
  308. package/src/helpers/generateFluidObjectSchema.ts +0 -95
  309. package/src/helpers/getFluidFromView.ts +0 -38
  310. package/src/helpers/getFluidState.ts +0 -67
  311. package/src/helpers/getSchema.ts +0 -18
  312. package/src/helpers/getViewFromFluid.ts +0 -68
  313. package/src/helpers/index.tsx +0 -16
  314. package/src/helpers/initializeState.ts +0 -162
  315. package/src/helpers/internalInterface.ts +0 -16
  316. package/src/helpers/rootCallbackListener.ts +0 -104
  317. package/src/helpers/setComponentSchema.ts +0 -21
  318. package/src/helpers/setFluidState.ts +0 -116
  319. package/src/helpers/syncState.ts +0 -159
  320. package/src/helpers/updateStateAndFluidObjectMap.ts +0 -85
  321. package/src/helpers/utils.tsx +0 -109
  322. package/src/interface.ts +0 -617
  323. package/src/reactView.tsx +0 -108
  324. package/src/syncedDataObject.ts +0 -337
  325. package/src/syncedObjects/array/fluidSyncedArray.ts +0 -126
  326. package/src/syncedObjects/array/index.ts +0 -7
  327. package/src/syncedObjects/array/interface.ts +0 -45
  328. package/src/syncedObjects/array/syncedArray.ts +0 -65
  329. package/src/syncedObjects/counter/fluidSyncedCounter.ts +0 -122
  330. package/src/syncedObjects/counter/index.ts +0 -7
  331. package/src/syncedObjects/counter/interface.ts +0 -44
  332. package/src/syncedObjects/counter/syncedCounter.ts +0 -64
  333. package/src/syncedObjects/index.ts +0 -9
  334. package/src/syncedObjects/object/index.ts +0 -7
  335. package/src/syncedObjects/object/interface.ts +0 -14
  336. package/src/syncedObjects/object/syncedObject.ts +0 -55
  337. package/src/syncedObjects/string/index.ts +0 -7
  338. package/src/syncedObjects/string/interface.ts +0 -17
  339. package/src/syncedObjects/string/syncedString.ts +0 -61
  340. package/src/useReducerFluid.tsx +0 -436
  341. package/src/useStateFluid.tsx +0 -84
  342. package/tsconfig.esnext.json +0 -7
@@ -1,436 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import * as React from "react";
7
- import { IFluidHandle } from "@fluidframework/core-interfaces";
8
- import { SharedMap } from "@fluidframework/map";
9
- import {
10
- IViewState,
11
- IFluidReducerProps,
12
- IFluidDataProps,
13
- instanceOfStateUpdateFunction,
14
- instanceOfAsyncStateUpdateFunction,
15
- instanceOfSelectorFunction,
16
- instanceOfFluidObjectSelectorFunction,
17
- instanceOfEffectFunction,
18
- instanceOfAsyncEffectFunction,
19
- IStateUpdateResult,
20
- IFluidState,
21
- IFluidReducer,
22
- IFluidSelector,
23
- ICombinedState,
24
- ISyncedStateConfig,
25
- } from "./interface";
26
- import { useStateFluid } from "./useStateFluid";
27
- import {
28
- updateStateAndFluidObjectMap,
29
- syncedStateCallbackListener,
30
- getFluidState,
31
- syncState,
32
- getSchema,
33
- } from "./helpers";
34
-
35
- export function useReducerFluid<
36
- SV extends IViewState,
37
- SF extends IFluidState,
38
- A extends IFluidReducer<SV, SF, C>,
39
- B extends IFluidSelector<SV, SF, C>,
40
- C extends IFluidDataProps
41
- >(
42
- props: IFluidReducerProps<SV, SF, A, B, C>,
43
- initialViewState: SV,
44
- ): [ICombinedState<SV, SF, C>, A, B] {
45
- const {
46
- syncedStateId,
47
- reducer,
48
- selector,
49
- syncedDataObject,
50
- } = props;
51
- const config = syncedDataObject.getConfig(syncedStateId);
52
- if (config === undefined) {
53
- throw Error(`Failed to find configuration for synced state ID: ${syncedStateId}`);
54
- }
55
- const dataProps = props.dataProps ?? syncedDataObject.dataProps as C;
56
- // Get our combined synced state and setState callbacks from the useStateFluid function
57
- const [viewState, setState] = useStateFluid<SV, SF>({
58
- syncedStateId,
59
- syncedDataObject,
60
- dataProps,
61
- }, initialViewState);
62
- const syncedState = syncedDataObject.syncedState;
63
- const { fluidToView, viewToFluid } = config as ISyncedStateConfig<SV, SF>;
64
-
65
- const schemaHandles = getSchema(
66
- syncedStateId,
67
- syncedState,
68
- );
69
- if (schemaHandles?.storedHandleMapHandle.absolutePath === undefined) {
70
- throw Error(`Component schema not initialized prior to render for ${syncedStateId}`);
71
- }
72
- const storedHandleMap = dataProps.fluidObjectMap.get(
73
- schemaHandles?.storedHandleMapHandle.absolutePath,
74
- )?.fluidObject as SharedMap;
75
- if (storedHandleMap === undefined) {
76
- throw Error(`Stored handle map not initialized prior to render for ${syncedStateId}`);
77
- }
78
-
79
- // Dispatch is an in-memory object that will load the reducer actions provided by the user
80
- // and add updates to the view and Fluid state based off of the type of function and
81
- // state values that were updated. Think of it as prepping the data in the first
82
- // stage of dynamic programming. The dispatch functions are copies of the user-defined functions
83
- // but with the updates to synced state also handled
84
- const dispatch = React.useCallback(
85
- (
86
- type: keyof A,
87
- dispatchState?: ICombinedState<SV, SF, C>,
88
- ...args: any
89
- ) => {
90
- // Retrieve the current state that is stored on the synced state for this Fluid object ID
91
- const currentFluidState = getFluidState(
92
- syncedStateId,
93
- syncedState,
94
- dataProps.fluidObjectMap,
95
- fluidToView,
96
- );
97
- if (currentFluidState === undefined) {
98
- throw Error(
99
- "Attempted to dispatch function before fluid state was initialized",
100
- );
101
- }
102
- const combinedDispatchFluidState: SF = {
103
- ...currentFluidState,
104
- ...dispatchState?.fluidState,
105
- };
106
- const combinedDispatchViewState: SV = {
107
- ...viewState,
108
- ...dispatchState?.viewState,
109
- };
110
- const combinedDispatchDataProps: C = {
111
- ...dataProps,
112
- ...dispatchState?.dataProps,
113
- };
114
- const combinedDispatchState = {
115
- fluidState: combinedDispatchFluidState,
116
- viewState: combinedDispatchViewState,
117
- dataProps: combinedDispatchDataProps,
118
- };
119
- const action = reducer[type];
120
- if (action !== undefined) {
121
- if (instanceOfStateUpdateFunction<SV, SF, C>(action)) {
122
- // If its a synchronous state update function, call it and inspect the result
123
- // for new Fluid object handles
124
- const result = (action.function as any)(
125
- combinedDispatchState,
126
- ...args,
127
- );
128
- if (result.newComponentHandles !== undefined) {
129
- // Fetch any new Fluid objects and add a listener to their synced state.
130
- // Then update the view state.
131
- const callback = syncedStateCallbackListener(
132
- combinedDispatchDataProps.fluidObjectMap,
133
- storedHandleMap,
134
- syncedStateId,
135
- syncedState,
136
- combinedDispatchDataProps.runtime,
137
- result.state.viewState,
138
- setState,
139
- fluidToView,
140
- viewToFluid,
141
- );
142
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
143
- updateStateAndFluidObjectMap(
144
- result.newComponentHandles,
145
- combinedDispatchDataProps.fluidObjectMap,
146
- storedHandleMap,
147
- false,
148
- syncedStateId,
149
- syncedState,
150
- combinedDispatchDataProps.runtime,
151
- result.state.viewState,
152
- setState,
153
- callback,
154
- fluidToView,
155
- viewToFluid,
156
- );
157
- } else {
158
- // Update the state directly
159
- syncState(
160
- false,
161
- syncedStateId,
162
- syncedState,
163
- combinedDispatchDataProps.runtime,
164
- result.state.viewState,
165
- setState,
166
- combinedDispatchDataProps.fluidObjectMap,
167
- fluidToView,
168
- viewToFluid,
169
- );
170
- }
171
- } else if (instanceOfAsyncStateUpdateFunction<SV, SF, C>(action)) {
172
- // In the case of an async function, the function promise is treated as a Thenable
173
- // and the returned result is inspected after the function has completed
174
- (action.asyncFunction as any)(
175
- combinedDispatchState,
176
- ...args,
177
- ).then((result: IStateUpdateResult<SV, SF, C>) => {
178
- const callback = syncedStateCallbackListener(
179
- combinedDispatchDataProps.fluidObjectMap,
180
- storedHandleMap,
181
- syncedStateId,
182
- syncedState,
183
- combinedDispatchDataProps.runtime,
184
- result.state.viewState,
185
- setState,
186
- fluidToView,
187
- viewToFluid,
188
- );
189
- if (result.newFluidHandles !== undefined) {
190
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
191
- updateStateAndFluidObjectMap(
192
- result.newFluidHandles,
193
- combinedDispatchDataProps.fluidObjectMap,
194
- storedHandleMap,
195
- false,
196
- syncedStateId,
197
- syncedState,
198
- combinedDispatchDataProps.runtime,
199
- result.state.viewState,
200
- setState,
201
- callback,
202
- fluidToView,
203
- viewToFluid,
204
- );
205
- } else {
206
- syncState(
207
- false,
208
- syncedStateId,
209
- syncedState,
210
- combinedDispatchDataProps.runtime,
211
- result.state.viewState,
212
- setState,
213
- combinedDispatchDataProps.fluidObjectMap,
214
- fluidToView,
215
- viewToFluid,
216
- );
217
- }
218
- });
219
- } else if (instanceOfAsyncEffectFunction<SV, SF, C>(action)) {
220
- (action.asyncFunction as any)(
221
- combinedDispatchState,
222
- ...args,
223
- ).then(() =>
224
- syncState(
225
- false,
226
- syncedStateId,
227
- syncedState,
228
- combinedDispatchDataProps.runtime,
229
- combinedDispatchState.viewState,
230
- setState,
231
- combinedDispatchDataProps.fluidObjectMap,
232
- fluidToView,
233
- viewToFluid,
234
- ),
235
- );
236
- } else if (instanceOfEffectFunction<SV, SF, C>(action)) {
237
- (action.function as any)(combinedDispatchState, ...args);
238
- syncState(
239
- false,
240
- syncedStateId,
241
- syncedState,
242
- combinedDispatchDataProps.runtime,
243
- combinedDispatchState.viewState,
244
- setState,
245
- combinedDispatchDataProps.fluidObjectMap,
246
- fluidToView,
247
- viewToFluid,
248
- );
249
- } else {
250
- throw new Error(
251
- `Action with key ${action} does not match an expected reducer action interface`,
252
- );
253
- }
254
- } else {
255
- throw new Error(
256
- `Action with key ${action} does not
257
- exist in the reducers provided`,
258
- );
259
- }
260
- },
261
- [reducer, viewState, setState, dataProps],
262
- );
263
-
264
- // The combinedReducer is then created using the dispatch functions we created above.
265
- // This allows us to preserve the reducer interface while injecting Fluid-specific logic
266
- // into the updating of the state. This is the second phase of DP, using the earlier created
267
- // in-memory object to access the function the user is trying to use in constant time and then,
268
- // subsequently performing it, taking the updated state, and applying it both locally and remotely
269
- const combinedReducer = {};
270
- Object.entries(reducer).forEach(([functionName, functionItem], i) => {
271
- if ((functionItem as any).asyncFunction !== undefined) {
272
- combinedReducer[functionName] = {
273
- asyncFunction: (
274
- dispatchState: ICombinedState<SV, SF, C>,
275
- ...args: any
276
- ) => dispatch(functionName, dispatchState, ...args),
277
- };
278
- } else {
279
- combinedReducer[functionName] = {
280
- function: (
281
- dispatchState: ICombinedState<SV, SF, C>,
282
- ...args: any
283
- ) => dispatch(functionName, dispatchState, ...args),
284
- };
285
- }
286
- });
287
-
288
- // Fetch is an in-memory object similar to dispatch, but now made for selector actions.
289
- // Selectors are NOT used for updating the state but instead to be able to access
290
- // and add other Fluid Fluid objects using the handle provided. If the handle provided is not available
291
- // in our Fluid object map, it will be dynamically updated and setState will be called again
292
- // with the updated Fluid object map available for use.
293
- // Alternatively, if you would like to pre-load Fluid objects before React is initialized,
294
- // you can do so and provide them in dataProps.
295
- // Fetch can also be used to retrieve data from these Fluid objects as they will also be available as a parameter.
296
- const fetch = React.useCallback(
297
- (
298
- type: keyof B,
299
- fetchState?: ICombinedState<SV, SF, C>,
300
- handle?: IFluidHandle,
301
- ) => {
302
- // Retrieve the current state that is stored on the syncedState for this Fluid object ID
303
- const currentFluidState = getFluidState(
304
- syncedStateId,
305
- syncedState,
306
- dataProps.fluidObjectMap,
307
- fluidToView,
308
- );
309
- if (currentFluidState === undefined) {
310
- throw Error(
311
- "Attempted to dispatch function before fluid state was initialized",
312
- );
313
- }
314
- const combinedFetchFluidState: SF = {
315
- ...currentFluidState,
316
- ...fetchState?.fluidState,
317
- };
318
- const combinedFetchViewState: SV = {
319
- ...viewState,
320
- ...fetchState?.viewState,
321
- };
322
- const combinedFetchDataProps: C = {
323
- ...dataProps,
324
- ...fetchState?.dataProps,
325
- };
326
- const combinedFetchState = {
327
- fluidState: combinedFetchFluidState,
328
- viewState: combinedFetchViewState,
329
- dataProps: combinedFetchDataProps,
330
- };
331
- const action = selector[type];
332
- if (action !== undefined) {
333
- if (instanceOfSelectorFunction<SV, SF, C>(action)) {
334
- // Add any new handles that were returned by the selector to our list
335
- // to be loaded to the fluid Fluid object map
336
- let newHandles: IFluidHandle[] = [];
337
- if (
338
- handle !== undefined &&
339
- instanceOfFluidObjectSelectorFunction<SV, SF, C>(action) &&
340
- combinedFetchDataProps.fluidObjectMap.get(
341
- handle.absolutePath,
342
- ) === undefined
343
- ) {
344
- newHandles.push(handle);
345
- }
346
- const actionResult = (action.function as any)(
347
- combinedFetchState,
348
- handle,
349
- );
350
- if (
351
- actionResult !== undefined &&
352
- actionResult.newComponentHandles !== undefined
353
- ) {
354
- newHandles = newHandles.concat(
355
- actionResult.newComponentHandles,
356
- );
357
- }
358
- // If there are handles, start a call to update the Fluid object map and then call the set state
359
- // callback when it has finished to provide the updated map in the state
360
- if (newHandles.length > 0) {
361
- const callback = syncedStateCallbackListener(
362
- combinedFetchDataProps.fluidObjectMap,
363
- storedHandleMap,
364
- syncedStateId,
365
- syncedState,
366
- combinedFetchDataProps.runtime,
367
- combinedFetchState.viewState,
368
- setState,
369
- fluidToView,
370
- viewToFluid,
371
- );
372
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
373
- updateStateAndFluidObjectMap(
374
- newHandles,
375
- combinedFetchDataProps.fluidObjectMap,
376
- storedHandleMap,
377
- true,
378
- syncedStateId,
379
- syncedState,
380
- combinedFetchDataProps.runtime,
381
- combinedFetchState.viewState,
382
- setState,
383
- callback,
384
- fluidToView,
385
- viewToFluid,
386
- );
387
- }
388
- // Always return the result immediately
389
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
390
- return actionResult;
391
- } else {
392
- throw new Error(
393
- `Action with key ${action} does not match an expected selector action interface`,
394
- );
395
- }
396
- } else {
397
- throw new Error(
398
- `Action with key ${action} does not
399
- exist in the selectors provided`,
400
- );
401
- }
402
- },
403
- [selector, viewState, setState, dataProps],
404
- );
405
-
406
- // The combined selector is then similarly created with the Fluid-specific logic of adding any new Fluid objects
407
- // to our Fluid object map interjected into the setState logic
408
- const combinedSelector = {};
409
- Object.entries(selector).forEach(([functionName, functionItem], i) => {
410
- combinedSelector[functionName] = {
411
- function: (
412
- fetchState: ICombinedState<SV, SF, C>,
413
- handle?: IFluidHandle,
414
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
415
- ) => fetch(functionName, fetchState, handle),
416
- };
417
- });
418
-
419
- // Retrieve the current state that is stored on the syncedState for this Fluid object ID
420
- const fluidState = getFluidState(
421
- syncedStateId,
422
- syncedState,
423
- dataProps.fluidObjectMap,
424
- fluidToView,
425
- );
426
-
427
- return [
428
- {
429
- viewState,
430
- fluidState,
431
- dataProps,
432
- },
433
- combinedReducer as A,
434
- combinedSelector as B,
435
- ];
436
- }
@@ -1,84 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import * as React from "react";
7
- import {
8
- IViewState,
9
- IFluidProps,
10
- IFluidState,
11
- ISyncedStateConfig,
12
- } from "./interface";
13
- import { initializeState, syncState } from "./helpers";
14
-
15
- /**
16
- * A wrapper around the useState React hook that combines local and Fluid state updates
17
- */
18
- export function useStateFluid<
19
- SV extends IViewState,
20
- SF extends IFluidState
21
- >(
22
- props: IFluidProps<SV, SF>, initialViewState: SV,
23
- ): [SV, (newState: SV, isSyncedStateUpdate?: boolean) => void] {
24
- const {
25
- syncedStateId,
26
- syncedDataObject,
27
- } = props;
28
- const config = syncedDataObject.getConfig(syncedStateId);
29
- if (config === undefined) {
30
- throw Error(`Failed to find configuration for synced state ID: ${syncedStateId}`);
31
- }
32
- const syncedState = syncedDataObject.syncedState;
33
- const dataProps = props.dataProps ?? syncedDataObject.dataProps;
34
- const { fluidToView, viewToFluid } = config as ISyncedStateConfig<SV, SF>;
35
- // Establish the react state and setState functions using the initialViewState passed in
36
- const [reactState, reactSetState] = React.useState<SV>(initialViewState);
37
-
38
- // If this is the first time this function is being called in this session
39
- // It's okay to disable eslint here as the state will be updated with the initialized values
40
- // after the async call has finished
41
- // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
42
- if (!reactState.isInitialized) {
43
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
44
- initializeState<SV, SF>(
45
- syncedStateId,
46
- syncedState,
47
- dataProps,
48
- reactState,
49
- reactSetState,
50
- fluidToView,
51
- viewToFluid,
52
- );
53
- }
54
-
55
- // Create the fluidSetState function as a callback that in turn calls either our combined state
56
- // update to both the local and Fluid state or just the local state respectively based off of
57
- // if the state update is coming locally, i.e. not from the root
58
- const fluidSetState = React.useCallback(
59
- (newState: Partial<SV>, fromRootUpdate = false, isLocal: boolean = false) => {
60
- const newCombinedState = {
61
- ...reactState,
62
- ...newState,
63
- isInitialized: true,
64
- };
65
- if (isLocal) {
66
- reactSetState(newCombinedState);
67
- } else {
68
- syncState(
69
- fromRootUpdate,
70
- syncedStateId,
71
- syncedState,
72
- dataProps.runtime,
73
- newCombinedState,
74
- reactSetState,
75
- dataProps.fluidObjectMap,
76
- fluidToView,
77
- viewToFluid,
78
- );
79
- }
80
- },
81
- [syncedState, viewToFluid, reactState, reactSetState, dataProps],
82
- );
83
- return [reactState, fluidSetState];
84
- }
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "./lib",
5
- "module": "esnext"
6
- },
7
- }