@dxos/plugin-thread 0.8.4-main.2e9d522 → 0.8.4-main.548089c
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-56QROCE4.mjs +16 -0
- package/dist/lib/browser/ChatContainer-7F5Y6GXJ.mjs +15 -0
- package/dist/lib/browser/{app-graph-builder-N7BE5TYW.mjs → app-graph-builder-USFBLGFG.mjs} +30 -31
- package/dist/lib/browser/app-graph-builder-USFBLGFG.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-6BKYTMJS.mjs +104 -0
- package/dist/lib/browser/blueprint-definition-6BKYTMJS.mjs.map +7 -0
- package/dist/lib/browser/{call-manager-NIPDYUVD.mjs → call-manager-MAXQLMMS.mjs} +7 -7
- package/dist/lib/browser/call-manager-MAXQLMMS.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KWPRNHTK.mjs → chunk-44S2SB4N.mjs} +250 -245
- package/dist/lib/browser/chunk-44S2SB4N.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-FR6MEAZI.mjs +377 -0
- package/dist/lib/browser/chunk-FR6MEAZI.mjs.map +7 -0
- package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-ISCHODBV.mjs} +55 -5
- package/dist/lib/browser/chunk-ISCHODBV.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-ERWASUQK.mjs → chunk-KOBXMDCI.mjs} +74 -41
- package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +7 -0
- package/dist/lib/browser/chunk-NMJEVD36.mjs +168 -0
- package/dist/lib/browser/chunk-NMJEVD36.mjs.map +7 -0
- package/dist/lib/browser/chunk-NSREO7OX.mjs +23 -0
- package/dist/lib/browser/chunk-NSREO7OX.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-ZCW3NSDZ.mjs} +310 -186
- package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZO5ZGDN5.mjs +617 -0
- package/dist/lib/browser/chunk-ZO5ZGDN5.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +47 -37
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-JFGLZ6VI.mjs → intent-resolver-BOUT4WGY.mjs} +33 -41
- package/dist/lib/browser/intent-resolver-BOUT4WGY.mjs.map +7 -0
- package/dist/lib/browser/{markdown-GEXBVJYN.mjs → markdown-74EUSQGV.mjs} +24 -22
- package/dist/lib/browser/markdown-74EUSQGV.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-root-2VRIT2HF.mjs +28 -0
- package/dist/lib/browser/react-root-2VRIT2HF.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-YCYEFBPM.mjs → react-surface-UOECBYHE.mjs} +29 -28
- package/dist/lib/browser/react-surface-UOECBYHE.mjs.map +7 -0
- package/dist/lib/browser/{settings-E32MTL7A.mjs → settings-LGQUZITB.mjs} +5 -5
- package/dist/lib/browser/{settings-E32MTL7A.mjs.map → settings-LGQUZITB.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/types/index.mjs +7 -9
- package/dist/lib/node-esm/ChannelContainer-4SV22AKC.mjs +17 -0
- package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs → ChatContainer-C526R4DI.mjs} +6 -6
- package/dist/lib/node-esm/{app-graph-builder-VCW76Z6V.mjs → app-graph-builder-DWYGNENL.mjs} +30 -31
- package/dist/lib/node-esm/app-graph-builder-DWYGNENL.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-6LEAWSC7.mjs +105 -0
- package/dist/lib/node-esm/blueprint-definition-6LEAWSC7.mjs.map +7 -0
- package/dist/lib/node-esm/{call-manager-D6O5ZJJ4.mjs → call-manager-LC4OS2KD.mjs} +7 -7
- package/dist/lib/node-esm/call-manager-LC4OS2KD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-7KZWZS2U.mjs} +310 -186
- 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-KE6SKBPO.mjs +618 -0
- package/dist/lib/node-esm/chunk-KE6SKBPO.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-NEGIPZTJ.mjs} +250 -245
- package/dist/lib/node-esm/chunk-NEGIPZTJ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-PZH2EDU5.mjs} +74 -41
- package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-TJKM5JZT.mjs +169 -0
- package/dist/lib/node-esm/chunk-TJKM5JZT.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-TWKGDFCS.mjs +378 -0
- package/dist/lib/node-esm/chunk-TWKGDFCS.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-VBI32FGI.mjs} +55 -5
- package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-VM6WD3YY.mjs +25 -0
- package/dist/lib/node-esm/chunk-VM6WD3YY.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 +47 -37
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-OXGNQ44Y.mjs → intent-resolver-45PLIFCJ.mjs} +33 -41
- package/dist/lib/node-esm/intent-resolver-45PLIFCJ.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-LIJZDK2J.mjs → markdown-566XXB55.mjs} +24 -22
- package/dist/lib/node-esm/markdown-566XXB55.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-root-JAE2VI2D.mjs +29 -0
- package/dist/lib/node-esm/react-root-JAE2VI2D.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-IRSEKM42.mjs → react-surface-BYKXK5YA.mjs} +29 -28
- package/dist/lib/node-esm/react-surface-BYKXK5YA.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-SJ24YG7M.mjs → settings-WKLJSP6R.mjs} +5 -5
- package/dist/lib/node-esm/{settings-SJ24YG7M.mjs.map → settings-WKLJSP6R.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/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/blueprint-definition.d.ts +5 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- 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/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 +2 -2
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
- 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 +6 -3
- 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 +2 -2
- 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 -1
- 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 +207 -208
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +67 -59
- package/src/ThreadPlugin.tsx +141 -127
- package/src/calls/call-manager.ts +2 -2
- package/src/calls/call-swarm-synchronizer.ts +1 -1
- package/src/calls/media-manager.ts +66 -37
- package/src/calls/types.ts +8 -4
- package/src/calls/util/calls-service.ts +65 -14
- package/src/calls/util/stub-media-streams.ts +64 -7
- package/src/calls-service.stories.tsx +78 -65
- package/src/capabilities/app-graph-builder.ts +45 -31
- package/src/capabilities/blueprint-definition.ts +38 -0
- 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 +25 -28
- package/src/capabilities/markdown.ts +9 -6
- package/src/capabilities/react-root.tsx +2 -2
- package/src/capabilities/react-surface.tsx +21 -19
- package/src/capabilities/state.ts +2 -1
- package/src/components/Call/Call.tsx +4 -3
- package/src/components/Call/Toolbar.tsx +10 -10
- package/src/components/CallDebugPanel.tsx +108 -49
- package/src/components/CallSidebar.tsx +3 -2
- package/src/components/ChannelContainer.stories.tsx +15 -14
- package/src/components/ChannelContainer.tsx +25 -20
- package/src/components/Chat.stories.tsx +33 -36
- package/src/components/ChatContainer.tsx +36 -23
- package/src/components/Comments.stories.tsx +40 -41
- package/src/components/CommentsContainer.tsx +8 -8
- package/src/components/CommentsThreadContainer.tsx +40 -33
- package/src/components/Lobby/Lobby.tsx +2 -2
- package/src/components/Media/VideoObject.stories.tsx +36 -28
- package/src/components/Media/VideoObject.tsx +1 -1
- package/src/components/MessageContainer.tsx +48 -14
- package/src/components/Participant/Participant.tsx +14 -8
- package/src/components/Participant/ParticipantGrid.tsx +2 -1
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +8 -8
- package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +2 -2
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +45 -43
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +7 -4
- package/src/components/ThreadComplementary.tsx +71 -34
- package/src/components/ThreadSettings.tsx +6 -7
- package/src/components/command-extension.ts +5 -2
- package/src/components/testing.ts +27 -5
- package/src/extensions/threads.ts +29 -20
- package/src/functions/create-proposals.ts +58 -0
- package/src/functions/index.ts +5 -0
- package/src/hooks/analytics.ts +4 -7
- package/src/hooks/index.ts +3 -1
- 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 +29 -28
- 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-IY2UIRLF.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-4OYAYON2.mjs +0 -21
- package/dist/lib/browser/chunk-4OYAYON2.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-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-XLPJXUKO.mjs +0 -367
- package/dist/lib/browser/chunk-XLPJXUKO.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-GEXBVJYN.mjs.map +0 -7
- package/dist/lib/browser/react-root-X4UIVGTX.mjs +0 -28
- package/dist/lib/browser/react-root-X4UIVGTX.mjs.map +0 -7
- package/dist/lib/browser/react-surface-YCYEFBPM.mjs.map +0 -7
- package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-DET6T5N2.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-25ABSYP2.mjs.map +0 -7
- 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-GRLRWTRU.mjs +0 -19
- package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GW37AAM4.mjs +0 -23
- package/dist/lib/node-esm/chunk-GW37AAM4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-J4NSON5Q.mjs +0 -368
- package/dist/lib/node-esm/chunk-J4NSON5Q.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-LIJZDK2J.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-M7J6PZVW.mjs +0 -29
- package/dist/lib/node-esm/react-root-M7J6PZVW.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-IRSEKM42.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-IY2UIRLF.mjs.map → ChannelContainer-56QROCE4.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-7F5Y6GXJ.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChannelContainer-DET6T5N2.mjs.map → ChannelContainer-4SV22AKC.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → ChatContainer-C526R4DI.mjs.map} +0 -0
|
@@ -4,33 +4,37 @@
|
|
|
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 } from '@dxos/types';
|
|
15
20
|
import { isNonNullable } from '@dxos/util';
|
|
16
21
|
|
|
17
|
-
import { MessageContainer } from './MessageContainer';
|
|
18
|
-
import { command } from './command-extension';
|
|
19
22
|
import { useStatus } from '../hooks';
|
|
20
23
|
import { meta } from '../meta';
|
|
21
|
-
import { type
|
|
24
|
+
import { type Thread } from '../types';
|
|
22
25
|
import { getMessageMetadata } from '../util';
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
import { command } from './command-extension';
|
|
28
|
+
import { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';
|
|
26
29
|
|
|
27
30
|
export type CommentsThreadContainerProps = {
|
|
28
|
-
anchor: AnchoredTo;
|
|
29
|
-
onAttend?: (anchor: AnchoredTo) => void;
|
|
30
|
-
onComment?: (anchor: AnchoredTo, message: string) => void;
|
|
31
|
-
onResolve?: (anchor: AnchoredTo) => void;
|
|
32
|
-
onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;
|
|
33
|
-
onThreadDelete?: (anchor: AnchoredTo) => void;
|
|
31
|
+
anchor: AnchoredTo.AnchoredTo;
|
|
32
|
+
onAttend?: (anchor: AnchoredTo.AnchoredTo) => void;
|
|
33
|
+
onComment?: (anchor: AnchoredTo.AnchoredTo, message: string) => void;
|
|
34
|
+
onResolve?: (anchor: AnchoredTo.AnchoredTo) => void;
|
|
35
|
+
onMessageDelete?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;
|
|
36
|
+
onThreadDelete?: (anchor: AnchoredTo.AnchoredTo) => void;
|
|
37
|
+
onAcceptProposal?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;
|
|
34
38
|
} & Pick<ThreadRootProps, 'current'>;
|
|
35
39
|
|
|
36
40
|
export const CommentsThreadContainer = ({
|
|
@@ -41,30 +45,31 @@ export const CommentsThreadContainer = ({
|
|
|
41
45
|
onResolve,
|
|
42
46
|
onMessageDelete,
|
|
43
47
|
onThreadDelete,
|
|
48
|
+
onAcceptProposal,
|
|
44
49
|
}: CommentsThreadContainerProps) => {
|
|
50
|
+
const { themeMode } = useThemeContext();
|
|
45
51
|
const { t } = useTranslation(meta.id);
|
|
46
52
|
const identity = useIdentity()!;
|
|
47
53
|
const space = getSpace(anchor);
|
|
48
54
|
const members = useMembers(space?.key);
|
|
49
55
|
const detached = !anchor.anchor;
|
|
50
|
-
const thread = Relation.getSource(anchor) as
|
|
51
|
-
const activity = useStatus(space,
|
|
56
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
57
|
+
const activity = useStatus(space, Obj.getDXN(thread).toString());
|
|
52
58
|
const threadScrollRef = useRef<HTMLDivElement | null>(null);
|
|
53
|
-
const { themeMode } = useThemeContext();
|
|
54
59
|
|
|
55
|
-
const textboxMetadata = getMessageMetadata(
|
|
60
|
+
const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);
|
|
61
|
+
|
|
56
62
|
// TODO(wittjosiah): This is a hack to reset the editor after a message is sent.
|
|
57
|
-
const [
|
|
58
|
-
const rerenderEditor = () => _setCount((count) => count + 1);
|
|
63
|
+
const [state, setState] = useState({});
|
|
59
64
|
const messageRef = useRef('');
|
|
60
65
|
const extensions = useMemo(
|
|
61
66
|
() => [
|
|
62
67
|
createBasicExtensions({ placeholder: t('message placeholder') }),
|
|
63
68
|
createThemeExtensions({ themeMode }),
|
|
64
|
-
listener({ onChange: (text) => (messageRef.current = text) }),
|
|
69
|
+
listener({ onChange: ({ text }) => (messageRef.current = text) }),
|
|
65
70
|
command,
|
|
66
71
|
],
|
|
67
|
-
[
|
|
72
|
+
[state],
|
|
68
73
|
);
|
|
69
74
|
|
|
70
75
|
// TODO(thure): Factor out.
|
|
@@ -75,6 +80,7 @@ export const CommentsThreadContainer = ({
|
|
|
75
80
|
const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);
|
|
76
81
|
const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);
|
|
77
82
|
const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);
|
|
83
|
+
const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);
|
|
78
84
|
|
|
79
85
|
const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {
|
|
80
86
|
if (!messageRef.current) {
|
|
@@ -84,14 +90,14 @@ export const CommentsThreadContainer = ({
|
|
|
84
90
|
onComment?.(anchor, messageRef.current);
|
|
85
91
|
messageRef.current = '';
|
|
86
92
|
scrollToEnd('instant');
|
|
87
|
-
|
|
93
|
+
setState({});
|
|
88
94
|
|
|
89
95
|
return true;
|
|
90
96
|
}, [anchor, identity]);
|
|
91
97
|
|
|
92
98
|
return (
|
|
93
|
-
<
|
|
94
|
-
id={
|
|
99
|
+
<ThreadComponent.Root
|
|
100
|
+
id={Obj.getDXN(thread).toString()}
|
|
95
101
|
classNames='pbs-2 border-be border-subduedSeparator last:border-none'
|
|
96
102
|
current={current}
|
|
97
103
|
onClickCapture={handleAttend}
|
|
@@ -107,12 +113,12 @@ export const CommentsThreadContainer = ({
|
|
|
107
113
|
>
|
|
108
114
|
{detached ? (
|
|
109
115
|
<Tooltip.Trigger asChild content={t('detached thread label')} side='top'>
|
|
110
|
-
<
|
|
116
|
+
<ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>
|
|
111
117
|
</Tooltip.Trigger>
|
|
112
118
|
) : (
|
|
113
|
-
<
|
|
119
|
+
<ThreadComponent.Header>{thread.name}</ThreadComponent.Header>
|
|
114
120
|
)}
|
|
115
|
-
<div
|
|
121
|
+
<div role='none' className={buttonGroupClassNames}>
|
|
116
122
|
{thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}
|
|
117
123
|
{onResolve && !(thread?.status === 'staged') && (
|
|
118
124
|
<IconButton
|
|
@@ -121,7 +127,7 @@ export const CommentsThreadContainer = ({
|
|
|
121
127
|
icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}
|
|
122
128
|
iconOnly
|
|
123
129
|
label={t('resolve thread label')}
|
|
124
|
-
classNames={[
|
|
130
|
+
classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}
|
|
125
131
|
onClick={handleResolve}
|
|
126
132
|
/>
|
|
127
133
|
)}
|
|
@@ -132,7 +138,7 @@ export const CommentsThreadContainer = ({
|
|
|
132
138
|
icon='ph--x--regular'
|
|
133
139
|
iconOnly
|
|
134
140
|
label={t('delete thread label')}
|
|
135
|
-
classNames={[
|
|
141
|
+
classNames={[buttonClassNames, hoverableControlItem]}
|
|
136
142
|
onClick={handleThreadDelete}
|
|
137
143
|
/>
|
|
138
144
|
)}
|
|
@@ -147,6 +153,7 @@ export const CommentsThreadContainer = ({
|
|
|
147
153
|
message={message}
|
|
148
154
|
members={members}
|
|
149
155
|
onDelete={handleMessageDelete}
|
|
156
|
+
onAcceptProposal={handleAcceptProposal}
|
|
150
157
|
/>
|
|
151
158
|
))}
|
|
152
159
|
|
|
@@ -158,10 +165,10 @@ export const CommentsThreadContainer = ({
|
|
|
158
165
|
*/}
|
|
159
166
|
<MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />
|
|
160
167
|
|
|
161
|
-
<
|
|
168
|
+
<ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>
|
|
162
169
|
|
|
163
170
|
{/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}
|
|
164
171
|
<div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />
|
|
165
|
-
</
|
|
172
|
+
</ThreadComponent.Root>
|
|
166
173
|
);
|
|
167
174
|
};
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { type FC, type PropsWithChildren, useEffect, useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import { useCapability } from '@dxos/app-framework';
|
|
8
|
-
import {
|
|
7
|
+
import { useCapability } from '@dxos/app-framework/react';
|
|
8
|
+
import { type ThemedClassName, useTranslation } from '@dxos/react-ui';
|
|
9
9
|
import { mx } from '@dxos/react-ui-theme';
|
|
10
10
|
|
|
11
11
|
import { ThreadCapabilities } from '../../capabilities';
|
|
@@ -2,47 +2,55 @@
|
|
|
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 StoryObj } from '@storybook/react-vite';
|
|
8
6
|
import React, { useEffect, useState } from 'react';
|
|
9
7
|
|
|
10
8
|
import { scheduleTask } from '@dxos/async';
|
|
11
9
|
import { Context } from '@dxos/context';
|
|
12
10
|
import { log } from '@dxos/log';
|
|
13
|
-
import { withTheme
|
|
11
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
14
12
|
|
|
15
|
-
import { VideoObject } from './VideoObject';
|
|
16
13
|
import { getUserMediaTrack } from '../../calls';
|
|
17
14
|
import { ResponsiveContainer } from '../ResponsiveGrid';
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
render
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
16
|
+
import { VideoObject, type VideoObjectProps } from './VideoObject';
|
|
17
|
+
|
|
18
|
+
const DefaultStory = (props: VideoObjectProps) => {
|
|
19
|
+
log.info('render');
|
|
20
|
+
const [videoStream, setVideoStream] = useState<MediaStream>();
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const ctx = new Context();
|
|
23
|
+
scheduleTask(ctx, async () => {
|
|
24
|
+
try {
|
|
28
25
|
const stream = new MediaStream();
|
|
29
26
|
stream.addTrack(await getUserMediaTrack('videoinput'));
|
|
30
27
|
setVideoStream(stream);
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
28
|
+
} catch (err) {
|
|
29
|
+
log.catch(err);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
return () => {
|
|
34
|
+
void ctx.dispose();
|
|
35
|
+
videoStream?.getTracks().forEach((track) => track.stop());
|
|
36
|
+
};
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<ResponsiveContainer>
|
|
41
|
+
<VideoObject videoStream={videoStream} flip {...props} />
|
|
42
|
+
</ResponsiveContainer>
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const meta = {
|
|
47
|
+
title: 'plugins/plugin-thread/VideoObject',
|
|
48
|
+
component: VideoObject,
|
|
49
|
+
render: DefaultStory,
|
|
50
|
+
decorators: [withTheme],
|
|
51
|
+
parameters: {
|
|
52
|
+
layout: 'fullscreen',
|
|
44
53
|
},
|
|
45
|
-
decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
|
|
46
54
|
};
|
|
47
55
|
|
|
48
56
|
export default meta;
|
|
@@ -5,31 +5,41 @@
|
|
|
5
5
|
import { EditorView } from '@codemirror/view';
|
|
6
6
|
import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import { Surface } from '@dxos/app-framework';
|
|
8
|
+
import { Surface } from '@dxos/app-framework/react';
|
|
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
|
-
import { type
|
|
17
|
+
import { type ContentBlock, type Message } from '@dxos/types';
|
|
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
|
-
message:
|
|
29
|
+
message: Message.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
|
))}
|
|
@@ -90,7 +116,7 @@ const TextboxBlock = ({
|
|
|
90
116
|
isAuthor,
|
|
91
117
|
editing,
|
|
92
118
|
}: {
|
|
93
|
-
block:
|
|
119
|
+
block: ContentBlock.Text;
|
|
94
120
|
editing?: boolean;
|
|
95
121
|
isAuthor?: boolean;
|
|
96
122
|
identity?: Identity;
|
|
@@ -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: ContentBlock.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';
|
|
@@ -142,7 +176,7 @@ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(
|
|
|
142
176
|
return (
|
|
143
177
|
<div
|
|
144
178
|
role='group'
|
|
145
|
-
className={mx('grid col-span-3
|
|
179
|
+
className={mx('grid col-span-3 plb-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
|
|
146
180
|
ref={forwardedRef}
|
|
147
181
|
>
|
|
148
182
|
<Surface role='card' limit={1} data={{ subject }} fallback={title} />
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { memo, useMemo } from 'react';
|
|
6
6
|
|
|
7
|
-
import { useCapability } from '@dxos/app-framework';
|
|
7
|
+
import { useCapability } from '@dxos/app-framework/react';
|
|
8
8
|
|
|
9
9
|
import { type EncodedTrackName, type UserState } from '../../calls';
|
|
10
10
|
import { ThreadCapabilities } from '../../capabilities';
|
|
@@ -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
|
|
|
@@ -18,11 +18,11 @@ import { mx } from '@dxos/react-ui-theme';
|
|
|
18
18
|
export const ResponsiveContainer = ({ children }: PropsWithChildren) => {
|
|
19
19
|
return (
|
|
20
20
|
// Outer container that takes full size of parent.
|
|
21
|
-
<div role='none' className='relative flex
|
|
21
|
+
<div role='none' className='relative flex is-full bs-full'>
|
|
22
22
|
{/* Absolute positioning layer for centering content. */}
|
|
23
23
|
<div role='none' className='absolute inset-0 flex justify-center items-center'>
|
|
24
24
|
{/* Content container that maintains given aspect ratio and proper scaling. */}
|
|
25
|
-
<div role='none' className={mx('max-
|
|
25
|
+
<div role='none' className={mx('max-bs-full max-is-full w-auto h-auto aspect-video')}>
|
|
26
26
|
{children}
|
|
27
27
|
</div>
|
|
28
28
|
</div>
|
|
@@ -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;
|
|
@@ -42,7 +41,7 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
|
|
|
42
41
|
{item.type === 'image' && <img className='aspect-video object-contain' src={item.imageUrl} />}
|
|
43
42
|
{item.type === 'video' && (
|
|
44
43
|
<video
|
|
45
|
-
className='
|
|
44
|
+
className='is-full aspect-video object-cover rounded-md'
|
|
46
45
|
src={item.videoUrl}
|
|
47
46
|
playsInline
|
|
48
47
|
autoPlay
|
|
@@ -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
|
|