@microsoft/live-share-react 2.0.0-internal.1 → 2.0.0-internal.11
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 +169 -164
- 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 +26 -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/cjs/internal/errors.d.ts +41 -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/cjs/internal/type-guards.d.ts +11 -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/cjs/live-hooks/useLiveEvent.d.ts +59 -0
- 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/cjs/live-hooks/useLiveState.d.ts +66 -0
- 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/cjs/live-hooks/useLiveTimer.d.ts +80 -0
- 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/cjs/providers/AzureProvider.d.ts +113 -0
- 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/cjs/providers/LiveShareProvider.d.ts +193 -0
- 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/cjs/shared-hooks/useDynamicDDS.d.ts +23 -0
- 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/cjs/shared-hooks/useSharedMap.d.ts +25 -0
- 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/cjs/shared-hooks/useSharedState.d.ts +22 -0
- 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/cjs/shared-hooks/useSharedStateRegistry.d.ts +37 -0
- 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/cjs/types/ActionTypes.d.ts +112 -0
- 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/cjs/types/ResultTypes.d.ts +334 -0
- 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 +15 -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 +6 -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 +42 -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/esm/live-hooks/useLiveEvent.js +144 -0
- 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/esm/live-hooks/useLiveFollowMode.js +354 -0
- 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/esm/live-hooks/useLivePresence.js +164 -0
- 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/esm/live-hooks/useLiveState.js +128 -0
- 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/esm/live-hooks/useLiveTimer.js +227 -0
- 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/esm/live-hooks/useMediaSynchronizer.js +295 -0
- 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/esm/providers/AzureProvider.js +119 -0
- 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/esm/shared-hooks/useDynamicDDS.js +81 -0
- 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/esm/shared-hooks/useSharedMap.js +128 -0
- 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/esm/shared-hooks/useSharedState.js +74 -0
- 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/esm/shared-hooks/useSharedStateRegistry.js +113 -0
- 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 +6 -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 +6 -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 +6 -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 +54 -0
- package/bin/esm/utils/type-check.js.map +1 -0
- package/bin/live-hooks/useLiveCanvas.js +1 -1
- package/bin/live-hooks/useLiveCanvas.js.map +1 -1
- package/bin/live-hooks/useLiveState.d.ts.map +1 -1
- package/bin/live-hooks/useLiveState.js +6 -2
- package/bin/live-hooks/useLiveState.js.map +1 -1
- package/bin/live-hooks/useMediaSynchronizer.js +1 -1
- package/bin/live-hooks/useMediaSynchronizer.js.map +1 -1
- package/bin/providers/AzureProvider.js +2 -2
- package/bin/providers/AzureProvider.js.map +1 -1
- package/bin/providers/LiveShareProvider.js +3 -3
- package/bin/providers/LiveShareProvider.js.map +1 -1
- package/package.json +61 -47
- package/src/index.ts +6 -6
- package/src/interfaces/index.ts +1 -1
- package/src/internal/index.ts +2 -2
- package/src/internal/type-guards.ts +1 -1
- 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 +71 -6
- package/src/providers/AzureProvider.tsx +21 -21
- package/src/providers/LiveShareProvider.tsx +115 -13
- 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/tsconfig.build.json +0 -6
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.useSharedMap = useSharedMap;
|
|
11
|
+
const react_1 = __importDefault(require("react"));
|
|
12
|
+
const index_js_1 = require("../utils/index.js");
|
|
13
|
+
const useDynamicDDS_js_1 = require("./useDynamicDDS.js");
|
|
14
|
+
const legacy_1 = require("fluid-framework/legacy");
|
|
15
|
+
const errors_js_1 = require("../internal/errors.js");
|
|
16
|
+
const AzureProvider_js_1 = require("../providers/AzureProvider.js");
|
|
17
|
+
/**
|
|
18
|
+
* @deprecated use {@link useSharedTree} instead.
|
|
19
|
+
*
|
|
20
|
+
* React hook for using a Fluid `SharedMap`.
|
|
21
|
+
*
|
|
22
|
+
* @remarks
|
|
23
|
+
* The primary benefit of using the `useSharedMap` hook rather than the Fluid `SharedMap`
|
|
24
|
+
* directly is that it integrates nicely with React state and automates repetitive tasks.
|
|
25
|
+
* If you want to use `SharedMap` this hook creates directly, you can do that as well.
|
|
26
|
+
* This hook can only be used in a child component of `<LiveShareProvider>` or `<AzureProvider>`.
|
|
27
|
+
*
|
|
28
|
+
* @template TData Optional typing for objects stored in the SharedMap. Default is `any` type.
|
|
29
|
+
* @param uniqueKey the unique key for the `SharedMap`. If one does not yet exist, a new `SharedMap`
|
|
30
|
+
* will be created, otherwise it will use the existing one.
|
|
31
|
+
* @param initialData a JS Map, entries array, or JSON object to insert into the `SharedMap` when creating
|
|
32
|
+
* the DDS for the first time.
|
|
33
|
+
* @returns the Fluid `sharedMap`.
|
|
34
|
+
*/
|
|
35
|
+
function useSharedMap(uniqueKey, initialData) {
|
|
36
|
+
const onFirstInitialize = react_1.default.useCallback((newDDS) => {
|
|
37
|
+
/**
|
|
38
|
+
* Callback method to set the `initialData` into the map when the `SharedMap` is first created.
|
|
39
|
+
* Only should be used as a prop to useDynamicDDS.
|
|
40
|
+
*/
|
|
41
|
+
getInitialData(initialData).forEach((value, key) => {
|
|
42
|
+
newDDS.set(key, value);
|
|
43
|
+
});
|
|
44
|
+
}, [initialData]);
|
|
45
|
+
/**
|
|
46
|
+
* User facing: dynamically load the SharedMap DDS for the given unique key.
|
|
47
|
+
*/
|
|
48
|
+
const { dds: sharedMap } = (0, useDynamicDDS_js_1.useDynamicDDS)(uniqueKey, legacy_1.SharedMap, onFirstInitialize);
|
|
49
|
+
const { container } = (0, AzureProvider_js_1.useFluidObjectsContext)();
|
|
50
|
+
/**
|
|
51
|
+
* User facing: get a value from the Fluid `SharedMap`.
|
|
52
|
+
*/
|
|
53
|
+
const getEntry = react_1.default.useCallback((key) => {
|
|
54
|
+
if (!container) {
|
|
55
|
+
throw new errors_js_1.ActionContainerNotJoinedError("sharedMap", "getEntry");
|
|
56
|
+
}
|
|
57
|
+
if (sharedMap === undefined) {
|
|
58
|
+
throw new errors_js_1.ActionLiveDataObjectUndefinedError("sharedMap", "getEntry");
|
|
59
|
+
}
|
|
60
|
+
return sharedMap.get(key);
|
|
61
|
+
}, [container, sharedMap]);
|
|
62
|
+
/**
|
|
63
|
+
* User facing: set a value to the Fluid `SharedMap`.
|
|
64
|
+
*/
|
|
65
|
+
const setEntry = react_1.default.useCallback((key, value) => {
|
|
66
|
+
if (!container) {
|
|
67
|
+
throw new errors_js_1.ActionContainerNotJoinedError("sharedMap", "setEntry");
|
|
68
|
+
}
|
|
69
|
+
if (sharedMap === undefined) {
|
|
70
|
+
throw new errors_js_1.ActionLiveDataObjectUndefinedError("sharedMap", "setEntry");
|
|
71
|
+
}
|
|
72
|
+
sharedMap.set(key, value);
|
|
73
|
+
}, [container, sharedMap]);
|
|
74
|
+
/**
|
|
75
|
+
* User facing: delete a value from the Fluid `SharedMap`.
|
|
76
|
+
*/
|
|
77
|
+
const deleteEntry = react_1.default.useCallback((key) => {
|
|
78
|
+
if (!container) {
|
|
79
|
+
throw new errors_js_1.ActionContainerNotJoinedError("sharedMap", "deleteEntry");
|
|
80
|
+
}
|
|
81
|
+
if (sharedMap === undefined) {
|
|
82
|
+
throw new errors_js_1.ActionLiveDataObjectUndefinedError("sharedMap", "deleteEntry");
|
|
83
|
+
}
|
|
84
|
+
sharedMap.delete(key);
|
|
85
|
+
}, [container, sharedMap]);
|
|
86
|
+
const [sharedMapProxy, setSharedMapProxy] = react_1.default.useState();
|
|
87
|
+
// Setup change listeners, initial values, etc.
|
|
88
|
+
react_1.default.useEffect(() => {
|
|
89
|
+
if (!sharedMap)
|
|
90
|
+
return;
|
|
91
|
+
setSharedMapProxy(sharedMap);
|
|
92
|
+
class SharedMapProxyHandler {
|
|
93
|
+
}
|
|
94
|
+
// Register valueChanged listener for `SharedMap`.
|
|
95
|
+
const onValueChanged = () => {
|
|
96
|
+
setSharedMapProxy(new Proxy(sharedMap, new SharedMapProxyHandler()));
|
|
97
|
+
};
|
|
98
|
+
sharedMap.on("valueChanged", onValueChanged);
|
|
99
|
+
// Get initial values from `SharedMap`.
|
|
100
|
+
onValueChanged();
|
|
101
|
+
return () => {
|
|
102
|
+
// Cleanup on component unmount.
|
|
103
|
+
sharedMap === null || sharedMap === void 0 ? void 0 : sharedMap.off("valueChanged", onValueChanged);
|
|
104
|
+
};
|
|
105
|
+
}, [sharedMap]);
|
|
106
|
+
return {
|
|
107
|
+
sharedMap: sharedMapProxy,
|
|
108
|
+
getEntry,
|
|
109
|
+
setEntry,
|
|
110
|
+
deleteEntry,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Helper method for converting different initial data props into a Map<string, TData> to insert into the Fluid SharedMap
|
|
115
|
+
* @template TData Optional typing for objects stored in the SharedMap. Default is `object` type.
|
|
116
|
+
* @param initialData a JS Map, entries array, or JSON object.
|
|
117
|
+
* @returns A Map<string, TData> with the entries provided.
|
|
118
|
+
*/
|
|
119
|
+
function getInitialData(initialData) {
|
|
120
|
+
if ((0, index_js_1.isMap)(initialData)) {
|
|
121
|
+
return initialData;
|
|
122
|
+
}
|
|
123
|
+
else if ((0, index_js_1.isEntries)(initialData)) {
|
|
124
|
+
return new Map(initialData);
|
|
125
|
+
}
|
|
126
|
+
else if ((0, index_js_1.isJSON)(initialData)) {
|
|
127
|
+
const values = Object.keys(initialData).map((key) => {
|
|
128
|
+
return [key, initialData[key]];
|
|
129
|
+
});
|
|
130
|
+
return new Map(values);
|
|
131
|
+
}
|
|
132
|
+
return new Map();
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=useSharedMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedMap.js","sourceRoot":"","sources":["../../../src/shared-hooks/useSharedMap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
+
*/
|
|
5
|
+
import { DisposeSharedStateAction, SetSharedStateAction } from "../types/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* Inspired by React's `useState` hook, `useSharedState` makes it easy to synchronize state in your app.
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* Values set through this state is automatically attached to a `SharedMap` that the `AzureProvider`
|
|
11
|
+
* creates. If you are synchronizing complex data structures that multiple users will be setting simultaneously,
|
|
12
|
+
* consider using an optimized hook for your data structure (e.g., `useSharedMap`, `useSharedString`, etc.).
|
|
13
|
+
* This hook can only be used in a child component of `<LiveShareProvider>` or `<AzureProvider>`.
|
|
14
|
+
*
|
|
15
|
+
* @template S Typing for objects stored associated with the `uniqueKey`.
|
|
16
|
+
* @param uniqueKey the unique key for a `SharedMap`. If you use the same key for multiple components, those components will reference the same state.
|
|
17
|
+
* @param initialState a default state for the `SharedMap`.
|
|
18
|
+
*
|
|
19
|
+
* @returns a stateful value, the function to update it, and an optional dispose method to delete it from the `SharedMap`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useSharedState<S = any>(uniqueKey: string, initialState: S): [S, SetSharedStateAction<S>, DisposeSharedStateAction];
|
|
22
|
+
//# sourceMappingURL=useSharedState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedState.d.ts","sourceRoot":"","sources":["../../../src/shared-hooks/useSharedState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACH,wBAAwB,EACxB,oBAAoB,EACvB,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,CAAC,GAAG,GAAG,EAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,CAAC,GAChB,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAkExD"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.useSharedState = useSharedState;
|
|
11
|
+
const react_1 = __importDefault(require("react"));
|
|
12
|
+
const index_js_1 = require("../providers/index.js");
|
|
13
|
+
const uuid_1 = require("uuid");
|
|
14
|
+
const index_js_2 = require("../internal/index.js");
|
|
15
|
+
/**
|
|
16
|
+
* Inspired by React's `useState` hook, `useSharedState` makes it easy to synchronize state in your app.
|
|
17
|
+
*
|
|
18
|
+
* @remarks
|
|
19
|
+
* Values set through this state is automatically attached to a `SharedMap` that the `AzureProvider`
|
|
20
|
+
* creates. If you are synchronizing complex data structures that multiple users will be setting simultaneously,
|
|
21
|
+
* consider using an optimized hook for your data structure (e.g., `useSharedMap`, `useSharedString`, etc.).
|
|
22
|
+
* This hook can only be used in a child component of `<LiveShareProvider>` or `<AzureProvider>`.
|
|
23
|
+
*
|
|
24
|
+
* @template S Typing for objects stored associated with the `uniqueKey`.
|
|
25
|
+
* @param uniqueKey the unique key for a `SharedMap`. If you use the same key for multiple components, those components will reference the same state.
|
|
26
|
+
* @param initialState a default state for the `SharedMap`.
|
|
27
|
+
*
|
|
28
|
+
* @returns a stateful value, the function to update it, and an optional dispose method to delete it from the `SharedMap`.
|
|
29
|
+
*/
|
|
30
|
+
function useSharedState(uniqueKey, initialState) {
|
|
31
|
+
/**
|
|
32
|
+
* User facing: stateful value and non-user facing setter.
|
|
33
|
+
*/
|
|
34
|
+
const [localState, setLocalState] = react_1.default.useState(initialState);
|
|
35
|
+
/**
|
|
36
|
+
* Unique ID reference for the component.
|
|
37
|
+
*/
|
|
38
|
+
const componentIdRef = react_1.default.useRef((0, uuid_1.v4)());
|
|
39
|
+
/**
|
|
40
|
+
* Register set state callbacks from AzureProvider and update/delete callbacks for initial object's `stateMap`.
|
|
41
|
+
*/
|
|
42
|
+
const { registerSharedSetStateAction, unregisterSharedSetStateAction, updateSharedState, deleteSharedState, } = (0, index_js_1.useFluidObjectsContext)();
|
|
43
|
+
/**
|
|
44
|
+
* User facing: callback to change the shared state.
|
|
45
|
+
*/
|
|
46
|
+
const setSharedState = react_1.default.useCallback((state) => {
|
|
47
|
+
setLocalState((prevState) => {
|
|
48
|
+
const valueToSet = (0, index_js_2.isPrevStateCallback)(state)
|
|
49
|
+
? state(prevState)
|
|
50
|
+
: state;
|
|
51
|
+
updateSharedState(uniqueKey, valueToSet);
|
|
52
|
+
return valueToSet;
|
|
53
|
+
});
|
|
54
|
+
}, [uniqueKey, setLocalState, updateSharedState]);
|
|
55
|
+
/**
|
|
56
|
+
* User facing: callback to dispose the shared state from the `stateMap`.
|
|
57
|
+
*/
|
|
58
|
+
const disposeSharedState = react_1.default.useCallback(() => {
|
|
59
|
+
deleteSharedState(uniqueKey);
|
|
60
|
+
}, [uniqueKey, deleteSharedState]);
|
|
61
|
+
/**
|
|
62
|
+
* Once container is available, this effect will register the setter method so that the `S` value
|
|
63
|
+
* from `stateMap` that matches `uniqueKey` can be passed back to this hook whenever changed.
|
|
64
|
+
*
|
|
65
|
+
* @see registerSharedSetStateAction to see how new values from `stateMap` are passed to this hook.
|
|
66
|
+
* @see unregisterSharedSetStateAction to see how this component stops listening to changes in the `stateMap`.
|
|
67
|
+
*/
|
|
68
|
+
react_1.default.useEffect(() => {
|
|
69
|
+
registerSharedSetStateAction(uniqueKey, componentIdRef.current, setLocalState);
|
|
70
|
+
return () => {
|
|
71
|
+
unregisterSharedSetStateAction(uniqueKey, componentIdRef.current);
|
|
72
|
+
};
|
|
73
|
+
}, [
|
|
74
|
+
uniqueKey,
|
|
75
|
+
registerSharedSetStateAction,
|
|
76
|
+
unregisterSharedSetStateAction,
|
|
77
|
+
]);
|
|
78
|
+
return [localState, setSharedState, disposeSharedState];
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=useSharedState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedState.js","sourceRoot":"","sources":["../../../src/shared-hooks/useSharedState.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AA0BH,wCAqEC;AA7FD,kDAA0B;AAC1B,oDAA+D;AAK/D,+BAAkC;AAClC,mDAA2D;AAE3D;;;;;;;;;;;;;;GAcG;AACH,SAAgB,cAAc,CAC1B,SAAiB,EACjB,YAAe;IAEf;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,eAAK,CAAC,QAAQ,CAAI,YAAY,CAAC,CAAC;IACpE;;OAEG;IACH,MAAM,cAAc,GAAG,eAAK,CAAC,MAAM,CAAC,IAAA,SAAI,GAAE,CAAC,CAAC;IAC5C;;OAEG;IACH,MAAM,EACF,4BAA4B,EAC5B,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,GACpB,GAAG,IAAA,iCAAsB,GAAE,CAAC;IAE7B;;OAEG;IACH,MAAM,cAAc,GAA4B,eAAK,CAAC,WAAW,CAC7D,CAAC,KAAgC,EAAE,EAAE;QACjC,aAAa,CAAC,CAAC,SAAS,EAAE,EAAE;YACxB,MAAM,UAAU,GAAG,IAAA,8BAAmB,EAAI,KAAK,CAAC;gBAC5C,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAClB,CAAC,CAAC,KAAK,CAAC;YACZ,iBAAiB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACzC,OAAO,UAAU,CAAC;QACtB,CAAC,CAAC,CAAC;IACP,CAAC,EACD,CAAC,SAAS,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAChD,CAAC;IAEF;;OAEG;IACH,MAAM,kBAAkB,GACpB,eAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACnB,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEvC;;;;;;OAMG;IACH,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,4BAA4B,CACxB,SAAS,EACT,cAAc,CAAC,OAAO,EACtB,aAAa,CAChB,CAAC;QACF,OAAO,GAAG,EAAE;YACR,8BAA8B,CAAC,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC,CAAC;IACN,CAAC,EAAE;QACC,SAAS;QACT,4BAA4B;QAC5B,8BAA8B;KACjC,CAAC,CAAC;IAEH,OAAO,CAAC,UAAU,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
+
*/
|
|
5
|
+
import { DeleteSharedStateAction, IAzureContainerResults, RegisterSharedSetStateAction, UnregisterSharedSetStateAction, UpdateSharedStateAction } from "../types/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* Response for the {@link useSharedStateRegistry} hook.
|
|
8
|
+
*/
|
|
9
|
+
export interface ISharedStateRegistryResponse {
|
|
10
|
+
/**
|
|
11
|
+
* Register a set state action callback
|
|
12
|
+
*/
|
|
13
|
+
registerSharedSetStateAction: RegisterSharedSetStateAction;
|
|
14
|
+
/**
|
|
15
|
+
* Unregister a set state action callback
|
|
16
|
+
*/
|
|
17
|
+
unregisterSharedSetStateAction: UnregisterSharedSetStateAction;
|
|
18
|
+
/**
|
|
19
|
+
* Setter callback to update the shared state
|
|
20
|
+
*/
|
|
21
|
+
updateSharedState: UpdateSharedStateAction;
|
|
22
|
+
/**
|
|
23
|
+
* Delete a shared state value
|
|
24
|
+
*/
|
|
25
|
+
deleteSharedState: DeleteSharedStateAction;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Hook used internally to keep track of the SharedSetStateActionMap for each unique key. It sets state values for provided keys and updates components listening to the values.
|
|
29
|
+
*
|
|
30
|
+
* @remarks
|
|
31
|
+
* Use this if you are building a custom `LiveShareProvider` or `AzureProvider` implementation in your app.
|
|
32
|
+
*
|
|
33
|
+
* @param results IAzureContainerResults response or undefined
|
|
34
|
+
* @returns ISharedStateRegistryResponse object
|
|
35
|
+
*/
|
|
36
|
+
export declare const useSharedStateRegistry: (results: IAzureContainerResults | undefined) => ISharedStateRegistryResponse;
|
|
37
|
+
//# sourceMappingURL=useSharedStateRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedStateRegistry.d.ts","sourceRoot":"","sources":["../../../src/shared-hooks/useSharedStateRegistry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EACH,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,EAE5B,8BAA8B,EAC9B,uBAAuB,EAC1B,MAAM,mBAAmB,CAAC;AAQ3B;;GAEG;AACH,MAAM,WAAW,4BAA4B;IACzC;;OAEG;IACH,4BAA4B,EAAE,4BAA4B,CAAC;IAC3D;;OAEG;IACH,8BAA8B,EAAE,8BAA8B,CAAC;IAC/D;;OAEG;IACH,iBAAiB,EAAE,uBAAuB,CAAC;IAC3C;;OAEG;IACH,iBAAiB,EAAE,uBAAuB,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,YACtB,sBAAsB,GAAG,SAAS,KAC5C,4BAgHF,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.useSharedStateRegistry = void 0;
|
|
11
|
+
const react_1 = __importDefault(require("react"));
|
|
12
|
+
const internal_1 = require("@microsoft/live-share/internal");
|
|
13
|
+
/**
|
|
14
|
+
* Hook used internally to keep track of the SharedSetStateActionMap for each unique key. It sets state values for provided keys and updates components listening to the values.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* Use this if you are building a custom `LiveShareProvider` or `AzureProvider` implementation in your app.
|
|
18
|
+
*
|
|
19
|
+
* @param results IAzureContainerResults response or undefined
|
|
20
|
+
* @returns ISharedStateRegistryResponse object
|
|
21
|
+
*/
|
|
22
|
+
const useSharedStateRegistry = (results) => {
|
|
23
|
+
const registeredSharedSetStateActionMapRef = react_1.default.useRef(new Map());
|
|
24
|
+
const stateMap = useStateMap(results === null || results === void 0 ? void 0 : results.container);
|
|
25
|
+
/**
|
|
26
|
+
* @see ISharedStateRegistryResponse.registerSharedSetStateAction
|
|
27
|
+
*/
|
|
28
|
+
const registerSharedSetStateAction = react_1.default.useCallback((uniqueKey, componentId, setLocalStateAction) => {
|
|
29
|
+
let actionsMap = registeredSharedSetStateActionMapRef.current.get(uniqueKey);
|
|
30
|
+
if (actionsMap) {
|
|
31
|
+
if (!actionsMap.has(componentId)) {
|
|
32
|
+
actionsMap.set(componentId, setLocalStateAction);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
actionsMap = new Map();
|
|
37
|
+
actionsMap.set(componentId, setLocalStateAction);
|
|
38
|
+
registeredSharedSetStateActionMapRef.current.set(uniqueKey, actionsMap);
|
|
39
|
+
}
|
|
40
|
+
// Set initial values, if known
|
|
41
|
+
const initialValue = stateMap === null || stateMap === void 0 ? void 0 : stateMap.get(uniqueKey);
|
|
42
|
+
if (initialValue) {
|
|
43
|
+
setLocalStateAction(initialValue);
|
|
44
|
+
}
|
|
45
|
+
}, [stateMap]);
|
|
46
|
+
/**
|
|
47
|
+
* @see ISharedStateRegistryResponse.unregisterSharedSetStateAction
|
|
48
|
+
*/
|
|
49
|
+
const unregisterSharedSetStateAction = react_1.default.useCallback((uniqueKey, componentId) => {
|
|
50
|
+
let actionsMap = registeredSharedSetStateActionMapRef.current.get(uniqueKey);
|
|
51
|
+
if (actionsMap === null || actionsMap === void 0 ? void 0 : actionsMap.has(componentId)) {
|
|
52
|
+
actionsMap.delete(componentId);
|
|
53
|
+
}
|
|
54
|
+
}, []);
|
|
55
|
+
/**
|
|
56
|
+
* @see ISharedStateRegistryResponse.updateSharedState
|
|
57
|
+
*/
|
|
58
|
+
const updateSharedState = react_1.default.useCallback((uniqueKey, value) => {
|
|
59
|
+
if (!stateMap)
|
|
60
|
+
return;
|
|
61
|
+
stateMap === null || stateMap === void 0 ? void 0 : stateMap.set(uniqueKey, value);
|
|
62
|
+
}, [stateMap]);
|
|
63
|
+
/**
|
|
64
|
+
* @see ISharedStateRegistryResponse.deleteSharedState
|
|
65
|
+
*/
|
|
66
|
+
const deleteSharedState = react_1.default.useCallback((uniqueKey) => {
|
|
67
|
+
if (!stateMap)
|
|
68
|
+
return;
|
|
69
|
+
let actionsMap = registeredSharedSetStateActionMapRef.current.get(uniqueKey);
|
|
70
|
+
actionsMap === null || actionsMap === void 0 ? void 0 : actionsMap.clear();
|
|
71
|
+
stateMap.delete(uniqueKey);
|
|
72
|
+
}, [stateMap]);
|
|
73
|
+
react_1.default.useEffect(() => {
|
|
74
|
+
if (!stateMap)
|
|
75
|
+
return;
|
|
76
|
+
const valueChangedListener = (changed) => {
|
|
77
|
+
if (registeredSharedSetStateActionMapRef.current.has(changed.key)) {
|
|
78
|
+
const value = stateMap === null || stateMap === void 0 ? void 0 : stateMap.get(changed.key);
|
|
79
|
+
const actionMap = registeredSharedSetStateActionMapRef.current.get(changed.key);
|
|
80
|
+
actionMap === null || actionMap === void 0 ? void 0 : actionMap.forEach((setLocalStateHandler) => {
|
|
81
|
+
setLocalStateHandler(value);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
stateMap.on("valueChanged", valueChangedListener);
|
|
86
|
+
// Set initial values
|
|
87
|
+
stateMap.forEach((value, key) => {
|
|
88
|
+
const actionMap = registeredSharedSetStateActionMapRef.current.get(key);
|
|
89
|
+
actionMap === null || actionMap === void 0 ? void 0 : actionMap.forEach((setLocalStateHandler) => {
|
|
90
|
+
setLocalStateHandler(value);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
return () => {
|
|
94
|
+
stateMap === null || stateMap === void 0 ? void 0 : stateMap.off("valueChanged", valueChangedListener);
|
|
95
|
+
};
|
|
96
|
+
}, [stateMap]);
|
|
97
|
+
return {
|
|
98
|
+
registerSharedSetStateAction,
|
|
99
|
+
unregisterSharedSetStateAction,
|
|
100
|
+
updateSharedState,
|
|
101
|
+
deleteSharedState,
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
exports.useSharedStateRegistry = useSharedStateRegistry;
|
|
105
|
+
const useStateMap = (container) => {
|
|
106
|
+
const [stateMap, setStateMap] = react_1.default.useState();
|
|
107
|
+
react_1.default.useEffect(() => {
|
|
108
|
+
if (!container) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const rootDataObject = (0, internal_1.getRootDataObject)(container);
|
|
112
|
+
const rootDirectory = (0, internal_1.getRootDirectory)(rootDataObject);
|
|
113
|
+
const turboDir = rootDirectory.getSubDirectory(internal_1.TurboDirectory);
|
|
114
|
+
turboDir === null || turboDir === void 0 ? void 0 : turboDir.get(internal_1.TurboStateMap).get().then((state) => {
|
|
115
|
+
setStateMap(state);
|
|
116
|
+
});
|
|
117
|
+
}, [container]);
|
|
118
|
+
return stateMap;
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=useSharedStateRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedStateRegistry.js","sourceRoot":"","sources":["../../../src/shared-hooks/useSharedStateRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ImplicitFieldSchema, TreeViewConfiguration, InsertableTreeFieldFromImplicitField } from "fluid-framework";
|
|
2
|
+
import { IUseSharedTreeResults } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a new Fluid `SharedTree` instance if one doesn't already exist.
|
|
5
|
+
* @remarks
|
|
6
|
+
* Use the `root` variable from the {@link IUseSharedTreeResults} response from this hook with {@link useTreeNode}.
|
|
7
|
+
* This makes `root` stateful with React whenever a leaf of `root` changes.
|
|
8
|
+
*
|
|
9
|
+
* @param uniqueKey the unique key for the `SharedTree`. If one does not yet exist, a new `SharedTree` will be created.
|
|
10
|
+
* Otherwise it will use the existing one.
|
|
11
|
+
* @param treeViewConfiguration the tree view configuration that contains the `SharedTree` field schema.
|
|
12
|
+
* @param initialData the initial data to load into the `SharedTree` when it is first created.
|
|
13
|
+
* @returns the {@link IUseSharedTreeResults} with the `root` node.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* import { SchemaFactory, TreeViewConfiguration } from "fluid-framework";
|
|
18
|
+
* import { useSharedTree, useTreeNode } from "@microsoft/live-share-react";
|
|
19
|
+
* // Declare a schema factory with your unique uuid
|
|
20
|
+
* const sf = new SchemaFactory("fc1db2e8-0000-11ee-be57-0242ac120002");
|
|
21
|
+
* class YourObject extends sf.object("YourObject", {
|
|
22
|
+
* listChangedCount: sf.number,
|
|
23
|
+
* list: sf.array(sf.string),
|
|
24
|
+
* }) {
|
|
25
|
+
* // You can add your own utility functions
|
|
26
|
+
* insert() {
|
|
27
|
+
* this.list.insertAtEnd("some text");
|
|
28
|
+
* this.listChangedCount += 1;
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
* const config = new TreeViewConfiguration({ schema: YourObject });
|
|
32
|
+
* const initialData = new YourObject({
|
|
33
|
+
* number: 0,
|
|
34
|
+
* list: [],
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Must be child component of <LiveShareProvider> or <AzureProvider>
|
|
38
|
+
* export const YourComponent = () => {
|
|
39
|
+
* // Get the root node of the `SharedTree` mapped to "some-unique-key"
|
|
40
|
+
* const { root } = useSharedTree("some-unique-key", config, initialData);
|
|
41
|
+
* // Makes root stateful / automatically update when the node changes (e.g., node.count)
|
|
42
|
+
* const { node } = useTreeNode(root);
|
|
43
|
+
* // node.list is its own TreeNode, so we make it stateful as well
|
|
44
|
+
* const { node: list } = useTreeNode(node?.list);
|
|
45
|
+
* if (!node || !list) return (<>"Loading"</>);
|
|
46
|
+
* return (
|
|
47
|
+
* <div>
|
|
48
|
+
* <div>Changed: {node.listChangedCount}</div>
|
|
49
|
+
* <button onClick={() => node.insert()}>Insert</button>
|
|
50
|
+
* { list.map((item) => <div key={item}>{item}</div>) }
|
|
51
|
+
* </div>
|
|
52
|
+
* );
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function useSharedTree<TSchema extends ImplicitFieldSchema = ImplicitFieldSchema>(uniqueKey: string, treeViewConfiguration: TreeViewConfiguration<TSchema>, initialData: InsertableTreeFieldFromImplicitField<TSchema>): IUseSharedTreeResults<TSchema>;
|
|
57
|
+
//# sourceMappingURL=useSharedTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedTree.d.ts","sourceRoot":"","sources":["../../../src/shared-hooks/useSharedTree.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EACnB,qBAAqB,EAIrB,oCAAoC,EAEvC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,wBAAgB,aAAa,CACzB,OAAO,SAAS,mBAAmB,GAAG,mBAAmB,EAEzD,SAAS,EAAE,MAAM,EACjB,qBAAqB,EAAE,qBAAqB,CAAC,OAAO,CAAC,EACrD,WAAW,EAAE,oCAAoC,CAAC,OAAO,CAAC,GAC3D,qBAAqB,CAAC,OAAO,CAAC,CAuEhC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.useSharedTree = useSharedTree;
|
|
7
|
+
const fluid_framework_1 = require("fluid-framework");
|
|
8
|
+
const index_js_1 = require("../shared-hooks/index.js");
|
|
9
|
+
const react_1 = __importDefault(require("react"));
|
|
10
|
+
/**
|
|
11
|
+
* Creates a new Fluid `SharedTree` instance if one doesn't already exist.
|
|
12
|
+
* @remarks
|
|
13
|
+
* Use the `root` variable from the {@link IUseSharedTreeResults} response from this hook with {@link useTreeNode}.
|
|
14
|
+
* This makes `root` stateful with React whenever a leaf of `root` changes.
|
|
15
|
+
*
|
|
16
|
+
* @param uniqueKey the unique key for the `SharedTree`. If one does not yet exist, a new `SharedTree` will be created.
|
|
17
|
+
* Otherwise it will use the existing one.
|
|
18
|
+
* @param treeViewConfiguration the tree view configuration that contains the `SharedTree` field schema.
|
|
19
|
+
* @param initialData the initial data to load into the `SharedTree` when it is first created.
|
|
20
|
+
* @returns the {@link IUseSharedTreeResults} with the `root` node.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* import { SchemaFactory, TreeViewConfiguration } from "fluid-framework";
|
|
25
|
+
* import { useSharedTree, useTreeNode } from "@microsoft/live-share-react";
|
|
26
|
+
* // Declare a schema factory with your unique uuid
|
|
27
|
+
* const sf = new SchemaFactory("fc1db2e8-0000-11ee-be57-0242ac120002");
|
|
28
|
+
* class YourObject extends sf.object("YourObject", {
|
|
29
|
+
* listChangedCount: sf.number,
|
|
30
|
+
* list: sf.array(sf.string),
|
|
31
|
+
* }) {
|
|
32
|
+
* // You can add your own utility functions
|
|
33
|
+
* insert() {
|
|
34
|
+
* this.list.insertAtEnd("some text");
|
|
35
|
+
* this.listChangedCount += 1;
|
|
36
|
+
* }
|
|
37
|
+
* }
|
|
38
|
+
* const config = new TreeViewConfiguration({ schema: YourObject });
|
|
39
|
+
* const initialData = new YourObject({
|
|
40
|
+
* number: 0,
|
|
41
|
+
* list: [],
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // Must be child component of <LiveShareProvider> or <AzureProvider>
|
|
45
|
+
* export const YourComponent = () => {
|
|
46
|
+
* // Get the root node of the `SharedTree` mapped to "some-unique-key"
|
|
47
|
+
* const { root } = useSharedTree("some-unique-key", config, initialData);
|
|
48
|
+
* // Makes root stateful / automatically update when the node changes (e.g., node.count)
|
|
49
|
+
* const { node } = useTreeNode(root);
|
|
50
|
+
* // node.list is its own TreeNode, so we make it stateful as well
|
|
51
|
+
* const { node: list } = useTreeNode(node?.list);
|
|
52
|
+
* if (!node || !list) return (<>"Loading"</>);
|
|
53
|
+
* return (
|
|
54
|
+
* <div>
|
|
55
|
+
* <div>Changed: {node.listChangedCount}</div>
|
|
56
|
+
* <button onClick={() => node.insert()}>Insert</button>
|
|
57
|
+
* { list.map((item) => <div key={item}>{item}</div>) }
|
|
58
|
+
* </div>
|
|
59
|
+
* );
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
function useSharedTree(uniqueKey, treeViewConfiguration, initialData) {
|
|
64
|
+
const [treeView, setTreeView] = react_1.default.useState();
|
|
65
|
+
const [root, setRoot] = react_1.default.useState();
|
|
66
|
+
const onFirstInitialize = react_1.default.useCallback((newDDS) => {
|
|
67
|
+
try {
|
|
68
|
+
// Create a `treeView` with the provided `treeViewConfiguration`
|
|
69
|
+
const _treeView = newDDS.viewWith(treeViewConfiguration);
|
|
70
|
+
if (_treeView.compatibility.canInitialize) {
|
|
71
|
+
// Set initial data
|
|
72
|
+
_treeView.initialize(initialData);
|
|
73
|
+
}
|
|
74
|
+
// `onFirstInitialize` is only called for the user that created the tree, but we need this object for all clients.
|
|
75
|
+
// Dispose, since we will call `sharedTree.viewWith` in a `useEffect` down below and set it to state.
|
|
76
|
+
_treeView.dispose();
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
console.error(err);
|
|
80
|
+
}
|
|
81
|
+
}, [treeViewConfiguration, initialData]);
|
|
82
|
+
/**
|
|
83
|
+
* User facing: dynamically load the `SharedTree` DDS for the given unique key.
|
|
84
|
+
*/
|
|
85
|
+
const { dds: sharedTree } = (0, index_js_1.useDynamicDDS)(uniqueKey, fluid_framework_1.SharedTree, onFirstInitialize);
|
|
86
|
+
/**
|
|
87
|
+
* Sets the tree view and root view
|
|
88
|
+
*/
|
|
89
|
+
react_1.default.useEffect(() => {
|
|
90
|
+
if (!sharedTree)
|
|
91
|
+
return;
|
|
92
|
+
let _treeView = undefined;
|
|
93
|
+
try {
|
|
94
|
+
// Create a `treeView` with the provided `treeViewConfiguration`
|
|
95
|
+
_treeView = sharedTree.viewWith(treeViewConfiguration);
|
|
96
|
+
setTreeView(_treeView);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
console.error(err);
|
|
100
|
+
}
|
|
101
|
+
// Listen for changes to root view
|
|
102
|
+
const updateRoot = () => {
|
|
103
|
+
if (_treeView === null || _treeView === void 0 ? void 0 : _treeView.compatibility.canView) {
|
|
104
|
+
setRoot(_treeView.root);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
setRoot(undefined);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
updateRoot();
|
|
111
|
+
const unsubscribeToRoot = _treeView === null || _treeView === void 0 ? void 0 : _treeView.events.on("rootChanged", updateRoot);
|
|
112
|
+
return () => {
|
|
113
|
+
_treeView === null || _treeView === void 0 ? void 0 : _treeView.dispose();
|
|
114
|
+
unsubscribeToRoot === null || unsubscribeToRoot === void 0 ? void 0 : unsubscribeToRoot();
|
|
115
|
+
};
|
|
116
|
+
}, [sharedTree, treeViewConfiguration]);
|
|
117
|
+
return {
|
|
118
|
+
treeView,
|
|
119
|
+
sharedTree,
|
|
120
|
+
root,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=useSharedTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedTree.js","sourceRoot":"","sources":["../../../src/shared-hooks/useSharedTree.ts"],"names":[],"mappings":";;;;;AAkEA,sCA6EC;AA/ID,qDAQyB;AAEzB,uDAAsE;AACtE,kDAA0B;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,SAAgB,aAAa,CAGzB,SAAiB,EACjB,qBAAqD,EACrD,WAA0D;IAE1D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,eAAK,CAAC,QAAQ,EAAqB,CAAC;IACpE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GACjB,eAAK,CAAC,QAAQ,EAAuC,CAAC;IAE1D,MAAM,iBAAiB,GAAG,eAAK,CAAC,WAAW,CACvC,CAAC,MAAa,EAAQ,EAAE;QACpB,IAAI,CAAC;YACD,gEAAgE;YAChE,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;YACzD,IAAI,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;gBACxC,mBAAmB;gBACnB,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACtC,CAAC;YACD,kHAAkH;YAClH,qGAAqG;YACrG,SAAS,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACL,CAAC,EACD,CAAC,qBAAqB,EAAE,WAAW,CAAC,CACvC,CAAC;IACF;;OAEG;IACH,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,IAAA,wBAAa,EACrC,SAAS,EACT,4BAAU,EACV,iBAAiB,CACpB,CAAC;IAEF;;OAEG;IACH,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,IAAI,SAAS,GAAkC,SAAS,CAAC;QACzD,IAAI,CAAC;YACD,gEAAgE;YAChE,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;YACvD,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAED,kCAAkC;QAClC,MAAM,UAAU,GAAG,GAAS,EAAE;YAC1B,IAAI,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,aAAa,CAAC,OAAO,EAAE,CAAC;gBACnC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,SAAS,CAAC,CAAC;YACvB,CAAC;QACL,CAAC,CAAC;QAEF,UAAU,EAAE,CAAC;QACb,MAAM,iBAAiB,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,CAAC,EAAE,CAC1C,aAAa,EACb,UAAU,CACb,CAAC;QACF,OAAO,GAAG,EAAE;YACR,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,OAAO,EAAE,CAAC;YACrB,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,EAAI,CAAC;QAC1B,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAExC,OAAO;QACH,QAAQ;QACR,UAAU;QACV,IAAI;KACP,CAAC;AACN,CAAC"}
|