@dxos/plugin-thread 0.8.4-main.67995b8 → 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-N7BE5TYW.mjs → app-graph-builder-ACBXRBOS.mjs} +22 -22
- package/dist/lib/browser/app-graph-builder-ACBXRBOS.mjs.map +7 -0
- package/dist/lib/browser/{call-manager-NIPDYUVD.mjs → call-manager-P3MYR2JS.mjs} +7 -7
- package/dist/lib/browser/call-manager-P3MYR2JS.mjs.map +7 -0
- package/dist/lib/browser/chunk-6CUDBEYP.mjs +377 -0
- 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-KWPRNHTK.mjs → chunk-DJOUMWEL.mjs} +242 -238
- package/dist/lib/browser/chunk-DJOUMWEL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-HDEQRBOC.mjs} +38 -6
- package/dist/lib/{node-esm/chunk-25ABSYP2.mjs.map → browser/chunk-HDEQRBOC.mjs.map} +4 -4
- package/dist/lib/browser/chunk-IQSXEHOW.mjs +618 -0
- 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-FR7KJPNY.mjs.map → chunk-L6F2AG6W.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-US5ZQYC3.mjs} +310 -186
- 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-6NSMBO3B.mjs → chunk-XYUJXHYV.mjs} +55 -5
- package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +35 -24
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-JFGLZ6VI.mjs → intent-resolver-5POQTZ24.mjs} +83 -33
- package/dist/lib/browser/intent-resolver-5POQTZ24.mjs.map +7 -0
- package/dist/lib/browser/{markdown-M3FMR7OD.mjs → markdown-L7LDNF56.mjs} +10 -10
- 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-XWS6GIZY.mjs → react-surface-IC576W2W.mjs} +27 -27
- package/dist/lib/browser/react-surface-IC576W2W.mjs.map +7 -0
- package/dist/lib/browser/{settings-E32MTL7A.mjs → settings-5FYGBOGI.mjs} +5 -5
- package/dist/lib/browser/{settings-E32MTL7A.mjs.map → settings-5FYGBOGI.mjs.map} +1 -1
- package/dist/lib/browser/{state-H6CYONWE.mjs → state-36REWXO5.mjs} +5 -5
- package/dist/lib/browser/state-36REWXO5.mjs.map +7 -0
- 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-IQUWU426.mjs → ChatContainer-MFKPXMIK.mjs} +6 -6
- package/dist/lib/node-esm/{app-graph-builder-VCW76Z6V.mjs → app-graph-builder-JXD7KY3G.mjs} +22 -22
- package/dist/lib/node-esm/app-graph-builder-JXD7KY3G.mjs.map +7 -0
- package/dist/lib/node-esm/{call-manager-D6O5ZJJ4.mjs → call-manager-FCEFP7EJ.mjs} +7 -7
- package/dist/lib/node-esm/call-manager-FCEFP7EJ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-2MMJF7DW.mjs} +38 -6
- package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-2V3WSLUZ.mjs} +55 -5
- 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-2CXOK2TD.mjs.map → chunk-AFDO2SUZ.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-KGYDYYKJ.mjs} +310 -186
- package/dist/lib/node-esm/chunk-KGYDYYKJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs +378 -0
- package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs +619 -0
- package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-QCQAAU6J.mjs} +242 -238
- 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 +35 -24
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-OXGNQ44Y.mjs → intent-resolver-63NV3XD2.mjs} +83 -33
- package/dist/lib/node-esm/intent-resolver-63NV3XD2.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-INKTE4MH.mjs → markdown-ZQW7MI5U.mjs} +10 -10
- 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-MJ33KPYE.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-SJ24YG7M.mjs → settings-EOBQUZSW.mjs} +5 -5
- package/dist/lib/node-esm/{settings-SJ24YG7M.mjs.map → settings-EOBQUZSW.mjs.map} +1 -1
- package/dist/lib/node-esm/{state-D7WNDT3N.mjs → state-X3W67GTL.mjs} +5 -5
- package/dist/lib/node-esm/state-X3W67GTL.mjs.map +7 -0
- 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/call-manager.d.ts.map +1 -1
- package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
- package/dist/types/src/calls/media-manager.d.ts +1 -1
- package/dist/types/src/calls/media-manager.d.ts.map +1 -1
- package/dist/types/src/calls/types.d.ts +1 -1
- package/dist/types/src/calls/types.d.ts.map +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts +4 -2
- package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
- package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
- package/dist/types/src/calls-service.stories.d.ts +10 -9
- package/dist/types/src/calls-service.stories.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/call-manager.d.ts +1 -1
- package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +3 -3
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +11 -10
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +1 -1
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-root.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts +2 -2
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit.d.ts +24 -0
- package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
- package/dist/types/src/components/Call/Call.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/CallSidebar.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 +155 -5
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Chat.stories.d.ts +158 -5
- 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 +156 -4
- package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
- package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
- package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
- package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
- package/dist/types/src/components/MessageContainer.d.ts +4 -1
- package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
- package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
- package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
- package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings.d.ts +1 -1
- package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
- package/dist/types/src/components/command-extension.d.ts.map +1 -1
- package/dist/types/src/components/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 -2
- 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/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/testing/stories.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +74 -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/Thread.d.ts +167 -0
- 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 +278 -206
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +64 -62
- package/src/ThreadPlugin.tsx +136 -126
- package/src/calls/call-manager.ts +2 -2
- package/src/calls/call-swarm-synchronizer.ts +1 -1
- package/src/calls/media-manager.ts +60 -34
- package/src/calls/types.ts +8 -4
- package/src/calls/util/calls-service.ts +65 -14
- package/src/calls/util/stub-media-streams.ts +62 -5
- package/src/calls-service.stories.tsx +78 -65
- package/src/capabilities/app-graph-builder.ts +24 -18
- package/src/capabilities/call-manager.ts +3 -2
- package/src/capabilities/capabilities.ts +8 -8
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +50 -20
- package/src/capabilities/markdown.ts +4 -3
- package/src/capabilities/react-root.tsx +2 -2
- package/src/capabilities/react-surface.tsx +19 -18
- package/src/capabilities/state.ts +2 -1
- package/src/capabilities/toolkit.ts +85 -0
- package/src/components/Call/Call.tsx +3 -2
- package/src/components/Call/Toolbar.tsx +7 -7
- package/src/components/CallDebugPanel.tsx +108 -49
- package/src/components/CallSidebar.tsx +2 -1
- package/src/components/ChannelContainer.stories.tsx +14 -13
- package/src/components/ChannelContainer.tsx +20 -16
- package/src/components/Chat.stories.tsx +32 -35
- package/src/components/ChatContainer.tsx +33 -20
- package/src/components/Comments.stories.tsx +38 -39
- package/src/components/CommentsContainer.tsx +4 -3
- package/src/components/CommentsThreadContainer.tsx +28 -21
- package/src/components/Lobby/Lobby.tsx +1 -1
- package/src/components/Media/VideoObject.stories.tsx +36 -28
- package/src/components/MessageContainer.tsx +43 -9
- package/src/components/Participant/Participant.tsx +13 -7
- package/src/components/Participant/ParticipantGrid.tsx +2 -1
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +8 -8
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +44 -42
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
- package/src/components/ThreadComplementary.tsx +42 -12
- package/src/components/ThreadSettings.tsx +6 -7
- package/src/components/command-extension.ts +5 -2
- package/src/components/testing.ts +25 -3
- package/src/extensions/threads.ts +7 -7
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
- package/src/hooks/useDebugMode.ts +1 -1
- package/src/hooks/useVideoStreamTrack.tsx +6 -3
- package/src/meta.ts +9 -5
- package/src/testing/stories.ts +5 -8
- package/src/translations.ts +6 -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 +30 -20
- package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
- package/src/typings.d.ts +8 -0
- package/src/util.ts +1 -1
- package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
- package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +0 -15
- package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
- package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
- package/dist/lib/browser/chunk-3SGRT4NM.mjs +0 -367
- package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
- package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
- package/dist/lib/browser/chunk-ERWASUQK.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-FR7KJPNY.mjs +0 -21
- package/dist/lib/browser/chunk-GCLD5ESP.mjs +0 -137
- package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
- package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
- package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
- package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
- package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
- package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
- package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
- package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
- package/dist/lib/browser/react-root-JEUSQXI6.mjs +0 -28
- package/dist/lib/browser/react-root-JEUSQXI6.mjs.map +0 -7
- package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
- package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-7FXCKO7X.mjs +0 -17
- package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
- package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
- package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
- package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
- package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FLBFYGBK.mjs +0 -368
- package/dist/lib/node-esm/chunk-FLBFYGBK.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-IHDNQLLR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs +0 -138
- package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs +0 -29
- package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
- package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
- package/dist/types/src/types/schema.d.ts +0 -162
- package/dist/types/src/types/schema.d.ts.map +0 -1
- package/src/types/schema.ts +0 -33
- /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → ChannelContainer-SVV4ZX5T.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-ALFWQ65B.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → ChannelContainer-63GMQ753.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → ChatContainer-MFKPXMIK.mjs.map} +0 -0
|
@@ -9,27 +9,37 @@ import { Surface } from '@dxos/app-framework';
|
|
|
9
9
|
import { type Obj, Ref, type Type } from '@dxos/echo';
|
|
10
10
|
import { PublicKey } from '@dxos/react-client';
|
|
11
11
|
import { type SpaceMember } from '@dxos/react-client/echo';
|
|
12
|
-
import {
|
|
12
|
+
import { type Identity, useIdentity } from '@dxos/react-client/halo';
|
|
13
13
|
import { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
14
14
|
import { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';
|
|
15
15
|
import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
|
|
16
16
|
import { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';
|
|
17
17
|
import { type DataType } from '@dxos/schema';
|
|
18
18
|
|
|
19
|
-
import { commentControlClassNames } from './CommentsThreadContainer';
|
|
20
|
-
import { command } from './command-extension';
|
|
21
19
|
import { useOnEditAnalytics } from '../hooks';
|
|
22
20
|
import { meta } from '../meta';
|
|
23
21
|
import { getMessageMetadata } from '../util';
|
|
24
22
|
|
|
23
|
+
import { command } from './command-extension';
|
|
24
|
+
|
|
25
|
+
export const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';
|
|
26
|
+
export const buttonClassNames = '!p-1 transition-opacity';
|
|
27
|
+
|
|
25
28
|
export type MessageContainerProps = {
|
|
26
29
|
message: DataType.Message;
|
|
27
30
|
members: SpaceMember[];
|
|
28
31
|
editable?: boolean;
|
|
29
32
|
onDelete?: (id: string) => void;
|
|
33
|
+
onAcceptProposal?: (id: string) => void;
|
|
30
34
|
};
|
|
31
35
|
|
|
32
|
-
export const MessageContainer = ({
|
|
36
|
+
export const MessageContainer = ({
|
|
37
|
+
message,
|
|
38
|
+
members,
|
|
39
|
+
editable = false,
|
|
40
|
+
onDelete,
|
|
41
|
+
onAcceptProposal,
|
|
42
|
+
}: MessageContainerProps) => {
|
|
33
43
|
const { t } = useTranslation(meta.id);
|
|
34
44
|
const senderIdentity = members.find(
|
|
35
45
|
(member) =>
|
|
@@ -39,8 +49,11 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
|
|
|
39
49
|
const messageMetadata = getMessageMetadata(message.id, senderIdentity);
|
|
40
50
|
const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;
|
|
41
51
|
const [editing, setEditing] = useState(false);
|
|
52
|
+
const handleEdit = useCallback(() => setEditing((editing) => !editing), []);
|
|
42
53
|
const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);
|
|
54
|
+
const handleAcceptProposal = useCallback(() => onAcceptProposal?.(message.id), [message, onAcceptProposal]);
|
|
43
55
|
const textBlock = message.blocks.find((block) => block._tag === 'text');
|
|
56
|
+
const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');
|
|
44
57
|
const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
|
|
45
58
|
|
|
46
59
|
useOnEditAnalytics(message, textBlock, !!editing);
|
|
@@ -48,7 +61,7 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
|
|
|
48
61
|
return (
|
|
49
62
|
<MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
|
|
50
63
|
<MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
|
|
51
|
-
<div
|
|
64
|
+
<div role='none' className={buttonGroupClassNames}>
|
|
52
65
|
{userIsAuthor && editable && (
|
|
53
66
|
<IconButton
|
|
54
67
|
data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
|
|
@@ -56,8 +69,20 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
|
|
|
56
69
|
icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}
|
|
57
70
|
iconOnly
|
|
58
71
|
label={t(editing ? 'save message label' : 'edit message label')}
|
|
59
|
-
classNames={[
|
|
60
|
-
onClick={
|
|
72
|
+
classNames={[buttonClassNames, hoverableControlItem]}
|
|
73
|
+
onClick={handleEdit}
|
|
74
|
+
/>
|
|
75
|
+
)}
|
|
76
|
+
{/* TODO(wittjosiah): Proposal controls should probably be hoisted to thread level. */}
|
|
77
|
+
{proposalBlock && onAcceptProposal && (
|
|
78
|
+
<IconButton
|
|
79
|
+
data-testid='thread.message.accept'
|
|
80
|
+
variant='ghost'
|
|
81
|
+
icon='ph--check--regular'
|
|
82
|
+
iconOnly
|
|
83
|
+
label={t('accept proposal label')}
|
|
84
|
+
classNames={[buttonClassNames, hoverableControlItem]}
|
|
85
|
+
onClick={handleAcceptProposal}
|
|
61
86
|
/>
|
|
62
87
|
)}
|
|
63
88
|
{onDelete && (
|
|
@@ -67,13 +92,14 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
|
|
|
67
92
|
icon='ph--x--regular'
|
|
68
93
|
iconOnly
|
|
69
94
|
label={t('delete message label')}
|
|
70
|
-
classNames={[
|
|
71
|
-
onClick={
|
|
95
|
+
classNames={[buttonClassNames, hoverableControlItem]}
|
|
96
|
+
onClick={handleDelete}
|
|
72
97
|
/>
|
|
73
98
|
)}
|
|
74
99
|
</div>
|
|
75
100
|
</MessageHeading>
|
|
76
101
|
{textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}
|
|
102
|
+
{proposalBlock && <ProposalBlock block={proposalBlock} />}
|
|
77
103
|
{Ref.Array.targets(references).map((reference, index) => (
|
|
78
104
|
<MessagePart key={index} part={reference} />
|
|
79
105
|
))}
|
|
@@ -132,6 +158,14 @@ const TextboxBlock = ({
|
|
|
132
158
|
return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;
|
|
133
159
|
};
|
|
134
160
|
|
|
161
|
+
const ProposalBlock = ({ block }: { block: DataType.MessageBlock.Proposal }) => {
|
|
162
|
+
return (
|
|
163
|
+
<div role='none' className='mie-4 italic'>
|
|
164
|
+
{block.text}
|
|
165
|
+
</div>
|
|
166
|
+
);
|
|
167
|
+
};
|
|
168
|
+
|
|
135
169
|
const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {
|
|
136
170
|
// TODO(burdon): Use annotation to get title.
|
|
137
171
|
let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';
|
|
@@ -17,15 +17,21 @@ export const Participant = memo(({ item: user, debug, ...props }: ResponsiveGrid
|
|
|
17
17
|
const call = useCapability(ThreadCapabilities.CallManager);
|
|
18
18
|
const isSelf: boolean = call.self.id !== undefined && user.id !== undefined && user.id.startsWith(call.self.id);
|
|
19
19
|
const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
|
|
21
|
+
const pulledVideoStream =
|
|
22
|
+
!isSelf && isScreenshare && user.tracks?.screenshareEnabled
|
|
23
|
+
? call.getVideoStream(user.tracks?.screenshare as EncodedTrackName)
|
|
24
|
+
: !isSelf && !isScreenshare && user.tracks?.videoEnabled
|
|
25
|
+
? call.getVideoStream(user.tracks?.video as EncodedTrackName)
|
|
26
|
+
: undefined;
|
|
23
27
|
|
|
24
28
|
const videoStream = useMemo<MediaStream | undefined>(() => {
|
|
25
|
-
if (isSelf
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
if (isSelf) {
|
|
30
|
+
if (isScreenshare) {
|
|
31
|
+
return call.media.screenshareVideoStream;
|
|
32
|
+
} else if (!isScreenshare) {
|
|
33
|
+
return call.media.videoStream;
|
|
34
|
+
}
|
|
29
35
|
} else if (!isSelf) {
|
|
30
36
|
return pulledVideoStream;
|
|
31
37
|
}
|
|
@@ -6,10 +6,11 @@ import React, { useEffect, useMemo, useState } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { type ThemedClassName } from '@dxos/react-ui';
|
|
8
8
|
|
|
9
|
-
import { Participant, SCREENSHARE_SUFFIX } from './Participant';
|
|
10
9
|
import { type UserState } from '../../calls';
|
|
11
10
|
import { ResponsiveGrid } from '../ResponsiveGrid';
|
|
12
11
|
|
|
12
|
+
import { Participant, SCREENSHARE_SUFFIX } from './Participant';
|
|
13
|
+
|
|
13
14
|
const getId = (user: UserState): string => user.id!;
|
|
14
15
|
|
|
15
16
|
export type ParticipantGridProps = ThemedClassName<{
|
|
@@ -2,25 +2,25 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
7
|
-
import { type StoryObj, type Meta } from '@storybook/react-vite';
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
6
|
import React from 'react';
|
|
9
7
|
|
|
10
|
-
import { withTheme
|
|
8
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
11
9
|
|
|
12
|
-
import { ResponsiveContainer } from './ResponsiveContainer';
|
|
13
10
|
import { translations } from '../../translations';
|
|
14
11
|
import { VideoObject as VideoObjectComponent } from '../Media';
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
import { ResponsiveContainer } from './ResponsiveContainer';
|
|
14
|
+
|
|
15
|
+
const meta = {
|
|
17
16
|
title: 'plugins/plugin-thread/ResponsiveContainer',
|
|
18
17
|
component: ResponsiveContainer,
|
|
19
|
-
decorators: [withTheme
|
|
18
|
+
decorators: [withTheme],
|
|
20
19
|
parameters: {
|
|
20
|
+
layout: 'fullscreen',
|
|
21
21
|
translations,
|
|
22
22
|
},
|
|
23
|
-
}
|
|
23
|
+
} satisfies Meta<typeof ResponsiveContainer>;
|
|
24
24
|
|
|
25
25
|
export default meta;
|
|
26
26
|
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
7
|
-
import { type StoryObj, type Meta } from '@storybook/react-vite';
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
6
|
import React, { useEffect, useState } from 'react';
|
|
9
7
|
|
|
10
8
|
import { faker } from '@dxos/random';
|
|
11
|
-
import { withTheme
|
|
9
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
10
|
+
|
|
11
|
+
import { translations } from '../../translations';
|
|
12
12
|
|
|
13
13
|
import { ResponsiveGrid, type ResponsiveGridProps } from './ResponsiveGrid';
|
|
14
14
|
import { ResponsiveGridItem, type ResponsiveGridItemProps } from './ResponsiveGridItem';
|
|
15
|
-
import { translations } from '../../translations';
|
|
16
15
|
|
|
17
16
|
type TestItem = {
|
|
18
17
|
id: string;
|
|
@@ -56,46 +55,49 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
|
|
|
56
55
|
|
|
57
56
|
type StoryProps = ResponsiveGridProps<TestItem> & { random?: boolean; autoHideGallery?: boolean };
|
|
58
57
|
|
|
59
|
-
const
|
|
58
|
+
const DefaultStory = (props: StoryProps) => {
|
|
59
|
+
const [pinned, setPinned] = useState<string | undefined>(
|
|
60
|
+
(props.pinned ?? props.items.length > 1) ? props.items[0]?.id : undefined,
|
|
61
|
+
);
|
|
62
|
+
const [items, setItems] = useState<TestItem[]>(props.items);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!props.random) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const interval = setInterval(() => {
|
|
69
|
+
setItems((items) => {
|
|
70
|
+
const p = Math.random();
|
|
71
|
+
if (p < 0.5) {
|
|
72
|
+
return items;
|
|
73
|
+
} else if (p < 0.99 && items.length > 1) {
|
|
74
|
+
return items.slice(0, -1);
|
|
75
|
+
} else {
|
|
76
|
+
return [...items, createItem(items[0]?.type)];
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}, 3_000);
|
|
80
|
+
|
|
81
|
+
return () => clearInterval(interval);
|
|
82
|
+
}, []);
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div className='grid grow p-4'>
|
|
86
|
+
<ResponsiveGrid {...props} Cell={TestCell} items={items} pinned={pinned} onPinnedChange={setPinned} />
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const meta = {
|
|
60
92
|
title: 'plugins/plugin-thread/ResponsiveGrid',
|
|
61
|
-
component: ResponsiveGrid,
|
|
62
|
-
render:
|
|
63
|
-
|
|
64
|
-
(args.pinned ?? args.items.length > 1) ? args.items[0]?.id : undefined,
|
|
65
|
-
);
|
|
66
|
-
const [items, setItems] = useState<TestItem[]>(args.items);
|
|
67
|
-
useEffect(() => {
|
|
68
|
-
if (!args.random) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const interval = setInterval(() => {
|
|
73
|
-
setItems((items) => {
|
|
74
|
-
const p = Math.random();
|
|
75
|
-
if (p < 0.5) {
|
|
76
|
-
return items;
|
|
77
|
-
} else if (p < 0.99 && items.length > 1) {
|
|
78
|
-
return items.slice(0, -1);
|
|
79
|
-
} else {
|
|
80
|
-
return [...items, createItem(items[0]?.type)];
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
}, 3_000);
|
|
84
|
-
|
|
85
|
-
return () => clearInterval(interval);
|
|
86
|
-
}, []);
|
|
87
|
-
|
|
88
|
-
return (
|
|
89
|
-
<div className='grid grow p-4'>
|
|
90
|
-
<ResponsiveGrid {...args} Cell={TestCell} items={items} pinned={pinned} onPinnedChange={setPinned} />
|
|
91
|
-
</div>
|
|
92
|
-
);
|
|
93
|
-
},
|
|
94
|
-
decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
|
|
93
|
+
component: ResponsiveGrid as any,
|
|
94
|
+
render: DefaultStory,
|
|
95
|
+
decorators: [withTheme],
|
|
95
96
|
parameters: {
|
|
97
|
+
layout: 'fullscreen',
|
|
96
98
|
translations,
|
|
97
99
|
},
|
|
98
|
-
}
|
|
100
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
99
101
|
|
|
100
102
|
const videoUrls = [
|
|
101
103
|
'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4',
|
|
@@ -117,7 +119,7 @@ const createItem = (type?: 'image' | 'video') => {
|
|
|
117
119
|
|
|
118
120
|
export default meta;
|
|
119
121
|
|
|
120
|
-
type Story = StoryObj<
|
|
122
|
+
type Story = StoryObj<typeof meta>;
|
|
121
123
|
|
|
122
124
|
// TODO(burdon): Story to join/leave repeatedly to test stable position.
|
|
123
125
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, { type ComponentType, type FC,
|
|
5
|
+
import React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';
|
|
6
6
|
import { useResizeDetector } from 'react-resize-detector';
|
|
7
7
|
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, {
|
|
5
|
+
import React, { type CSSProperties, type PropsWithChildren, useEffect, useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import { Icon, IconButton,
|
|
7
|
+
import { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';
|
|
8
8
|
import { Waveform } from '@dxos/react-ui-sfx';
|
|
9
9
|
import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
|
|
10
10
|
|
|
@@ -6,25 +6,27 @@ import React, { useCallback, useMemo } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
8
|
Capabilities,
|
|
9
|
+
CollaborationActions,
|
|
9
10
|
LayoutAction,
|
|
10
11
|
createIntent,
|
|
11
|
-
useCapability,
|
|
12
12
|
useCapabilities,
|
|
13
|
+
useCapability,
|
|
13
14
|
useIntentDispatcher,
|
|
14
15
|
} from '@dxos/app-framework';
|
|
15
16
|
import { Filter, Obj, Query, Relation } from '@dxos/echo';
|
|
16
|
-
import { fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';
|
|
17
|
+
import { Ref, fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';
|
|
17
18
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
18
19
|
import { useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
19
20
|
import { useAttended } from '@dxos/react-ui-attention';
|
|
20
21
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
21
22
|
import { Tabs } from '@dxos/react-ui-tabs';
|
|
23
|
+
import { mx } from '@dxos/react-ui-theme';
|
|
22
24
|
import { AnchoredTo } from '@dxos/schema';
|
|
23
25
|
|
|
24
26
|
import { ThreadCapabilities } from '../capabilities';
|
|
25
|
-
import { CommentsContainer } from '../components';
|
|
27
|
+
import { CommentsContainer, type CommentsContainerProps } from '../components';
|
|
26
28
|
import { meta } from '../meta';
|
|
27
|
-
import {
|
|
29
|
+
import { Thread, ThreadAction } from '../types';
|
|
28
30
|
|
|
29
31
|
export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
30
32
|
const { t } = useTranslation(meta.id);
|
|
@@ -54,14 +56,14 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
54
56
|
const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));
|
|
55
57
|
const anchors = objectsAnchoredTo
|
|
56
58
|
.toSorted((a, b) => sort?.(a, b) ?? 0)
|
|
57
|
-
.filter((anchor) => Obj.instanceOf(
|
|
59
|
+
.filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))
|
|
58
60
|
.concat(drafts ?? []);
|
|
59
61
|
|
|
60
62
|
const attended = useAttended();
|
|
61
63
|
|
|
62
64
|
const handleAttend = useCallback(
|
|
63
65
|
(anchor: AnchoredTo) => {
|
|
64
|
-
const thread = Relation.getSource(anchor) as
|
|
66
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
65
67
|
const threadId = fullyQualifiedId(thread);
|
|
66
68
|
|
|
67
69
|
if (state.current !== threadId) {
|
|
@@ -91,7 +93,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
91
93
|
createIntent(ThreadAction.AddMessage, { anchor, subject, sender: { identityDid: identity?.did }, text }),
|
|
92
94
|
);
|
|
93
95
|
|
|
94
|
-
const thread = Relation.getSource(anchor) as
|
|
96
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
95
97
|
state.current = fullyQualifiedId(thread);
|
|
96
98
|
},
|
|
97
99
|
[dispatch, identity, subject],
|
|
@@ -99,7 +101,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
99
101
|
|
|
100
102
|
const handleResolve = useCallback(
|
|
101
103
|
(anchor: AnchoredTo) =>
|
|
102
|
-
dispatch(createIntent(ThreadAction.ToggleResolved, { thread: Relation.getSource(anchor) as
|
|
104
|
+
dispatch(createIntent(ThreadAction.ToggleResolved, { thread: Relation.getSource(anchor) as Thread.Thread })),
|
|
103
105
|
[dispatch],
|
|
104
106
|
);
|
|
105
107
|
|
|
@@ -114,6 +116,28 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
114
116
|
[dispatch, subject],
|
|
115
117
|
);
|
|
116
118
|
|
|
119
|
+
const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(
|
|
120
|
+
async (anchor, messageId) => {
|
|
121
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
122
|
+
const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));
|
|
123
|
+
const message = thread.messages[messageIndex]?.target;
|
|
124
|
+
const proposal = message?.blocks.find((block) => block._tag === 'proposal');
|
|
125
|
+
if (!proposal || !anchor.anchor) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
await dispatch(
|
|
130
|
+
createIntent(CollaborationActions.AcceptProposal, {
|
|
131
|
+
subject,
|
|
132
|
+
anchor: anchor.anchor,
|
|
133
|
+
proposal,
|
|
134
|
+
}),
|
|
135
|
+
);
|
|
136
|
+
await dispatch(createIntent(ThreadAction.ToggleResolved, { thread }));
|
|
137
|
+
},
|
|
138
|
+
[dispatch, subject],
|
|
139
|
+
);
|
|
140
|
+
|
|
117
141
|
const comments = (
|
|
118
142
|
<CommentsContainer
|
|
119
143
|
anchors={anchors}
|
|
@@ -124,6 +148,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
124
148
|
onResolve={handleResolve}
|
|
125
149
|
onMessageDelete={handleMessageDelete}
|
|
126
150
|
onThreadDelete={handleThreadDelete}
|
|
151
|
+
onAcceptProposal={handleAcceptProposal}
|
|
127
152
|
/>
|
|
128
153
|
);
|
|
129
154
|
|
|
@@ -132,10 +157,13 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
132
157
|
<Tabs.Root
|
|
133
158
|
value={showResolvedThreads ? 'all' : 'unresolved'}
|
|
134
159
|
orientation='horizontal'
|
|
135
|
-
classNames=
|
|
160
|
+
classNames={[
|
|
161
|
+
'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin',
|
|
162
|
+
]}
|
|
136
163
|
onValueChange={onChangeViewState}
|
|
137
164
|
>
|
|
138
|
-
|
|
165
|
+
{/* TODO(burdon): Standardize (like Tollbar). */}
|
|
166
|
+
<Tabs.Tablist classNames={mx('bg-toolbarSurface border-b border-subduedSeparator')}>
|
|
139
167
|
<Tabs.Tab value='unresolved' classNames='text-sm'>
|
|
140
168
|
{t('show unresolved label')}
|
|
141
169
|
</Tabs.Tab>
|
|
@@ -143,8 +171,10 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
143
171
|
{t('show all label')}
|
|
144
172
|
</Tabs.Tab>
|
|
145
173
|
</Tabs.Tablist>
|
|
146
|
-
<
|
|
147
|
-
|
|
174
|
+
<div className='overflow-y-auto'>
|
|
175
|
+
<Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
|
|
176
|
+
<Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
|
|
177
|
+
</div>
|
|
148
178
|
</Tabs.Root>
|
|
149
179
|
</StackItem.Content>
|
|
150
180
|
);
|
|
@@ -4,14 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
import {
|
|
7
|
+
import { useTranslation } from '@dxos/react-ui';
|
|
8
|
+
import { ControlPage } from '@dxos/react-ui-form';
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
import { meta } from '../meta';
|
|
11
11
|
import type { ThreadSettingsProps } from '../types';
|
|
12
12
|
|
|
13
|
-
export const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return <DeprecatedFormContainer></DeprecatedFormContainer>;
|
|
13
|
+
export const ThreadSettings = ({ settings: _settings }: { settings: ThreadSettingsProps }) => {
|
|
14
|
+
const { t: _t } = useTranslation(meta.id);
|
|
15
|
+
return <ControlPage></ControlPage>;
|
|
17
16
|
};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';
|
|
6
6
|
import { type Extension } from '@codemirror/state';
|
|
7
7
|
|
|
8
8
|
import { tags } from '@dxos/react-ui-editor';
|
|
@@ -27,7 +27,10 @@ const parser = StreamLanguage.define<{ count: number }>({
|
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
const styles = HighlightStyle.define([
|
|
30
|
-
{
|
|
30
|
+
{
|
|
31
|
+
tag: tags.tagName,
|
|
32
|
+
class: mx('dx-tag dx-tag--indigo text-baseText font-medium'),
|
|
33
|
+
},
|
|
31
34
|
]);
|
|
32
35
|
|
|
33
36
|
export const command: Extension = [parser, syntaxHighlighting(styles)];
|
|
@@ -8,10 +8,11 @@ import { faker } from '@dxos/random';
|
|
|
8
8
|
import { type Identity } from '@dxos/react-client/halo';
|
|
9
9
|
import { DataType } from '@dxos/schema';
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { Thread } from '../types';
|
|
12
12
|
|
|
13
|
-
export const createCommentThread = (identity: Identity):
|
|
14
|
-
return
|
|
13
|
+
export const createCommentThread = (identity: Identity): Thread.Thread => {
|
|
14
|
+
return Thread.make({
|
|
15
|
+
name: 'Comment',
|
|
15
16
|
messages: faker.helpers.multiple(
|
|
16
17
|
() =>
|
|
17
18
|
Ref.make(
|
|
@@ -25,5 +26,26 @@ export const createCommentThread = (identity: Identity): ThreadType => {
|
|
|
25
26
|
),
|
|
26
27
|
{ count: { min: 2, max: 3 } },
|
|
27
28
|
),
|
|
29
|
+
status: 'active',
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const createProposalThread = (identity: Identity): Thread.Thread => {
|
|
34
|
+
return Thread.make({
|
|
35
|
+
name: 'Proposal',
|
|
36
|
+
messages: faker.helpers.multiple(
|
|
37
|
+
() =>
|
|
38
|
+
Ref.make(
|
|
39
|
+
Obj.make(DataType.Message, {
|
|
40
|
+
created: new Date().toISOString(),
|
|
41
|
+
sender: {
|
|
42
|
+
identityDid: faker.datatype.boolean() ? identity.did : IdentityDid.random(),
|
|
43
|
+
},
|
|
44
|
+
blocks: [{ _tag: 'proposal', text: faker.lorem.sentences(3) }],
|
|
45
|
+
}),
|
|
46
|
+
),
|
|
47
|
+
{ count: { min: 1, max: 1 } },
|
|
48
|
+
),
|
|
49
|
+
status: 'active',
|
|
28
50
|
});
|
|
29
51
|
};
|
|
@@ -6,14 +6,14 @@ import { type Extension } from '@codemirror/state';
|
|
|
6
6
|
import { EditorView } from '@codemirror/view';
|
|
7
7
|
import { computed, effect } from '@preact/signals-core';
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import { type PromiseIntentDispatcher, createIntent } from '@dxos/app-framework';
|
|
10
10
|
import { Filter, Obj, Query, Relation } from '@dxos/echo';
|
|
11
11
|
import { type Markdown } from '@dxos/plugin-markdown/types';
|
|
12
|
-
import {
|
|
12
|
+
import { createDocAccessor, fullyQualifiedId, getSource, getSpace, getTextInRange } from '@dxos/react-client/echo';
|
|
13
13
|
import { comments, createExternalCommentSync } from '@dxos/react-ui-editor';
|
|
14
14
|
import { AnchoredTo } from '@dxos/schema';
|
|
15
15
|
|
|
16
|
-
import {
|
|
16
|
+
import { Thread, ThreadAction, type ThreadState } from '../types';
|
|
17
17
|
|
|
18
18
|
// TODO(burdon): Factor out.
|
|
19
19
|
const getName = (doc: Markdown.Document, anchor: string): string | undefined => {
|
|
@@ -41,7 +41,7 @@ export const threads = (state: ThreadState, doc?: Markdown.Document, dispatch?:
|
|
|
41
41
|
query.objects
|
|
42
42
|
.filter((anchor) => {
|
|
43
43
|
const thread = Relation.getSource(anchor);
|
|
44
|
-
return Obj.instanceOf(
|
|
44
|
+
return Obj.instanceOf(Thread.Thread, thread) && thread.status !== 'resolved';
|
|
45
45
|
})
|
|
46
46
|
.concat(state.drafts[fullyQualifiedId(doc)] ?? []),
|
|
47
47
|
);
|
|
@@ -60,7 +60,7 @@ export const threads = (state: ThreadState, doc?: Markdown.Document, dispatch?:
|
|
|
60
60
|
// Only update if the name has changed, otherwise this will cause an infinite loop.
|
|
61
61
|
// Skip if the name is empty; this means comment text was deleted, but thread name should remain.
|
|
62
62
|
const name = getName(doc, anchor.anchor);
|
|
63
|
-
const thread = Relation.getSource(anchor) as
|
|
63
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
64
64
|
if (name && name !== thread.name) {
|
|
65
65
|
thread.name = name;
|
|
66
66
|
}
|
|
@@ -101,7 +101,7 @@ export const threads = (state: ThreadState, doc?: Markdown.Document, dispatch?:
|
|
|
101
101
|
onUpdate: ({ id, cursor }) => {
|
|
102
102
|
const draft = state.drafts[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id);
|
|
103
103
|
if (draft) {
|
|
104
|
-
const thread = Relation.getSource(draft) as
|
|
104
|
+
const thread = Relation.getSource(draft) as Thread.Thread;
|
|
105
105
|
thread.name = getName(doc, cursor);
|
|
106
106
|
draft.anchor = cursor;
|
|
107
107
|
}
|
|
@@ -109,7 +109,7 @@ export const threads = (state: ThreadState, doc?: Markdown.Document, dispatch?:
|
|
|
109
109
|
const relation = query.objects.find((object) => getSource(object).id === id);
|
|
110
110
|
if (relation) {
|
|
111
111
|
const thread = getSource(relation);
|
|
112
|
-
if (Obj.instanceOf(
|
|
112
|
+
if (Obj.instanceOf(Thread.Thread, thread)) {
|
|
113
113
|
thread.name = getName(doc, cursor);
|
|
114
114
|
relation.anchor = cursor;
|
|
115
115
|
}
|
package/src/hooks/index.ts
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
|
+
|
|
7
|
+
import { scheduleTask } from '@dxos/async';
|
|
8
|
+
import { Context } from '@dxos/context';
|
|
9
|
+
|
|
10
|
+
import { createBlackCanvasStreamTrack } from '../calls/util/stub-media-streams';
|
|
11
|
+
|
|
12
|
+
export const useBlackCanvasStreamTrack = () => {
|
|
13
|
+
const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
const ctx = new Context();
|
|
16
|
+
scheduleTask(ctx, async () => {
|
|
17
|
+
const blackCanvasStreamTrack = await createBlackCanvasStreamTrack({ ctx, width: 720, height: 480 });
|
|
18
|
+
setBlackCanvasStreamTrack(blackCanvasStreamTrack);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return () => {
|
|
22
|
+
void ctx.dispose();
|
|
23
|
+
};
|
|
24
|
+
}, []);
|
|
25
|
+
|
|
26
|
+
return blackCanvasStreamTrack;
|
|
27
|
+
};
|