@dxos/plugin-thread 0.8.4-main.5ea62a8 → 0.8.4-main.ae835ea
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-SVV4ZX5T.mjs +16 -0
- package/dist/lib/browser/ChatContainer-ALFWQ65B.mjs +15 -0
- package/dist/lib/browser/{app-graph-builder-FHAOPO57.mjs → app-graph-builder-ACBXRBOS.mjs} +20 -20
- package/dist/lib/browser/app-graph-builder-ACBXRBOS.mjs.map +7 -0
- package/dist/lib/browser/{call-manager-EW2QC6Q4.mjs → call-manager-P3MYR2JS.mjs} +7 -7
- package/dist/lib/browser/{call-manager-EW2QC6Q4.mjs.map → call-manager-P3MYR2JS.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-H63NDV62.mjs → chunk-6CUDBEYP.mjs} +12 -11
- package/dist/lib/browser/chunk-6CUDBEYP.mjs.map +7 -0
- package/dist/lib/browser/chunk-BBTXGRIR.mjs +18 -0
- package/dist/lib/browser/chunk-BBTXGRIR.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-TQJYDFBU.mjs → chunk-DJOUMWEL.mjs} +20 -18
- package/dist/lib/browser/chunk-DJOUMWEL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-2P3GVRHP.mjs → chunk-HDEQRBOC.mjs} +2 -2
- package/dist/lib/browser/{chunk-2P3GVRHP.mjs.map → chunk-HDEQRBOC.mjs.map} +2 -2
- package/dist/lib/browser/{chunk-J26C57ZY.mjs → chunk-IQSXEHOW.mjs} +139 -69
- package/dist/lib/browser/chunk-IQSXEHOW.mjs.map +7 -0
- package/dist/lib/browser/chunk-K2DUJRFJ.mjs +27 -0
- package/dist/lib/browser/chunk-K2DUJRFJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-L6F2AG6W.mjs +23 -0
- package/dist/lib/browser/{chunk-TUSBPMNU.mjs → chunk-US5ZQYC3.mjs} +267 -367
- package/dist/lib/browser/chunk-US5ZQYC3.mjs.map +7 -0
- package/dist/lib/browser/chunk-UTSLSZED.mjs +178 -0
- package/dist/lib/browser/chunk-UTSLSZED.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KEXJGF2R.mjs → chunk-XYUJXHYV.mjs} +53 -3
- package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +23 -22
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-IB5GYU2D.mjs → intent-resolver-5POQTZ24.mjs} +25 -34
- package/dist/lib/browser/intent-resolver-5POQTZ24.mjs.map +7 -0
- package/dist/lib/browser/{markdown-Z677YORA.mjs → markdown-L7LDNF56.mjs} +9 -9
- package/dist/lib/browser/markdown-L7LDNF56.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-root-RCJLK4EP.mjs +28 -0
- package/dist/lib/browser/react-root-RCJLK4EP.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-X2VB6P37.mjs → react-surface-IC576W2W.mjs} +27 -27
- package/dist/lib/browser/react-surface-IC576W2W.mjs.map +7 -0
- package/dist/lib/browser/{settings-GRKEID73.mjs → settings-5FYGBOGI.mjs} +5 -5
- package/dist/lib/browser/{settings-GRKEID73.mjs.map → settings-5FYGBOGI.mjs.map} +1 -1
- package/dist/lib/browser/{state-2T4KDWBX.mjs → state-36REWXO5.mjs} +5 -5
- package/dist/lib/browser/{state-2T4KDWBX.mjs.map → state-36REWXO5.mjs.map} +1 -1
- package/dist/lib/browser/toolkit-PXASLYEQ.mjs +74 -0
- package/dist/lib/browser/toolkit-PXASLYEQ.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +7 -9
- package/dist/lib/node-esm/ChannelContainer-63GMQ753.mjs +17 -0
- package/dist/lib/node-esm/{ChatContainer-4EGHKHIU.mjs → ChatContainer-MFKPXMIK.mjs} +6 -6
- package/dist/lib/node-esm/{app-graph-builder-XEYWX5FC.mjs → app-graph-builder-JXD7KY3G.mjs} +20 -20
- package/dist/lib/node-esm/app-graph-builder-JXD7KY3G.mjs.map +7 -0
- package/dist/lib/node-esm/{call-manager-N3KASRDQ.mjs → call-manager-FCEFP7EJ.mjs} +7 -7
- package/dist/lib/node-esm/{call-manager-N3KASRDQ.mjs.map → call-manager-FCEFP7EJ.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-CTZ75IFK.mjs → chunk-2MMJF7DW.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-CTZ75IFK.mjs.map → chunk-2MMJF7DW.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-S3D7DTBF.mjs → chunk-2V3WSLUZ.mjs} +53 -3
- 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-AFDO2SUZ.mjs +25 -0
- package/dist/lib/node-esm/{chunk-JR7KESLL.mjs → chunk-KGYDYYKJ.mjs} +267 -367
- package/dist/lib/node-esm/chunk-KGYDYYKJ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-UHZQTPXU.mjs → chunk-NWUUMKVQ.mjs} +12 -11
- package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-NNKKNW57.mjs → chunk-Q7AKKZNY.mjs} +139 -69
- package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-CCE5LHBE.mjs → chunk-QCQAAU6J.mjs} +20 -18
- package/dist/lib/node-esm/chunk-QCQAAU6J.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-TYLLHI46.mjs +179 -0
- package/dist/lib/node-esm/chunk-TYLLHI46.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XI45H4IV.mjs +28 -0
- package/dist/lib/node-esm/chunk-XI45H4IV.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ZQAGII7M.mjs +19 -0
- package/dist/lib/node-esm/chunk-ZQAGII7M.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +23 -22
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-VIMI5VLH.mjs → intent-resolver-63NV3XD2.mjs} +25 -34
- package/dist/lib/node-esm/intent-resolver-63NV3XD2.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-FL4IXLRP.mjs → markdown-ZQW7MI5U.mjs} +9 -9
- package/dist/lib/node-esm/markdown-ZQW7MI5U.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-root-4IDB2SN2.mjs +29 -0
- package/dist/lib/node-esm/react-root-4IDB2SN2.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-OLN3XNND.mjs → react-surface-O4LGTAZ3.mjs} +27 -27
- package/dist/lib/node-esm/react-surface-O4LGTAZ3.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-F2ODVNNW.mjs → settings-EOBQUZSW.mjs} +5 -5
- package/dist/lib/node-esm/{settings-F2ODVNNW.mjs.map → settings-EOBQUZSW.mjs.map} +1 -1
- package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-X3W67GTL.mjs} +5 -5
- package/dist/lib/node-esm/{state-62TQKQVB.mjs.map → state-X3W67GTL.mjs.map} +1 -1
- package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs +75 -0
- package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +7 -9
- 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.map +1 -1
- package/dist/types/src/calls/types.d.ts.map +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts +2 -0
- 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 +0 -1
- package/dist/types/src/calls-service.stories.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +2 -2
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit.d.ts +21 -2
- package/dist/types/src/capabilities/toolkit.d.ts.map +1 -1
- package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
- package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
- 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.d.ts +2 -2
- package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts +74 -8
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Chat.stories.d.ts +74 -6
- package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts +6 -5
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/Comments.stories.d.ts +3 -2
- package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
- 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 +5 -3
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +4 -2
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +4 -2
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.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/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +3 -3
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- 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/testing/stories.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +73 -6
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Channel.d.ts +16 -0
- package/dist/types/src/types/Channel.d.ts.map +1 -0
- package/dist/types/src/types/{schema.d.ts → Thread.d.ts} +18 -28
- package/dist/types/src/types/Thread.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +37 -50
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +59 -59
- package/src/ThreadPlugin.tsx +133 -130
- package/src/calls/call-manager.ts +1 -1
- package/src/calls/media-manager.ts +2 -1
- package/src/calls/types.ts +7 -3
- package/src/calls/util/calls-service.ts +12 -7
- package/src/calls/util/stub-media-streams.ts +60 -2
- package/src/calls-service.stories.tsx +2 -5
- package/src/capabilities/app-graph-builder.ts +17 -14
- package/src/capabilities/capabilities.ts +7 -7
- package/src/capabilities/intent-resolver.ts +14 -19
- package/src/capabilities/react-root.tsx +2 -2
- package/src/capabilities/react-surface.tsx +15 -15
- package/src/capabilities/toolkit.ts +18 -11
- package/src/components/Call/Toolbar.tsx +6 -6
- package/src/components/CallDebugPanel.tsx +108 -49
- package/src/components/ChannelContainer.stories.tsx +9 -9
- package/src/components/ChannelContainer.tsx +14 -11
- package/src/components/Chat.stories.tsx +13 -18
- package/src/components/ChatContainer.tsx +26 -17
- package/src/components/Comments.stories.tsx +8 -13
- package/src/components/CommentsContainer.tsx +2 -2
- package/src/components/CommentsThreadContainer.tsx +19 -14
- package/src/components/Media/VideoObject.stories.tsx +12 -7
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +3 -4
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +3 -4
- package/src/components/ThreadComplementary.tsx +7 -7
- package/src/components/ThreadSettings.tsx +4 -5
- package/src/components/testing.ts +5 -5
- package/src/extensions/threads.ts +5 -5
- package/src/hooks/useVideoStreamTrack.tsx +1 -1
- package/src/meta.ts +9 -5
- package/src/testing/stories.ts +3 -6
- package/src/translations.ts +5 -3
- package/src/types/Channel.ts +27 -0
- package/src/types/Thread.ts +26 -0
- package/src/types/index.ts +2 -1
- package/src/types/types.ts +10 -9
- package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
- package/src/util.ts +1 -1
- package/dist/lib/browser/ChannelContainer-GHDNEZT2.mjs +0 -16
- package/dist/lib/browser/ChatContainer-42ALOWUA.mjs +0 -15
- package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +0 -7
- package/dist/lib/browser/chunk-2I277V52.mjs +0 -23
- package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
- package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
- package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
- package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
- package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
- package/dist/lib/browser/chunk-H63NDV62.mjs.map +0 -7
- package/dist/lib/browser/chunk-J26C57ZY.mjs.map +0 -7
- package/dist/lib/browser/chunk-KEXJGF2R.mjs.map +0 -7
- package/dist/lib/browser/chunk-KTWYVC5X.mjs +0 -147
- package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +0 -7
- package/dist/lib/browser/chunk-TQJYDFBU.mjs.map +0 -7
- package/dist/lib/browser/chunk-TUSBPMNU.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-IB5GYU2D.mjs.map +0 -7
- package/dist/lib/browser/markdown-Z677YORA.mjs.map +0 -7
- package/dist/lib/browser/react-root-PTTTW2MO.mjs +0 -28
- package/dist/lib/browser/react-root-PTTTW2MO.mjs.map +0 -7
- package/dist/lib/browser/react-surface-X2VB6P37.mjs.map +0 -7
- package/dist/lib/browser/toolkit-KUPIIFC6.mjs +0 -80
- package/dist/lib/browser/toolkit-KUPIIFC6.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-D5E2S6AI.mjs +0 -17
- package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CCE5LHBE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
- package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JR7KESLL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NNKKNW57.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-P6E247RF.mjs +0 -148
- package/dist/lib/node-esm/chunk-P6E247RF.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-S3D7DTBF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UHZQTPXU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UJ2QNRLS.mjs +0 -25
- package/dist/lib/node-esm/intent-resolver-VIMI5VLH.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-2HHRRUME.mjs +0 -29
- package/dist/lib/node-esm/react-root-2HHRRUME.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-OLN3XNND.mjs.map +0 -7
- package/dist/lib/node-esm/toolkit-KZIS7G36.mjs +0 -81
- package/dist/lib/node-esm/toolkit-KZIS7G36.mjs.map +0 -7
- package/dist/types/src/types/schema.d.ts.map +0 -1
- package/src/types/schema.ts +0 -33
- /package/dist/lib/browser/{ChannelContainer-GHDNEZT2.mjs.map → ChannelContainer-SVV4ZX5T.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-42ALOWUA.mjs.map → ChatContainer-ALFWQ65B.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-2I277V52.mjs.map → chunk-L6F2AG6W.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChannelContainer-D5E2S6AI.mjs.map → ChannelContainer-63GMQ753.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-4EGHKHIU.mjs.map → ChatContainer-MFKPXMIK.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-UJ2QNRLS.mjs.map → chunk-AFDO2SUZ.mjs.map} +0 -0
|
@@ -1,56 +1,64 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
ThreadAction,
|
|
4
|
-
|
|
5
|
-
} from "./chunk-
|
|
4
|
+
Thread_exports
|
|
5
|
+
} from "./chunk-TYLLHI46.mjs";
|
|
6
6
|
import {
|
|
7
7
|
ChannelContainer
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-QCQAAU6J.mjs";
|
|
9
9
|
import {
|
|
10
10
|
ThreadCapabilities
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-ZQAGII7M.mjs";
|
|
12
12
|
import {
|
|
13
13
|
MessageContainer,
|
|
14
14
|
buttonClassNames,
|
|
15
15
|
buttonGroupClassNames,
|
|
16
16
|
command
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-NWUUMKVQ.mjs";
|
|
18
18
|
import {
|
|
19
19
|
useStatus
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-2MMJF7DW.mjs";
|
|
21
21
|
import {
|
|
22
22
|
getMessageMetadata
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-ABUFOZVX.mjs";
|
|
24
24
|
import {
|
|
25
25
|
meta
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-XI45H4IV.mjs";
|
|
27
27
|
|
|
28
28
|
// src/components/CallDebugPanel.tsx
|
|
29
29
|
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
30
30
|
import { WebRTCStats } from "@peermetrics/webrtc-stats";
|
|
31
31
|
import React, { useEffect, useMemo, useState } from "react";
|
|
32
|
-
import {
|
|
32
|
+
import { truncateKey } from "@dxos/debug";
|
|
33
|
+
import { JsonView, Panel } from "@dxos/devtools";
|
|
33
34
|
import { log } from "@dxos/log";
|
|
34
|
-
import { Input, useTranslation } from "@dxos/react-ui";
|
|
35
|
-
import { Json } from "@dxos/react-ui-syntax-highlighter";
|
|
35
|
+
import { IconButton, Input, useTranslation } from "@dxos/react-ui";
|
|
36
36
|
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/components/CallDebugPanel.tsx";
|
|
37
37
|
var CallDebugPanel = ({ state }) => {
|
|
38
38
|
var _effect = _useSignals();
|
|
39
39
|
try {
|
|
40
40
|
const { t } = useTranslation(meta.id);
|
|
41
|
-
const users = state?.call?.users;
|
|
42
|
-
const self = state?.call?.self;
|
|
43
41
|
const [open, setOpen] = useState(false);
|
|
44
42
|
const handleToggle = () => setOpen(!open);
|
|
43
|
+
const [showServiceHistory, setShowServiceHistory] = useState(false);
|
|
44
|
+
const handleToggleServiceHistory = () => setShowServiceHistory(!showServiceHistory);
|
|
45
|
+
const handleCopyRaw = async () => {
|
|
46
|
+
await navigator.clipboard.writeText(JSON.stringify({
|
|
47
|
+
users: state?.call?.users,
|
|
48
|
+
stats
|
|
49
|
+
}, null, 2));
|
|
50
|
+
};
|
|
45
51
|
const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);
|
|
46
52
|
const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);
|
|
47
53
|
const webrtcStats = useMemo(() => new WebRTCStats({
|
|
48
54
|
getStatsInterval: 1e3
|
|
49
55
|
}), []);
|
|
50
|
-
const [stats, setStats] = useState(
|
|
56
|
+
const [stats, setStats] = useState();
|
|
51
57
|
useEffect(() => {
|
|
52
58
|
const pc = state?.media.peer?.session?.peerConnection;
|
|
53
|
-
const handleStats = (stats2) =>
|
|
59
|
+
const handleStats = (stats2) => {
|
|
60
|
+
setStats(stats2.data);
|
|
61
|
+
};
|
|
54
62
|
let added = false;
|
|
55
63
|
if (pc && showDetailedWebRTCStats) {
|
|
56
64
|
webrtcStats.addConnection({
|
|
@@ -77,7 +85,7 @@ var CallDebugPanel = ({ state }) => {
|
|
|
77
85
|
connectionId: "1"
|
|
78
86
|
}, {
|
|
79
87
|
F: __dxlog_file,
|
|
80
|
-
L:
|
|
88
|
+
L: 62,
|
|
81
89
|
S: void 0,
|
|
82
90
|
C: (f, a) => f(...a)
|
|
83
91
|
});
|
|
@@ -87,6 +95,10 @@ var CallDebugPanel = ({ state }) => {
|
|
|
87
95
|
state?.media.peer?.session?.peerConnection,
|
|
88
96
|
showDetailedWebRTCStats
|
|
89
97
|
]);
|
|
98
|
+
const rows = useMemo(() => getCallStatusTable(state), [
|
|
99
|
+
state?.call.users,
|
|
100
|
+
state?.media.pulledAudioTracks
|
|
101
|
+
]);
|
|
90
102
|
return /* @__PURE__ */ React.createElement(Panel, {
|
|
91
103
|
id: "meeting-status",
|
|
92
104
|
icon: "ph--video-conference--regular",
|
|
@@ -96,51 +108,109 @@ var CallDebugPanel = ({ state }) => {
|
|
|
96
108
|
maxHeight: false,
|
|
97
109
|
info: /* @__PURE__ */ React.createElement("div", {
|
|
98
110
|
className: "flex items-center gap-2"
|
|
99
|
-
},
|
|
100
|
-
title: "Joined"
|
|
101
|
-
}, self?.joined ? "Active" : "Inactive"), users?.length !== void 0 && /* @__PURE__ */ React.createElement("span", {
|
|
102
|
-
title: "Users"
|
|
103
|
-
}, users?.length ?? 0, " User(s)"))
|
|
111
|
+
}, " ", state?.call.joined ? "Active" : "Inactive")
|
|
104
112
|
}, /* @__PURE__ */ React.createElement("div", {
|
|
105
|
-
className: "flex flex-col gap-2
|
|
113
|
+
className: "flex flex-col w-full gap-2 text-xs"
|
|
106
114
|
}, /* @__PURE__ */ React.createElement("div", {
|
|
107
|
-
className: "flex items-
|
|
115
|
+
className: "flex items-center gap-2"
|
|
108
116
|
}, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
|
|
109
117
|
classNames: "text-sm"
|
|
110
118
|
}, t("show webrtc stats title")), /* @__PURE__ */ React.createElement(Input.Checkbox, {
|
|
111
119
|
checked: showDetailedWebRTCStats,
|
|
112
120
|
onCheckedChange: handleShowDetailedWebRTCStats
|
|
113
|
-
}))), /* @__PURE__ */ React.createElement(
|
|
121
|
+
}))), /* @__PURE__ */ React.createElement("div", {
|
|
122
|
+
className: "flex items-center gap-2"
|
|
123
|
+
}, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
|
|
124
|
+
classNames: "text-sm"
|
|
125
|
+
}, t("show calls history title")), /* @__PURE__ */ React.createElement(Input.Checkbox, {
|
|
126
|
+
checked: showServiceHistory,
|
|
127
|
+
onCheckedChange: handleToggleServiceHistory
|
|
128
|
+
}))), /* @__PURE__ */ React.createElement("div", {
|
|
129
|
+
className: "flex items-center gap-2"
|
|
130
|
+
}, /* @__PURE__ */ React.createElement(IconButton, {
|
|
114
131
|
classNames: "text-sm",
|
|
132
|
+
icon: "ph--copy--regular",
|
|
133
|
+
label: "copy raw",
|
|
134
|
+
onClick: handleCopyRaw
|
|
135
|
+
})), /* @__PURE__ */ React.createElement(Table, {
|
|
136
|
+
rows
|
|
137
|
+
}), showDetailedWebRTCStats && /* @__PURE__ */ React.createElement(JsonView, {
|
|
115
138
|
data: {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
iceConnectionState: state?.media.peer?.session?.peerConnection.iceConnectionState,
|
|
122
|
-
stats
|
|
123
|
-
}
|
|
124
|
-
} : {},
|
|
125
|
-
tracks: state?.media.peer?.session?.peerConnection.getTransceivers().map((transceiver) => {
|
|
126
|
-
const track = transceiver.direction === "recvonly" ? transceiver.receiver.track : transceiver.sender.track;
|
|
127
|
-
return {
|
|
128
|
-
id: track?.id,
|
|
129
|
-
kind: track?.kind,
|
|
130
|
-
direction: transceiver.direction,
|
|
131
|
-
enabled: track?.enabled,
|
|
132
|
-
muted: track?.muted,
|
|
133
|
-
readyState: track?.readyState,
|
|
134
|
-
settings: track?.getSettings()
|
|
135
|
-
};
|
|
136
|
-
}),
|
|
137
|
-
callsServiceHistory: state?.media.peer?.history.get()
|
|
139
|
+
stats
|
|
140
|
+
}
|
|
141
|
+
}), showServiceHistory && /* @__PURE__ */ React.createElement(JsonView, {
|
|
142
|
+
data: {
|
|
143
|
+
history: state?.media.peer?.history.get()
|
|
138
144
|
}
|
|
139
145
|
})));
|
|
140
146
|
} finally {
|
|
141
147
|
_effect.f();
|
|
142
148
|
}
|
|
143
149
|
};
|
|
150
|
+
var getCallStatusTable = (state) => {
|
|
151
|
+
if (!state || !state.call?.users) {
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
const self = state.call.self;
|
|
155
|
+
const users = state.call.users.filter((user) => user.id !== self.id).map((user) => {
|
|
156
|
+
const isOk = {
|
|
157
|
+
audio: user.tracks?.audio && state.media.pulledAudioTracks[user.tracks?.audio]?.ctx.disposed === false,
|
|
158
|
+
video: user.tracks?.video && state.media.pulledVideoStreams[user.tracks?.video]?.ctx.disposed === false,
|
|
159
|
+
screenshare: user.tracks?.screenshare && state.media.pulledVideoStreams[user.tracks?.screenshare]?.ctx.disposed === false
|
|
160
|
+
};
|
|
161
|
+
return {
|
|
162
|
+
...user,
|
|
163
|
+
isOk
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
return [
|
|
167
|
+
[
|
|
168
|
+
"users",
|
|
169
|
+
state.call.users.length ?? 0
|
|
170
|
+
],
|
|
171
|
+
[
|
|
172
|
+
"*self* " + (self?.name ?? truncateKey(self.id, 8)),
|
|
173
|
+
self?.tracks?.audio && state.media.pushedAudioTrack ? "AUD \u2705" : "AUD \u274C",
|
|
174
|
+
self?.tracks?.video && state.media.pushedVideoTrack ? "VID \u2705" : "VID \u274C",
|
|
175
|
+
self?.tracks?.screenshareEnabled ? self.tracks.screenshareEnabled && state.media.pushedScreenshareTrack ? "SCR \u2705" : "SCR \u274C" : void 0
|
|
176
|
+
],
|
|
177
|
+
...users.map((user) => [
|
|
178
|
+
user.name ?? truncateKey(user.id, 8),
|
|
179
|
+
user.isOk.audio ? "AUD \u2705" : "AUD \u274C",
|
|
180
|
+
user.isOk.video ? "VID \u2705" : "VID \u274C",
|
|
181
|
+
user.tracks?.screenshareEnabled ? user.isOk.screenshare ? "SCR \u2705" : "SCR \u274C" : void 0
|
|
182
|
+
]),
|
|
183
|
+
[
|
|
184
|
+
"ICE",
|
|
185
|
+
state.media.peer?.session?.peerConnection.iceConnectionState ?? "no connection"
|
|
186
|
+
]
|
|
187
|
+
];
|
|
188
|
+
};
|
|
189
|
+
(function(Unit2) {
|
|
190
|
+
Unit2.KB = (n) => ((n ?? 0) / 1e3).toFixed(2);
|
|
191
|
+
})(Unit || (Unit = {}));
|
|
192
|
+
var Table = ({ rows }) => {
|
|
193
|
+
var _effect = _useSignals();
|
|
194
|
+
try {
|
|
195
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
196
|
+
className: "w-full text-xs font-mono"
|
|
197
|
+
}, rows.map(([prefix, label, value, unit], i) => /* @__PURE__ */ React.createElement("div", {
|
|
198
|
+
key: i,
|
|
199
|
+
className: "grid grid-cols-[3fr_1fr_1fr_1fr]"
|
|
200
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
201
|
+
className: "p-1"
|
|
202
|
+
}, prefix), /* @__PURE__ */ React.createElement("div", {
|
|
203
|
+
className: "p-1"
|
|
204
|
+
}, label), /* @__PURE__ */ React.createElement("div", {
|
|
205
|
+
className: "p-1"
|
|
206
|
+
}, value), /* @__PURE__ */ React.createElement("div", {
|
|
207
|
+
className: "p-1"
|
|
208
|
+
}, unit))));
|
|
209
|
+
} finally {
|
|
210
|
+
_effect.f();
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
var Unit;
|
|
144
214
|
|
|
145
215
|
// src/components/CallSidebar.tsx
|
|
146
216
|
import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
|
|
@@ -165,7 +235,7 @@ import { Capabilities, CollaborationActions, LayoutAction, createIntent, useCapa
|
|
|
165
235
|
import { Filter, Obj, Query, Relation as Relation3 } from "@dxos/echo";
|
|
166
236
|
import { Ref as Ref2, fullyQualifiedId as fullyQualifiedId3, getSpace as getSpace2, useQuery } from "@dxos/react-client/echo";
|
|
167
237
|
import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
|
|
168
|
-
import { useThemeContext as useThemeContext2, useTranslation as
|
|
238
|
+
import { useThemeContext as useThemeContext2, useTranslation as useTranslation5 } from "@dxos/react-ui";
|
|
169
239
|
import { useAttended } from "@dxos/react-ui-attention";
|
|
170
240
|
import { StackItem } from "@dxos/react-ui-stack";
|
|
171
241
|
import { Tabs } from "@dxos/react-ui-tabs";
|
|
@@ -188,14 +258,15 @@ import React3, { useCallback, useMemo as useMemo2, useRef, useState as useState2
|
|
|
188
258
|
import { Ref, Relation } from "@dxos/echo";
|
|
189
259
|
import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
|
|
190
260
|
import { useIdentity } from "@dxos/react-client/halo";
|
|
191
|
-
import { IconButton, Tag, Tooltip, useThemeContext, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
261
|
+
import { IconButton as IconButton2, Tag, Tooltip, useThemeContext, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
192
262
|
import { createBasicExtensions, createThemeExtensions, listener } from "@dxos/react-ui-editor";
|
|
193
263
|
import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from "@dxos/react-ui-theme";
|
|
194
|
-
import { MessageTextbox, Thread } from "@dxos/react-ui-thread";
|
|
264
|
+
import { MessageTextbox, Thread as ThreadComponent } from "@dxos/react-ui-thread";
|
|
195
265
|
import { isNonNullable } from "@dxos/util";
|
|
196
266
|
var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve, onMessageDelete, onThreadDelete, onAcceptProposal }) => {
|
|
197
267
|
var _effect = _useSignals3();
|
|
198
268
|
try {
|
|
269
|
+
const { themeMode } = useThemeContext();
|
|
199
270
|
const { t } = useTranslation2(meta.id);
|
|
200
271
|
const identity = useIdentity();
|
|
201
272
|
const space = getSpace(anchor);
|
|
@@ -204,10 +275,8 @@ var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve
|
|
|
204
275
|
const thread = Relation.getSource(anchor);
|
|
205
276
|
const activity = useStatus(space, fullyQualifiedId(thread));
|
|
206
277
|
const threadScrollRef = useRef(null);
|
|
207
|
-
const { themeMode } = useThemeContext();
|
|
208
278
|
const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
|
|
209
|
-
const [
|
|
210
|
-
const rerenderEditor = () => _setCount((count) => count + 1);
|
|
279
|
+
const [state, setState] = useState2({});
|
|
211
280
|
const messageRef = useRef("");
|
|
212
281
|
const extensions = useMemo2(() => [
|
|
213
282
|
createBasicExtensions({
|
|
@@ -217,11 +286,11 @@ var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve
|
|
|
217
286
|
themeMode
|
|
218
287
|
}),
|
|
219
288
|
listener({
|
|
220
|
-
onChange: (text) => messageRef.current = text
|
|
289
|
+
onChange: ({ text }) => messageRef.current = text
|
|
221
290
|
}),
|
|
222
291
|
command
|
|
223
292
|
], [
|
|
224
|
-
|
|
293
|
+
state
|
|
225
294
|
]);
|
|
226
295
|
const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
|
|
227
296
|
behavior,
|
|
@@ -254,13 +323,13 @@ var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve
|
|
|
254
323
|
onComment?.(anchor, messageRef.current);
|
|
255
324
|
messageRef.current = "";
|
|
256
325
|
scrollToEnd("instant");
|
|
257
|
-
|
|
326
|
+
setState({});
|
|
258
327
|
return true;
|
|
259
328
|
}, [
|
|
260
329
|
anchor,
|
|
261
330
|
identity
|
|
262
331
|
]);
|
|
263
|
-
return /* @__PURE__ */ React3.createElement(
|
|
332
|
+
return /* @__PURE__ */ React3.createElement(ThreadComponent.Root, {
|
|
264
333
|
id: fullyQualifiedId(thread),
|
|
265
334
|
classNames: "pbs-2 border-be border-subduedSeparator last:border-none",
|
|
266
335
|
current,
|
|
@@ -273,14 +342,14 @@ var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve
|
|
|
273
342
|
asChild: true,
|
|
274
343
|
content: t("detached thread label"),
|
|
275
344
|
side: "top"
|
|
276
|
-
}, /* @__PURE__ */ React3.createElement(
|
|
345
|
+
}, /* @__PURE__ */ React3.createElement(ThreadComponent.Header, {
|
|
277
346
|
detached: true
|
|
278
|
-
}, thread.name)) : /* @__PURE__ */ React3.createElement(
|
|
347
|
+
}, thread.name)) : /* @__PURE__ */ React3.createElement(ThreadComponent.Header, null, thread.name), /* @__PURE__ */ React3.createElement("div", {
|
|
279
348
|
role: "none",
|
|
280
349
|
className: buttonGroupClassNames
|
|
281
350
|
}, thread.status === "staged" && /* @__PURE__ */ React3.createElement(Tag, {
|
|
282
351
|
palette: "neutral"
|
|
283
|
-
}, t("draft button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React3.createElement(
|
|
352
|
+
}, t("draft button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React3.createElement(IconButton2, {
|
|
284
353
|
"data-testid": "thread.resolve",
|
|
285
354
|
variant: "ghost",
|
|
286
355
|
icon: thread?.status === "resolved" ? "ph--check--fill" : "ph--check--regular",
|
|
@@ -291,7 +360,7 @@ var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve
|
|
|
291
360
|
thread?.status !== "resolved" && hoverableControlItem
|
|
292
361
|
],
|
|
293
362
|
onClick: handleResolve
|
|
294
|
-
}), onThreadDelete && /* @__PURE__ */ React3.createElement(
|
|
363
|
+
}), onThreadDelete && /* @__PURE__ */ React3.createElement(IconButton2, {
|
|
295
364
|
"data-testid": "thread.delete",
|
|
296
365
|
variant: "ghost",
|
|
297
366
|
icon: "ph--x--regular",
|
|
@@ -313,7 +382,7 @@ var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve
|
|
|
313
382
|
extensions,
|
|
314
383
|
onSend: handleComment,
|
|
315
384
|
...textboxMetadata
|
|
316
|
-
}), /* @__PURE__ */ React3.createElement(
|
|
385
|
+
}), /* @__PURE__ */ React3.createElement(ThreadComponent.Status, {
|
|
317
386
|
activity
|
|
318
387
|
}, t("activity message")), /* @__PURE__ */ React3.createElement("div", {
|
|
319
388
|
role: "none",
|
|
@@ -378,10 +447,12 @@ var CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props })
|
|
|
378
447
|
// src/components/ThreadSettings.tsx
|
|
379
448
|
import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
|
|
380
449
|
import React5 from "react";
|
|
450
|
+
import { useTranslation as useTranslation4 } from "@dxos/react-ui";
|
|
381
451
|
import { ControlPage } from "@dxos/react-ui-form";
|
|
382
|
-
var ThreadSettings = ({ settings }) => {
|
|
452
|
+
var ThreadSettings = ({ settings: _settings }) => {
|
|
383
453
|
var _effect = _useSignals5();
|
|
384
454
|
try {
|
|
455
|
+
const { t: _t } = useTranslation4(meta.id);
|
|
385
456
|
return /* @__PURE__ */ React5.createElement(ControlPage, null);
|
|
386
457
|
} finally {
|
|
387
458
|
_effect.f();
|
|
@@ -389,14 +460,14 @@ var ThreadSettings = ({ settings }) => {
|
|
|
389
460
|
};
|
|
390
461
|
|
|
391
462
|
// src/components/index.ts
|
|
392
|
-
var ChannelContainer2 = lazy(() => import("./ChannelContainer-
|
|
393
|
-
var ChatContainer = lazy(() => import("./ChatContainer-
|
|
463
|
+
var ChannelContainer2 = lazy(() => import("./ChannelContainer-63GMQ753.mjs"));
|
|
464
|
+
var ChatContainer = lazy(() => import("./ChatContainer-MFKPXMIK.mjs"));
|
|
394
465
|
|
|
395
466
|
// src/components/ThreadComplementary.tsx
|
|
396
467
|
var ThreadComplementary = ({ subject }) => {
|
|
397
468
|
var _effect = _useSignals6();
|
|
398
469
|
try {
|
|
399
|
-
const { t } =
|
|
470
|
+
const { t } = useTranslation5(meta.id);
|
|
400
471
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
401
472
|
const identity = useIdentity2();
|
|
402
473
|
const { tx } = useThemeContext2();
|
|
@@ -420,7 +491,7 @@ var ThreadComplementary = ({ subject }) => {
|
|
|
420
491
|
]);
|
|
421
492
|
const space = getSpace2(subject);
|
|
422
493
|
const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));
|
|
423
|
-
const anchors = objectsAnchoredTo.toSorted((a, b) => sort?.(a, b) ?? 0).filter((anchor) => Obj.instanceOf(
|
|
494
|
+
const anchors = objectsAnchoredTo.toSorted((a, b) => sort?.(a, b) ?? 0).filter((anchor) => Obj.instanceOf(Thread_exports.Thread, Relation3.getSource(anchor))).concat(drafts ?? []);
|
|
424
495
|
const attended = useAttended();
|
|
425
496
|
const handleAttend = useCallback2((anchor) => {
|
|
426
497
|
const thread = Relation3.getSource(anchor);
|
|
@@ -509,8 +580,7 @@ var ThreadComplementary = ({ subject }) => {
|
|
|
509
580
|
onAcceptProposal: handleAcceptProposal
|
|
510
581
|
});
|
|
511
582
|
return /* @__PURE__ */ React6.createElement(StackItem.Content, {
|
|
512
|
-
toolbar: true
|
|
513
|
-
classNames: "overflow-hidden"
|
|
583
|
+
toolbar: true
|
|
514
584
|
}, /* @__PURE__ */ React6.createElement(Tabs.Root, {
|
|
515
585
|
value: showResolvedThreads ? "all" : "unresolved",
|
|
516
586
|
orientation: "horizontal",
|
|
@@ -546,4 +616,4 @@ export {
|
|
|
546
616
|
ChannelContainer2 as ChannelContainer,
|
|
547
617
|
ChatContainer
|
|
548
618
|
};
|
|
549
|
-
//# sourceMappingURL=chunk-
|
|
619
|
+
//# sourceMappingURL=chunk-Q7AKKZNY.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/CallDebugPanel.tsx", "../../../src/components/CallSidebar.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/components/index.ts", "../../../src/components/CommentsContainer.tsx", "../../../src/components/CommentsThreadContainer.tsx", "../../../src/components/ThreadSettings.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { WebRTCStats, type WebRTCStatsEvent } from '@peermetrics/webrtc-stats';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { truncateKey } from '@dxos/debug';\nimport { JsonView, Panel } from '@dxos/devtools';\nimport { log } from '@dxos/log';\nimport { IconButton, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';\n\nimport { type EncodedTrackName, type GlobalState } from '../calls';\nimport { meta } from '../meta';\n\nexport type CallDebugPanelProps = ThemedClassName<{\n state?: GlobalState;\n}>;\n\nexport const CallDebugPanel = ({ state }: CallDebugPanelProps) => {\n const { t } = useTranslation(meta.id);\n\n const [open, setOpen] = useState(false);\n const handleToggle = () => setOpen(!open);\n const [showServiceHistory, setShowServiceHistory] = useState(false);\n const handleToggleServiceHistory = () => setShowServiceHistory(!showServiceHistory);\n\n const handleCopyRaw = async () => {\n await navigator.clipboard.writeText(JSON.stringify({ users: state?.call?.users, stats }, null, 2));\n };\n\n const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);\n const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);\n\n const webrtcStats = useMemo(\n () =>\n new WebRTCStats({\n getStatsInterval: 1000,\n }),\n [],\n );\n const [stats, setStats] = useState<WebRTCStatsEvent['data']>();\n\n useEffect(() => {\n const pc = state?.media.peer?.session?.peerConnection;\n const handleStats = (stats: WebRTCStatsEvent) => {\n setStats(stats.data);\n };\n let added = false;\n if (pc && showDetailedWebRTCStats) {\n webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });\n webrtcStats.on('stats', handleStats as never);\n added = true;\n }\n return () => {\n try {\n if (pc && added) {\n webrtcStats.removeConnection({ pc });\n webrtcStats.removeListener('stats', handleStats as never);\n }\n } catch (error) {\n log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });\n }\n };\n }, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);\n\n const rows = useMemo(() => getCallStatusTable(state), [state?.call.users, state?.media.pulledAudioTracks]);\n\n return (\n <Panel\n id='meeting-status'\n icon='ph--video-conference--regular'\n open={open}\n onToggle={handleToggle}\n title={t('meeting status title')}\n maxHeight={false}\n info={<div className='flex items-center gap-2'> {state?.call.joined ? 'Active' : 'Inactive'}</div>}\n >\n <div className='flex flex-col w-full gap-2 text-xs'>\n <div className='flex items-center gap-2'>\n <Input.Root>\n <Input.Label classNames={'text-sm'}>{t('show webrtc stats title')}</Input.Label>\n <Input.Checkbox checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />\n </Input.Root>\n </div>\n <div className='flex items-center gap-2'>\n <Input.Root>\n <Input.Label classNames={'text-sm'}>{t('show calls history title')}</Input.Label>\n <Input.Checkbox checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />\n </Input.Root>\n </div>\n <div className='flex items-center gap-2'>\n <IconButton classNames={'text-sm'} icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />\n </div>\n <Table rows={rows} />\n {showDetailedWebRTCStats && <JsonView data={{ stats }} />}\n {showServiceHistory && <JsonView data={{ history: state?.media.peer?.history.get() }} />}\n </div>\n </Panel>\n );\n};\n\nconst getCallStatusTable = (state?: GlobalState): TableProps['rows'] => {\n if (!state || !state.call?.users) {\n return [];\n }\n\n const self = state.call.self;\n const users = state.call.users\n .filter((user) => user.id !== self!.id)\n .map((user) => {\n const isOk = {\n audio:\n user.tracks?.audio &&\n state.media.pulledAudioTracks[user.tracks?.audio as EncodedTrackName]?.ctx.disposed === false,\n video:\n user.tracks?.video &&\n state.media.pulledVideoStreams[user.tracks?.video as EncodedTrackName]?.ctx.disposed === false,\n screenshare:\n user.tracks?.screenshare &&\n state.media.pulledVideoStreams[user.tracks?.screenshare as EncodedTrackName]?.ctx.disposed === false,\n };\n\n return {\n ...user,\n isOk,\n };\n });\n\n return [\n ['users', state.call.users.length ?? 0],\n [\n '*self* ' + (self?.name ?? truncateKey(self!.id, 8)),\n self?.tracks?.audio && state.media.pushedAudioTrack ? 'AUD ✅' : 'AUD ❌',\n self?.tracks?.video && state.media.pushedVideoTrack ? 'VID ✅' : 'VID ❌',\n self?.tracks?.screenshareEnabled\n ? self.tracks.screenshareEnabled && state.media.pushedScreenshareTrack\n ? 'SCR ✅'\n : 'SCR ❌'\n : undefined,\n ],\n\n ...users.map((user) => [\n user.name ?? truncateKey(user.id, 8),\n user.isOk.audio ? 'AUD ✅' : 'AUD ❌',\n user.isOk.video ? 'VID ✅' : 'VID ❌',\n user.tracks?.screenshareEnabled ? (user.isOk.screenshare ? 'SCR ✅' : 'SCR ❌') : undefined,\n ]),\n ['ICE', state.media.peer?.session?.peerConnection.iceConnectionState ?? 'no connection'],\n ];\n};\n\nexport namespace Unit {\n export const KB = (n?: number) => ((n ?? 0) / 1_000).toFixed(2);\n}\n\nexport type TableProps = {\n rows: (string | number | undefined)[][];\n};\n\nexport const Table = ({ rows }: TableProps) => {\n return (\n <div className='w-full text-xs font-mono'>\n {rows.map(([prefix, label, value, unit], i) => (\n <div key={i} className='grid grid-cols-[3fr_1fr_1fr_1fr]'>\n <div className='p-1'>{prefix}</div>\n <div className='p-1'>{label}</div>\n <div className='p-1'>{value}</div>\n <div className='p-1'>{unit}</div>\n </div>\n ))}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\n\nimport { ThreadCapabilities } from '../capabilities';\n\nimport { ChannelContainer } from './ChannelContainer';\n\nexport const CallSidebar = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n return <ChannelContainer roomId={call.roomId} />;\n};\n\nexport default CallSidebar;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n Capabilities,\n CollaborationActions,\n LayoutAction,\n createIntent,\n useCapabilities,\n useCapability,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { Filter, Obj, Query, Relation } from '@dxos/echo';\nimport { Ref, fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { mx } from '@dxos/react-ui-theme';\nimport { AnchoredTo } from '@dxos/schema';\n\nimport { ThreadCapabilities } from '../capabilities';\nimport { CommentsContainer, type CommentsContainerProps } from '../components';\nimport { meta } from '../meta';\nimport { Thread, ThreadAction } from '../types';\n\nexport const ThreadComplementary = ({ subject }: { subject: any }) => {\n const { t } = useTranslation(meta.id);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const { tx } = useThemeContext();\n const subjectId = fullyQualifiedId(subject);\n\n const { state, getViewState } = useCapability(ThreadCapabilities.MutableState);\n const drafts = state.drafts[subjectId];\n const viewState = useMemo(() => getViewState(subjectId), [getViewState, subjectId]);\n const { showResolvedThreads } = viewState;\n const onChangeViewState = useCallback(\n (nextValue: string) => {\n viewState.showResolvedThreads = nextValue === 'all';\n },\n [viewState],\n );\n\n const anchorSorts = useCapabilities(Capabilities.AnchorSort);\n const sort = useMemo(\n () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,\n [anchorSorts, subject],\n );\n\n const space = getSpace(subject);\n const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));\n const anchors = objectsAnchoredTo\n .toSorted((a, b) => sort?.(a, b) ?? 0)\n .filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))\n .concat(drafts ?? []);\n\n const attended = useAttended();\n\n const handleAttend = useCallback(\n (anchor: AnchoredTo) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const threadId = fullyQualifiedId(thread);\n\n if (state.current !== threadId) {\n state.current = threadId;\n\n // TODO(wittjosiah): Should this be a thread-specific intent?\n // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.\n // This may be overloading this intent or highjacking its intended purpose.\n void dispatch(\n createIntent(LayoutAction.ScrollIntoView, {\n part: 'current',\n subject: fullyQualifiedId(subject),\n options: {\n cursor: anchor.anchor,\n ref: threadId,\n },\n }),\n );\n }\n },\n [state.current, dispatch, subject],\n );\n\n const handleComment = useCallback(\n async (anchor: AnchoredTo, text: string) => {\n await dispatch(\n createIntent(ThreadAction.AddMessage, { anchor, subject, sender: { identityDid: identity?.did }, text }),\n );\n\n const thread = Relation.getSource(anchor) as Thread.Thread;\n state.current = fullyQualifiedId(thread);\n },\n [dispatch, identity, subject],\n );\n\n const handleResolve = useCallback(\n (anchor: AnchoredTo) =>\n dispatch(createIntent(ThreadAction.ToggleResolved, { thread: Relation.getSource(anchor) as Thread.Thread })),\n [dispatch],\n );\n\n const handleThreadDelete = useCallback(\n (anchor: AnchoredTo) => dispatch(createIntent(ThreadAction.Delete, { anchor, subject })),\n [dispatch, subject],\n );\n\n const handleMessageDelete = useCallback(\n (anchor: AnchoredTo, messageId: string) =>\n dispatch(createIntent(ThreadAction.DeleteMessage, { anchor, subject, messageId })),\n [dispatch, subject],\n );\n\n const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(\n async (anchor, messageId) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));\n const message = thread.messages[messageIndex]?.target;\n const proposal = message?.blocks.find((block) => block._tag === 'proposal');\n if (!proposal || !anchor.anchor) {\n return;\n }\n\n await dispatch(\n createIntent(CollaborationActions.AcceptProposal, {\n subject,\n anchor: anchor.anchor,\n proposal,\n }),\n );\n await dispatch(createIntent(ThreadAction.ToggleResolved, { thread }));\n },\n [dispatch, subject],\n );\n\n const comments = (\n <CommentsContainer\n anchors={anchors}\n currentId={attended.includes(subjectId) ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n );\n\n return (\n <StackItem.Content toolbar>\n <Tabs.Root\n value={showResolvedThreads ? 'all' : 'unresolved'}\n orientation='horizontal'\n classNames={[\n 'contents [&_[role=\"tabpanel\"]]:min-bs-0 [&_[role=\"tabpanel\"]]:overflow-y-auto [&_[role=\"tabpanel\"]]:scrollbar-thin',\n ]}\n onValueChange={onChangeViewState}\n >\n {/* TODO(burdon): Standardize (like Tollbar). */}\n <Tabs.Tablist classNames={mx('bg-toolbarSurface border-b border-subduedSeparator')}>\n <Tabs.Tab value='unresolved' classNames='text-sm'>\n {t('show unresolved label')}\n </Tabs.Tab>\n <Tabs.Tab value='all' classNames='text-sm'>\n {t('show all label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n <div className='overflow-y-auto'>\n <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>\n <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>\n </div>\n </Tabs.Root>\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const ChannelContainer = lazy(() => import('./ChannelContainer'));\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './Call';\nexport * from './CallDebugPanel';\nexport * from './CallSidebar';\nexport * from './CommentsContainer';\nexport * from './CommentsThreadContainer';\nexport * from './MessageContainer';\nexport * from './ThreadComplementary';\nexport * from './ThreadSettings';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { Relation } from '@dxos/echo';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';\nimport { type AnchoredTo } from '@dxos/schema';\n\nimport { meta } from '../meta';\nimport { type Thread } from '../types';\n\nimport { CommentsThreadContainer, type CommentsThreadContainerProps } from './CommentsThreadContainer';\n\nexport type CommentsContainerProps = Omit<CommentsThreadContainerProps, 'anchor' | 'current'> & {\n anchors: AnchoredTo[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Root container for collection of comment threads.\n */\nexport const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsContainerProps) => {\n const { t } = useTranslation(meta.id);\n\n // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.\n const filteredAnchors = showResolvedThreads\n ? anchors.filter((anchor) => !!Relation.getSource(anchor))\n : anchors.filter((anchor) => {\n const thread = Relation.getSource(anchor);\n return thread && thread.status !== 'resolved';\n });\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n if (filteredAnchors.length === 0) {\n return (\n <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>\n <Callout.Root>\n <Callout.Title>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='inline-block' />,\n },\n }}\n />\n </Callout.Title>\n </Callout.Root>\n </div>\n );\n }\n\n return (\n <div>\n {filteredAnchors.map((anchor) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const threadId = fullyQualifiedId(thread);\n return <CommentsThreadContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;\n })}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Ref, Relation } from '@dxos/echo';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread as ThreadComponent,\n type ThreadRootProps,\n} from '@dxos/react-ui-thread';\nimport { type AnchoredTo } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { type Thread } from '../types';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';\n\nexport type CommentsThreadContainerProps = {\n anchor: AnchoredTo;\n onAttend?: (anchor: AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo) => void;\n onAcceptProposal?: (anchor: AnchoredTo, messageId: string) => void;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const CommentsThreadContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n onAcceptProposal,\n}: CommentsThreadContainerProps) => {\n const { themeMode } = useThemeContext();\n const { t } = useTranslation(meta.id);\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.key);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const activity = useStatus(space, fullyQualifiedId(thread));\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [state, setState] = useState({});\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: ({ text }) => (messageRef.current = text) }),\n command,\n ],\n [state],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n setState({});\n\n return true;\n }, [anchor, identity]);\n\n return (\n <ThreadComponent.Root\n id={fullyQualifiedId(thread)}\n classNames='pbs-2 border-be border-subduedSeparator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>\n </Tooltip.Trigger>\n ) : (\n <ThreadComponent.Header>{thread.name}</ThreadComponent.Header>\n )}\n <div role='none' className={buttonGroupClassNames}>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <IconButton\n data-testid='thread.resolve'\n variant='ghost'\n icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}\n iconOnly\n label={t('resolve thread label')}\n classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}\n onClick={handleResolve}\n />\n )}\n {onThreadDelete && (\n <IconButton\n data-testid='thread.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete thread label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleThreadDelete}\n />\n )}\n </div>\n </div>\n\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {Ref.Array.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer\n key={message.id}\n editable\n message={message}\n members={members}\n onDelete={handleMessageDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n ))}\n\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n\n <ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>\n\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </ThreadComponent.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useTranslation } from '@dxos/react-ui';\nimport { ControlPage } from '@dxos/react-ui-form';\n\nimport { meta } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport const ThreadSettings = ({ settings: _settings }: { settings: ThreadSettingsProps }) => {\n const { t: _t } = useTranslation(meta.id);\n return <ControlPage></ControlPage>;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["WebRTCStats", "React", "useEffect", "useMemo", "useState", "truncateKey", "JsonView", "Panel", "log", "IconButton", "Input", "useTranslation", "CallDebugPanel", "state", "t", "useTranslation", "meta", "id", "open", "setOpen", "useState", "handleToggle", "showServiceHistory", "setShowServiceHistory", "handleToggleServiceHistory", "handleCopyRaw", "navigator", "clipboard", "writeText", "JSON", "stringify", "users", "call", "stats", "showDetailedWebRTCStats", "setShowDetailedWebRTCStats", "handleShowDetailedWebRTCStats", "webrtcStats", "useMemo", "WebRTCStats", "getStatsInterval", "setStats", "useEffect", "pc", "media", "peer", "session", "peerConnection", "handleStats", "data", "added", "addConnection", "peerId", "connectionId", "on", "removeConnection", "removeListener", "error", "log", "rows", "getCallStatusTable", "pulledAudioTracks", "Panel", "icon", "onToggle", "title", "maxHeight", "info", "div", "className", "joined", "Input", "Root", "Label", "classNames", "Checkbox", "checked", "onCheckedChange", "IconButton", "label", "onClick", "Table", "JsonView", "history", "get", "self", "filter", "user", "map", "isOk", "audio", "tracks", "ctx", "disposed", "video", "pulledVideoStreams", "screenshare", "length", "name", "truncateKey", "pushedAudioTrack", "pushedVideoTrack", "screenshareEnabled", "pushedScreenshareTrack", "undefined", "iceConnectionState", "Unit", "KB", "n", "toFixed", "prefix", "value", "unit", "i", "key", "React", "useCapability", "CallSidebar", "call", "useCapability", "ThreadCapabilities", "CallManager", "React", "ChannelContainer", "roomId", "React", "useCallback", "useMemo", "Capabilities", "CollaborationActions", "LayoutAction", "createIntent", "useCapabilities", "useCapability", "useIntentDispatcher", "Filter", "Obj", "Query", "Relation", "Ref", "fullyQualifiedId", "getSpace", "useQuery", "useIdentity", "useThemeContext", "useTranslation", "useAttended", "StackItem", "Tabs", "mx", "AnchoredTo", "lazy", "React", "useEffect", "Relation", "fullyQualifiedId", "Callout", "Icon", "Trans", "useTranslation", "React", "useCallback", "useMemo", "useRef", "useState", "Ref", "Relation", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "IconButton", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadComponent", "isNonNullable", "CommentsThreadContainer", "anchor", "current", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "themeMode", "useThemeContext", "t", "useTranslation", "meta", "id", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "detached", "thread", "Relation", "getSource", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "textboxMetadata", "getMessageMetadata", "state", "setState", "useState", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "handleThreadDelete", "handleAcceptProposal", "handleComment", "React", "ThreadComponent", "Root", "classNames", "onClickCapture", "onFocusCapture", "div", "role", "className", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Tooltip", "Trigger", "asChild", "content", "side", "Header", "name", "buttonGroupClassNames", "status", "Tag", "palette", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "buttonClassNames", "hoverableControlItem", "onClick", "Ref", "Array", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "editable", "onDelete", "MessageTextbox", "onSend", "Status", "ref", "CommentsContainer", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "meta", "id", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "role", "className", "Callout", "Root", "Title", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "fullyQualifiedId", "CommentsThreadContainer", "key", "current", "React", "useTranslation", "ControlPage", "ThreadSettings", "settings", "_settings", "t", "_t", "useTranslation", "meta", "id", "React", "ControlPage", "ChannelContainer", "lazy", "ChatContainer", "ThreadComplementary", "subject", "t", "useTranslation", "meta", "id", "dispatchPromise", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "tx", "useThemeContext", "subjectId", "fullyQualifiedId", "state", "getViewState", "useCapability", "ThreadCapabilities", "MutableState", "drafts", "viewState", "useMemo", "showResolvedThreads", "onChangeViewState", "useCallback", "nextValue", "anchorSorts", "useCapabilities", "Capabilities", "AnchorSort", "sort", "find", "key", "Obj", "getTypename", "space", "getSpace", "objectsAnchoredTo", "useQuery", "Query", "select", "Filter", "ids", "targetOf", "AnchoredTo", "anchors", "toSorted", "a", "b", "filter", "anchor", "instanceOf", "Thread", "Relation", "getSource", "concat", "attended", "useAttended", "handleAttend", "thread", "threadId", "current", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "ref", "handleComment", "text", "ThreadAction", "AddMessage", "sender", "identityDid", "did", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "handleAcceptProposal", "messageIndex", "messages", "findIndex", "Ref", "hasObjectId", "message", "target", "proposal", "blocks", "block", "_tag", "CollaborationActions", "AcceptProposal", "comments", "React", "CommentsContainer", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "StackItem", "Content", "toolbar", "Tabs", "Root", "value", "orientation", "classNames", "onValueChange", "Tablist", "mx", "Tab", "div", "className", "Tabpanel"]
|
|
7
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
ThreadCapabilities
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZQAGII7M.mjs";
|
|
5
5
|
import {
|
|
6
6
|
ChatContainer_default
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NWUUMKVQ.mjs";
|
|
8
8
|
import {
|
|
9
9
|
useDebugMode
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-2MMJF7DW.mjs";
|
|
11
11
|
import {
|
|
12
12
|
meta
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-XI45H4IV.mjs";
|
|
14
14
|
|
|
15
15
|
// src/components/ChannelContainer.tsx
|
|
16
16
|
import { useSignals as _useSignals10 } from "@preact-signals/safe-react/tracking";
|
|
@@ -589,7 +589,7 @@ import React8 from "react";
|
|
|
589
589
|
import { useAppGraph, useCapability as useCapability2 } from "@dxos/app-framework";
|
|
590
590
|
import { useActions, useNode } from "@dxos/plugin-graph";
|
|
591
591
|
import { fullyQualifiedId } from "@dxos/react-client/echo";
|
|
592
|
-
import { Icon as Icon2, IconButton as IconButton2, Toolbar as
|
|
592
|
+
import { Icon as Icon2, IconButton as IconButton2, Toolbar as NaturalToolbar, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
593
593
|
import { groupHoverControlItemWithTransition as groupHoverControlItemWithTransition2, mx as mx5 } from "@dxos/react-ui-theme";
|
|
594
594
|
var Toolbar = ({ classNames, channel, participants, autoHideControls = true, onJoin, onLeave }) => {
|
|
595
595
|
var _effect = _useSignals8();
|
|
@@ -603,7 +603,7 @@ var Toolbar = ({ classNames, channel, participants, autoHideControls = true, onJ
|
|
|
603
603
|
const canSharescreen = typeof navigator.mediaDevices !== "undefined" && navigator.mediaDevices.getDisplayMedia !== void 0;
|
|
604
604
|
return /* @__PURE__ */ React8.createElement("div", {
|
|
605
605
|
className: mx5("z-20 flex justify-center m-8", autoHideControls && groupHoverControlItemWithTransition2)
|
|
606
|
-
}, /* @__PURE__ */ React8.createElement(
|
|
606
|
+
}, /* @__PURE__ */ React8.createElement(NaturalToolbar.Root, {
|
|
607
607
|
classNames: [
|
|
608
608
|
"p-2 bg-modalSurface rounded-md shadow-md",
|
|
609
609
|
classNames
|
|
@@ -645,7 +645,7 @@ var Toolbar = ({ classNames, channel, participants, autoHideControls = true, onJ
|
|
|
645
645
|
}, /* @__PURE__ */ React8.createElement(Icon2, {
|
|
646
646
|
icon: "ph--users--regular",
|
|
647
647
|
size: 4
|
|
648
|
-
}), /* @__PURE__ */ React8.createElement("div", null, participants)) || /* @__PURE__ */ React8.createElement(
|
|
648
|
+
}), /* @__PURE__ */ React8.createElement("div", null, participants)) || /* @__PURE__ */ React8.createElement(NaturalToolbar.Separator, {
|
|
649
649
|
variant: "gap"
|
|
650
650
|
}), call.joined && /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(ToggleButton, {
|
|
651
651
|
disabled: !canSharescreen,
|
|
@@ -795,7 +795,8 @@ var ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }) => {
|
|
|
795
795
|
try {
|
|
796
796
|
const space = getSpace(channel);
|
|
797
797
|
const callManager = useCapability4(ThreadCapabilities.CallManager);
|
|
798
|
-
const
|
|
798
|
+
const attendableId = fullyQualifiedId2(channel);
|
|
799
|
+
const roomId = _roomId ?? (channel ? attendableId : failUndefined());
|
|
799
800
|
const identity = useIdentity();
|
|
800
801
|
const isNamed = !!identity?.profile?.displayName;
|
|
801
802
|
const joinSound = useSoundEffect("JoinCall");
|
|
@@ -804,7 +805,7 @@ var ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }) => {
|
|
|
804
805
|
useEffect6(() => {
|
|
805
806
|
const ctx = new Context(void 0, {
|
|
806
807
|
F: __dxlog_file2,
|
|
807
|
-
L:
|
|
808
|
+
L: 52
|
|
808
809
|
});
|
|
809
810
|
callManager.left.on(ctx, (roomId2) => {
|
|
810
811
|
extensions.forEach((extension) => {
|
|
@@ -846,7 +847,7 @@ var ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }) => {
|
|
|
846
847
|
} catch (err) {
|
|
847
848
|
log.catch(err, void 0, {
|
|
848
849
|
F: __dxlog_file2,
|
|
849
|
-
L:
|
|
850
|
+
L: 96,
|
|
850
851
|
S: void 0,
|
|
851
852
|
C: (f, a) => f(...a)
|
|
852
853
|
});
|
|
@@ -862,7 +863,7 @@ var ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }) => {
|
|
|
862
863
|
} catch (err) {
|
|
863
864
|
log.catch(err, void 0, {
|
|
864
865
|
F: __dxlog_file2,
|
|
865
|
-
L:
|
|
866
|
+
L: 108,
|
|
866
867
|
S: void 0,
|
|
867
868
|
C: (f, a) => f(...a)
|
|
868
869
|
});
|
|
@@ -878,20 +879,21 @@ var ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }) => {
|
|
|
878
879
|
]);
|
|
879
880
|
const isJoined = callManager.joined && callManager.roomId === roomId;
|
|
880
881
|
return /* @__PURE__ */ React10.createElement(StackItem.Content, {
|
|
881
|
-
|
|
882
|
-
|
|
882
|
+
classNames: isJoined && "bs-full",
|
|
883
|
+
toolbar: !isJoined
|
|
883
884
|
}, isJoined && !isNamed && /* @__PURE__ */ React10.createElement(DisplayNameMissing, null), isJoined && isNamed && /* @__PURE__ */ React10.createElement(Call.Root, null, /* @__PURE__ */ React10.createElement(Call.Grid, {
|
|
884
885
|
fullscreen
|
|
885
886
|
}), /* @__PURE__ */ React10.createElement(Call.Toolbar, {
|
|
886
887
|
channel,
|
|
887
888
|
onLeave: handleLeave
|
|
888
889
|
})), !isJoined && channel && channel.defaultThread.target && space && /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(ChannelToolbar, {
|
|
889
|
-
attendableId
|
|
890
|
+
attendableId,
|
|
890
891
|
role,
|
|
891
892
|
onJoinCall: handleJoin
|
|
892
893
|
}), /* @__PURE__ */ React10.createElement(ChatContainer_default, {
|
|
893
894
|
space,
|
|
894
|
-
thread: channel.defaultThread.target
|
|
895
|
+
thread: channel.defaultThread.target,
|
|
896
|
+
classNames: "container-max-width"
|
|
895
897
|
})));
|
|
896
898
|
} finally {
|
|
897
899
|
_effect.f();
|
|
@@ -962,7 +964,7 @@ var useChannelToolbarActions = (onJoinCall) => {
|
|
|
962
964
|
}), []);
|
|
963
965
|
return useMenuActions(creator);
|
|
964
966
|
};
|
|
965
|
-
var ChannelToolbar = ({ attendableId, role, onJoinCall
|
|
967
|
+
var ChannelToolbar = ({ attendableId, role, onJoinCall }) => {
|
|
966
968
|
var _effect = _useSignals10();
|
|
967
969
|
try {
|
|
968
970
|
const menuProps = useChannelToolbarActions(onJoinCall);
|
|
@@ -972,7 +974,7 @@ var ChannelToolbar = ({ attendableId, role, onJoinCall, classNames }) => {
|
|
|
972
974
|
...menuProps,
|
|
973
975
|
attendableId
|
|
974
976
|
}, /* @__PURE__ */ React10.createElement(ToolbarMenu, {
|
|
975
|
-
|
|
977
|
+
textBlockWidth: true
|
|
976
978
|
})));
|
|
977
979
|
} finally {
|
|
978
980
|
_effect.f();
|
|
@@ -984,4 +986,4 @@ export {
|
|
|
984
986
|
ChannelContainer,
|
|
985
987
|
ChannelContainer_default
|
|
986
988
|
};
|
|
987
|
-
//# sourceMappingURL=chunk-
|
|
989
|
+
//# sourceMappingURL=chunk-QCQAAU6J.mjs.map
|