@dxos/plugin-thread 0.8.4-main.e098934 → 0.8.4-main.e8ec1fe
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-NDIH62Q4.mjs +17 -0
- package/dist/lib/browser/ChatContainer-6FVFME3R.mjs +16 -0
- package/dist/lib/browser/{app-graph-builder-FHAOPO57.mjs → app-graph-builder-URVQHGMR.mjs} +32 -32
- package/dist/lib/browser/app-graph-builder-URVQHGMR.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs +101 -0
- package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs.map +7 -0
- package/dist/lib/browser/{call-manager-RMPTWSTF.mjs → call-manager-4YFT4XA6.mjs} +8 -7
- package/dist/lib/{node-esm/call-manager-QAREJFVX.mjs.map → browser/call-manager-4YFT4XA6.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-PBMNFG3B.mjs → chunk-6LWKNZUV.mjs} +18 -17
- package/dist/lib/browser/chunk-6LWKNZUV.mjs.map +7 -0
- package/dist/lib/browser/chunk-CFC7LEPD.mjs +18 -0
- package/dist/lib/browser/chunk-CFC7LEPD.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-7W7QK5ZP.mjs → chunk-F36NHPJG.mjs} +37 -34
- package/dist/lib/browser/chunk-F36NHPJG.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ZH2WPTNP.mjs → chunk-HKI7FUMB.mjs} +65 -72
- package/dist/lib/browser/chunk-HKI7FUMB.mjs.map +7 -0
- package/dist/lib/browser/{chunk-XYUJXHYV.mjs → chunk-ISCHODBV.mjs} +1 -1
- package/dist/lib/browser/{chunk-XYUJXHYV.mjs.map → chunk-ISCHODBV.mjs.map} +2 -2
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-JDFDDUTH.mjs +23 -0
- package/dist/lib/browser/chunk-JDFDDUTH.mjs.map +7 -0
- package/dist/lib/browser/{chunk-RI3Z6MK3.mjs → chunk-KOBXMDCI.mjs} +68 -67
- package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +7 -0
- package/dist/lib/browser/chunk-QM34EZQK.mjs +20 -0
- package/dist/lib/browser/chunk-QM34EZQK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KTWYVC5X.mjs → chunk-R5UOPOO7.mjs} +44 -49
- package/dist/lib/browser/chunk-R5UOPOO7.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ZCEU5K23.mjs → chunk-ZCW3NSDZ.mjs} +139 -236
- package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +41 -42
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-J7OCP2P6.mjs → intent-resolver-S3F7DVFM.mjs} +33 -99
- package/dist/lib/browser/intent-resolver-S3F7DVFM.mjs.map +7 -0
- package/dist/lib/browser/{markdown-Z677YORA.mjs → markdown-454GFKEZ.mjs} +25 -23
- package/dist/lib/browser/markdown-454GFKEZ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-root-ZB5ZA4I6.mjs +29 -0
- package/dist/lib/browser/react-root-ZB5ZA4I6.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-GVGZRBDK.mjs → react-surface-MBLTXSOC.mjs} +38 -36
- package/dist/lib/browser/react-surface-MBLTXSOC.mjs.map +7 -0
- package/dist/lib/browser/{settings-GRKEID73.mjs → settings-JN2HHORY.mjs} +6 -5
- package/dist/lib/{node-esm/settings-F2ODVNNW.mjs.map → browser/settings-JN2HHORY.mjs.map} +1 -1
- package/dist/lib/browser/{state-2T4KDWBX.mjs → state-UYPLBGZJ.mjs} +6 -5
- package/dist/lib/{node-esm/state-62TQKQVB.mjs.map → browser/state-UYPLBGZJ.mjs.map} +1 -1
- package/dist/lib/browser/types/index.mjs +7 -10
- package/dist/lib/node-esm/ChannelContainer-NGSDMNEE.mjs +18 -0
- package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs +17 -0
- package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-XEYWX5FC.mjs → app-graph-builder-2IH5RPR7.mjs} +32 -32
- package/dist/lib/node-esm/app-graph-builder-2IH5RPR7.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs +102 -0
- package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs.map +7 -0
- package/dist/lib/node-esm/{call-manager-QAREJFVX.mjs → call-manager-UMUXEYH5.mjs} +8 -7
- package/dist/lib/{browser/call-manager-RMPTWSTF.mjs.map → node-esm/call-manager-UMUXEYH5.mjs.map} +1 -1
- package/dist/lib/node-esm/chunk-2AEIN5MI.mjs +22 -0
- package/dist/lib/node-esm/chunk-2AEIN5MI.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-3VRYXHKX.mjs +25 -0
- package/dist/lib/node-esm/chunk-3VRYXHKX.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-TIPIOH2J.mjs → chunk-7KZWZS2U.mjs} +139 -236
- package/dist/lib/node-esm/chunk-7KZWZS2U.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-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-P6E247RF.mjs → chunk-MEIWWPR2.mjs} +44 -49
- package/dist/lib/node-esm/chunk-MEIWWPR2.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LE2LIYGX.mjs → chunk-MM6HOX5W.mjs} +65 -72
- package/dist/lib/node-esm/chunk-MM6HOX5W.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-JNPKMT7O.mjs → chunk-PZH2EDU5.mjs} +68 -67
- package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-RT6NRL2I.mjs +19 -0
- package/dist/lib/node-esm/chunk-RT6NRL2I.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs → chunk-VBI32FGI.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs.map → chunk-VBI32FGI.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-SNKFZQST.mjs → chunk-Y3F2SGNH.mjs} +37 -34
- package/dist/lib/node-esm/chunk-Y3F2SGNH.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-DKCQCENK.mjs → chunk-Z4GUSLWL.mjs} +18 -17
- package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +41 -42
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-SR2LW4HF.mjs → intent-resolver-UES35EMJ.mjs} +33 -99
- package/dist/lib/node-esm/intent-resolver-UES35EMJ.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-FL4IXLRP.mjs → markdown-7JUG6J7B.mjs} +25 -23
- package/dist/lib/node-esm/markdown-7JUG6J7B.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-root-3XXULWUN.mjs +30 -0
- package/dist/lib/node-esm/react-root-3XXULWUN.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-WLQUVRAX.mjs → react-surface-DCF4DD7B.mjs} +38 -36
- package/dist/lib/node-esm/react-surface-DCF4DD7B.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-F2ODVNNW.mjs → settings-VSPM3BIM.mjs} +6 -5
- package/dist/lib/{browser/settings-GRKEID73.mjs.map → node-esm/settings-VSPM3BIM.mjs.map} +1 -1
- package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-XNWOLBNE.mjs} +6 -5
- package/dist/lib/{browser/state-2T4KDWBX.mjs.map → node-esm/state-XNWOLBNE.mjs.map} +1 -1
- package/dist/lib/node-esm/types/index.mjs +7 -10
- 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-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/blueprint-definition.d.ts +5 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- 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/index.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.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.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 +73 -8
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Chat.stories.d.ts +73 -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 +1 -2
- package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/components/CommentsContainer.d.ts +2 -2
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts +8 -8
- 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/MessageContainer.d.ts +2 -2
- package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +2 -2
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +2 -2
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
- package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
- package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
- 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 +3 -3
- 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/functions/create-proposals.d.ts +6 -0
- package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
- package/dist/types/src/functions/index.d.ts +2 -0
- package/dist/types/src/functions/index.d.ts.map +1 -0
- package/dist/types/src/hooks/analytics.d.ts +2 -2
- package/dist/types/src/hooks/analytics.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -2
- package/dist/types/src/hooks/index.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 +72 -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/index.d.ts +1 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +30 -117
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +62 -58
- package/src/ThreadPlugin.tsx +139 -132
- package/src/calls/media-manager.ts +9 -6
- package/src/calls/util/stub-media-streams.ts +2 -2
- package/src/calls-service.stories.tsx +2 -5
- package/src/capabilities/app-graph-builder.ts +41 -30
- package/src/capabilities/blueprint-definition.ts +38 -0
- package/src/capabilities/capabilities.ts +7 -7
- package/src/capabilities/index.ts +1 -1
- package/src/capabilities/intent-resolver.ts +22 -59
- package/src/capabilities/markdown.ts +5 -3
- package/src/capabilities/react-root.tsx +2 -2
- package/src/capabilities/react-surface.tsx +25 -23
- package/src/components/Call/Call.tsx +1 -1
- package/src/components/Call/Toolbar.tsx +5 -5
- package/src/components/CallDebugPanel.tsx +12 -14
- package/src/components/CallSidebar.tsx +1 -1
- package/src/components/ChannelContainer.stories.tsx +10 -10
- package/src/components/ChannelContainer.tsx +19 -15
- package/src/components/Chat.stories.tsx +14 -19
- package/src/components/ChatContainer.tsx +29 -21
- package/src/components/Comments.stories.tsx +11 -17
- package/src/components/CommentsContainer.tsx +5 -7
- package/src/components/CommentsThreadContainer.tsx +31 -27
- package/src/components/Lobby/Lobby.tsx +1 -1
- package/src/components/Media/VideoObject.stories.tsx +12 -7
- package/src/components/Media/VideoObject.tsx +1 -1
- package/src/components/MessageContainer.tsx +6 -6
- package/src/components/Participant/Participant.tsx +1 -1
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +3 -4
- package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +2 -2
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +4 -5
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +5 -2
- package/src/components/{ThreadComplementary.tsx → ThreadCompanion.tsx} +41 -34
- package/src/components/ThreadSettings.tsx +4 -5
- package/src/components/index.ts +4 -4
- package/src/components/testing.ts +7 -9
- package/src/extensions/threads.ts +25 -16
- package/src/functions/create-proposals.ts +56 -0
- package/src/functions/index.ts +5 -0
- package/src/hooks/analytics.ts +4 -7
- package/src/hooks/index.ts +3 -2
- package/src/hooks/useVideoStreamTrack.tsx +1 -1
- package/src/meta.ts +9 -5
- package/src/testing/stories.ts +3 -6
- package/src/translations.ts +4 -3
- package/src/types/Channel.ts +26 -0
- package/src/types/index.ts +1 -1
- package/src/types/types.ts +18 -27
- package/src/util.ts +1 -1
- package/dist/lib/browser/ChannelContainer-4PYFOIDK.mjs +0 -16
- package/dist/lib/browser/ChatContainer-EXNNREYB.mjs +0 -15
- package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +0 -7
- package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
- package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
- package/dist/lib/browser/chunk-7W7QK5ZP.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-G4CNILRR.mjs +0 -23
- package/dist/lib/browser/chunk-G4CNILRR.mjs.map +0 -7
- package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
- package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +0 -7
- package/dist/lib/browser/chunk-PBMNFG3B.mjs.map +0 -7
- package/dist/lib/browser/chunk-RI3Z6MK3.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZH2WPTNP.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-J7OCP2P6.mjs.map +0 -7
- package/dist/lib/browser/markdown-Z677YORA.mjs.map +0 -7
- package/dist/lib/browser/react-root-XKOD4KRB.mjs +0 -28
- package/dist/lib/browser/react-root-XKOD4KRB.mjs.map +0 -7
- package/dist/lib/browser/react-surface-GVGZRBDK.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-KQQEZWUN.mjs +0 -17
- package/dist/lib/node-esm/ChatContainer-QVQKFBWA.mjs +0 -16
- package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4T45PCKP.mjs +0 -25
- package/dist/lib/node-esm/chunk-4T45PCKP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-DKCQCENK.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-JNPKMT7O.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LE2LIYGX.mjs.map +0 -7
- 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-SNKFZQST.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-SR2LW4HF.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-4JWDRIQB.mjs +0 -29
- package/dist/lib/node-esm/react-root-4JWDRIQB.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-WLQUVRAX.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/capabilities/toolkit.d.ts +0 -5
- package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
- package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
- package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
- package/dist/types/src/types/schema.d.ts +0 -177
- package/dist/types/src/types/schema.d.ts.map +0 -1
- package/src/capabilities/toolkit.ts +0 -78
- package/src/types/schema.ts +0 -33
- /package/dist/lib/browser/{ChannelContainer-4PYFOIDK.mjs.map → ChannelContainer-NDIH62Q4.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-EXNNREYB.mjs.map → ChatContainer-6FVFME3R.mjs.map} +0 -0
- /package/dist/lib/{node-esm/ChannelContainer-KQQEZWUN.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-QVQKFBWA.mjs.map → ChannelContainer-NGSDMNEE.mjs.map} +0 -0
|
@@ -13,9 +13,7 @@ import { IconButton, Input, type ThemedClassName, useTranslation } from '@dxos/r
|
|
|
13
13
|
import { type EncodedTrackName, type GlobalState } from '../calls';
|
|
14
14
|
import { meta } from '../meta';
|
|
15
15
|
|
|
16
|
-
export type CallDebugPanelProps = ThemedClassName<{
|
|
17
|
-
state?: GlobalState;
|
|
18
|
-
}>;
|
|
16
|
+
export type CallDebugPanelProps = ThemedClassName<{ state?: GlobalState }>;
|
|
19
17
|
|
|
20
18
|
export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
|
|
21
19
|
const { t } = useTranslation(meta.id);
|
|
@@ -73,24 +71,24 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
|
|
|
73
71
|
open={open}
|
|
74
72
|
onToggle={handleToggle}
|
|
75
73
|
title={t('meeting status title')}
|
|
76
|
-
maxHeight={false}
|
|
77
74
|
info={<div className='flex items-center gap-2'> {state?.call.joined ? 'Active' : 'Inactive'}</div>}
|
|
75
|
+
maxHeight={0}
|
|
78
76
|
>
|
|
79
|
-
<div className='flex flex-col
|
|
80
|
-
<div className='flex items-center gap-2'>
|
|
77
|
+
<div className='flex flex-col is-full text-xs'>
|
|
78
|
+
<div className='flex items-center gap-2 items-center'>
|
|
81
79
|
<Input.Root>
|
|
82
|
-
<Input.
|
|
83
|
-
<Input.
|
|
80
|
+
<Input.Switch checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />
|
|
81
|
+
<Input.Label>{t('show webrtc stats title')}</Input.Label>
|
|
84
82
|
</Input.Root>
|
|
85
83
|
</div>
|
|
86
|
-
<div className='flex items-center gap-2'>
|
|
84
|
+
<div className='flex items-center gap-2 items-center'>
|
|
87
85
|
<Input.Root>
|
|
88
|
-
<Input.
|
|
89
|
-
<Input.
|
|
86
|
+
<Input.Switch checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />
|
|
87
|
+
<Input.Label>{t('show calls history title')}</Input.Label>
|
|
90
88
|
</Input.Root>
|
|
91
89
|
</div>
|
|
92
|
-
<div className='flex items-center gap-2'>
|
|
93
|
-
<IconButton
|
|
90
|
+
<div className='flex items-center gap-2 items-center'>
|
|
91
|
+
<IconButton icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />
|
|
94
92
|
</div>
|
|
95
93
|
<Table rows={rows} />
|
|
96
94
|
{showDetailedWebRTCStats && <JsonView data={{ stats }} />}
|
|
@@ -160,7 +158,7 @@ export type TableProps = {
|
|
|
160
158
|
|
|
161
159
|
export const Table = ({ rows }: TableProps) => {
|
|
162
160
|
return (
|
|
163
|
-
<div className='
|
|
161
|
+
<div className='is-full text-xs font-mono'>
|
|
164
162
|
{rows.map(([prefix, label, value, unit], i) => (
|
|
165
163
|
<div key={i} className='grid grid-cols-[3fr_1fr_1fr_1fr]'>
|
|
166
164
|
<div className='p-1'>{prefix}</div>
|
|
@@ -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,19 +9,20 @@ 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';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
12
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
13
|
+
import { render } from '@dxos/storybook-utils';
|
|
14
|
+
import { Message, Thread } from '@dxos/types';
|
|
16
15
|
|
|
17
16
|
import { createThreadPlugins } from '../testing';
|
|
18
17
|
import { translations } from '../translations';
|
|
19
|
-
import {
|
|
18
|
+
import { Channel } from '../types';
|
|
20
19
|
|
|
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
|
-
const [channel] = useQuery(space, Query.type(
|
|
25
|
+
const [channel] = useQuery(space, Query.type(Channel.Channel));
|
|
27
26
|
if (!channel) {
|
|
28
27
|
return null;
|
|
29
28
|
}
|
|
@@ -34,13 +33,14 @@ const Story = ({ roomId }: ChannelContainerProps) => {
|
|
|
34
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
|
+
withLayout({ container: 'column' }),
|
|
39
40
|
withPluginManager({
|
|
40
41
|
plugins: [...(await createThreadPlugins())],
|
|
41
|
-
capabilities: [contributes(ClientCapabilities.Schema, [
|
|
42
|
+
capabilities: [contributes(ClientCapabilities.Schema, [Channel.Channel, Thread.Thread, Message.Message])],
|
|
42
43
|
}),
|
|
43
|
-
withLayout({ Container: ColumnContainer, classNames: 'w-[40rem] overflow-hidden' }),
|
|
44
44
|
],
|
|
45
45
|
parameters: {
|
|
46
46
|
translations,
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Atom } from '@effect-atom/atom-react';
|
|
6
6
|
import React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import { useCapabilities, useCapability } from '@dxos/app-framework';
|
|
8
|
+
import { useCapabilities, useCapability } from '@dxos/app-framework/react';
|
|
9
9
|
import { Context } from '@dxos/context';
|
|
10
10
|
import { failUndefined } from '@dxos/debug';
|
|
11
|
+
import { Obj } from '@dxos/echo';
|
|
11
12
|
import { log } from '@dxos/log';
|
|
12
13
|
import { useClient } from '@dxos/react-client';
|
|
13
|
-
import {
|
|
14
|
+
import { getSpace } from '@dxos/react-client/echo';
|
|
14
15
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
15
|
-
import { ElevationProvider, Input,
|
|
16
|
+
import { ElevationProvider, Input, useTranslation } from '@dxos/react-ui';
|
|
16
17
|
import { ControlGroup, ControlGroupButton, ControlItemInput } from '@dxos/react-ui-form';
|
|
17
18
|
import { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';
|
|
18
19
|
import { useSoundEffect } from '@dxos/react-ui-sfx';
|
|
@@ -20,13 +21,15 @@ import { StackItem } from '@dxos/react-ui-stack';
|
|
|
20
21
|
|
|
21
22
|
import { ThreadCapabilities } from '../capabilities';
|
|
22
23
|
import { meta } from '../meta';
|
|
23
|
-
import { type
|
|
24
|
+
import { type Channel } from '../types';
|
|
24
25
|
|
|
25
26
|
import { Call } from './Call';
|
|
26
27
|
import ChatContainer from './ChatContainer';
|
|
27
28
|
|
|
29
|
+
// TODO(burdon): Create Radix style layout.
|
|
30
|
+
|
|
28
31
|
export type ChannelContainerProps = {
|
|
29
|
-
channel?:
|
|
32
|
+
channel?: Channel.Channel;
|
|
30
33
|
roomId?: string;
|
|
31
34
|
role?: string;
|
|
32
35
|
fullscreen?: boolean;
|
|
@@ -38,7 +41,8 @@ export type ChannelContainerProps = {
|
|
|
38
41
|
export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }: ChannelContainerProps) => {
|
|
39
42
|
const space = getSpace(channel);
|
|
40
43
|
const callManager = useCapability(ThreadCapabilities.CallManager);
|
|
41
|
-
const
|
|
44
|
+
const attendableId = channel ? Obj.getDXN(channel).toString() : undefined;
|
|
45
|
+
const roomId = _roomId ?? attendableId ?? failUndefined();
|
|
42
46
|
const identity = useIdentity();
|
|
43
47
|
const isNamed = !!identity?.profile?.displayName;
|
|
44
48
|
const joinSound = useSoundEffect('JoinCall');
|
|
@@ -114,7 +118,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
|
|
|
114
118
|
const isJoined = callManager.joined && callManager.roomId === roomId;
|
|
115
119
|
|
|
116
120
|
return (
|
|
117
|
-
<StackItem.Content
|
|
121
|
+
<StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
|
|
118
122
|
{isJoined && !isNamed && <DisplayNameMissing />}
|
|
119
123
|
{isJoined && isNamed && (
|
|
120
124
|
<Call.Root>
|
|
@@ -124,8 +128,8 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
|
|
|
124
128
|
)}
|
|
125
129
|
{!isJoined && channel && channel.defaultThread.target && space && (
|
|
126
130
|
<>
|
|
127
|
-
<ChannelToolbar attendableId={
|
|
128
|
-
<ChatContainer space={space} thread={channel.defaultThread.target} />
|
|
131
|
+
<ChannelToolbar attendableId={attendableId} role={role} onJoinCall={handleJoin} />
|
|
132
|
+
<ChatContainer space={space} thread={channel.defaultThread.target} classNames='container-max-width' />
|
|
129
133
|
</>
|
|
130
134
|
)}
|
|
131
135
|
</StackItem.Content>
|
|
@@ -161,7 +165,7 @@ const DisplayNameMissing = () => {
|
|
|
161
165
|
const useChannelToolbarActions = (onJoinCall?: () => void) => {
|
|
162
166
|
const creator = useMemo(
|
|
163
167
|
() =>
|
|
164
|
-
|
|
168
|
+
Atom.make(() => {
|
|
165
169
|
return {
|
|
166
170
|
nodes: [
|
|
167
171
|
createMenuItemGroup('root', {
|
|
@@ -182,19 +186,19 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
|
|
|
182
186
|
return useMenuActions(creator);
|
|
183
187
|
};
|
|
184
188
|
|
|
185
|
-
type ChannelToolbarProps =
|
|
189
|
+
type ChannelToolbarProps = {
|
|
186
190
|
attendableId?: string;
|
|
187
191
|
role?: string;
|
|
188
192
|
onJoinCall?: () => void;
|
|
189
|
-
}
|
|
193
|
+
};
|
|
190
194
|
|
|
191
|
-
const ChannelToolbar = ({ attendableId, role, onJoinCall
|
|
195
|
+
const ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {
|
|
192
196
|
const menuProps = useChannelToolbarActions(onJoinCall);
|
|
193
197
|
|
|
194
198
|
return (
|
|
195
199
|
<ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
|
|
196
200
|
<MenuProvider {...menuProps} attendableId={attendableId}>
|
|
197
|
-
<ToolbarMenu
|
|
201
|
+
<ToolbarMenu textBlockWidth />
|
|
198
202
|
</MenuProvider>
|
|
199
203
|
</ElevationProvider>
|
|
200
204
|
);
|
|
@@ -2,26 +2,24 @@
|
|
|
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, { useState } from 'react';
|
|
9
7
|
|
|
10
8
|
import { Capabilities, IntentPlugin, contributes, createSurface } from '@dxos/app-framework';
|
|
11
9
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
12
|
-
import { Obj, Ref } from '@dxos/echo';
|
|
13
10
|
import { faker } from '@dxos/random';
|
|
14
11
|
import { useClient } from '@dxos/react-client';
|
|
15
12
|
import { type Space } from '@dxos/react-client/echo';
|
|
16
13
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
17
14
|
import { withClientProvider } from '@dxos/react-client/testing';
|
|
18
15
|
import { useAsyncEffect } from '@dxos/react-ui';
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { render
|
|
16
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
17
|
+
import { Thread as ThreadComponent } from '@dxos/react-ui-thread';
|
|
18
|
+
import { render } from '@dxos/storybook-utils';
|
|
19
|
+
import { Message, Thread } from '@dxos/types';
|
|
22
20
|
|
|
23
21
|
import { translations } from '../translations';
|
|
24
|
-
import {
|
|
22
|
+
import { Channel } from '../types';
|
|
25
23
|
|
|
26
24
|
import { ChatContainer } from './ChatContainer';
|
|
27
25
|
|
|
@@ -31,17 +29,12 @@ const DefaultStory = () => {
|
|
|
31
29
|
const client = useClient();
|
|
32
30
|
const identity = useIdentity();
|
|
33
31
|
const [space, setSpace] = useState<Space>();
|
|
34
|
-
const [channel, setChannel] = useState<
|
|
32
|
+
const [channel, setChannel] = useState<Channel.Channel | null>();
|
|
35
33
|
|
|
36
34
|
useAsyncEffect(async () => {
|
|
37
35
|
if (identity) {
|
|
38
36
|
const space = await client.spaces.create();
|
|
39
|
-
const channel = space.db.add(
|
|
40
|
-
Obj.make(ChannelType, {
|
|
41
|
-
defaultThread: Ref.make(Obj.make(ThreadType, { messages: [], status: 'active' })),
|
|
42
|
-
threads: [],
|
|
43
|
-
}),
|
|
44
|
-
);
|
|
37
|
+
const channel = space.db.add(Channel.make());
|
|
45
38
|
setSpace(space);
|
|
46
39
|
setChannel(channel);
|
|
47
40
|
}
|
|
@@ -60,9 +53,10 @@ const DefaultStory = () => {
|
|
|
60
53
|
|
|
61
54
|
const meta = {
|
|
62
55
|
title: 'plugins/plugin-thread/Chat',
|
|
63
|
-
component:
|
|
56
|
+
component: ThreadComponent.Root as any,
|
|
64
57
|
render: render(DefaultStory),
|
|
65
58
|
decorators: [
|
|
59
|
+
withTheme,
|
|
66
60
|
withPluginManager({
|
|
67
61
|
plugins: [IntentPlugin()],
|
|
68
62
|
capabilities: [
|
|
@@ -76,11 +70,12 @@ const meta = {
|
|
|
76
70
|
),
|
|
77
71
|
],
|
|
78
72
|
}),
|
|
79
|
-
|
|
80
|
-
withLayout({ fullscreen: true }),
|
|
81
|
-
withClientProvider({ createSpace: true, types: [ThreadType, ChannelType, DataType.Message] }),
|
|
73
|
+
withClientProvider({ createSpace: true, types: [Thread.Thread, Channel.Channel, Message.Message] }),
|
|
82
74
|
],
|
|
83
|
-
parameters: {
|
|
75
|
+
parameters: {
|
|
76
|
+
layout: 'fullscreen',
|
|
77
|
+
translations,
|
|
78
|
+
},
|
|
84
79
|
} satisfies Meta<typeof DefaultStory>;
|
|
85
80
|
|
|
86
81
|
export default meta;
|
|
@@ -5,25 +5,24 @@
|
|
|
5
5
|
import React, { useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
6
6
|
|
|
7
7
|
import { Obj, Ref } from '@dxos/echo';
|
|
8
|
-
import { type Space,
|
|
8
|
+
import { type Space, useMembers } from '@dxos/react-client/echo';
|
|
9
9
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
10
|
-
import { Icon, ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
10
|
+
import { Icon, ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
11
11
|
import { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';
|
|
12
12
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
13
13
|
import { mx } from '@dxos/react-ui-theme';
|
|
14
14
|
import {
|
|
15
15
|
MessageTextbox,
|
|
16
16
|
type MessageTextboxProps,
|
|
17
|
-
Thread,
|
|
17
|
+
Thread as ThreadComponent,
|
|
18
18
|
type ThreadRootProps,
|
|
19
19
|
threadLayout,
|
|
20
20
|
} from '@dxos/react-ui-thread';
|
|
21
|
-
import {
|
|
21
|
+
import { Message, type Thread } from '@dxos/types';
|
|
22
22
|
import { isNonNullable } from '@dxos/util';
|
|
23
23
|
|
|
24
24
|
import { useStatus } from '../hooks';
|
|
25
25
|
import { meta } from '../meta';
|
|
26
|
-
import { type ThreadType } from '../types';
|
|
27
26
|
import { getMessageMetadata } from '../util';
|
|
28
27
|
|
|
29
28
|
import { command } from './command-extension';
|
|
@@ -41,16 +40,25 @@ export const ChatHeading = ({ attendableId }: { attendableId?: string }) => {
|
|
|
41
40
|
);
|
|
42
41
|
};
|
|
43
42
|
|
|
44
|
-
export type ChatContainerProps =
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
export type ChatContainerProps = ThemedClassName<
|
|
44
|
+
{
|
|
45
|
+
space: Space;
|
|
46
|
+
thread: Thread.Thread;
|
|
47
|
+
context?: Obj.Any;
|
|
48
|
+
autoFocusTextbox?: boolean;
|
|
49
|
+
} & Pick<ThreadRootProps, 'current'>
|
|
50
|
+
>;
|
|
51
|
+
|
|
52
|
+
export const ChatContainer = ({
|
|
53
|
+
classNames,
|
|
54
|
+
space,
|
|
55
|
+
thread,
|
|
56
|
+
context,
|
|
57
|
+
current,
|
|
58
|
+
autoFocusTextbox,
|
|
59
|
+
}: ChatContainerProps) => {
|
|
52
60
|
const { t } = useTranslation(meta.id);
|
|
53
|
-
const id =
|
|
61
|
+
const id = Obj.getDXN(thread).toString();
|
|
54
62
|
const identity = useIdentity()!;
|
|
55
63
|
const members = useMembers(space?.key);
|
|
56
64
|
const activity = useStatus(space, id);
|
|
@@ -67,7 +75,7 @@ export const ChatContainer = ({ space, thread, context, current, autoFocusTextbo
|
|
|
67
75
|
() => [
|
|
68
76
|
createBasicExtensions({ placeholder: t('message placeholder') }),
|
|
69
77
|
createThemeExtensions({ themeMode }),
|
|
70
|
-
listener({ onChange: (text) => (messageRef.current = text) }),
|
|
78
|
+
listener({ onChange: ({ text }) => (messageRef.current = text) }),
|
|
71
79
|
command,
|
|
72
80
|
],
|
|
73
81
|
[themeMode, _count],
|
|
@@ -92,7 +100,7 @@ export const ChatContainer = ({ space, thread, context, current, autoFocusTextbo
|
|
|
92
100
|
|
|
93
101
|
thread.messages.push(
|
|
94
102
|
Ref.make(
|
|
95
|
-
Obj.make(
|
|
103
|
+
Obj.make(Message.Message, {
|
|
96
104
|
created: new Date().toISOString(),
|
|
97
105
|
sender: { identityDid: identity.did },
|
|
98
106
|
blocks: [{ _tag: 'text', text: messageRef.current }],
|
|
@@ -109,12 +117,13 @@ export const ChatContainer = ({ space, thread, context, current, autoFocusTextbo
|
|
|
109
117
|
};
|
|
110
118
|
|
|
111
119
|
return (
|
|
112
|
-
<
|
|
120
|
+
<ThreadComponent.Root
|
|
113
121
|
current={current}
|
|
114
122
|
id={id}
|
|
115
123
|
classNames={[
|
|
116
|
-
'bs-full
|
|
124
|
+
'bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden',
|
|
117
125
|
'transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0',
|
|
126
|
+
classNames,
|
|
118
127
|
]}
|
|
119
128
|
>
|
|
120
129
|
<ScrollArea.Root classNames='col-span-2'>
|
|
@@ -136,9 +145,8 @@ export const ChatContainer = ({ space, thread, context, current, autoFocusTextbo
|
|
|
136
145
|
</ScrollArea.Root>
|
|
137
146
|
|
|
138
147
|
<MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
</Thread.Root>
|
|
148
|
+
<ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>
|
|
149
|
+
</ThreadComponent.Root>
|
|
142
150
|
);
|
|
143
151
|
};
|
|
144
152
|
|
|
@@ -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
|
|
|
@@ -15,11 +13,11 @@ import { faker } from '@dxos/random';
|
|
|
15
13
|
import { useQuery, useSpace } from '@dxos/react-client/echo';
|
|
16
14
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
17
15
|
import { useAsyncEffect } from '@dxos/react-ui';
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
16
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
17
|
+
import { render } from '@dxos/storybook-utils';
|
|
18
|
+
import { AnchoredTo, Message, Thread } from '@dxos/types';
|
|
20
19
|
|
|
21
20
|
import { translations } from '../translations';
|
|
22
|
-
import { ThreadType } from '../types';
|
|
23
21
|
|
|
24
22
|
import { CommentsContainer } from './CommentsContainer';
|
|
25
23
|
import { createCommentThread, createProposalThread } from './testing';
|
|
@@ -29,7 +27,7 @@ faker.seed(1);
|
|
|
29
27
|
const DefaultStory = () => {
|
|
30
28
|
const identity = useIdentity();
|
|
31
29
|
const space = useSpace();
|
|
32
|
-
const anchors = useQuery(space, Query.type(AnchoredTo));
|
|
30
|
+
const anchors = useQuery(space, Query.type(AnchoredTo.AnchoredTo));
|
|
33
31
|
|
|
34
32
|
useAsyncEffect(async () => {
|
|
35
33
|
if (identity && space) {
|
|
@@ -37,14 +35,14 @@ const DefaultStory = () => {
|
|
|
37
35
|
const thread1 = space.db.add(createCommentThread(identity));
|
|
38
36
|
const thread2 = space.db.add(createProposalThread(identity));
|
|
39
37
|
space.db.add(
|
|
40
|
-
Relation.make(AnchoredTo, {
|
|
38
|
+
Relation.make(AnchoredTo.AnchoredTo, {
|
|
41
39
|
[Relation.Source]: thread1,
|
|
42
40
|
[Relation.Target]: object,
|
|
43
41
|
anchor: 'test',
|
|
44
42
|
}),
|
|
45
43
|
);
|
|
46
44
|
space.db.add(
|
|
47
|
-
Relation.make(AnchoredTo, {
|
|
45
|
+
Relation.make(AnchoredTo.AnchoredTo, {
|
|
48
46
|
[Relation.Source]: thread2,
|
|
49
47
|
[Relation.Target]: object,
|
|
50
48
|
anchor: 'test',
|
|
@@ -57,11 +55,7 @@ const DefaultStory = () => {
|
|
|
57
55
|
return null;
|
|
58
56
|
}
|
|
59
57
|
|
|
60
|
-
return
|
|
61
|
-
<div className='w-[30rem] overflow-y-auto bg-baseSurface'>
|
|
62
|
-
<CommentsContainer anchors={anchors} onThreadDelete={console.log} onAcceptProposal={console.log} />
|
|
63
|
-
</div>
|
|
64
|
-
);
|
|
58
|
+
return <CommentsContainer anchors={anchors} onThreadDelete={console.log} onAcceptProposal={console.log} />;
|
|
65
59
|
};
|
|
66
60
|
|
|
67
61
|
const meta = {
|
|
@@ -69,14 +63,14 @@ const meta = {
|
|
|
69
63
|
render: render(DefaultStory),
|
|
70
64
|
decorators: [
|
|
71
65
|
withTheme,
|
|
72
|
-
withLayout({
|
|
73
|
-
// TODO(wittjosiah): This shouldn't depend on app framework
|
|
74
|
-
//
|
|
66
|
+
withLayout({ container: 'column', scroll: true }),
|
|
67
|
+
// TODO(wittjosiah): This shouldn't depend on app framework (use withClientProvider instead).
|
|
68
|
+
// Currently this is required due to useOnEditAnalytics.
|
|
75
69
|
withPluginManager({
|
|
76
70
|
plugins: [
|
|
77
71
|
IntentPlugin(),
|
|
78
72
|
ClientPlugin({
|
|
79
|
-
types: [
|
|
73
|
+
types: [Message.Message, Thread.Thread, AnchoredTo.AnchoredTo],
|
|
80
74
|
onClientInitialized: async ({ client }) => {
|
|
81
75
|
await client.halo.createIdentity();
|
|
82
76
|
},
|
|
@@ -4,18 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { useEffect } from 'react';
|
|
6
6
|
|
|
7
|
-
import { Relation } from '@dxos/echo';
|
|
8
|
-
import { fullyQualifiedId } from '@dxos/react-client/echo';
|
|
7
|
+
import { Obj, Relation } from '@dxos/echo';
|
|
9
8
|
import { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';
|
|
10
|
-
import { type AnchoredTo } from '@dxos/
|
|
9
|
+
import { type AnchoredTo, type Thread } from '@dxos/types';
|
|
11
10
|
|
|
12
11
|
import { meta } from '../meta';
|
|
13
|
-
import { type ThreadType } from '../types';
|
|
14
12
|
|
|
15
13
|
import { CommentsThreadContainer, type CommentsThreadContainerProps } from './CommentsThreadContainer';
|
|
16
14
|
|
|
17
15
|
export type CommentsContainerProps = Omit<CommentsThreadContainerProps, 'anchor' | 'current'> & {
|
|
18
|
-
anchors: AnchoredTo[];
|
|
16
|
+
anchors: AnchoredTo.AnchoredTo[];
|
|
19
17
|
currentId?: string;
|
|
20
18
|
showResolvedThreads?: boolean;
|
|
21
19
|
};
|
|
@@ -63,8 +61,8 @@ export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...
|
|
|
63
61
|
return (
|
|
64
62
|
<div>
|
|
65
63
|
{filteredAnchors.map((anchor) => {
|
|
66
|
-
const thread = Relation.getSource(anchor) as
|
|
67
|
-
const threadId =
|
|
64
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
65
|
+
const threadId = Obj.getDXN(thread).toString();
|
|
68
66
|
return <CommentsThreadContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;
|
|
69
67
|
})}
|
|
70
68
|
</div>
|
|
@@ -4,32 +4,36 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import { Ref, Relation } from '@dxos/echo';
|
|
8
|
-
import {
|
|
7
|
+
import { Obj, Ref, Relation } from '@dxos/echo';
|
|
8
|
+
import { getSpace, useMembers } from '@dxos/react-client/echo';
|
|
9
9
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
10
10
|
import { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
11
11
|
import { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';
|
|
12
12
|
import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
|
|
13
|
-
import {
|
|
14
|
-
|
|
13
|
+
import {
|
|
14
|
+
MessageTextbox,
|
|
15
|
+
type MessageTextboxProps,
|
|
16
|
+
Thread as ThreadComponent,
|
|
17
|
+
type ThreadRootProps,
|
|
18
|
+
} from '@dxos/react-ui-thread';
|
|
19
|
+
import { type AnchoredTo, type Thread } from '@dxos/types';
|
|
15
20
|
import { isNonNullable } from '@dxos/util';
|
|
16
21
|
|
|
17
22
|
import { useStatus } from '../hooks';
|
|
18
23
|
import { meta } from '../meta';
|
|
19
|
-
import { type ThreadType } from '../types';
|
|
20
24
|
import { getMessageMetadata } from '../util';
|
|
21
25
|
|
|
22
26
|
import { command } from './command-extension';
|
|
23
27
|
import { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';
|
|
24
28
|
|
|
25
29
|
export type CommentsThreadContainerProps = {
|
|
26
|
-
anchor: AnchoredTo;
|
|
27
|
-
onAttend?: (anchor: AnchoredTo) => void;
|
|
28
|
-
onComment?: (anchor: AnchoredTo, message: string) => void;
|
|
29
|
-
onResolve?: (anchor: AnchoredTo) => void;
|
|
30
|
-
onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;
|
|
31
|
-
onThreadDelete?: (anchor: AnchoredTo) => void;
|
|
32
|
-
onAcceptProposal?: (anchor: AnchoredTo, messageId: string) => void;
|
|
30
|
+
anchor: AnchoredTo.AnchoredTo;
|
|
31
|
+
onAttend?: (anchor: AnchoredTo.AnchoredTo) => void;
|
|
32
|
+
onComment?: (anchor: AnchoredTo.AnchoredTo, message: string) => void;
|
|
33
|
+
onResolve?: (anchor: AnchoredTo.AnchoredTo) => void;
|
|
34
|
+
onMessageDelete?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;
|
|
35
|
+
onThreadDelete?: (anchor: AnchoredTo.AnchoredTo) => void;
|
|
36
|
+
onAcceptProposal?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;
|
|
33
37
|
} & Pick<ThreadRootProps, 'current'>;
|
|
34
38
|
|
|
35
39
|
export const CommentsThreadContainer = ({
|
|
@@ -42,29 +46,29 @@ export const CommentsThreadContainer = ({
|
|
|
42
46
|
onThreadDelete,
|
|
43
47
|
onAcceptProposal,
|
|
44
48
|
}: CommentsThreadContainerProps) => {
|
|
49
|
+
const { themeMode } = useThemeContext();
|
|
45
50
|
const { t } = useTranslation(meta.id);
|
|
46
51
|
const identity = useIdentity()!;
|
|
47
52
|
const space = getSpace(anchor);
|
|
48
53
|
const members = useMembers(space?.key);
|
|
49
54
|
const detached = !anchor.anchor;
|
|
50
|
-
const thread = Relation.getSource(anchor) as
|
|
51
|
-
const activity = useStatus(space,
|
|
55
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
56
|
+
const activity = useStatus(space, Obj.getDXN(thread).toString());
|
|
52
57
|
const threadScrollRef = useRef<HTMLDivElement | null>(null);
|
|
53
|
-
const { themeMode } = useThemeContext();
|
|
54
58
|
|
|
55
|
-
const textboxMetadata = getMessageMetadata(
|
|
59
|
+
const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);
|
|
60
|
+
|
|
56
61
|
// TODO(wittjosiah): This is a hack to reset the editor after a message is sent.
|
|
57
|
-
const [
|
|
58
|
-
const rerenderEditor = () => _setCount((count) => count + 1);
|
|
62
|
+
const [state, setState] = useState({});
|
|
59
63
|
const messageRef = useRef('');
|
|
60
64
|
const extensions = useMemo(
|
|
61
65
|
() => [
|
|
62
66
|
createBasicExtensions({ placeholder: t('message placeholder') }),
|
|
63
67
|
createThemeExtensions({ themeMode }),
|
|
64
|
-
listener({ onChange: (text) => (messageRef.current = text) }),
|
|
68
|
+
listener({ onChange: ({ text }) => (messageRef.current = text) }),
|
|
65
69
|
command,
|
|
66
70
|
],
|
|
67
|
-
[
|
|
71
|
+
[state],
|
|
68
72
|
);
|
|
69
73
|
|
|
70
74
|
// TODO(thure): Factor out.
|
|
@@ -85,14 +89,14 @@ export const CommentsThreadContainer = ({
|
|
|
85
89
|
onComment?.(anchor, messageRef.current);
|
|
86
90
|
messageRef.current = '';
|
|
87
91
|
scrollToEnd('instant');
|
|
88
|
-
|
|
92
|
+
setState({});
|
|
89
93
|
|
|
90
94
|
return true;
|
|
91
95
|
}, [anchor, identity]);
|
|
92
96
|
|
|
93
97
|
return (
|
|
94
|
-
<
|
|
95
|
-
id={
|
|
98
|
+
<ThreadComponent.Root
|
|
99
|
+
id={Obj.getDXN(thread).toString()}
|
|
96
100
|
classNames='pbs-2 border-be border-subduedSeparator last:border-none'
|
|
97
101
|
current={current}
|
|
98
102
|
onClickCapture={handleAttend}
|
|
@@ -108,10 +112,10 @@ export const CommentsThreadContainer = ({
|
|
|
108
112
|
>
|
|
109
113
|
{detached ? (
|
|
110
114
|
<Tooltip.Trigger asChild content={t('detached thread label')} side='top'>
|
|
111
|
-
<
|
|
115
|
+
<ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>
|
|
112
116
|
</Tooltip.Trigger>
|
|
113
117
|
) : (
|
|
114
|
-
<
|
|
118
|
+
<ThreadComponent.Header>{thread.name}</ThreadComponent.Header>
|
|
115
119
|
)}
|
|
116
120
|
<div role='none' className={buttonGroupClassNames}>
|
|
117
121
|
{thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}
|
|
@@ -160,10 +164,10 @@ export const CommentsThreadContainer = ({
|
|
|
160
164
|
*/}
|
|
161
165
|
<MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />
|
|
162
166
|
|
|
163
|
-
<
|
|
167
|
+
<ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>
|
|
164
168
|
|
|
165
169
|
{/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}
|
|
166
170
|
<div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />
|
|
167
|
-
</
|
|
171
|
+
</ThreadComponent.Root>
|
|
168
172
|
);
|
|
169
173
|
};
|