@microsoft/live-share-react 1.4.0-preview.0 → 2.0.0-internal.10
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/LICENSE +64 -61
- package/README.md +173 -168
- package/bin/cjs/index.d.ts +7 -0
- package/bin/cjs/index.d.ts.map +1 -0
- package/bin/cjs/index.js +23 -0
- package/bin/cjs/index.js.map +1 -0
- package/bin/cjs/interfaces/LiveInterfaceExtensions.d.ts.map +1 -0
- package/bin/cjs/interfaces/LiveInterfaceExtensions.js +7 -0
- package/bin/cjs/interfaces/LiveInterfaceExtensions.js.map +1 -0
- package/bin/cjs/interfaces/index.d.ts +2 -0
- package/bin/cjs/interfaces/index.d.ts.map +1 -0
- package/bin/cjs/interfaces/index.js +18 -0
- package/bin/cjs/interfaces/index.js.map +1 -0
- package/bin/{internal → cjs/internal}/errors.d.ts +15 -0
- package/bin/cjs/internal/errors.d.ts.map +1 -0
- package/bin/cjs/internal/errors.js +48 -0
- package/bin/cjs/internal/errors.js.map +1 -0
- package/bin/cjs/internal/index.d.ts +3 -0
- package/bin/cjs/internal/index.d.ts.map +1 -0
- package/bin/cjs/internal/index.js +19 -0
- package/bin/cjs/internal/index.js.map +1 -0
- package/bin/{internal → cjs/internal}/type-guards.d.ts +5 -0
- package/bin/cjs/internal/type-guards.d.ts.map +1 -0
- package/bin/cjs/internal/type-guards.js +24 -0
- package/bin/cjs/internal/type-guards.js.map +1 -0
- package/bin/cjs/live-hooks/index.d.ts +8 -0
- package/bin/cjs/live-hooks/index.d.ts.map +1 -0
- package/bin/cjs/live-hooks/index.js +24 -0
- package/bin/cjs/live-hooks/index.js.map +1 -0
- package/bin/cjs/live-hooks/useLiveCanvas.d.ts +80 -0
- package/bin/cjs/live-hooks/useLiveCanvas.d.ts.map +1 -0
- package/bin/cjs/live-hooks/useLiveCanvas.js +244 -0
- package/bin/cjs/live-hooks/useLiveCanvas.js.map +1 -0
- package/bin/{live-hooks → cjs/live-hooks}/useLiveEvent.d.ts +37 -1
- package/bin/cjs/live-hooks/useLiveEvent.d.ts.map +1 -0
- package/bin/cjs/live-hooks/useLiveEvent.js +150 -0
- package/bin/cjs/live-hooks/useLiveEvent.js.map +1 -0
- package/bin/cjs/live-hooks/useLiveFollowMode.d.ts +163 -0
- package/bin/cjs/live-hooks/useLiveFollowMode.d.ts.map +1 -0
- package/bin/cjs/live-hooks/useLiveFollowMode.js +360 -0
- package/bin/cjs/live-hooks/useLiveFollowMode.js.map +1 -0
- package/bin/cjs/live-hooks/useLivePresence.d.ts +76 -0
- package/bin/cjs/live-hooks/useLivePresence.d.ts.map +1 -0
- package/bin/cjs/live-hooks/useLivePresence.js +170 -0
- package/bin/cjs/live-hooks/useLivePresence.js.map +1 -0
- package/bin/{live-hooks → cjs/live-hooks}/useLiveState.d.ts +46 -1
- package/bin/cjs/live-hooks/useLiveState.d.ts.map +1 -0
- package/bin/cjs/live-hooks/useLiveState.js +134 -0
- package/bin/cjs/live-hooks/useLiveState.js.map +1 -0
- package/bin/{live-hooks → cjs/live-hooks}/useLiveTimer.d.ts +56 -1
- package/bin/cjs/live-hooks/useLiveTimer.d.ts.map +1 -0
- package/bin/cjs/live-hooks/useLiveTimer.js +233 -0
- package/bin/cjs/live-hooks/useLiveTimer.js.map +1 -0
- package/bin/cjs/live-hooks/useMediaSynchronizer.d.ts +86 -0
- package/bin/cjs/live-hooks/useMediaSynchronizer.d.ts.map +1 -0
- package/bin/cjs/live-hooks/useMediaSynchronizer.js +301 -0
- package/bin/cjs/live-hooks/useMediaSynchronizer.js.map +1 -0
- package/bin/cjs/package.json +1 -0
- package/bin/{providers → cjs/providers}/AzureProvider.d.ts +9 -9
- package/bin/cjs/providers/AzureProvider.d.ts.map +1 -0
- package/bin/cjs/providers/AzureProvider.js +127 -0
- package/bin/cjs/providers/AzureProvider.js.map +1 -0
- package/bin/{providers → cjs/providers}/LiveShareProvider.d.ts +106 -4
- package/bin/cjs/providers/LiveShareProvider.d.ts.map +1 -0
- package/bin/cjs/providers/LiveShareProvider.js +205 -0
- package/bin/cjs/providers/LiveShareProvider.js.map +1 -0
- package/bin/cjs/providers/index.d.ts +3 -0
- package/bin/cjs/providers/index.d.ts.map +1 -0
- package/bin/cjs/providers/index.js +19 -0
- package/bin/cjs/providers/index.js.map +1 -0
- package/bin/cjs/shared-hooks/index.d.ts +7 -0
- package/bin/cjs/shared-hooks/index.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/index.js +23 -0
- package/bin/cjs/shared-hooks/index.js.map +1 -0
- package/bin/cjs/shared-hooks/internals/tree-node-constants.d.ts +3 -0
- package/bin/cjs/shared-hooks/internals/tree-node-constants.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/internals/tree-node-constants.js +6 -0
- package/bin/cjs/shared-hooks/internals/tree-node-constants.js.map +1 -0
- package/bin/cjs/shared-hooks/internals/tree-node-types.d.ts +10 -0
- package/bin/cjs/shared-hooks/internals/tree-node-types.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/internals/tree-node-types.js +23 -0
- package/bin/cjs/shared-hooks/internals/tree-node-types.js.map +1 -0
- package/bin/cjs/shared-hooks/internals/tree-node-utils.d.ts +33 -0
- package/bin/cjs/shared-hooks/internals/tree-node-utils.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/internals/tree-node-utils.js +193 -0
- package/bin/cjs/shared-hooks/internals/tree-node-utils.js.map +1 -0
- package/bin/{shared-hooks → cjs/shared-hooks}/useDynamicDDS.d.ts +4 -4
- package/bin/cjs/shared-hooks/useDynamicDDS.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/useDynamicDDS.js +87 -0
- package/bin/cjs/shared-hooks/useDynamicDDS.js.map +1 -0
- package/bin/{shared-hooks → cjs/shared-hooks}/useSharedMap.d.ts +4 -2
- package/bin/cjs/shared-hooks/useSharedMap.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/useSharedMap.js +134 -0
- package/bin/cjs/shared-hooks/useSharedMap.js.map +1 -0
- package/bin/{shared-hooks → cjs/shared-hooks}/useSharedState.d.ts +1 -1
- package/bin/cjs/shared-hooks/useSharedState.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/useSharedState.js +80 -0
- package/bin/cjs/shared-hooks/useSharedState.js.map +1 -0
- package/bin/{shared-hooks → cjs/shared-hooks}/useSharedStateRegistry.d.ts +1 -1
- package/bin/cjs/shared-hooks/useSharedStateRegistry.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/useSharedStateRegistry.js +120 -0
- package/bin/cjs/shared-hooks/useSharedStateRegistry.js.map +1 -0
- package/bin/cjs/shared-hooks/useSharedTree.d.ts +57 -0
- package/bin/cjs/shared-hooks/useSharedTree.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/useSharedTree.js +123 -0
- package/bin/cjs/shared-hooks/useSharedTree.js.map +1 -0
- package/bin/cjs/shared-hooks/useTreeNode.d.ts +96 -0
- package/bin/cjs/shared-hooks/useTreeNode.d.ts.map +1 -0
- package/bin/cjs/shared-hooks/useTreeNode.js +135 -0
- package/bin/cjs/shared-hooks/useTreeNode.js.map +1 -0
- package/bin/{types → cjs/types}/ActionTypes.d.ts +7 -7
- package/bin/cjs/types/ActionTypes.d.ts.map +1 -0
- package/bin/cjs/types/ActionTypes.js +7 -0
- package/bin/cjs/types/ActionTypes.js.map +1 -0
- package/bin/cjs/types/PropTypes.d.ts +56 -0
- package/bin/cjs/types/PropTypes.d.ts.map +1 -0
- package/bin/cjs/types/PropTypes.js +7 -0
- package/bin/cjs/types/PropTypes.js.map +1 -0
- package/bin/{types → cjs/types}/ResultTypes.d.ts +50 -18
- package/bin/cjs/types/ResultTypes.d.ts.map +1 -0
- package/bin/cjs/types/ResultTypes.js +7 -0
- package/bin/cjs/types/ResultTypes.js.map +1 -0
- package/bin/cjs/types/index.d.ts +4 -0
- package/bin/cjs/types/index.d.ts.map +1 -0
- package/bin/cjs/types/index.js +20 -0
- package/bin/cjs/types/index.js.map +1 -0
- package/bin/cjs/utils/index.d.ts +2 -0
- package/bin/cjs/utils/index.d.ts.map +1 -0
- package/bin/cjs/utils/index.js +18 -0
- package/bin/cjs/utils/index.js.map +1 -0
- package/bin/cjs/utils/type-check.d.ts.map +1 -0
- package/bin/cjs/utils/type-check.js +62 -0
- package/bin/cjs/utils/type-check.js.map +1 -0
- package/bin/esm/index.d.ts +7 -0
- package/bin/esm/index.d.ts.map +1 -0
- package/bin/esm/index.js +7 -0
- package/bin/esm/index.js.map +1 -0
- package/bin/esm/interfaces/LiveInterfaceExtensions.d.ts +26 -0
- package/bin/esm/interfaces/LiveInterfaceExtensions.d.ts.map +1 -0
- package/bin/esm/interfaces/LiveInterfaceExtensions.js.map +1 -0
- package/bin/esm/interfaces/index.d.ts +2 -0
- package/bin/esm/interfaces/index.d.ts.map +1 -0
- package/bin/esm/interfaces/index.js +2 -0
- package/bin/esm/interfaces/index.js.map +1 -0
- package/bin/esm/internal/errors.d.ts +41 -0
- package/bin/esm/internal/errors.d.ts.map +1 -0
- package/bin/esm/internal/errors.js.map +1 -0
- package/bin/esm/internal/index.d.ts +3 -0
- package/bin/esm/internal/index.d.ts.map +1 -0
- package/bin/esm/internal/index.js +3 -0
- package/bin/esm/internal/index.js.map +1 -0
- package/bin/esm/internal/type-guards.d.ts +11 -0
- package/bin/esm/internal/type-guards.d.ts.map +1 -0
- package/bin/esm/internal/type-guards.js +20 -0
- package/bin/esm/internal/type-guards.js.map +1 -0
- package/bin/esm/live-hooks/index.d.ts +8 -0
- package/bin/esm/live-hooks/index.d.ts.map +1 -0
- package/bin/esm/live-hooks/index.js +8 -0
- package/bin/esm/live-hooks/index.js.map +1 -0
- package/bin/esm/live-hooks/useLiveCanvas.d.ts +80 -0
- package/bin/esm/live-hooks/useLiveCanvas.d.ts.map +1 -0
- package/bin/esm/live-hooks/useLiveCanvas.js +238 -0
- package/bin/esm/live-hooks/useLiveCanvas.js.map +1 -0
- package/bin/esm/live-hooks/useLiveEvent.d.ts +59 -0
- package/bin/esm/live-hooks/useLiveEvent.d.ts.map +1 -0
- package/bin/{live-hooks → esm/live-hooks}/useLiveEvent.js +41 -5
- package/bin/esm/live-hooks/useLiveEvent.js.map +1 -0
- package/bin/esm/live-hooks/useLiveFollowMode.d.ts +163 -0
- package/bin/esm/live-hooks/useLiveFollowMode.d.ts.map +1 -0
- package/bin/{live-hooks → esm/live-hooks}/useLiveFollowMode.js +148 -5
- package/bin/esm/live-hooks/useLiveFollowMode.js.map +1 -0
- package/bin/esm/live-hooks/useLivePresence.d.ts +76 -0
- package/bin/esm/live-hooks/useLivePresence.d.ts.map +1 -0
- package/bin/{live-hooks → esm/live-hooks}/useLivePresence.js +71 -13
- package/bin/esm/live-hooks/useLivePresence.js.map +1 -0
- package/bin/esm/live-hooks/useLiveState.d.ts +66 -0
- package/bin/esm/live-hooks/useLiveState.d.ts.map +1 -0
- package/bin/{live-hooks → esm/live-hooks}/useLiveState.js +54 -5
- package/bin/esm/live-hooks/useLiveState.js.map +1 -0
- package/bin/esm/live-hooks/useLiveTimer.d.ts +80 -0
- package/bin/esm/live-hooks/useLiveTimer.d.ts.map +1 -0
- package/bin/{live-hooks → esm/live-hooks}/useLiveTimer.js +58 -3
- package/bin/esm/live-hooks/useLiveTimer.js.map +1 -0
- package/bin/esm/live-hooks/useMediaSynchronizer.d.ts +86 -0
- package/bin/esm/live-hooks/useMediaSynchronizer.d.ts.map +1 -0
- package/bin/{live-hooks → esm/live-hooks}/useMediaSynchronizer.js +65 -4
- package/bin/esm/live-hooks/useMediaSynchronizer.js.map +1 -0
- package/bin/esm/providers/AzureProvider.d.ts +113 -0
- package/bin/esm/providers/AzureProvider.d.ts.map +1 -0
- package/bin/{providers → esm/providers}/AzureProvider.js +12 -12
- package/bin/esm/providers/AzureProvider.js.map +1 -0
- package/bin/esm/providers/LiveShareProvider.d.ts +193 -0
- package/bin/esm/providers/LiveShareProvider.d.ts.map +1 -0
- package/bin/esm/providers/LiveShareProvider.js +197 -0
- package/bin/esm/providers/LiveShareProvider.js.map +1 -0
- package/bin/esm/providers/index.d.ts +3 -0
- package/bin/esm/providers/index.d.ts.map +1 -0
- package/bin/esm/providers/index.js +3 -0
- package/bin/esm/providers/index.js.map +1 -0
- package/bin/esm/shared-hooks/index.d.ts +7 -0
- package/bin/esm/shared-hooks/index.d.ts.map +1 -0
- package/bin/esm/shared-hooks/index.js +7 -0
- package/bin/esm/shared-hooks/index.js.map +1 -0
- package/bin/esm/shared-hooks/internals/tree-node-constants.d.ts +3 -0
- package/bin/esm/shared-hooks/internals/tree-node-constants.d.ts.map +1 -0
- package/bin/esm/shared-hooks/internals/tree-node-constants.js +3 -0
- package/bin/esm/shared-hooks/internals/tree-node-constants.js.map +1 -0
- package/bin/esm/shared-hooks/internals/tree-node-types.d.ts +10 -0
- package/bin/esm/shared-hooks/internals/tree-node-types.d.ts.map +1 -0
- package/bin/esm/shared-hooks/internals/tree-node-types.js +18 -0
- package/bin/esm/shared-hooks/internals/tree-node-types.js.map +1 -0
- package/bin/esm/shared-hooks/internals/tree-node-utils.d.ts +33 -0
- package/bin/esm/shared-hooks/internals/tree-node-utils.d.ts.map +1 -0
- package/bin/esm/shared-hooks/internals/tree-node-utils.js +188 -0
- package/bin/esm/shared-hooks/internals/tree-node-utils.js.map +1 -0
- package/bin/esm/shared-hooks/useDynamicDDS.d.ts +23 -0
- package/bin/esm/shared-hooks/useDynamicDDS.d.ts.map +1 -0
- package/bin/{shared-hooks → esm/shared-hooks}/useDynamicDDS.js +20 -11
- package/bin/esm/shared-hooks/useDynamicDDS.js.map +1 -0
- package/bin/esm/shared-hooks/useSharedMap.d.ts +25 -0
- package/bin/esm/shared-hooks/useSharedMap.d.ts.map +1 -0
- package/bin/{shared-hooks → esm/shared-hooks}/useSharedMap.js +27 -13
- package/bin/esm/shared-hooks/useSharedMap.js.map +1 -0
- package/bin/esm/shared-hooks/useSharedState.d.ts +22 -0
- package/bin/esm/shared-hooks/useSharedState.d.ts.map +1 -0
- package/bin/{shared-hooks → esm/shared-hooks}/useSharedState.js +2 -2
- package/bin/esm/shared-hooks/useSharedState.js.map +1 -0
- package/bin/esm/shared-hooks/useSharedStateRegistry.d.ts +37 -0
- package/bin/esm/shared-hooks/useSharedStateRegistry.d.ts.map +1 -0
- package/bin/{shared-hooks → esm/shared-hooks}/useSharedStateRegistry.js +27 -19
- package/bin/esm/shared-hooks/useSharedStateRegistry.js.map +1 -0
- package/bin/esm/shared-hooks/useSharedTree.d.ts +57 -0
- package/bin/esm/shared-hooks/useSharedTree.d.ts.map +1 -0
- package/bin/esm/shared-hooks/useSharedTree.js +117 -0
- package/bin/esm/shared-hooks/useSharedTree.js.map +1 -0
- package/bin/esm/shared-hooks/useTreeNode.d.ts +96 -0
- package/bin/esm/shared-hooks/useTreeNode.d.ts.map +1 -0
- package/bin/esm/shared-hooks/useTreeNode.js +132 -0
- package/bin/esm/shared-hooks/useTreeNode.js.map +1 -0
- package/bin/esm/types/ActionTypes.d.ts +112 -0
- package/bin/esm/types/ActionTypes.d.ts.map +1 -0
- package/bin/esm/types/ActionTypes.js.map +1 -0
- package/bin/esm/types/PropTypes.d.ts +56 -0
- package/bin/esm/types/PropTypes.d.ts.map +1 -0
- package/bin/esm/types/PropTypes.js.map +1 -0
- package/bin/esm/types/ResultTypes.d.ts +334 -0
- package/bin/esm/types/ResultTypes.d.ts.map +1 -0
- package/bin/esm/types/ResultTypes.js.map +1 -0
- package/bin/esm/types/index.d.ts +4 -0
- package/bin/esm/types/index.d.ts.map +1 -0
- package/bin/esm/types/index.js +4 -0
- package/bin/esm/types/index.js.map +1 -0
- package/bin/esm/utils/index.d.ts +2 -0
- package/bin/esm/utils/index.d.ts.map +1 -0
- package/bin/esm/utils/index.js +2 -0
- package/bin/esm/utils/index.js.map +1 -0
- package/bin/esm/utils/type-check.d.ts +15 -0
- package/bin/esm/utils/type-check.d.ts.map +1 -0
- package/bin/esm/utils/type-check.js.map +1 -0
- package/package.json +61 -50
- package/src/index.ts +6 -6
- package/src/interfaces/index.ts +1 -1
- package/src/internal/errors.ts +16 -0
- package/src/internal/index.ts +2 -2
- package/src/internal/type-guards.ts +12 -0
- package/src/live-hooks/index.ts +7 -7
- package/src/live-hooks/useLiveCanvas.ts +154 -82
- package/src/live-hooks/useLiveEvent.ts +43 -7
- package/src/live-hooks/useLiveFollowMode.ts +149 -6
- package/src/live-hooks/useLivePresence.ts +80 -17
- package/src/live-hooks/useLiveState.ts +54 -6
- package/src/live-hooks/useLiveTimer.ts +59 -4
- package/src/live-hooks/useMediaSynchronizer.ts +70 -5
- package/src/providers/AzureProvider.tsx +21 -21
- package/src/providers/LiveShareProvider.tsx +126 -12
- package/src/providers/index.ts +2 -2
- package/src/shared-hooks/index.ts +6 -4
- package/src/shared-hooks/internals/tree-node-constants.ts +2 -0
- package/src/shared-hooks/internals/tree-node-types.ts +26 -0
- package/src/shared-hooks/internals/tree-node-utils.ts +269 -0
- package/src/shared-hooks/useDynamicDDS.ts +28 -17
- package/src/shared-hooks/useSharedMap.ts +42 -17
- package/src/shared-hooks/useSharedState.ts +6 -3
- package/src/shared-hooks/useSharedStateRegistry.ts +44 -22
- package/src/shared-hooks/useSharedTree.ts +144 -0
- package/src/shared-hooks/useTreeNode.ts +147 -0
- package/src/types/ActionTypes.ts +13 -9
- package/src/types/PropTypes.ts +57 -0
- package/src/types/ResultTypes.ts +71 -17
- package/src/types/index.ts +3 -3
- package/src/utils/index.ts +1 -1
- package/tsconfig.cjs.json +14 -0
- package/tsconfig.json +65 -70
- package/.nycrc.json +0 -10
- package/bin/index.d.ts +0 -7
- package/bin/index.d.ts.map +0 -1
- package/bin/index.js +0 -7
- package/bin/index.js.map +0 -1
- package/bin/interfaces/LiveInterfaceExtensions.d.ts.map +0 -1
- package/bin/interfaces/LiveInterfaceExtensions.js.map +0 -1
- package/bin/interfaces/index.d.ts +0 -2
- package/bin/interfaces/index.d.ts.map +0 -1
- package/bin/interfaces/index.js +0 -2
- package/bin/interfaces/index.js.map +0 -1
- package/bin/internal/errors.d.ts.map +0 -1
- package/bin/internal/errors.js.map +0 -1
- package/bin/internal/index.d.ts +0 -3
- package/bin/internal/index.d.ts.map +0 -1
- package/bin/internal/index.js +0 -3
- package/bin/internal/index.js.map +0 -1
- package/bin/internal/type-guards.d.ts.map +0 -1
- package/bin/internal/type-guards.js +0 -8
- package/bin/internal/type-guards.js.map +0 -1
- package/bin/live-hooks/index.d.ts +0 -8
- package/bin/live-hooks/index.d.ts.map +0 -1
- package/bin/live-hooks/index.js +0 -8
- package/bin/live-hooks/index.js.map +0 -1
- package/bin/live-hooks/useLiveCanvas.d.ts +0 -29
- package/bin/live-hooks/useLiveCanvas.d.ts.map +0 -1
- package/bin/live-hooks/useLiveCanvas.js +0 -160
- package/bin/live-hooks/useLiveCanvas.js.map +0 -1
- package/bin/live-hooks/useLiveEvent.d.ts.map +0 -1
- package/bin/live-hooks/useLiveEvent.js.map +0 -1
- package/bin/live-hooks/useLiveFollowMode.d.ts +0 -24
- package/bin/live-hooks/useLiveFollowMode.d.ts.map +0 -1
- package/bin/live-hooks/useLiveFollowMode.js.map +0 -1
- package/bin/live-hooks/useLivePresence.d.ts +0 -26
- package/bin/live-hooks/useLivePresence.d.ts.map +0 -1
- package/bin/live-hooks/useLivePresence.js.map +0 -1
- package/bin/live-hooks/useLiveState.d.ts.map +0 -1
- package/bin/live-hooks/useLiveState.js.map +0 -1
- package/bin/live-hooks/useLiveTimer.d.ts.map +0 -1
- package/bin/live-hooks/useLiveTimer.js.map +0 -1
- package/bin/live-hooks/useMediaSynchronizer.d.ts +0 -25
- package/bin/live-hooks/useMediaSynchronizer.d.ts.map +0 -1
- package/bin/live-hooks/useMediaSynchronizer.js.map +0 -1
- package/bin/providers/AzureProvider.d.ts.map +0 -1
- package/bin/providers/AzureProvider.js.map +0 -1
- package/bin/providers/LiveShareProvider.d.ts.map +0 -1
- package/bin/providers/LiveShareProvider.js +0 -87
- package/bin/providers/LiveShareProvider.js.map +0 -1
- package/bin/providers/index.d.ts +0 -3
- package/bin/providers/index.d.ts.map +0 -1
- package/bin/providers/index.js +0 -3
- package/bin/providers/index.js.map +0 -1
- package/bin/shared-hooks/index.d.ts +0 -5
- package/bin/shared-hooks/index.d.ts.map +0 -1
- package/bin/shared-hooks/index.js +0 -5
- package/bin/shared-hooks/index.js.map +0 -1
- package/bin/shared-hooks/useDynamicDDS.d.ts.map +0 -1
- package/bin/shared-hooks/useDynamicDDS.js.map +0 -1
- package/bin/shared-hooks/useSharedMap.d.ts.map +0 -1
- package/bin/shared-hooks/useSharedMap.js.map +0 -1
- package/bin/shared-hooks/useSharedState.d.ts.map +0 -1
- package/bin/shared-hooks/useSharedState.js.map +0 -1
- package/bin/shared-hooks/useSharedStateRegistry.d.ts.map +0 -1
- package/bin/shared-hooks/useSharedStateRegistry.js.map +0 -1
- package/bin/types/ActionTypes.d.ts.map +0 -1
- package/bin/types/ActionTypes.js.map +0 -1
- package/bin/types/PropTypes.d.ts +0 -8
- package/bin/types/PropTypes.d.ts.map +0 -1
- package/bin/types/PropTypes.js.map +0 -1
- package/bin/types/ResultTypes.d.ts.map +0 -1
- package/bin/types/ResultTypes.js.map +0 -1
- package/bin/types/index.d.ts +0 -4
- package/bin/types/index.d.ts.map +0 -1
- package/bin/types/index.js +0 -4
- package/bin/types/index.js.map +0 -1
- package/bin/utils/index.d.ts +0 -2
- package/bin/utils/index.d.ts.map +0 -1
- package/bin/utils/index.js +0 -2
- package/bin/utils/index.js.map +0 -1
- package/bin/utils/type-check.d.ts.map +0 -1
- package/bin/utils/type-check.js.map +0 -1
- package/tsconfig.build.json +0 -6
- /package/bin/{interfaces → cjs/interfaces}/LiveInterfaceExtensions.d.ts +0 -0
- /package/bin/{utils → cjs/utils}/type-check.d.ts +0 -0
- /package/bin/{interfaces → esm/interfaces}/LiveInterfaceExtensions.js +0 -0
- /package/bin/{internal → esm/internal}/errors.js +0 -0
- /package/bin/{types → esm/types}/ActionTypes.js +0 -0
- /package/bin/{types → esm/types}/PropTypes.js +0 -0
- /package/bin/{types → esm/types}/ResultTypes.js +0 -0
- /package/bin/{utils → esm/utils}/type-check.js +0 -0
|
@@ -3,17 +3,18 @@
|
|
|
3
3
|
* Licensed under the Microsoft Live Share SDK License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { ContainerSchema, IFluidContainer } from "fluid-framework";
|
|
7
7
|
import React from "react";
|
|
8
|
-
import { useSharedStateRegistry } from "../shared-hooks";
|
|
8
|
+
import { useSharedStateRegistry } from "../shared-hooks/index.js";
|
|
9
9
|
import {
|
|
10
10
|
ILiveShareClientOptions,
|
|
11
11
|
ILiveShareHost,
|
|
12
12
|
ILiveShareJoinResults,
|
|
13
13
|
ITimestampProvider,
|
|
14
|
+
LiveShareClient,
|
|
14
15
|
} from "@microsoft/live-share";
|
|
15
|
-
import { FluidContext, useFluidObjectsContext } from "./AzureProvider";
|
|
16
|
-
import {
|
|
16
|
+
import { FluidContext, useFluidObjectsContext } from "./AzureProvider.js";
|
|
17
|
+
import { isITeamsJsSdkError } from "../internal/index.js";
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* React Context provider values for `<LiveShareProvider>`.
|
|
@@ -51,7 +52,7 @@ export interface ILiveShareContext {
|
|
|
51
52
|
* @returns Promise with `ILiveShareJoinResults`, which includes the Fluid container
|
|
52
53
|
*/
|
|
53
54
|
join: (
|
|
54
|
-
|
|
55
|
+
fluidContainerSchema?: ContainerSchema,
|
|
55
56
|
onInitializeContainer?: (container: IFluidContainer) => void
|
|
56
57
|
) => Promise<ILiveShareJoinResults>;
|
|
57
58
|
}
|
|
@@ -71,6 +72,57 @@ export const LiveShareContext = React.createContext<ILiveShareContext>(
|
|
|
71
72
|
* See `useFluidObjectsContext` for other information related to the Live Share session, such as the `container`.
|
|
72
73
|
*
|
|
73
74
|
* @returns current state of `LiveShareContext`
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
```jsx
|
|
78
|
+
// LiveShareApp.jsx
|
|
79
|
+
import { LiveShareProvider } from "@microsoft/live-share-react";
|
|
80
|
+
import { LiveShareHost } from "@microsoft/teams-js";
|
|
81
|
+
|
|
82
|
+
const host = LiveShareHost.create();
|
|
83
|
+
|
|
84
|
+
export function LiveShareApp() {
|
|
85
|
+
// Call app.initialize() from teams-js before rendering LiveShareProvider
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<LiveShareProvider
|
|
89
|
+
joinOnLoad={true}
|
|
90
|
+
host={host}
|
|
91
|
+
>
|
|
92
|
+
<LiveShareLoader>
|
|
93
|
+
<LiveCheckbox />
|
|
94
|
+
</LiveShareLoader>
|
|
95
|
+
</LiveShareProvider>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// LiveShareLoader.jsx
|
|
100
|
+
import { useLiveShareContext } from "@microsoft/live-share-react";
|
|
101
|
+
|
|
102
|
+
export function LiveShareLoader({ children }) {
|
|
103
|
+
const { joined, joinError } = useLiveShareContext();
|
|
104
|
+
|
|
105
|
+
if (joinError) return <>{joinError.message}</>;
|
|
106
|
+
if (!joined) return <>Joining Live Share session...</>;
|
|
107
|
+
return <>{children}</>
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// LiveCheckbox.jsx
|
|
111
|
+
import { useLiveState } from "@microsoft/live-share-react";
|
|
112
|
+
|
|
113
|
+
export function LiveCheckbox() {
|
|
114
|
+
const [checked, setChecked] = useLiveState("MY-UNIQUE-ID", false);
|
|
115
|
+
return (
|
|
116
|
+
<input
|
|
117
|
+
type="checkbox"
|
|
118
|
+
checked={checked}
|
|
119
|
+
onChange={() => {
|
|
120
|
+
setChecked(!checked);
|
|
121
|
+
}}
|
|
122
|
+
/>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
```
|
|
74
126
|
*/
|
|
75
127
|
export const useLiveShareContext = (): ILiveShareContext => {
|
|
76
128
|
const context = React.useContext(LiveShareContext);
|
|
@@ -102,9 +154,9 @@ export interface ILiveShareProviderProps {
|
|
|
102
154
|
*/
|
|
103
155
|
host: ILiveShareHost;
|
|
104
156
|
/**
|
|
105
|
-
* The
|
|
157
|
+
* The schema to use when {@link joinOnLoad} is true.
|
|
106
158
|
*/
|
|
107
|
-
|
|
159
|
+
fluidContainerSchema?: ContainerSchema;
|
|
108
160
|
/**
|
|
109
161
|
* Optional. Flag to determine whether to join Fluid container on load.
|
|
110
162
|
*/
|
|
@@ -113,11 +165,62 @@ export interface ILiveShareProviderProps {
|
|
|
113
165
|
|
|
114
166
|
/**
|
|
115
167
|
* React Context provider component for using Live Share data objects & joining a Live Share session using `LiveShareClient`.
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
```jsx
|
|
171
|
+
// LiveShareApp.jsx
|
|
172
|
+
import { LiveShareProvider } from "@microsoft/live-share-react";
|
|
173
|
+
import { LiveShareHost } from "@microsoft/teams-js";
|
|
174
|
+
|
|
175
|
+
const host = LiveShareHost.create();
|
|
176
|
+
|
|
177
|
+
export function LiveShareApp() {
|
|
178
|
+
// Call app.initialize() from teams-js before rendering LiveShareProvider
|
|
179
|
+
|
|
180
|
+
return (
|
|
181
|
+
<LiveShareProvider
|
|
182
|
+
joinOnLoad={true}
|
|
183
|
+
host={host}
|
|
184
|
+
>
|
|
185
|
+
<LiveShareLoader>
|
|
186
|
+
<LiveCheckbox />
|
|
187
|
+
</LiveShareLoader>
|
|
188
|
+
</LiveShareProvider>
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// LiveShareLoader.jsx
|
|
193
|
+
import { useLiveShareContext } from "@microsoft/live-share-react";
|
|
194
|
+
|
|
195
|
+
export function LiveShareLoader({ children }) {
|
|
196
|
+
const { joined, joinError } = useLiveShareContext();
|
|
197
|
+
|
|
198
|
+
if (joinError) return <>{joinError.message}</>;
|
|
199
|
+
if (!joined) return <>Joining Live Share session...</>;
|
|
200
|
+
return <>{children}</>
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// LiveCheckbox.jsx
|
|
204
|
+
import { useLiveState } from "@microsoft/live-share-react";
|
|
205
|
+
|
|
206
|
+
export function LiveCheckbox() {
|
|
207
|
+
const [checked, setChecked] = useLiveState("MY-UNIQUE-ID", false);
|
|
208
|
+
return (
|
|
209
|
+
<input
|
|
210
|
+
type="checkbox"
|
|
211
|
+
checked={checked}
|
|
212
|
+
onChange={() => {
|
|
213
|
+
setChecked(!checked);
|
|
214
|
+
}}
|
|
215
|
+
/>
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
```
|
|
116
219
|
*/
|
|
117
220
|
export const LiveShareProvider: React.FC<ILiveShareProviderProps> = (props) => {
|
|
118
221
|
const startedRef = React.useRef(false);
|
|
119
222
|
const clientRef = React.useRef(
|
|
120
|
-
new
|
|
223
|
+
new LiveShareClient(props.host, props.clientOptions)
|
|
121
224
|
);
|
|
122
225
|
const [results, setResults] = React.useState<
|
|
123
226
|
ILiveShareJoinResults | undefined
|
|
@@ -131,12 +234,12 @@ export const LiveShareProvider: React.FC<ILiveShareProviderProps> = (props) => {
|
|
|
131
234
|
*/
|
|
132
235
|
const join = React.useCallback(
|
|
133
236
|
async (
|
|
134
|
-
|
|
237
|
+
fluidContainerSchema?: ContainerSchema,
|
|
135
238
|
onInitializeContainer?: (container: IFluidContainer) => void
|
|
136
239
|
): Promise<ILiveShareJoinResults> => {
|
|
137
240
|
startedRef.current = true;
|
|
138
241
|
const results = await clientRef.current.join(
|
|
139
|
-
|
|
242
|
+
fluidContainerSchema,
|
|
140
243
|
onInitializeContainer
|
|
141
244
|
);
|
|
142
245
|
setResults(results);
|
|
@@ -154,10 +257,21 @@ export const LiveShareProvider: React.FC<ILiveShareProviderProps> = (props) => {
|
|
|
154
257
|
// We are not doing this here for backwards compatibility. View the README for more information.
|
|
155
258
|
if (results !== undefined || startedRef.current || !props.joinOnLoad)
|
|
156
259
|
return;
|
|
157
|
-
join(props.
|
|
260
|
+
join(props.fluidContainerSchema).catch((error) => {
|
|
158
261
|
console.error(error);
|
|
159
262
|
if (error instanceof Error) {
|
|
160
263
|
setJoinError(error);
|
|
264
|
+
} else if (isITeamsJsSdkError(error)) {
|
|
265
|
+
setJoinError(
|
|
266
|
+
new Error(
|
|
267
|
+
`[${error.errorCode}] ${
|
|
268
|
+
error.message ??
|
|
269
|
+
"An unknown error occurred while joining container."
|
|
270
|
+
}`
|
|
271
|
+
)
|
|
272
|
+
);
|
|
273
|
+
} else if (typeof error == "string") {
|
|
274
|
+
setJoinError(new Error(error));
|
|
161
275
|
} else {
|
|
162
276
|
setJoinError(
|
|
163
277
|
new Error(
|
|
@@ -166,7 +280,7 @@ export const LiveShareProvider: React.FC<ILiveShareProviderProps> = (props) => {
|
|
|
166
280
|
);
|
|
167
281
|
}
|
|
168
282
|
});
|
|
169
|
-
}, [results, props.joinOnLoad, props.
|
|
283
|
+
}, [results, props.joinOnLoad, props.fluidContainerSchema, join]);
|
|
170
284
|
|
|
171
285
|
return (
|
|
172
286
|
<LiveShareContext.Provider
|
package/src/providers/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./AzureProvider";
|
|
2
|
-
export * from "./LiveShareProvider";
|
|
1
|
+
export * from "./AzureProvider.js";
|
|
2
|
+
export * from "./LiveShareProvider.js";
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export * from "./useSharedState";
|
|
2
|
-
export * from "./useSharedMap";
|
|
3
|
-
export * from "./useDynamicDDS";
|
|
4
|
-
export * from "./useSharedStateRegistry";
|
|
1
|
+
export * from "./useSharedState.js";
|
|
2
|
+
export * from "./useSharedMap.js";
|
|
3
|
+
export * from "./useDynamicDDS.js";
|
|
4
|
+
export * from "./useSharedStateRegistry.js";
|
|
5
|
+
export * from "./useSharedTree.js";
|
|
6
|
+
export * from "./useTreeNode.js";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { TreeNode, Tree } from "fluid-framework";
|
|
2
|
+
import { proxiedChildrenKey, rawTNodeKey } from "./tree-node-constants.js";
|
|
3
|
+
|
|
4
|
+
export interface ICustomProxyHandler<TNode extends TreeNode = TreeNode> {
|
|
5
|
+
[rawTNodeKey]: TNode;
|
|
6
|
+
[proxiedChildrenKey]: Record<string, TreeNode>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function isProxy(value: any): value is typeof Proxy {
|
|
10
|
+
return value && value["[[Handler]]"];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function isCustomProxyHandler<TNode extends TreeNode = TreeNode>(
|
|
14
|
+
value: any
|
|
15
|
+
): value is ICustomProxyHandler<TNode> {
|
|
16
|
+
return value?.[rawTNodeKey] !== undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function isTreeNode(value: any): value is TreeNode {
|
|
20
|
+
try {
|
|
21
|
+
Tree.schema(value);
|
|
22
|
+
return true;
|
|
23
|
+
} catch (_) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { proxiedChildrenKey, rawTNodeKey } from "./tree-node-constants.js";
|
|
2
|
+
import {
|
|
3
|
+
ICustomProxyHandler,
|
|
4
|
+
isCustomProxyHandler,
|
|
5
|
+
isTreeNode,
|
|
6
|
+
isProxy,
|
|
7
|
+
} from "./tree-node-types.js";
|
|
8
|
+
import { TreeNode, Tree } from "fluid-framework";
|
|
9
|
+
import { Dispatch, SetStateAction } from "react";
|
|
10
|
+
|
|
11
|
+
// Exported utils
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @internal
|
|
15
|
+
* Build a proxied version of a node and set its value to the treeMap provided
|
|
16
|
+
*
|
|
17
|
+
* @param rawNode the raw proxy node exposed by Fluid
|
|
18
|
+
* @param treeMap a map where Fluid's proxy node is mapped to our proxied node
|
|
19
|
+
* @returns TNode instance
|
|
20
|
+
*/
|
|
21
|
+
export function buildProxy<TNode extends TreeNode = TreeNode>(
|
|
22
|
+
rawNode: TNode,
|
|
23
|
+
treeMap: WeakMap<TreeNode, TreeNode>
|
|
24
|
+
): TNode {
|
|
25
|
+
const previousProxy = treeMap.get(rawNode);
|
|
26
|
+
const previousProxyHandler = previousProxy
|
|
27
|
+
? getCustomProxyHandler(previousProxy)
|
|
28
|
+
: undefined;
|
|
29
|
+
const proxyHandler: ProxyHandler<TreeNode> & ICustomProxyHandler<TNode> = {
|
|
30
|
+
// Add some extra stuff into the handler so we can store the original Fluid TreeNode and access it later
|
|
31
|
+
// Without overriding the rest of the getters in the object.
|
|
32
|
+
[rawTNodeKey]: rawNode,
|
|
33
|
+
[proxiedChildrenKey]: previousProxyHandler?.[proxiedChildrenKey] ?? {},
|
|
34
|
+
get: (target, prop, _) => {
|
|
35
|
+
if (prop === "[[Handler]]") {
|
|
36
|
+
return proxyHandler;
|
|
37
|
+
}
|
|
38
|
+
if (
|
|
39
|
+
typeof prop === "string" &&
|
|
40
|
+
proxyHandler[proxiedChildrenKey][prop]
|
|
41
|
+
) {
|
|
42
|
+
return proxyHandler[proxiedChildrenKey][prop];
|
|
43
|
+
}
|
|
44
|
+
// pass in the rawNode so Fluid doesn't get confused by our proxy object and can find the flex node
|
|
45
|
+
const value = Reflect.get(target, prop, rawNode);
|
|
46
|
+
return typeof value === "function" &&
|
|
47
|
+
typeof prop === "string" &&
|
|
48
|
+
// TODO: need a better way of identifying which types of functions need to be proxied
|
|
49
|
+
// This is because if a developer uses an array prototype function, we need to return proxied
|
|
50
|
+
// objects so React can detect changes to those nodes...
|
|
51
|
+
!["map", "flatMap", "filter", "find", "indexOf"].includes(prop)
|
|
52
|
+
? value.bind(rawNode)
|
|
53
|
+
: value;
|
|
54
|
+
},
|
|
55
|
+
set(target, p, newValue, _) {
|
|
56
|
+
return Reflect.set(target, p, newValue, rawNode);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const proxy = new Proxy(rawNode, proxyHandler);
|
|
60
|
+
// Track the proxy for the rawNode
|
|
61
|
+
treeMap.set(rawNode, proxy);
|
|
62
|
+
// Set raw node getter so we can access it before things like Tree.on
|
|
63
|
+
return proxy as TNode;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @internal
|
|
68
|
+
* Set up listeners for a given TreeNode.
|
|
69
|
+
* Will recursively call this function for all children nodes of each children until there are no more child nodes.
|
|
70
|
+
*
|
|
71
|
+
* @param parentRawNode raw parent node
|
|
72
|
+
* @param rootNodeForListener root node being listened to in useTreeNode
|
|
73
|
+
* @param treeMap a map where Fluid's proxy node is mapped to our proxied node
|
|
74
|
+
* @param unsubscribeListeners list of unsubscribe listeners, where we set the unsubscribe callbacks
|
|
75
|
+
* @param setProxyNode setter to set the root proxy node listened to in useTreeNode
|
|
76
|
+
*/
|
|
77
|
+
export function setUpListenersForNodeChildren<
|
|
78
|
+
TNode extends TreeNode = TreeNode,
|
|
79
|
+
>(
|
|
80
|
+
parentRawNode: TreeNode,
|
|
81
|
+
rootNodeForListener: TreeNode,
|
|
82
|
+
treeMap: WeakMap<TreeNode, TreeNode>,
|
|
83
|
+
unsubscribeListeners: (() => void)[],
|
|
84
|
+
setProxyNode: Dispatch<SetStateAction<TNode>>
|
|
85
|
+
) {
|
|
86
|
+
let entries = Object.entries(parentRawNode);
|
|
87
|
+
for (let i = 0; i < entries.length; i++) {
|
|
88
|
+
const [key, entry] = entries[i];
|
|
89
|
+
if (
|
|
90
|
+
!entry ||
|
|
91
|
+
["string", "boolean", "number", "function"].includes(
|
|
92
|
+
typeof entry
|
|
93
|
+
) ||
|
|
94
|
+
!isTreeNode(entry)
|
|
95
|
+
) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const rawEntry = getRawNode(entry);
|
|
99
|
+
const onNodeChanged = () => {
|
|
100
|
+
onTreeNodeChanged(
|
|
101
|
+
key,
|
|
102
|
+
rawEntry,
|
|
103
|
+
rootNodeForListener,
|
|
104
|
+
treeMap,
|
|
105
|
+
setProxyNode
|
|
106
|
+
);
|
|
107
|
+
};
|
|
108
|
+
const unsubscribe = Tree.on(rawEntry, "nodeChanged", onNodeChanged);
|
|
109
|
+
unsubscribeListeners.push(unsubscribe);
|
|
110
|
+
// Recursively listen to children nodes of this node
|
|
111
|
+
setUpListenersForNodeChildren(
|
|
112
|
+
rawEntry,
|
|
113
|
+
rootNodeForListener,
|
|
114
|
+
treeMap,
|
|
115
|
+
unsubscribeListeners,
|
|
116
|
+
setProxyNode
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @internal
|
|
123
|
+
* Fluid only knows how to work with their proxied version of a TreeNode.
|
|
124
|
+
* We store a reference to that node in our proxied instances so we can easily use it when working with Fluid APIs.
|
|
125
|
+
*
|
|
126
|
+
* @param node get the raw node from the proxy
|
|
127
|
+
* @returns the raw proxied node that Fluid expects
|
|
128
|
+
*/
|
|
129
|
+
export function getRawNode<TNode extends TreeNode | undefined = TreeNode>(
|
|
130
|
+
node: TNode
|
|
131
|
+
): TNode {
|
|
132
|
+
if (isProxy(node)) {
|
|
133
|
+
return getRawNodeFromProxy(node) as TNode;
|
|
134
|
+
}
|
|
135
|
+
return node;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Non public utils
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Callback for when a tree node changed
|
|
142
|
+
*
|
|
143
|
+
* @param key key where the object is stored in the parent
|
|
144
|
+
* @param rawNode the raw node that changed
|
|
145
|
+
* @param rootNodeForListener the root node that is being listened to in useTreeNode
|
|
146
|
+
* @param treeMap a map where Fluid's proxy node is mapped to our proxied node
|
|
147
|
+
* @param setProxyNode setter to set the root proxy node listened to in useTreeNode
|
|
148
|
+
*/
|
|
149
|
+
function onTreeNodeChanged<TNode extends TreeNode = TreeNode>(
|
|
150
|
+
key: string,
|
|
151
|
+
rawNode: TreeNode,
|
|
152
|
+
rootNodeForListener: TreeNode,
|
|
153
|
+
treeMap: WeakMap<TreeNode, TreeNode>,
|
|
154
|
+
setProxyNode: Dispatch<SetStateAction<TNode>>
|
|
155
|
+
) {
|
|
156
|
+
const proxyNode = buildProxy(rawNode, treeMap);
|
|
157
|
+
const parent = Tree.parent(rawNode);
|
|
158
|
+
if (!parent) {
|
|
159
|
+
throw new Error(
|
|
160
|
+
"useTreeNode onTreeNodeChanged: no parent found for rawParentNode"
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
proxyParentForNode(
|
|
165
|
+
key,
|
|
166
|
+
parent,
|
|
167
|
+
proxyNode,
|
|
168
|
+
rootNodeForListener,
|
|
169
|
+
treeMap,
|
|
170
|
+
setProxyNode
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Proxies the parent and sets reference to the child node that changed.
|
|
176
|
+
*
|
|
177
|
+
* @param key key where the object is referenced in its parent node
|
|
178
|
+
* @param rawParentNode raw parent tree node
|
|
179
|
+
* @param proxyNode proxied instance of the node that changed
|
|
180
|
+
* @param rootNodeForListener root node listened to in useTreeNode
|
|
181
|
+
* @param treeMap a map where Fluid's proxy node is mapped to our proxied node
|
|
182
|
+
* @param setProxyNode setter to set the root proxy node listened to in useTreeNode
|
|
183
|
+
*/
|
|
184
|
+
function proxyParentForNode<TNode extends TreeNode = TreeNode>(
|
|
185
|
+
key: string,
|
|
186
|
+
rawParentNode: TreeNode,
|
|
187
|
+
proxyNode: TreeNode,
|
|
188
|
+
rootNodeForListener: TreeNode,
|
|
189
|
+
treeMap: WeakMap<TreeNode, TreeNode>,
|
|
190
|
+
setProxyNode: Dispatch<SetStateAction<TNode>>
|
|
191
|
+
) {
|
|
192
|
+
const parentProxy = buildProxy(rawParentNode, treeMap);
|
|
193
|
+
let parentProxyHandler = getCustomProxyHandler(parentProxy);
|
|
194
|
+
if (!parentProxyHandler) {
|
|
195
|
+
throw new Error(
|
|
196
|
+
"useTreeNode proxyParentForNode: unexpected error, should always find valid proxy handler"
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
parentProxyHandler[proxiedChildrenKey][key] = proxyNode;
|
|
200
|
+
if (rawParentNode === rootNodeForListener) {
|
|
201
|
+
setProxyNode(parentProxy as TNode);
|
|
202
|
+
} else {
|
|
203
|
+
const parentOfParent = Tree.parent(rawParentNode);
|
|
204
|
+
if (!parentOfParent) {
|
|
205
|
+
throw new Error(
|
|
206
|
+
"useTreeNode proxyParentForNode: no parent found for rawParentNode"
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
const parentKey = findKeyOfNode(rawParentNode, parentOfParent);
|
|
210
|
+
proxyParentForNode(
|
|
211
|
+
parentKey,
|
|
212
|
+
parentOfParent,
|
|
213
|
+
parentProxy,
|
|
214
|
+
rootNodeForListener,
|
|
215
|
+
treeMap,
|
|
216
|
+
setProxyNode
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Returns key where parent[key] == nodeToCheck
|
|
223
|
+
*
|
|
224
|
+
* @param nodeToCheck tree node to check
|
|
225
|
+
* @param parent parent node where nodeToCheck is a child of
|
|
226
|
+
* @returns the key for node
|
|
227
|
+
*/
|
|
228
|
+
function findKeyOfNode(nodeToCheck: TreeNode, parent: TreeNode): string {
|
|
229
|
+
let entries = Object.entries(parent);
|
|
230
|
+
for (let i = 0; i < entries.length; i++) {
|
|
231
|
+
const [key, entry] = entries[i];
|
|
232
|
+
if (
|
|
233
|
+
!entry ||
|
|
234
|
+
["string", "boolean", "number", "function"].includes(
|
|
235
|
+
typeof entry
|
|
236
|
+
) ||
|
|
237
|
+
!isTreeNode(entry)
|
|
238
|
+
) {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (entry === nodeToCheck) return key;
|
|
242
|
+
}
|
|
243
|
+
throw new Error("Did not find node as a child of parent");
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Type utils
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Gets the proxy handler for a given TreeNode, assuming `isCustomProxyHandler` returns true.
|
|
250
|
+
* @param proxy the proxied TreeNode to get the handler for.
|
|
251
|
+
* @returns the handler if valid, otherwise undefined
|
|
252
|
+
*/
|
|
253
|
+
function getCustomProxyHandler(proxy: TreeNode) {
|
|
254
|
+
const handler = (proxy as any)["[[Handler]]"];
|
|
255
|
+
if (isCustomProxyHandler(handler)) {
|
|
256
|
+
return handler;
|
|
257
|
+
}
|
|
258
|
+
return undefined;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Gets the raw node for a given proxied tree node
|
|
263
|
+
*
|
|
264
|
+
* @param proxy the proxied TreeNode to get the raw node for
|
|
265
|
+
* @returns the raw node if valid, otherwise undefined
|
|
266
|
+
*/
|
|
267
|
+
function getRawNodeFromProxy(proxy: TreeNode) {
|
|
268
|
+
return getCustomProxyHandler(proxy)?.[rawTNodeKey];
|
|
269
|
+
}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { FluidObject, IFluidLoadable } from "@fluidframework/core-interfaces";
|
|
8
|
-
import { useFluidObjectsContext } from "../providers";
|
|
9
|
-
import {
|
|
8
|
+
import { useFluidObjectsContext } from "../providers/AzureProvider.js";
|
|
9
|
+
import { SharedObjectKind } from "fluid-framework";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Hook to gets or creates a DDS that corresponds to a given uniqueKey string.
|
|
@@ -14,17 +14,17 @@ import { LoadableObjectClass } from "fluid-framework";
|
|
|
14
14
|
* @remarks
|
|
15
15
|
* This hook can only be used in a child component of `<LiveShareProvider>` or `<AzureProvider>`.
|
|
16
16
|
*
|
|
17
|
-
* @template T Type of Fluid
|
|
17
|
+
* @template T Type of Fluid SharedObjectKind type to load. Must conform to IFluidLoadable interface.
|
|
18
18
|
* @param uniqueKey uniqueKey value for the data object
|
|
19
|
-
* @param
|
|
19
|
+
* @param objectKind Fluid SharedObjectKind<T> to create/load.
|
|
20
20
|
* @param onFirstInitialize Optional. Callback function for when the DDS is first loaded
|
|
21
21
|
* @returns the DDS object, which is of type T when loaded and undefined while loading
|
|
22
22
|
*/
|
|
23
23
|
export function useDynamicDDS<
|
|
24
|
-
T extends IFluidLoadable = FluidObject<any> & IFluidLoadable
|
|
24
|
+
T extends IFluidLoadable = FluidObject<any> & IFluidLoadable,
|
|
25
25
|
>(
|
|
26
26
|
uniqueKey: string,
|
|
27
|
-
|
|
27
|
+
objectClass: SharedObjectKind<T>,
|
|
28
28
|
onFirstInitialize?: (dds: T) => void
|
|
29
29
|
): {
|
|
30
30
|
dds: T | undefined;
|
|
@@ -37,24 +37,38 @@ export function useDynamicDDS<
|
|
|
37
37
|
*/
|
|
38
38
|
const { container, clientRef } = useFluidObjectsContext();
|
|
39
39
|
|
|
40
|
+
const mountedRef = React.useRef(false);
|
|
41
|
+
React.useEffect(() => {
|
|
42
|
+
mountedRef.current = true;
|
|
43
|
+
return () => {
|
|
44
|
+
mountedRef.current = false;
|
|
45
|
+
};
|
|
46
|
+
}, []);
|
|
47
|
+
|
|
48
|
+
const getDDSPromisesRef = React.useRef<Map<string, Promise<T>>>(new Map());
|
|
49
|
+
|
|
40
50
|
/**
|
|
41
51
|
* Once container is available, this effect will register the setter method so that the DDS loaded
|
|
42
52
|
* from `dynamicObjects` that matches `uniqueKey` can be passed back to this hook. If one does not yet exist,
|
|
43
53
|
* a new DDS is automatically created. If multiple users try to create a DDS at the same time when this component first
|
|
44
|
-
* mounts, `live-share
|
|
54
|
+
* mounts, `live-share` ensures it will ultimately self correct using last-writer wins.
|
|
45
55
|
*/
|
|
46
56
|
React.useEffect(() => {
|
|
47
57
|
if (container === undefined) return;
|
|
48
|
-
let mounted = true;
|
|
49
58
|
// Callback method to set the `initialData` into the map when the DDS is first created.
|
|
50
59
|
const onGetDDS = async () => {
|
|
51
60
|
try {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
let getPromise = getDDSPromisesRef.current.get(uniqueKey);
|
|
62
|
+
if (!getPromise) {
|
|
63
|
+
getPromise = clientRef.current.getDDS<T>(
|
|
64
|
+
uniqueKey,
|
|
65
|
+
objectClass,
|
|
66
|
+
onFirstInitialize
|
|
67
|
+
);
|
|
68
|
+
getDDSPromisesRef.current.set(uniqueKey, getPromise);
|
|
69
|
+
}
|
|
70
|
+
const dds = await getPromise;
|
|
71
|
+
if (mountedRef.current) {
|
|
58
72
|
setDDS(dds);
|
|
59
73
|
}
|
|
60
74
|
} catch (error: unknown) {
|
|
@@ -70,9 +84,6 @@ export function useDynamicDDS<
|
|
|
70
84
|
}
|
|
71
85
|
};
|
|
72
86
|
onGetDDS();
|
|
73
|
-
return () => {
|
|
74
|
-
mounted = false;
|
|
75
|
-
};
|
|
76
87
|
}, [container, uniqueKey, onFirstInitialize]);
|
|
77
88
|
|
|
78
89
|
return {
|