@dxos/plugin-thread 0.8.4-main.28f8d3d → 0.8.4-main.406dc2a
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/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +16 -0
- package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +15 -0
- package/dist/lib/browser/{app-graph-builder-AF3M7UWN.mjs → app-graph-builder-ODKIAXR7.mjs} +17 -17
- package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +7 -0
- package/dist/lib/browser/{call-manager-XRRCAVLI.mjs → call-manager-BCKLI4QD.mjs} +7 -7
- package/dist/lib/browser/{call-manager-XRRCAVLI.mjs.map → call-manager-BCKLI4QD.mjs.map} +1 -1
- package/dist/lib/browser/chunk-2MUYQOQE.mjs +23 -0
- package/dist/lib/browser/{chunk-2CWJBXBH.mjs.map → chunk-2MUYQOQE.mjs.map} +3 -3
- package/dist/lib/browser/chunk-B7YQ7QR2.mjs +376 -0
- package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ZJ7QBXK6.mjs → chunk-CMCVHULC.mjs} +17 -15
- package/dist/lib/browser/chunk-CMCVHULC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
- package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
- package/dist/lib/browser/{chunk-X5PIP5YR.mjs → chunk-HDEQRBOC.mjs} +37 -5
- package/dist/lib/{node-esm/chunk-SED3O2XO.mjs.map → browser/chunk-HDEQRBOC.mjs.map} +4 -4
- package/dist/lib/browser/chunk-L326LSNS.mjs +18 -0
- package/dist/lib/browser/chunk-L326LSNS.mjs.map +7 -0
- package/dist/lib/browser/{chunk-EV4JWI7L.mjs → chunk-T4KJ5JR4.mjs} +5 -7
- package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +7 -0
- package/dist/lib/browser/chunk-VJMKS4CZ.mjs +619 -0
- package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-DW7JD64V.mjs → chunk-VTYX3SIM.mjs} +26 -16
- package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +7 -0
- package/dist/lib/browser/{chunk-JGKMMI65.mjs → chunk-XYUJXHYV.mjs} +54 -4
- package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
- package/dist/lib/browser/{chunk-TUFWPOVS.mjs → chunk-ZCEU5K23.mjs} +460 -268
- package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +22 -13
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-DCY4P4OX.mjs → intent-resolver-VOQD3TQ2.mjs} +73 -15
- package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +7 -0
- package/dist/lib/browser/{markdown-WZSXCEZJ.mjs → markdown-R6MGRIA6.mjs} +6 -6
- package/dist/lib/browser/{markdown-WZSXCEZJ.mjs.map → markdown-R6MGRIA6.mjs.map} +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-root-UMSBTN6H.mjs +28 -0
- package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-PYAMIADB.mjs → react-surface-SXMQEWKE.mjs} +22 -22
- package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +7 -0
- package/dist/lib/browser/{settings-AC6YSASL.mjs → settings-TCNF54PN.mjs} +5 -5
- package/dist/lib/browser/{settings-AC6YSASL.mjs.map → settings-TCNF54PN.mjs.map} +1 -1
- package/dist/lib/browser/{state-2T4KDWBX.mjs → state-ZQ4IPOJT.mjs} +5 -5
- package/dist/lib/browser/{state-2T4KDWBX.mjs.map → state-ZQ4IPOJT.mjs.map} +1 -1
- package/dist/lib/browser/toolkit-JF4B4QIO.mjs +84 -0
- package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +17 -0
- package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs → ChatContainer-SH6LTFQL.mjs} +6 -6
- package/dist/lib/node-esm/{app-graph-builder-OLSJVCWY.mjs → app-graph-builder-DMPT3MY6.mjs} +17 -17
- package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +7 -0
- package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs → call-manager-Q7RY2YP4.mjs} +7 -7
- package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs.map → call-manager-Q7RY2YP4.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-YIDU3DXK.mjs → chunk-2KZ4ODHU.mjs} +17 -15
- package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SED3O2XO.mjs → chunk-2MMJF7DW.mjs} +37 -5
- package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-QBHKLWGR.mjs → chunk-2V3WSLUZ.mjs} +54 -4
- package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
- package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-XVKWHTH4.mjs → chunk-BAMZXJS4.mjs} +26 -16
- package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +377 -0
- package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +25 -0
- package/dist/lib/node-esm/{chunk-6CRHHOST.mjs.map → chunk-GZ4WL2IS.mjs.map} +3 -3
- package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +19 -0
- package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +620 -0
- package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-GRLRWTRU.mjs → chunk-OBVAURUU.mjs} +5 -7
- package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-4TME3BR4.mjs → chunk-TIPIOH2J.mjs} +460 -268
- package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +22 -13
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-QGTPU6QB.mjs → intent-resolver-AKVH66PH.mjs} +73 -15
- package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs → markdown-MYGTDXT6.mjs} +6 -6
- package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs.map → markdown-MYGTDXT6.mjs.map} +1 -1
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +29 -0
- package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-UJFCSFNO.mjs → react-surface-NLSZJGMO.mjs} +22 -22
- package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-N52O7MLS.mjs → settings-ZQHGVFBY.mjs} +5 -5
- package/dist/lib/node-esm/{settings-N52O7MLS.mjs.map → settings-ZQHGVFBY.mjs.map} +1 -1
- package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-FSLLJ5TZ.mjs} +5 -5
- package/dist/lib/node-esm/{state-62TQKQVB.mjs.map → state-FSLLJ5TZ.mjs.map} +1 -1
- package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +85 -0
- package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +2 -2
- package/dist/types/src/ThreadPlugin.d.ts +1 -1
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/calls/media-manager.d.ts +1 -1
- package/dist/types/src/calls/media-manager.d.ts.map +1 -1
- package/dist/types/src/calls/types.d.ts.map +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts +3 -1
- package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
- package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
- package/dist/types/src/calls-service.stories.d.ts +10 -9
- package/dist/types/src/calls-service.stories.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/call-manager.d.ts +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +11 -10
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +1 -1
- package/dist/types/src/capabilities/react-root.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts +2 -2
- package/dist/types/src/capabilities/toolkit.d.ts +6 -0
- package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
- package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
- package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts +89 -5
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Chat.stories.d.ts +91 -5
- package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/Comments.stories.d.ts +156 -4
- package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
- package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
- package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
- package/dist/types/src/components/MessageContainer.d.ts +4 -1
- package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
- package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings.d.ts +1 -1
- package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
- package/dist/types/src/components/command-extension.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +1 -0
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +3 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +126 -111
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +259 -174
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +60 -58
- package/src/ThreadPlugin.tsx +128 -122
- package/src/calls/call-manager.ts +1 -1
- package/src/calls/media-manager.ts +58 -32
- package/src/calls/types.ts +7 -3
- package/src/calls/util/calls-service.ts +61 -11
- package/src/calls/util/stub-media-streams.ts +60 -3
- package/src/calls-service.stories.tsx +76 -63
- package/src/capabilities/app-graph-builder.ts +13 -10
- package/src/capabilities/capabilities.ts +5 -5
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +39 -6
- package/src/capabilities/react-root.tsx +2 -2
- package/src/capabilities/react-surface.tsx +9 -9
- package/src/capabilities/toolkit.ts +82 -0
- package/src/components/Call/Toolbar.tsx +4 -4
- package/src/components/CallDebugPanel.tsx +108 -49
- package/src/components/ChannelContainer.stories.tsx +9 -9
- package/src/components/ChannelContainer.tsx +1 -1
- package/src/components/Chat.stories.tsx +31 -29
- package/src/components/ChatContainer.tsx +4 -1
- package/src/components/Comments.stories.tsx +33 -35
- package/src/components/CommentsThreadContainer.tsx +8 -7
- package/src/components/Media/VideoObject.stories.tsx +35 -28
- package/src/components/MessageContainer.tsx +40 -7
- package/src/components/Participant/Participant.tsx +13 -7
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -6
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +41 -40
- package/src/components/ThreadComplementary.tsx +36 -6
- package/src/components/ThreadSettings.tsx +6 -7
- package/src/components/command-extension.ts +4 -1
- package/src/components/testing.ts +22 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
- package/src/hooks/useVideoStreamTrack.tsx +6 -3
- package/src/meta.ts +3 -4
- package/src/testing/stories.ts +1 -1
- package/src/translations.ts +3 -1
- package/src/types/schema.ts +1 -1
- package/src/types/types.ts +21 -13
- package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
- package/src/util.ts +1 -1
- package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
- package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
- package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
- package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
- package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
- package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
- package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
- package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
- package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
- package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
- package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
- package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
- package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
- package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
- package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
- package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
- package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
- package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
- package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
- package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
- package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
- package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
- package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
- package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
- package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
- /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → ChannelContainer-BGDGZHV4.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-PVT3DUZJ.mjs.map → ChatContainer-75KJZ4XR.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChannelContainer-B2ZGAE4P.mjs.map → ChannelContainer-OXC6BTU7.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs.map → ChatContainer-SH6LTFQL.mjs.map} +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
7
|
import { Capabilities, type PluginContext, contributes, createIntent, createResolver } from '@dxos/app-framework';
|
|
8
8
|
import { sleep } from '@dxos/async';
|
|
@@ -14,7 +14,7 @@ import { CollectionAction, SpaceAction } from '@dxos/plugin-space/types';
|
|
|
14
14
|
import { Ref, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
|
|
15
15
|
import { AnchoredTo, DataType } from '@dxos/schema';
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { meta } from '../meta';
|
|
18
18
|
import { ChannelType, ThreadAction, ThreadType } from '../types';
|
|
19
19
|
|
|
20
20
|
import { ThreadCapabilities } from './capabilities';
|
|
@@ -22,7 +22,7 @@ import { ThreadCapabilities } from './capabilities';
|
|
|
22
22
|
export default (context: PluginContext) =>
|
|
23
23
|
contributes(Capabilities.IntentResolver, [
|
|
24
24
|
createResolver({
|
|
25
|
-
intent: ThreadAction.
|
|
25
|
+
intent: ThreadAction.onCreateSpace,
|
|
26
26
|
resolve: ({ space, rootCollection }) =>
|
|
27
27
|
Effect.gen(function* () {
|
|
28
28
|
const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
|
|
@@ -95,6 +95,39 @@ export default (context: PluginContext) =>
|
|
|
95
95
|
};
|
|
96
96
|
},
|
|
97
97
|
}),
|
|
98
|
+
createResolver({
|
|
99
|
+
intent: ThreadAction.AddProposal,
|
|
100
|
+
resolve: ({ text, anchor, sender, subject }) => {
|
|
101
|
+
const space = getSpace(subject);
|
|
102
|
+
invariant(space, 'Space not found');
|
|
103
|
+
|
|
104
|
+
const subjectId = fullyQualifiedId(subject);
|
|
105
|
+
const proposal = Obj.make(DataType.Message, {
|
|
106
|
+
created: new Date().toISOString(),
|
|
107
|
+
sender,
|
|
108
|
+
blocks: [{ _tag: 'proposal', text }],
|
|
109
|
+
});
|
|
110
|
+
const thread = Obj.make(ThreadType, { name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
intents: [
|
|
114
|
+
createIntent(SpaceAction.AddObject, { object: thread, target: space, hidden: true }),
|
|
115
|
+
createIntent(SpaceAction.AddRelation, {
|
|
116
|
+
space,
|
|
117
|
+
schema: AnchoredTo,
|
|
118
|
+
source: thread,
|
|
119
|
+
target: subject,
|
|
120
|
+
fields: { anchor },
|
|
121
|
+
}),
|
|
122
|
+
createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),
|
|
123
|
+
createIntent(DeckAction.ChangeCompanion, {
|
|
124
|
+
primary: subjectId,
|
|
125
|
+
companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,
|
|
126
|
+
}),
|
|
127
|
+
],
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
}),
|
|
98
131
|
createResolver({
|
|
99
132
|
intent: ThreadAction.Select,
|
|
100
133
|
resolve: ({ current }) => {
|
|
@@ -157,7 +190,7 @@ export default (context: PluginContext) =>
|
|
|
157
190
|
|
|
158
191
|
return {
|
|
159
192
|
undoable: {
|
|
160
|
-
message: ['thread deleted label', { ns:
|
|
193
|
+
message: ['thread deleted label', { ns: meta.id }],
|
|
161
194
|
data: { thread, anchor },
|
|
162
195
|
},
|
|
163
196
|
intents: [
|
|
@@ -198,7 +231,6 @@ export default (context: PluginContext) =>
|
|
|
198
231
|
const subjectId = fullyQualifiedId(subject);
|
|
199
232
|
const space = getSpace(subject);
|
|
200
233
|
invariant(space, 'Space not found');
|
|
201
|
-
const intents = [];
|
|
202
234
|
|
|
203
235
|
const message = Obj.make(DataType.Message, {
|
|
204
236
|
created: new Date().toISOString(),
|
|
@@ -209,6 +241,7 @@ export default (context: PluginContext) =>
|
|
|
209
241
|
});
|
|
210
242
|
thread.messages.push(Ref.make(message));
|
|
211
243
|
|
|
244
|
+
const intents = [];
|
|
212
245
|
const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);
|
|
213
246
|
if (draft) {
|
|
214
247
|
// Move draft to document.
|
|
@@ -277,7 +310,7 @@ export default (context: PluginContext) =>
|
|
|
277
310
|
|
|
278
311
|
return {
|
|
279
312
|
undoable: {
|
|
280
|
-
message: ['message deleted label', { ns:
|
|
313
|
+
message: ['message deleted label', { ns: meta.id }],
|
|
281
314
|
data: { message, messageIndex },
|
|
282
315
|
},
|
|
283
316
|
intents: [
|
|
@@ -7,11 +7,11 @@ import React from 'react';
|
|
|
7
7
|
import { Capabilities, contributes } from '@dxos/app-framework';
|
|
8
8
|
|
|
9
9
|
import { Call } from '../components';
|
|
10
|
-
import {
|
|
10
|
+
import { meta } from '../meta';
|
|
11
11
|
|
|
12
12
|
export default () => {
|
|
13
13
|
return contributes(Capabilities.ReactRoot, {
|
|
14
|
-
id:
|
|
14
|
+
id: meta.id,
|
|
15
15
|
root: () => <Call.Audio />,
|
|
16
16
|
});
|
|
17
17
|
};
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
ThreadComplementary,
|
|
18
18
|
ThreadSettings,
|
|
19
19
|
} from '../components';
|
|
20
|
-
import {
|
|
20
|
+
import { meta } from '../meta';
|
|
21
21
|
import { ChannelType, type ThreadSettingsProps, ThreadType } from '../types';
|
|
22
22
|
|
|
23
23
|
import { ThreadCapabilities } from './capabilities';
|
|
@@ -25,13 +25,13 @@ import { ThreadCapabilities } from './capabilities';
|
|
|
25
25
|
export default () =>
|
|
26
26
|
contributes(Capabilities.ReactSurface, [
|
|
27
27
|
createSurface({
|
|
28
|
-
id: `${
|
|
28
|
+
id: `${meta.id}/channel`,
|
|
29
29
|
role: 'article',
|
|
30
30
|
filter: (data): data is { subject: ChannelType } => Obj.instanceOf(ChannelType, data.subject),
|
|
31
31
|
component: ({ data: { subject: channel }, role }) => <ChannelContainer channel={channel} role={role} />,
|
|
32
32
|
}),
|
|
33
33
|
createSurface({
|
|
34
|
-
id: `${
|
|
34
|
+
id: `${meta.id}/chat-companion`,
|
|
35
35
|
role: 'article',
|
|
36
36
|
filter: (data): data is { companionTo: ChannelType; subject: 'chat' } =>
|
|
37
37
|
Obj.instanceOf(ChannelType, data.companionTo) && data.subject === 'chat',
|
|
@@ -46,7 +46,7 @@ export default () =>
|
|
|
46
46
|
},
|
|
47
47
|
}),
|
|
48
48
|
createSurface({
|
|
49
|
-
id: `${
|
|
49
|
+
id: `${meta.id}/thread`,
|
|
50
50
|
role: 'article',
|
|
51
51
|
filter: (data): data is { subject: ThreadType } => Obj.instanceOf(ThreadType, data.subject),
|
|
52
52
|
component: ({ data: { subject: thread } }) => {
|
|
@@ -59,7 +59,7 @@ export default () =>
|
|
|
59
59
|
},
|
|
60
60
|
}),
|
|
61
61
|
createSurface({
|
|
62
|
-
id: `${
|
|
62
|
+
id: `${meta.id}/comments`,
|
|
63
63
|
role: 'article',
|
|
64
64
|
filter: (data): data is { companionTo: { threads: Ref.Ref<ThreadType>[] } } =>
|
|
65
65
|
data.subject === 'comments' && Obj.isObject(data.companionTo),
|
|
@@ -67,19 +67,19 @@ export default () =>
|
|
|
67
67
|
component: ({ data }) => <ThreadComplementary subject={data.companionTo} />,
|
|
68
68
|
}),
|
|
69
69
|
createSurface({
|
|
70
|
-
id: `${
|
|
70
|
+
id: `${meta.id}/plugin-settings`,
|
|
71
71
|
role: 'article',
|
|
72
72
|
filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>
|
|
73
|
-
data.subject instanceof SettingsStore && data.subject.prefix ===
|
|
73
|
+
data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
|
|
74
74
|
component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,
|
|
75
75
|
}),
|
|
76
76
|
createSurface({
|
|
77
|
-
id: `${
|
|
77
|
+
id: `${meta.id}/assistant`,
|
|
78
78
|
role: 'deck-companion--active-call',
|
|
79
79
|
component: () => <CallSidebar />,
|
|
80
80
|
}),
|
|
81
81
|
createSurface({
|
|
82
|
-
id: `${
|
|
82
|
+
id: `${meta.id}/devtools-overview`,
|
|
83
83
|
role: 'devtools-overview',
|
|
84
84
|
component: () => {
|
|
85
85
|
const call = useCapability(ThreadCapabilities.CallManager);
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Tool from '@effect/ai/Tool';
|
|
6
|
+
import * as Toolkit from '@effect/ai/Toolkit';
|
|
7
|
+
import * as Array from 'effect/Array';
|
|
8
|
+
import * as Effect from 'effect/Effect';
|
|
9
|
+
import * as Function from 'effect/Function';
|
|
10
|
+
import * as Schema from 'effect/Schema';
|
|
11
|
+
|
|
12
|
+
import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
|
|
13
|
+
import { ArtifactId, computeDiffsWithCursors } from '@dxos/assistant';
|
|
14
|
+
import { type SpaceId } from '@dxos/keys';
|
|
15
|
+
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
16
|
+
import { type Markdown } from '@dxos/plugin-markdown/types';
|
|
17
|
+
import { createDocAccessor } from '@dxos/react-client/echo';
|
|
18
|
+
import { trim } from '@dxos/util';
|
|
19
|
+
|
|
20
|
+
import { ThreadAction } from '../types';
|
|
21
|
+
|
|
22
|
+
// TODO(wittjosiah): How to make this work for more than Documents?
|
|
23
|
+
class ThreadToolkit extends Toolkit.make(
|
|
24
|
+
Tool.make('add-proposals', {
|
|
25
|
+
description: trim`
|
|
26
|
+
Proposes a set of changes to a document.
|
|
27
|
+
`,
|
|
28
|
+
parameters: {
|
|
29
|
+
id: ArtifactId,
|
|
30
|
+
diffs: Schema.Array(Schema.String).annotations({
|
|
31
|
+
description: 'The diffs to propose for the document.',
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
success: Schema.Any,
|
|
35
|
+
failure: Schema.Never,
|
|
36
|
+
}),
|
|
37
|
+
) {
|
|
38
|
+
static layer = (context: PluginContext) =>
|
|
39
|
+
ThreadToolkit.toLayer({
|
|
40
|
+
'add-proposals': ({ id, diffs: _diffs }) =>
|
|
41
|
+
Effect.gen(function* () {
|
|
42
|
+
// TODO(wittjosiah): Get capabilities via layers.
|
|
43
|
+
const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
|
|
44
|
+
const client = context.getCapability(ClientCapabilities.Client);
|
|
45
|
+
const state = context.getCapability(Capabilities.Layout);
|
|
46
|
+
|
|
47
|
+
const dxn = ArtifactId.toDXN(id, state.workspace as SpaceId);
|
|
48
|
+
|
|
49
|
+
const echoDxn = dxn.asEchoDXN();
|
|
50
|
+
if (!echoDxn) {
|
|
51
|
+
throw new Error(`Invalid object ID: ${id}`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const space = client.spaces.get(echoDxn.spaceId!);
|
|
55
|
+
const object = space?.db.getObjectById<Markdown.Document>(echoDxn.echoId);
|
|
56
|
+
if (!object) {
|
|
57
|
+
throw new Error(`Object not found: ${id}`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const content = yield* Effect.promise(() => object.content.load());
|
|
61
|
+
const accessor = createDocAccessor(content, ['content']);
|
|
62
|
+
yield* Function.pipe(
|
|
63
|
+
computeDiffsWithCursors(accessor, _diffs),
|
|
64
|
+
Array.map(({ cursor, text }) =>
|
|
65
|
+
createIntent(ThreadAction.AddProposal, {
|
|
66
|
+
subject: object,
|
|
67
|
+
sender: { role: 'assistant' },
|
|
68
|
+
anchor: cursor,
|
|
69
|
+
text,
|
|
70
|
+
}),
|
|
71
|
+
),
|
|
72
|
+
Array.map(dispatch),
|
|
73
|
+
Effect.allWith({ concurrency: 'unbounded' }),
|
|
74
|
+
);
|
|
75
|
+
}).pipe(Effect.orDie),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export default (context: PluginContext) => [
|
|
80
|
+
contributes(Capabilities.Toolkit, ThreadToolkit),
|
|
81
|
+
contributes(Capabilities.ToolkitHandler, ThreadToolkit.layer(context)),
|
|
82
|
+
];
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
Icon,
|
|
12
12
|
IconButton,
|
|
13
13
|
type IconButtonProps,
|
|
14
|
-
Toolbar as
|
|
14
|
+
Toolbar as NaturalToolbar,
|
|
15
15
|
type ThemedClassName,
|
|
16
16
|
toLocalizedString,
|
|
17
17
|
useTranslation,
|
|
@@ -56,7 +56,7 @@ export const Toolbar = ({
|
|
|
56
56
|
// TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.
|
|
57
57
|
return (
|
|
58
58
|
<div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>
|
|
59
|
-
<
|
|
59
|
+
<NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
|
|
60
60
|
<ToggleButton
|
|
61
61
|
active={call.media.audioEnabled}
|
|
62
62
|
state={{
|
|
@@ -95,7 +95,7 @@ export const Toolbar = ({
|
|
|
95
95
|
<Icon icon='ph--users--regular' size={4} />
|
|
96
96
|
<div>{participants}</div>
|
|
97
97
|
</div>
|
|
98
|
-
)) || <
|
|
98
|
+
)) || <NaturalToolbar.Separator variant='gap' />}
|
|
99
99
|
|
|
100
100
|
{call.joined && (
|
|
101
101
|
<>
|
|
@@ -151,7 +151,7 @@ export const Toolbar = ({
|
|
|
151
151
|
) : (
|
|
152
152
|
<IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />
|
|
153
153
|
)}
|
|
154
|
-
</
|
|
154
|
+
</NaturalToolbar.Root>
|
|
155
155
|
</div>
|
|
156
156
|
);
|
|
157
157
|
};
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { WebRTCStats } from '@peermetrics/webrtc-stats';
|
|
5
|
+
import { WebRTCStats, type WebRTCStatsEvent } from '@peermetrics/webrtc-stats';
|
|
6
6
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { truncateKey } from '@dxos/debug';
|
|
9
|
+
import { JsonView, Panel } from '@dxos/devtools';
|
|
9
10
|
import { log } from '@dxos/log';
|
|
10
|
-
import { Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
|
|
11
|
-
import { Json } from '@dxos/react-ui-syntax-highlighter';
|
|
11
|
+
import { IconButton, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
|
|
12
12
|
|
|
13
|
-
import { type GlobalState } from '../calls';
|
|
13
|
+
import { type EncodedTrackName, type GlobalState } from '../calls';
|
|
14
14
|
import { meta } from '../meta';
|
|
15
15
|
|
|
16
16
|
export type CallDebugPanelProps = ThemedClassName<{
|
|
@@ -19,11 +19,16 @@ export type CallDebugPanelProps = ThemedClassName<{
|
|
|
19
19
|
|
|
20
20
|
export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
|
|
21
21
|
const { t } = useTranslation(meta.id);
|
|
22
|
-
const users = state?.call?.users;
|
|
23
|
-
const self = state?.call?.self;
|
|
24
22
|
|
|
25
23
|
const [open, setOpen] = useState(false);
|
|
26
24
|
const handleToggle = () => setOpen(!open);
|
|
25
|
+
const [showServiceHistory, setShowServiceHistory] = useState(false);
|
|
26
|
+
const handleToggleServiceHistory = () => setShowServiceHistory(!showServiceHistory);
|
|
27
|
+
|
|
28
|
+
const handleCopyRaw = async () => {
|
|
29
|
+
await navigator.clipboard.writeText(JSON.stringify({ users: state?.call?.users, stats }, null, 2));
|
|
30
|
+
};
|
|
31
|
+
|
|
27
32
|
const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);
|
|
28
33
|
const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);
|
|
29
34
|
|
|
@@ -34,22 +39,24 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
|
|
|
34
39
|
}),
|
|
35
40
|
[],
|
|
36
41
|
);
|
|
42
|
+
const [stats, setStats] = useState<WebRTCStatsEvent['data']>();
|
|
37
43
|
|
|
38
|
-
const [stats, setStats] = useState<Record<string, any>>({});
|
|
39
44
|
useEffect(() => {
|
|
40
45
|
const pc = state?.media.peer?.session?.peerConnection;
|
|
41
|
-
const handleStats = (stats:
|
|
46
|
+
const handleStats = (stats: WebRTCStatsEvent) => {
|
|
47
|
+
setStats(stats.data);
|
|
48
|
+
};
|
|
42
49
|
let added = false;
|
|
43
50
|
if (pc && showDetailedWebRTCStats) {
|
|
44
51
|
webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });
|
|
45
|
-
webrtcStats.on('stats', handleStats);
|
|
52
|
+
webrtcStats.on('stats', handleStats as never);
|
|
46
53
|
added = true;
|
|
47
54
|
}
|
|
48
55
|
return () => {
|
|
49
56
|
try {
|
|
50
57
|
if (pc && added) {
|
|
51
58
|
webrtcStats.removeConnection({ pc });
|
|
52
|
-
webrtcStats.removeListener('stats', handleStats);
|
|
59
|
+
webrtcStats.removeListener('stats', handleStats as never);
|
|
53
60
|
}
|
|
54
61
|
} catch (error) {
|
|
55
62
|
log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });
|
|
@@ -57,6 +64,8 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
|
|
|
57
64
|
};
|
|
58
65
|
}, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);
|
|
59
66
|
|
|
67
|
+
const rows = useMemo(() => getCallStatusTable(state), [state?.call.users, state?.media.pulledAudioTracks]);
|
|
68
|
+
|
|
60
69
|
return (
|
|
61
70
|
<Panel
|
|
62
71
|
id='meeting-status'
|
|
@@ -65,51 +74,101 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
|
|
|
65
74
|
onToggle={handleToggle}
|
|
66
75
|
title={t('meeting status title')}
|
|
67
76
|
maxHeight={false}
|
|
68
|
-
info={
|
|
69
|
-
<div className='flex items-center gap-2'>
|
|
70
|
-
<span title='Joined'>{self?.joined ? 'Active' : 'Inactive'}</span>
|
|
71
|
-
{users?.length !== undefined && <span title='Users'>{users?.length ?? 0} User(s)</span>}
|
|
72
|
-
</div>
|
|
73
|
-
}
|
|
77
|
+
info={<div className='flex items-center gap-2'> {state?.call.joined ? 'Active' : 'Inactive'}</div>}
|
|
74
78
|
>
|
|
75
|
-
<div className='flex flex-col gap-2
|
|
76
|
-
<div className='flex items-
|
|
79
|
+
<div className='flex flex-col w-full gap-2 text-xs'>
|
|
80
|
+
<div className='flex items-center gap-2'>
|
|
77
81
|
<Input.Root>
|
|
78
82
|
<Input.Label classNames={'text-sm'}>{t('show webrtc stats title')}</Input.Label>
|
|
79
83
|
<Input.Checkbox checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />
|
|
80
84
|
</Input.Root>
|
|
81
85
|
</div>
|
|
82
|
-
<
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
: {}),
|
|
96
|
-
tracks: state?.media.peer?.session?.peerConnection.getTransceivers().map((transceiver) => {
|
|
97
|
-
const track =
|
|
98
|
-
transceiver.direction === 'recvonly' ? transceiver.receiver.track : transceiver.sender.track;
|
|
99
|
-
return {
|
|
100
|
-
id: track?.id,
|
|
101
|
-
kind: track?.kind,
|
|
102
|
-
direction: transceiver.direction,
|
|
103
|
-
enabled: track?.enabled,
|
|
104
|
-
muted: track?.muted,
|
|
105
|
-
readyState: track?.readyState,
|
|
106
|
-
settings: track?.getSettings(),
|
|
107
|
-
};
|
|
108
|
-
}),
|
|
109
|
-
callsServiceHistory: state?.media.peer?.history.get(),
|
|
110
|
-
}}
|
|
111
|
-
/>
|
|
86
|
+
<div className='flex items-center gap-2'>
|
|
87
|
+
<Input.Root>
|
|
88
|
+
<Input.Label classNames={'text-sm'}>{t('show calls history title')}</Input.Label>
|
|
89
|
+
<Input.Checkbox checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />
|
|
90
|
+
</Input.Root>
|
|
91
|
+
</div>
|
|
92
|
+
<div className='flex items-center gap-2'>
|
|
93
|
+
<IconButton classNames={'text-sm'} icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />
|
|
94
|
+
</div>
|
|
95
|
+
<Table rows={rows} />
|
|
96
|
+
{showDetailedWebRTCStats && <JsonView data={{ stats }} />}
|
|
97
|
+
{showServiceHistory && <JsonView data={{ history: state?.media.peer?.history.get() }} />}
|
|
112
98
|
</div>
|
|
113
99
|
</Panel>
|
|
114
100
|
);
|
|
115
101
|
};
|
|
102
|
+
|
|
103
|
+
const getCallStatusTable = (state?: GlobalState): TableProps['rows'] => {
|
|
104
|
+
if (!state || !state.call?.users) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const self = state.call.self;
|
|
109
|
+
const users = state.call.users
|
|
110
|
+
.filter((user) => user.id !== self!.id)
|
|
111
|
+
.map((user) => {
|
|
112
|
+
const isOk = {
|
|
113
|
+
audio:
|
|
114
|
+
user.tracks?.audio &&
|
|
115
|
+
state.media.pulledAudioTracks[user.tracks?.audio as EncodedTrackName]?.ctx.disposed === false,
|
|
116
|
+
video:
|
|
117
|
+
user.tracks?.video &&
|
|
118
|
+
state.media.pulledVideoStreams[user.tracks?.video as EncodedTrackName]?.ctx.disposed === false,
|
|
119
|
+
screenshare:
|
|
120
|
+
user.tracks?.screenshare &&
|
|
121
|
+
state.media.pulledVideoStreams[user.tracks?.screenshare as EncodedTrackName]?.ctx.disposed === false,
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
...user,
|
|
126
|
+
isOk,
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
return [
|
|
131
|
+
['users', state.call.users.length ?? 0],
|
|
132
|
+
[
|
|
133
|
+
'*self* ' + (self?.name ?? truncateKey(self!.id, 8)),
|
|
134
|
+
self?.tracks?.audio && state.media.pushedAudioTrack ? 'AUD ✅' : 'AUD ❌',
|
|
135
|
+
self?.tracks?.video && state.media.pushedVideoTrack ? 'VID ✅' : 'VID ❌',
|
|
136
|
+
self?.tracks?.screenshareEnabled
|
|
137
|
+
? self.tracks.screenshareEnabled && state.media.pushedScreenshareTrack
|
|
138
|
+
? 'SCR ✅'
|
|
139
|
+
: 'SCR ❌'
|
|
140
|
+
: undefined,
|
|
141
|
+
],
|
|
142
|
+
|
|
143
|
+
...users.map((user) => [
|
|
144
|
+
user.name ?? truncateKey(user.id, 8),
|
|
145
|
+
user.isOk.audio ? 'AUD ✅' : 'AUD ❌',
|
|
146
|
+
user.isOk.video ? 'VID ✅' : 'VID ❌',
|
|
147
|
+
user.tracks?.screenshareEnabled ? (user.isOk.screenshare ? 'SCR ✅' : 'SCR ❌') : undefined,
|
|
148
|
+
]),
|
|
149
|
+
['ICE', state.media.peer?.session?.peerConnection.iceConnectionState ?? 'no connection'],
|
|
150
|
+
];
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export namespace Unit {
|
|
154
|
+
export const KB = (n?: number) => ((n ?? 0) / 1_000).toFixed(2);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export type TableProps = {
|
|
158
|
+
rows: (string | number | undefined)[][];
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export const Table = ({ rows }: TableProps) => {
|
|
162
|
+
return (
|
|
163
|
+
<div className='w-full text-xs font-mono'>
|
|
164
|
+
{rows.map(([prefix, label, value, unit], i) => (
|
|
165
|
+
<div key={i} className='grid grid-cols-[3fr_1fr_1fr_1fr]'>
|
|
166
|
+
<div className='p-1'>{prefix}</div>
|
|
167
|
+
<div className='p-1'>{label}</div>
|
|
168
|
+
<div className='p-1'>{value}</div>
|
|
169
|
+
<div className='p-1'>{unit}</div>
|
|
170
|
+
</div>
|
|
171
|
+
))}
|
|
172
|
+
</div>
|
|
173
|
+
);
|
|
174
|
+
};
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@dxos-theme';
|
|
6
|
-
|
|
7
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
6
|
import React from 'react';
|
|
9
7
|
|
|
@@ -11,8 +9,9 @@ import { contributes } from '@dxos/app-framework';
|
|
|
11
9
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
12
10
|
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
13
11
|
import { Query, useQuery, useSpace } from '@dxos/react-client/echo';
|
|
12
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
14
13
|
import { DataType } from '@dxos/schema';
|
|
15
|
-
import {
|
|
14
|
+
import { render } from '@dxos/storybook-utils';
|
|
16
15
|
|
|
17
16
|
import { createThreadPlugins } from '../testing';
|
|
18
17
|
import { translations } from '../translations';
|
|
@@ -21,7 +20,7 @@ import { ChannelType, ThreadType } from '../types';
|
|
|
21
20
|
import { ChannelContainer, type ChannelContainerProps } from './ChannelContainer';
|
|
22
21
|
|
|
23
22
|
// TODO(wittjosiah): Channel doesn't render full height.
|
|
24
|
-
const
|
|
23
|
+
const DefaultStory = ({ roomId }: ChannelContainerProps) => {
|
|
25
24
|
const space = useSpace();
|
|
26
25
|
const [channel] = useQuery(space, Query.type(ChannelType));
|
|
27
26
|
if (!channel) {
|
|
@@ -31,25 +30,26 @@ const Story = ({ roomId }: ChannelContainerProps) => {
|
|
|
31
30
|
return <ChannelContainer channel={channel} roomId={roomId} />;
|
|
32
31
|
};
|
|
33
32
|
|
|
34
|
-
const meta
|
|
33
|
+
const meta = {
|
|
35
34
|
title: 'plugins/plugin-thread/ChannelContainer',
|
|
36
35
|
component: ChannelContainer,
|
|
37
|
-
render: (
|
|
36
|
+
render: render(DefaultStory),
|
|
38
37
|
decorators: [
|
|
38
|
+
withTheme,
|
|
39
39
|
withPluginManager({
|
|
40
40
|
plugins: [...(await createThreadPlugins())],
|
|
41
41
|
capabilities: [contributes(ClientCapabilities.Schema, [ChannelType, ThreadType, DataType.Message])],
|
|
42
42
|
}),
|
|
43
|
-
withLayout({ Container: ColumnContainer, classNames: 'w-[40rem] overflow-hidden' }),
|
|
44
43
|
],
|
|
45
44
|
parameters: {
|
|
45
|
+
layout: 'column',
|
|
46
46
|
translations,
|
|
47
47
|
},
|
|
48
|
-
}
|
|
48
|
+
} satisfies Meta<typeof ChannelContainer>;
|
|
49
49
|
|
|
50
50
|
export default meta;
|
|
51
51
|
|
|
52
|
-
type Story = StoryObj<
|
|
52
|
+
type Story = StoryObj<typeof meta>;
|
|
53
53
|
|
|
54
54
|
export const Default: Story = {
|
|
55
55
|
args: {
|
|
@@ -114,7 +114,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
|
|
|
114
114
|
const isJoined = callManager.joined && callManager.roomId === roomId;
|
|
115
115
|
|
|
116
116
|
return (
|
|
117
|
-
<StackItem.Content
|
|
117
|
+
<StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
|
|
118
118
|
{isJoined && !isNamed && <DisplayNameMissing />}
|
|
119
119
|
{isJoined && isNamed && (
|
|
120
120
|
<Call.Root>
|