@fluidframework/react 0.41.4 → 2.62.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 (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
package/src/reactView.tsx DELETED
@@ -1,108 +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
- IFluidProps,
9
- IFluidState,
10
- IViewState,
11
- IFluidConverter,
12
- IViewConverter,
13
- IFluidDataProps,
14
- ISyncedState,
15
- } from "./interface";
16
- import { syncState, initializeState } from "./helpers";
17
-
18
- /**
19
- * A React view with a synced state, initial props, and a Fluid-to-view state two-way mapping
20
- */
21
- export abstract class FluidReactView<SV extends IViewState,
22
- SF extends IFluidState> extends React.Component<IFluidProps<SV, SF>, SV> {
23
- private readonly _syncedStateId: string;
24
- private readonly _syncedState: ISyncedState;
25
- private readonly _dataProps: IFluidDataProps;
26
- private readonly _viewToFluid: Map<keyof SV, IFluidConverter<SV, SF>>;
27
- private readonly _fluidToView: Map<keyof SF, IViewConverter<SV, SF>>;
28
- constructor(props: IFluidProps<SV, SF>) {
29
- super(props);
30
- const {
31
- syncedStateId,
32
- syncedDataObject,
33
- } = props;
34
- const config = syncedDataObject.getConfig(syncedStateId);
35
- if (config === undefined) {
36
- throw Error(`Failed to find configuration for synced state ID: ${syncedStateId}`);
37
- }
38
- this._viewToFluid = config.viewToFluid as any;
39
- this._fluidToView = config.fluidToView as any;
40
- this._syncedStateId = syncedStateId;
41
- this._syncedState = syncedDataObject.syncedState;
42
- this._dataProps = syncedDataObject.dataProps;
43
- this.state = config.defaultViewState;
44
- }
45
-
46
- public async componentDidMount() {
47
- await initializeState(
48
- this._syncedStateId,
49
- this._syncedState,
50
- this._dataProps,
51
- this.state,
52
- this._setState.bind(this),
53
- this._fluidToView,
54
- this._viewToFluid,
55
- );
56
- }
57
-
58
- /**
59
- * Function to update the state from both synced state updates or local ones. Only updates the synced state
60
- * on local updates
61
- * @param newState - the new state to be set
62
- * @param fromRootUpdate - is this update coming locally or from a synced state value change
63
- * @param isLocal - should this update be applied only locally
64
- */
65
- private _setState(
66
- newState: SV,
67
- fromRootUpdate?: boolean,
68
- isLocal?: boolean,
69
- ) {
70
- // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
71
- if (isLocal) {
72
- super.setState(newState);
73
- // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
74
- } else if (fromRootUpdate) {
75
- syncState(
76
- true,
77
- this._syncedStateId,
78
- this._syncedState,
79
- this._dataProps.runtime,
80
- newState,
81
- this._setState.bind(this),
82
- this._dataProps.fluidObjectMap,
83
- this._fluidToView,
84
- this._viewToFluid,
85
- );
86
- } else {
87
- this.setState(newState);
88
- }
89
- }
90
-
91
- /**
92
- * Function to update the current state. It overloads the React setState function
93
- * @param newState - New state to be set both locally and on the synced state
94
- */
95
- public setState(newState: SV) {
96
- syncState(
97
- false,
98
- this._syncedStateId,
99
- this._syncedState,
100
- this._dataProps.runtime,
101
- newState,
102
- this._setState.bind(this),
103
- this._dataProps.fluidObjectMap,
104
- this._fluidToView,
105
- this._viewToFluid,
106
- );
107
- }
108
- }
@@ -1,337 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { DataObject } from "@fluidframework/aqueduct";
6
- import {
7
- IFluidObject,
8
- IFluidHandle,
9
- } from "@fluidframework/core-interfaces";
10
- import { IEvent } from "@fluidframework/common-definitions";
11
- import { SharedMap, ISharedMap } from "@fluidframework/map";
12
- import { IFluidHTMLView } from "@fluidframework/view-interfaces";
13
- import type { IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
14
-
15
- import {
16
- FluidObjectMap,
17
- SyncedStateConfig,
18
- ISyncedStateConfig,
19
- IViewState,
20
- IFluidState,
21
- ISyncedState,
22
- } from "./interface";
23
- import {
24
- generateFluidObjectSchema,
25
- setSchema,
26
- getSchema,
27
- } from "./helpers";
28
-
29
- /**
30
- * SyncedDataObject is a base class for Fluid data objects with views. It extends DataObject.
31
- * In addition to the root and task manager, the SyncedDataObject also provides a syncedStateConfig
32
- * and assures that the syncedState will be initialized according the config by the time the view
33
- * is rendered.
34
- *
35
- * As this is used for views, it also implements the IFluidHTMLView interface, and requires
36
- * the render function to be filled in.
37
- */
38
- export abstract class SyncedDataObject<
39
- // eslint-disable-next-line @typescript-eslint/ban-types
40
- P extends IFluidObject = object,
41
- S = undefined,
42
- E extends IEvent = IEvent
43
- > extends DataObject<P, S, E> implements IFluidHTMLView {
44
- private readonly syncedStateConfig: SyncedStateConfig = new Map();
45
- private readonly fluidObjectMap: FluidObjectMap = new Map();
46
- private readonly syncedStateDirectoryId = "syncedState";
47
- private internalSyncedState: ISharedMap | undefined;
48
-
49
- public get IFluidHTMLView() {
50
- return this;
51
- }
52
-
53
- /**
54
- * Runs the first time the SyncedDataObject is generated and sets up all necessary data structures for the view
55
- * To extend this function, please call super() prior to adding to functionality to ensure correct initializing
56
- */
57
- protected async initializingFirstTime(): Promise<void> {
58
- // Initialize our synced state map for the first time using our
59
- // syncedStateConfig values
60
- await this.initializeStateFirstTime();
61
- }
62
-
63
- /**
64
- * Runs any time the SyncedDataObject is rendered again. It sets up all necessary data structures for the view,
65
- * along with any additional ones that may have been added due to user behavior
66
- * To extend this function, please call super() prior to adding to functionality to ensure correct initializing
67
- */
68
- protected async initializingFromExisting(): Promise<void> {
69
- // Load our existing state values to be ready for the render lifecycle
70
- await this.initializeStateFromExisting();
71
- }
72
-
73
- /**
74
- * Returns an interface to interact with the stored synced state for the SyncedDataObject.
75
- * Views can get and fetch values from it based on their syncedStateId to retrieve their view-specific information.
76
- * They can also attach listeners using the addValueChangedListener
77
- */
78
- public get syncedState(): ISyncedState {
79
- if (this.internalSyncedState === undefined) {
80
- throw new Error(this.getUninitializedErrorString(`syncedState`));
81
- }
82
- return {
83
- set: this.internalSyncedState.set.bind(this.internalSyncedState),
84
- get: this.internalSyncedState.get.bind(this.internalSyncedState),
85
- addValueChangedListener: (callback) => {
86
- if (this.internalSyncedState === undefined) {
87
- throw new Error(
88
- this.getUninitializedErrorString(`syncedState`),
89
- );
90
- }
91
- this.internalSyncedState.on("valueChanged", callback);
92
- },
93
- };
94
- }
95
-
96
- /**
97
- * Returns the data props used by the view to manage the different DDSes and add any new ones
98
- */
99
- public get dataProps() {
100
- return {
101
- // The return type is defined explicitly here to prevent TypeScript from generating dynamic imports
102
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
103
- runtime: this.runtime as IFluidDataStoreRuntime,
104
- fluidObjectMap: this.fluidObjectMap,
105
- };
106
- }
107
-
108
- /**
109
- * Set values to the syncedStateConfig where the view and Fluid states have the same values defined by S.
110
- * Each view with a unique syncedStateId needs its own value in the syncedStateConfig.
111
- * @param key - The syncedStateId that maps to the view that will be using these definitions
112
- * @param value - The config value containing the syncedStateId and the fluidToView and viewToFluid maps
113
- */
114
- // eslint-disable-next-line @typescript-eslint/no-shadow
115
- public setConfig<S>(key: string, value: ISyncedStateConfig<S, S>) {
116
- this.syncedStateConfig.set(key, value);
117
- }
118
-
119
- /**
120
- * Set values to the syncedStateConfig with different view and Fluid state definitions.
121
- * Each view with a unique syncedStateId needs its own value in the syncedStateConfig,
122
- * with SV being the view state definition and SF being the Fluid state definition.
123
- * @param key - The syncedStateId that maps to the view that will be using these definitions
124
- * @param value - The config value containing the syncedStateId and the fluidToView and viewToFluid maps
125
- * that establish the relationship between SV and SF
126
- */
127
- public setFluidConfig<
128
- SV extends IViewState,
129
- SF extends IFluidState
130
- >(key: string, value: ISyncedStateConfig<SV, SF>) {
131
- this.syncedStateConfig.set(key, value);
132
- }
133
-
134
- /**
135
- * Get a config for a specific view with the key as its syncedStateId
136
- * @param key - The syncedStateId to get the config for
137
- */
138
- public getConfig(key: string) {
139
- return this.syncedStateConfig.get(key);
140
- }
141
-
142
- /**
143
- * Returns a view. This function need to be implemented for any consumer of SyncedDataObject
144
- * to render values that have been initialized using the syncedStateConfig
145
- * @param element - The document that the rendered value will be displayed in
146
- */
147
- public render(element: HTMLElement) {
148
- throw Error("Render function was not implemented");
149
- }
150
-
151
- private async initializeStateFirstTime() {
152
- this.internalSyncedState = SharedMap.create(
153
- this.runtime,
154
- this.syncedStateDirectoryId,
155
- );
156
- this.internalSyncedState.bindToContext();
157
- for (const stateConfig of this.syncedStateConfig.values()) {
158
- const {
159
- syncedStateId,
160
- fluidToView,
161
- viewToFluid,
162
- defaultViewState,
163
- } = stateConfig;
164
- // Add the SharedMap to store the Fluid state
165
- const storedFluidState = SharedMap.create(this.runtime);
166
- // Add it to the Fluid object map so that it will have a listener added to it once
167
- // we enter the render lifecycle
168
- this.fluidObjectMap.set(storedFluidState.handle.absolutePath, {
169
- fluidObject: storedFluidState,
170
- isRuntimeMap: true,
171
- });
172
- // Add the state to our map of synced states so that we can load it later for persistence
173
- this.syncedState.set(
174
- `syncedState-${syncedStateId}`,
175
- storedFluidState.handle,
176
- );
177
- // Initialize any DDSes needed for the state or fetch any values from the root if they are stored
178
- // on the root under a different key
179
- for (const [key, value] of fluidToView.entries()) {
180
- const fluidKey = key as string;
181
- const rootKey = value.rootKey;
182
- const createCallback = value.sharedObjectCreate;
183
- if (createCallback !== undefined) {
184
- const sharedObject = createCallback(this.runtime);
185
- this.fluidObjectMap.set(sharedObject.handle.absolutePath, {
186
- fluidObject: sharedObject,
187
- listenedEvents: value.listenedEvents ?? ["valueChanged"],
188
- });
189
- storedFluidState.set(fluidKey, sharedObject.handle);
190
- if (rootKey !== undefined) {
191
- this.root.set(rootKey, sharedObject.handle);
192
- }
193
- } else if (rootKey !== undefined) {
194
- storedFluidState.set(fluidKey, this.root.get(rootKey));
195
- }
196
- }
197
-
198
- // Generate our schema and store it, so that we don't need to parse our maps each time
199
- const schema = generateFluidObjectSchema(
200
- this.runtime,
201
- defaultViewState,
202
- fluidToView,
203
- viewToFluid,
204
- );
205
- const schemaHandles = {
206
- fluidMatchingMapHandle: schema.fluidMatchingMap
207
- .handle as IFluidHandle<SharedMap>,
208
- viewMatchingMapHandle: schema.viewMatchingMap
209
- .handle as IFluidHandle<SharedMap>,
210
- storedHandleMapHandle: schema.storedHandleMap
211
- .handle as IFluidHandle<SharedMap>,
212
- };
213
- this.fluidObjectMap.set(
214
- schema.fluidMatchingMap.handle.absolutePath,
215
- {
216
- fluidObject: schema.fluidMatchingMap,
217
- isRuntimeMap: true,
218
- },
219
- );
220
- this.fluidObjectMap.set(
221
- schema.viewMatchingMap.handle.absolutePath,
222
- {
223
- fluidObject: schema.viewMatchingMap,
224
- isRuntimeMap: true,
225
- },
226
- );
227
- this.fluidObjectMap.set(
228
- schema.storedHandleMap.handle.absolutePath,
229
- {
230
- fluidObject: schema.storedHandleMap,
231
- isRuntimeMap: true,
232
- },
233
- );
234
-
235
- setSchema(
236
- syncedStateId,
237
- this.syncedState,
238
- schemaHandles,
239
- );
240
- }
241
- }
242
-
243
- private async initializeStateFromExisting() {
244
- // Fetch our synced state that stores all of our information to re-initialize the view state
245
- this.internalSyncedState = (await this.runtime.getChannel(
246
- this.syncedStateDirectoryId,
247
- )) as ISharedMap;
248
- // Reload the stored state for each config provided
249
- for (const stateConfig of this.syncedStateConfig.values()) {
250
- const { syncedStateId, fluidToView } = stateConfig;
251
- // Fetch this specific view's state using the syncedStateId
252
- const storedFluidStateHandle = this.syncedState.get<
253
- IFluidHandle<ISharedMap>
254
- >(`syncedState-${syncedStateId}`);
255
- if (storedFluidStateHandle === undefined) {
256
- throw new Error(
257
- this.getUninitializedErrorString(
258
- `syncedState-${syncedStateId}`,
259
- ),
260
- );
261
- }
262
- const storedFluidState = await storedFluidStateHandle.get();
263
- // Add it to the Fluid object map so that it will have a listener added to it once
264
- // we enter the render lifecycle
265
- this.fluidObjectMap.set(storedFluidStateHandle.absolutePath, {
266
- fluidObject: storedFluidState,
267
- isRuntimeMap: true,
268
- });
269
- // If the view is using any Fluid data stores or SharedObjects, asynchronously fetch them
270
- // from their stored handles
271
- for (const [key, value] of fluidToView.entries()) {
272
- const fluidKey = key as string;
273
- const rootKey = value.rootKey;
274
- const createCallback = value.sharedObjectCreate;
275
- if (createCallback !== undefined) {
276
- const handle = rootKey !== undefined
277
- ? this.root.get(rootKey)
278
- : storedFluidState.get(fluidKey);
279
- if (handle === undefined) {
280
- throw new Error(
281
- `Failed to find ${fluidKey} in synced state`,
282
- );
283
- }
284
- this.fluidObjectMap.set(handle.absolutePath, {
285
- fluidObject: await handle.get(),
286
- listenedEvents: value.listenedEvents ?? ["valueChanged"],
287
- });
288
- } else {
289
- const storedValue = rootKey !== undefined
290
- ? this.root.get(rootKey)
291
- : storedFluidState.get(fluidKey);
292
- const handle = storedValue?.IFluidHandle;
293
- if (handle !== undefined) {
294
- this.fluidObjectMap.set(handle.absolutePath, {
295
- fluidObject: await handle.get(),
296
- listenedEvents: value.listenedEvents ?? [
297
- "valueChanged",
298
- ],
299
- });
300
- }
301
- }
302
- }
303
- const schemaHandles = getSchema(
304
- syncedStateId,
305
- this.syncedState,
306
- );
307
- if (schemaHandles === undefined) {
308
- throw new Error(
309
- this.getUninitializedErrorString(
310
- `schema-${syncedStateId}`,
311
- ),
312
- );
313
- }
314
- this.fluidObjectMap.set(
315
- schemaHandles.fluidMatchingMapHandle.absolutePath,
316
- {
317
- fluidObject: await schemaHandles.fluidMatchingMapHandle.get(),
318
- isRuntimeMap: true,
319
- },
320
- );
321
- this.fluidObjectMap.set(
322
- schemaHandles.viewMatchingMapHandle.absolutePath,
323
- {
324
- fluidObject: await schemaHandles.viewMatchingMapHandle.get(),
325
- isRuntimeMap: true,
326
- },
327
- );
328
- this.fluidObjectMap.set(
329
- schemaHandles.storedHandleMapHandle.absolutePath,
330
- {
331
- fluidObject: await schemaHandles.storedHandleMapHandle.get(),
332
- isRuntimeMap: true,
333
- },
334
- );
335
- }
336
- }
337
- }
@@ -1,126 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { SharedObjectSequence } from "@fluidframework/sequence";
7
- import {
8
- IViewState,
9
- IFluidState,
10
- SyncedDataObject,
11
- ICombinedState,
12
- IFluidDataProps,
13
- useReducerFluid,
14
- } from "../..";
15
- import { IFluidSyncedArrayReducer } from "./interface";
16
-
17
- export function setFluidSyncedArrayConfig<
18
- SV extends IViewState,
19
- SF extends IFluidState
20
- >(
21
- syncedDataObject: SyncedDataObject,
22
- syncedStateId: string,
23
- viewKey: keyof SV,
24
- fluidKey: keyof SF,
25
- defaultViewState: SV,
26
- sharedObjectCreate = SharedObjectSequence.create,
27
- ) {
28
- syncedDataObject.setFluidConfig<SV, SF>(syncedStateId, {
29
- syncedStateId,
30
- fluidToView: new Map([
31
- [
32
- fluidKey,
33
- {
34
- type: SharedObjectSequence.name,
35
- viewKey,
36
- viewConverter: (viewState, fluidState) => {
37
- if (fluidState[fluidKey] === undefined) {
38
- throw Error("Fluid state was not initialized");
39
- }
40
- viewState[viewKey] = (fluidState[
41
- fluidKey
42
- ] as any).getItems(0);
43
- return viewState;
44
- },
45
- sharedObjectCreate,
46
- listenedEvents: ["valueChanged"],
47
- },
48
- ],
49
- ]),
50
- viewToFluid: new Map([
51
- [
52
- viewKey,
53
- {
54
- type: "array",
55
- fluidKey,
56
- fluidConverter: (viewState, fluidState) => {
57
- if (fluidState[fluidKey] === undefined) {
58
- throw Error("Fluid state was not initialized");
59
- }
60
- viewState[viewKey] = (fluidState[
61
- fluidKey
62
- ] as any).getItems(0);
63
- return fluidState;
64
- },
65
- },
66
- ],
67
- ]),
68
- defaultViewState,
69
- });
70
- }
71
-
72
- export function generateSyncedArrayReducer<
73
- SV extends IViewState,
74
- SF extends IFluidState
75
- >(viewKey: keyof SV, fluidKey: keyof SF): IFluidSyncedArrayReducer<SV, SF> {
76
- const syncedArrayReducer = {
77
- add: {
78
- function: (state, value: any) => {
79
- if (state?.fluidState?.[fluidKey] === undefined) {
80
- throw Error(
81
- "State was not initialized prior to dispatch call",
82
- );
83
- }
84
- state.fluidState[fluidKey].insert(
85
- state.fluidState[fluidKey].getLength(),
86
- [{ ...value }],
87
- );
88
- state.viewState[viewKey] = state.fluidState[fluidKey].getItems(
89
- 0,
90
- );
91
- return { state };
92
- },
93
- },
94
- };
95
- return syncedArrayReducer;
96
- }
97
-
98
- export function useSyncedArrayReducerFluid<
99
- SV extends IViewState,
100
- SF extends IFluidState
101
- >(
102
- syncedDataObject: SyncedDataObject,
103
- syncedStateId: string,
104
- viewKey: keyof SV,
105
- fluidKey: keyof SF,
106
- defaultViewState: SV,
107
- // eslint-disable-next-line @typescript-eslint/ban-types
108
- ): [ICombinedState<SV, SF, IFluidDataProps>, IFluidSyncedArrayReducer<SV, SF>, {}] {
109
- const syncedArrayReducer = generateSyncedArrayReducer(viewKey, fluidKey);
110
- return useReducerFluid<
111
- SV,
112
- SF,
113
- IFluidSyncedArrayReducer<SV, SF>,
114
- // eslint-disable-next-line @typescript-eslint/ban-types
115
- {},
116
- IFluidDataProps
117
- >(
118
- {
119
- syncedDataObject,
120
- syncedStateId,
121
- reducer: syncedArrayReducer,
122
- selector: {},
123
- },
124
- defaultViewState,
125
- );
126
- }
@@ -1,7 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- export * from "./syncedArray";
7
- export * from "./interface";
@@ -1,45 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { SharedObjectSequence } from "@fluidframework/sequence";
6
- import {
7
- IViewState,
8
- IFluidState,
9
- IFluidReducer,
10
- IFluidDataProps,
11
- FluidStateUpdateFunction,
12
- } from "../..";
13
-
14
- /**
15
- * The state interface exposed to the view for the synced array
16
- */
17
- export interface ISyncedArrayViewState<T> extends IViewState {
18
- values: T[];
19
- }
20
-
21
- /**
22
- * The state interface for the Fluid data source that powers the synced array
23
- */
24
- export interface ISyncedArrayFluidState<T> extends IFluidState {
25
- values: SharedObjectSequence<T>;
26
- }
27
-
28
- /**
29
- * The reducer interface for modifying the synced array
30
- * TODO: Add more functions that further expose the SharedObjectSequence interface for use
31
- */
32
- export interface ISyncedArrayReducer<T> {
33
- add: (value: T) => void;
34
- }
35
-
36
- /**
37
- * The underlying reducer interface passed to the useReducerFluid hook to bind the view and Fluid
38
- * state definitions together
39
- */
40
- export interface IFluidSyncedArrayReducer<
41
- SV extends IViewState,
42
- SF extends IFluidState
43
- > extends IFluidReducer<SV, SF, IFluidDataProps> {
44
- add: FluidStateUpdateFunction<SV, SF, IFluidDataProps>;
45
- }
@@ -1,65 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { SharedObjectSequence } from "@fluidframework/sequence";
6
- import { SyncedDataObject } from "../..";
7
- import { ISyncedArrayViewState, ISyncedArrayFluidState, ISyncedArrayReducer } from "./interface";
8
- import { setFluidSyncedArrayConfig, useSyncedArrayReducerFluid } from "./fluidSyncedArray";
9
-
10
- /**
11
- * Function to set the config for a synced array on a syncedDataObject's SharedMap synced state. This
12
- * will initialize and provide a SharedObjectSequence<T> for the view to use through a T[] interface.
13
- * This SharedObjectSequence provided is automatically bound to the state update of the
14
- * functional view useSyncedArray is called in.
15
- * @param syncedDataObject - The Fluid data object on which the synced state config is being set
16
- * @param syncedStateId - The ID of the view state that this config schema is being set for
17
- * @param defaultValue - The default values in the view array prior to the SharedObjectSequence initializing
18
- * @param sharedObjectCreate - The creation function for the SharedObjectSequence. This can be set to
19
- * pre-increment the sequence with initial values.
20
- */
21
- export function setSyncedArrayConfig<T>(
22
- syncedDataObject: SyncedDataObject,
23
- syncedStateId: string,
24
- defaultValue: T[] = [],
25
- sharedObjectCreate = SharedObjectSequence.create,
26
- ) {
27
- setFluidSyncedArrayConfig<ISyncedArrayViewState<T>, ISyncedArrayFluidState<T>>(
28
- syncedDataObject,
29
- syncedStateId,
30
- "values",
31
- "values",
32
- { values: defaultValue },
33
- sharedObjectCreate,
34
- );
35
- }
36
-
37
- /**
38
- * Function to use the synced array state powered by a SharedObjectSequence<T> that has been prepared for this view
39
- * @param syncedDataObject - The Fluid data object that holds the synced state config for this view
40
- * @param syncedStateId - The ID of this view state
41
- * @returns [
42
- * the array of T objects currently in the SharedObjectSequence,
43
- * the reducer to modify values on the SharedObjectSequence
44
- * ]
45
- */
46
- export function useSyncedArray<T>(
47
- syncedDataObject: SyncedDataObject,
48
- syncedStateId: string,
49
- defaultValue = [] as T[],
50
- ): [T[], ISyncedArrayReducer<T>] {
51
- type viewState = ISyncedArrayViewState<T>;
52
- type fluidState = ISyncedArrayFluidState<T>;
53
- const [state, reducer] = useSyncedArrayReducerFluid<viewState, fluidState>(
54
- syncedDataObject,
55
- syncedStateId,
56
- "values",
57
- "values",
58
- { values: defaultValue },
59
- );
60
- const pureReducer: ISyncedArrayReducer<T> = {
61
- add: (value: T) => reducer.add.function(state, value),
62
- };
63
-
64
- return [state.viewState.values, pureReducer];
65
- }