@dxos/plugin-thread 0.8.4-main.1068cf700f → 0.8.4-main.1c7ec43d41
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/add-message-3FTZANTW.mjs +89 -0
- package/dist/lib/browser/add-message-3FTZANTW.mjs.map +7 -0
- package/dist/lib/browser/append-channel-message-CO3M6FSA.mjs +40 -0
- package/dist/lib/browser/append-channel-message-CO3M6FSA.mjs.map +7 -0
- package/dist/lib/browser/blueprints/index.mjs +33 -4
- package/dist/lib/browser/blueprints/index.mjs.map +4 -4
- package/dist/lib/browser/chunk-MR4CWITF.mjs +31 -0
- package/dist/lib/browser/chunk-MR4CWITF.mjs.map +7 -0
- package/dist/lib/browser/chunk-TPNZ43NB.mjs +258 -0
- package/dist/lib/browser/chunk-TPNZ43NB.mjs.map +7 -0
- package/dist/lib/browser/create-GMUAPFZM.mjs +55 -0
- package/dist/lib/browser/create-GMUAPFZM.mjs.map +7 -0
- package/dist/lib/browser/create-channel-ZXKSLHGN.mjs +19 -0
- package/dist/lib/browser/create-channel-ZXKSLHGN.mjs.map +7 -0
- package/dist/lib/browser/create-proposals-AV5CREPV.mjs +56 -0
- package/dist/lib/browser/create-proposals-AV5CREPV.mjs.map +7 -0
- package/dist/lib/browser/delete-673YOWCG.mjs +59 -0
- package/dist/lib/browser/delete-673YOWCG.mjs.map +7 -0
- package/dist/lib/browser/delete-message-RQ72ZY5D.mjs +55 -0
- package/dist/lib/browser/delete-message-RQ72ZY5D.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1770 -270
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/on-create-space-SPE3QVFZ.mjs +24 -0
- package/dist/lib/browser/on-create-space-SPE3QVFZ.mjs.map +7 -0
- package/dist/lib/browser/operations/index.mjs +13 -0
- package/dist/lib/browser/operations/index.mjs.map +7 -0
- package/dist/lib/browser/restore-VX7FLZOZ.mjs +32 -0
- package/dist/lib/browser/restore-VX7FLZOZ.mjs.map +7 -0
- package/dist/lib/browser/restore-message-D65NSWUA.mjs +33 -0
- package/dist/lib/browser/restore-message-D65NSWUA.mjs.map +7 -0
- package/dist/lib/browser/select-DO4AYSCB.mjs +26 -0
- package/dist/lib/browser/select-DO4AYSCB.mjs.map +7 -0
- package/dist/lib/browser/toggle-resolved-JD3D4WBZ.mjs +36 -0
- package/dist/lib/browser/toggle-resolved-JD3D4WBZ.mjs.map +7 -0
- package/dist/lib/browser/translations.mjs +90 -0
- package/dist/lib/browser/translations.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +5 -9
- package/dist/lib/node-esm/add-message-56J2HLJB.mjs +90 -0
- package/dist/lib/node-esm/add-message-56J2HLJB.mjs.map +7 -0
- package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs +41 -0
- package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs.map +7 -0
- package/dist/lib/node-esm/blueprints/index.mjs +33 -4
- package/dist/lib/node-esm/blueprints/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-L6UL3NVS.mjs +32 -0
- package/dist/lib/node-esm/chunk-L6UL3NVS.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XKUMDYGR.mjs +259 -0
- package/dist/lib/node-esm/chunk-XKUMDYGR.mjs.map +7 -0
- package/dist/lib/node-esm/create-LEXHIPUT.mjs +56 -0
- package/dist/lib/node-esm/create-LEXHIPUT.mjs.map +7 -0
- package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs +20 -0
- package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs.map +7 -0
- package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs +57 -0
- package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs.map +7 -0
- package/dist/lib/node-esm/delete-4KSU4UEJ.mjs +60 -0
- package/dist/lib/node-esm/delete-4KSU4UEJ.mjs.map +7 -0
- package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs +56 -0
- package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +1770 -270
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs +25 -0
- package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs.map +7 -0
- package/dist/lib/node-esm/operations/index.mjs +14 -0
- package/dist/lib/node-esm/operations/index.mjs.map +7 -0
- package/dist/lib/node-esm/restore-E27OAIFJ.mjs +33 -0
- package/dist/lib/node-esm/restore-E27OAIFJ.mjs.map +7 -0
- package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs +34 -0
- package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs.map +7 -0
- package/dist/lib/node-esm/select-NDHRM75K.mjs +27 -0
- package/dist/lib/node-esm/select-NDHRM75K.mjs.map +7 -0
- package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs +37 -0
- package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs.map +7 -0
- package/dist/lib/node-esm/translations.mjs +91 -0
- package/dist/lib/node-esm/translations.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +5 -9
- package/dist/types/src/ThreadPlugin.d.ts +1 -0
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
- package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
- package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
- package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/index.d.ts +1 -1
- package/dist/types/src/blueprints/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/thread-blueprint.d.ts +3 -20
- package/dist/types/src/blueprints/thread-blueprint.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.map +1 -1
- package/dist/types/src/calls/speaking-monitor.d.ts +0 -3
- package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -1
- package/dist/types/src/calls/types.d.ts.map +1 -1
- package/dist/types/src/calls/util/audio.d.ts.map +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts +2 -2
- package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
- package/dist/types/src/calls/util/history-cache.d.ts.map +1 -1
- package/dist/types/src/calls/util/media.d.ts.map +1 -1
- package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
- package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
- package/dist/types/src/calls-service.stories.d.ts +2 -2
- package/dist/types/src/calls-service.stories.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +6 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/call-manager.d.ts +6 -0
- package/dist/types/src/capabilities/call-manager.d.ts.map +1 -0
- package/dist/types/src/capabilities/create-object.d.ts +11 -0
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +21 -10
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +5 -0
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
- package/dist/types/src/capabilities/{react-root/react-root.d.ts → react-root.d.ts} +1 -1
- package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +5 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/settings.d.ts +7 -0
- package/dist/types/src/capabilities/settings.d.ts.map +1 -0
- package/dist/types/src/capabilities/state.d.ts +7 -0
- package/dist/types/src/capabilities/state.d.ts.map +1 -0
- package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
- package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
- package/dist/types/src/components/Call/Call.d.ts +32 -4
- package/dist/types/src/components/Call/Call.d.ts.map +1 -1
- package/dist/types/src/components/Call/Toolbar.d.ts +5 -5
- package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.d.ts +51 -0
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
- package/dist/types/src/components/Chat/index.d.ts +2 -0
- package/dist/types/src/components/Chat/index.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
- package/dist/types/src/components/{CommentsThreadContainer.d.ts → CommentsPanel/CommentsThread.d.ts} +3 -3
- package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
- package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
- package/dist/types/src/components/Lobby/Lobby.d.ts +24 -3
- package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
- package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
- package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
- package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
- package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
- 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/ResponsiveGrid.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +142 -144
- 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/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
- package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
- package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
- package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
- package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
- package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
- package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
- package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +5 -9
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/{components → containers/CallDebugPanel}/CallDebugPanel.d.ts +1 -1
- package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
- package/dist/types/src/containers/CallDebugPanel/index.d.ts +2 -0
- package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
- package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
- package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
- package/dist/types/src/containers/CallSidebar/index.d.ts +2 -0
- package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
- package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
- package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelContainer/index.d.ts +2 -0
- package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
- package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadCompanion/index.d.ts +2 -0
- package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
- package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +8 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
- package/dist/types/src/extensions/command.d.ts.map +1 -0
- package/dist/types/src/extensions/index.d.ts +1 -0
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/threads.d.ts +3 -3
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- package/dist/types/src/hooks/analytics.d.ts.map +1 -1
- package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/operations/add-message.d.ts +5 -0
- package/dist/types/src/operations/add-message.d.ts.map +1 -0
- package/dist/types/src/operations/append-channel-message.d.ts +5 -0
- package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
- package/dist/types/src/operations/create-channel.d.ts +5 -0
- package/dist/types/src/operations/create-channel.d.ts.map +1 -0
- package/dist/types/src/operations/create-proposals.d.ts +5 -0
- package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
- package/dist/types/src/operations/create.d.ts +5 -0
- package/dist/types/src/operations/create.d.ts.map +1 -0
- package/dist/types/src/operations/definitions.d.ts +1995 -0
- package/dist/types/src/operations/definitions.d.ts.map +1 -0
- package/dist/types/src/operations/delete-message.d.ts +5 -0
- package/dist/types/src/operations/delete-message.d.ts.map +1 -0
- package/dist/types/src/operations/delete.d.ts +5 -0
- package/dist/types/src/operations/delete.d.ts.map +1 -0
- package/dist/types/src/operations/index.d.ts +4 -0
- package/dist/types/src/operations/index.d.ts.map +1 -0
- package/dist/types/src/operations/on-create-space.d.ts +5 -0
- package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
- package/dist/types/src/operations/restore-message.d.ts +5 -0
- package/dist/types/src/operations/restore-message.d.ts.map +1 -0
- package/dist/types/src/operations/restore.d.ts +5 -0
- package/dist/types/src/operations/restore.d.ts.map +1 -0
- package/dist/types/src/operations/select.d.ts +5 -0
- package/dist/types/src/operations/select.d.ts.map +1 -0
- package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
- package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
- package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +1 -1
- package/dist/types/src/testing/data.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +140 -142
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Settings.d.ts +5 -0
- package/dist/types/src/types/Settings.d.ts.map +1 -0
- package/dist/types/src/types/capabilities.d.ts +8 -2
- package/dist/types/src/types/capabilities.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +0 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +1 -3227
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +6 -3
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +89 -71
- package/src/ThreadPlugin.node.ts +39 -0
- package/src/ThreadPlugin.test.ts +37 -0
- package/src/ThreadPlugin.tsx +20 -67
- package/src/blueprints/index.ts +1 -1
- package/src/blueprints/thread-blueprint.ts +13 -9
- package/src/calls/util/calls-service.ts +3 -2
- package/src/calls/util/stub-media-streams.ts +3 -1
- package/src/calls-service.stories.tsx +9 -8
- package/src/capabilities/{app-graph-builder/app-graph-builder.ts → app-graph-builder.ts} +53 -60
- package/src/capabilities/blueprint-definition.ts +19 -0
- package/src/capabilities/{call-manager/call-manager.ts → call-manager.ts} +4 -3
- package/src/capabilities/create-object.ts +29 -0
- package/src/capabilities/index.ts +18 -10
- package/src/capabilities/{markdown/markdown.ts → markdown.ts} +17 -14
- package/src/capabilities/operation-handler.ts +16 -0
- package/src/capabilities/{react-root/react-root.tsx → react-root.tsx} +2 -2
- package/src/capabilities/react-surface.tsx +97 -0
- package/src/capabilities/{settings/settings.ts → settings.ts} +6 -5
- package/src/capabilities/{state/state.ts → state.ts} +1 -1
- package/src/capabilities/undo-mappings.ts +46 -0
- package/src/components/Call/Call.tsx +9 -9
- package/src/components/Call/Toolbar.tsx +28 -20
- package/src/components/Chat/Chat.tsx +258 -0
- package/src/components/Chat/index.ts +5 -0
- package/src/components/{Comments.stories.tsx → CommentsPanel/CommentsPanel.stories.tsx} +18 -16
- package/src/components/{CommentsContainer.tsx → CommentsPanel/CommentsPanel.tsx} +15 -14
- package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +19 -20
- package/src/components/CommentsPanel/index.ts +6 -0
- package/src/components/Lobby/Lobby.tsx +12 -10
- package/src/components/Media/VideoObject.stories.tsx +6 -7
- package/src/components/Media/VideoObject.tsx +1 -1
- package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +28 -19
- package/src/components/MessagePanel/index.ts +5 -0
- package/src/components/Participant/Participant.tsx +2 -1
- package/src/components/Participant/ParticipantGrid.tsx +0 -1
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +11 -11
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +8 -8
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +9 -9
- package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +9 -9
- package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
- package/src/components/ResponsiveGrid/index.ts +1 -1
- package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
- package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
- package/src/components/ThreadSettings/index.ts +5 -0
- package/src/components/index.ts +6 -9
- package/src/{components → containers/CallDebugPanel}/CallDebugPanel.tsx +8 -7
- package/src/containers/CallDebugPanel/index.ts +5 -0
- package/src/{components → containers/CallSidebar}/CallSidebar.tsx +3 -5
- package/src/containers/CallSidebar/index.ts +5 -0
- package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
- package/src/containers/ChannelChat/index.ts +8 -0
- package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +105 -0
- package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +73 -58
- package/src/containers/ChannelContainer/index.ts +5 -0
- package/src/{components → containers/ThreadCompanion}/ThreadCompanion.tsx +66 -45
- package/src/containers/ThreadCompanion/index.ts +5 -0
- package/src/{components/Chat.stories.tsx → containers/ThreadContainer/ThreadContainer.stories.tsx} +23 -23
- package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
- package/src/containers/ThreadContainer/index.ts +8 -0
- package/src/containers/index.ts +12 -0
- package/src/{components/command-extension.ts → extensions/command.ts} +1 -1
- package/src/extensions/index.ts +1 -0
- package/src/extensions/threads.ts +15 -14
- package/src/hooks/analytics.ts +2 -1
- package/src/index.ts +10 -3
- package/src/meta.ts +2 -2
- package/src/operations/add-message.ts +81 -0
- package/src/operations/append-channel-message.ts +36 -0
- package/src/operations/create-channel.ts +20 -0
- package/src/operations/create-proposals.ts +49 -0
- package/src/operations/create.ts +48 -0
- package/src/operations/definitions.ts +177 -0
- package/src/operations/delete-message.ts +53 -0
- package/src/operations/delete.ts +63 -0
- package/src/operations/index.ts +22 -0
- package/src/operations/on-create-space.ts +27 -0
- package/src/operations/restore-message.ts +38 -0
- package/src/operations/restore.ts +38 -0
- package/src/operations/select.ts +24 -0
- package/src/operations/toggle-resolved.ts +41 -0
- package/src/{components/testing.ts → testing/data.ts} +7 -7
- package/src/testing/index.ts +1 -1
- package/src/translations.ts +72 -76
- package/src/types/Settings.ts +10 -0
- package/src/types/capabilities.ts +15 -7
- package/src/types/index.ts +0 -1
- package/src/types/types.ts +2 -184
- package/src/util.ts +37 -5
- package/dist/lib/browser/app-graph-builder-XFGLMIGK.mjs +0 -189
- package/dist/lib/browser/app-graph-builder-XFGLMIGK.mjs.map +0 -7
- package/dist/lib/browser/blueprint-definition-ACPH22F7.mjs +0 -18
- package/dist/lib/browser/blueprint-definition-ACPH22F7.mjs.map +0 -7
- package/dist/lib/browser/call-manager-GDGIKJKN.mjs +0 -26
- package/dist/lib/browser/call-manager-GDGIKJKN.mjs.map +0 -7
- package/dist/lib/browser/chunk-2FIHSX35.mjs +0 -293
- package/dist/lib/browser/chunk-2FIHSX35.mjs.map +0 -7
- package/dist/lib/browser/chunk-4EUEMHNI.mjs +0 -1817
- package/dist/lib/browser/chunk-4EUEMHNI.mjs.map +0 -7
- package/dist/lib/browser/chunk-CP7E2HRE.mjs +0 -31
- package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
- package/dist/lib/browser/chunk-ERK254BS.mjs +0 -1810
- package/dist/lib/browser/chunk-ERK254BS.mjs.map +0 -7
- package/dist/lib/browser/chunk-ISCHODBV.mjs +0 -106
- package/dist/lib/browser/chunk-ISCHODBV.mjs.map +0 -7
- package/dist/lib/browser/chunk-JBB73URQ.mjs +0 -184
- package/dist/lib/browser/chunk-JBB73URQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-RH7XTXSR.mjs +0 -106
- package/dist/lib/browser/chunk-RH7XTXSR.mjs.map +0 -7
- package/dist/lib/browser/markdown-YJCSOWXX.mjs +0 -210
- package/dist/lib/browser/markdown-YJCSOWXX.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-PROCP5L4.mjs +0 -441
- package/dist/lib/browser/operation-resolver-PROCP5L4.mjs.map +0 -7
- package/dist/lib/browser/react-root-FHK2SVPU.mjs +0 -25
- package/dist/lib/browser/react-root-FHK2SVPU.mjs.map +0 -7
- package/dist/lib/browser/react-surface-7MQA6VSH.mjs +0 -111
- package/dist/lib/browser/react-surface-7MQA6VSH.mjs.map +0 -7
- package/dist/lib/browser/repair-6OZ75AUU.mjs +0 -38
- package/dist/lib/browser/repair-6OZ75AUU.mjs.map +0 -7
- package/dist/lib/browser/settings-TWKOTGSU.mjs +0 -33
- package/dist/lib/browser/settings-TWKOTGSU.mjs.map +0 -7
- package/dist/lib/browser/state-SJR2GL5G.mjs +0 -24
- package/dist/lib/browser/state-SJR2GL5G.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs +0 -190
- package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs.map +0 -7
- package/dist/lib/node-esm/blueprint-definition-SXVKFUNV.mjs +0 -19
- package/dist/lib/node-esm/blueprint-definition-SXVKFUNV.mjs.map +0 -7
- package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs +0 -27
- package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
- package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-G7PZNN3Z.mjs +0 -185
- package/dist/lib/node-esm/chunk-G7PZNN3Z.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-OKVE6CLS.mjs +0 -107
- package/dist/lib/node-esm/chunk-OKVE6CLS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs +0 -1811
- package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-RBRWHRHE.mjs +0 -1818
- package/dist/lib/node-esm/chunk-RBRWHRHE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-VBI32FGI.mjs +0 -108
- package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-WMWUXWAS.mjs +0 -294
- package/dist/lib/node-esm/chunk-WMWUXWAS.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-6LRP3PAP.mjs +0 -211
- package/dist/lib/node-esm/markdown-6LRP3PAP.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs +0 -442
- package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs +0 -26
- package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs +0 -112
- package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs.map +0 -7
- package/dist/lib/node-esm/repair-6777EPOM.mjs +0 -39
- package/dist/lib/node-esm/repair-6777EPOM.mjs.map +0 -7
- package/dist/lib/node-esm/settings-5O254B3Z.mjs +0 -34
- package/dist/lib/node-esm/settings-5O254B3Z.mjs.map +0 -7
- package/dist/lib/node-esm/state-5R3TZJQE.mjs +0 -25
- package/dist/lib/node-esm/state-5R3TZJQE.mjs.map +0 -7
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +0 -6
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -10
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/call-manager/call-manager.d.ts +0 -6
- package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +0 -1
- package/dist/types/src/capabilities/call-manager/index.d.ts +0 -3
- package/dist/types/src/capabilities/call-manager/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/markdown/index.d.ts +0 -3
- package/dist/types/src/capabilities/markdown/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/markdown/markdown.d.ts +0 -5
- package/dist/types/src/capabilities/markdown/markdown.d.ts.map +0 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-root/index.d.ts +0 -6
- package/dist/types/src/capabilities/react-root/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-root/react-root.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +0 -5
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
- package/dist/types/src/capabilities/repair/index.d.ts +0 -3
- package/dist/types/src/capabilities/repair/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/repair/repair.d.ts +0 -6
- package/dist/types/src/capabilities/repair/repair.d.ts.map +0 -1
- package/dist/types/src/capabilities/settings/index.d.ts +0 -3
- package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/settings/settings.d.ts +0 -6
- package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
- package/dist/types/src/capabilities/state/index.d.ts +0 -3
- package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/state/state.d.ts +0 -7
- package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
- package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
- package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
- package/dist/types/src/components/ChannelContainer.d.ts +0 -13
- package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -164
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/Chat.stories.d.ts +0 -164
- package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
- package/dist/types/src/components/ChatContainer.d.ts +0 -18
- package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
- package/dist/types/src/components/Comments.stories.d.ts +0 -162
- package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
- package/dist/types/src/components/CommentsContainer.d.ts +0 -13
- package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
- package/dist/types/src/components/MessageContainer.d.ts +0 -15
- package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -166
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/ThreadCompanion.d.ts +0 -5
- package/dist/types/src/components/ThreadCompanion.d.ts.map +0 -1
- package/dist/types/src/components/ThreadSettings.d.ts +0 -8
- package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
- package/dist/types/src/components/command-extension.d.ts.map +0 -1
- package/dist/types/src/components/testing.d.ts.map +0 -1
- package/dist/types/src/functions/create-proposals.d.ts +0 -13
- package/dist/types/src/functions/create-proposals.d.ts.map +0 -1
- package/dist/types/src/functions/index.d.ts +0 -2
- package/dist/types/src/functions/index.d.ts.map +0 -1
- package/dist/types/src/testing/stories.d.ts +0 -3
- package/dist/types/src/testing/stories.d.ts.map +0 -1
- package/dist/types/src/types/Channel.d.ts +0 -695
- package/dist/types/src/types/Channel.d.ts.map +0 -1
- package/src/capabilities/app-graph-builder/index.ts +0 -7
- package/src/capabilities/blueprint-definition/blueprint-definition.ts +0 -24
- package/src/capabilities/blueprint-definition/index.ts +0 -7
- package/src/capabilities/call-manager/index.ts +0 -7
- package/src/capabilities/markdown/index.ts +0 -7
- package/src/capabilities/operation-resolver/index.ts +0 -7
- package/src/capabilities/operation-resolver/operation-resolver.ts +0 -400
- package/src/capabilities/react-root/index.ts +0 -7
- package/src/capabilities/react-surface/index.ts +0 -7
- package/src/capabilities/react-surface/react-surface.tsx +0 -98
- package/src/capabilities/repair/index.ts +0 -7
- package/src/capabilities/repair/repair.ts +0 -51
- package/src/capabilities/settings/index.ts +0 -7
- package/src/capabilities/state/index.ts +0 -7
- package/src/components/ChannelContainer.stories.tsx +0 -60
- package/src/components/ChatContainer.tsx +0 -152
- package/src/components/ThreadSettings.tsx +0 -22
- package/src/functions/create-proposals.ts +0 -57
- package/src/functions/index.ts +0 -5
- package/src/testing/stories.ts +0 -56
- package/src/types/Channel.ts +0 -30
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/Call/Call.tsx", "../../../src/components/Media/AudioStream.tsx", "../../../src/components/Media/VideoObject.tsx", "../../../src/components/Participant/Participant.tsx", "../../../src/components/ResponsiveGrid/ResponsiveContainer.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGrid.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGridItem.tsx", "../../../src/components/Participant/ParticipantGrid.tsx", "../../../src/components/Call/Toolbar.tsx", "../../../src/components/CallDebugPanel.tsx", "../../../src/components/ChatContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/components/MessageContainer.tsx", "../../../src/components/ChannelContainer.tsx", "../../../src/components/CallSidebar.tsx", "../../../src/components/ThreadCompanion.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/CommentsThreadContainer.tsx", "../../../src/components/ThreadSettings.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { type FC, type PropsWithChildren } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { useDebugMode } from '../../hooks';\nimport { ThreadCapabilities } from '../../types';\nimport { AudioStream } from '../Media';\nimport { ParticipantGrid } from '../Participant';\n\nimport { Toolbar, type ToolbarProps } from './Toolbar';\n\n//\n// Root\n//\n\ntype CallRootProps = PropsWithChildren<ThemedClassName>;\n\nconst CallRoot: FC<CallRootProps> = ({ children }) => {\n return <div className='relative flex flex-col grow overflow-hidden'>{children}</div>;\n};\n\nCallRoot.displayName = 'CallRoot';\n\n//\n// Audio\n//\n\ntype CallAudioProps = {};\n\nconst CallAudio: FC<CallAudioProps> = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);\n\n return <AudioStream tracks={audioTracksToPlay} />;\n};\n\nCallAudio.displayName = 'CallAudio';\n\n//\n// Room\n//\n\ntype CallGridProps = {\n fullscreen?: boolean;\n};\n\nconst CallGrid: FC<CallGridProps> = ({ fullscreen }) => {\n const debug = useDebugMode();\n const call = useCapability(ThreadCapabilities.CallManager);\n const self = useAtomValue(call.selfAtom);\n const users = useAtomValue(call.usersAtom);\n\n return (\n <div className='grid grow p-4 dark:bg-neutral-900'>\n <ParticipantGrid self={self} users={users} debug={debug} fullscreen={fullscreen} />\n </div>\n );\n};\n\nCallGrid.displayName = 'CallGrid';\n\n//\n// Toolbar\n//\n\ntype CallToolbarProps = Pick<ToolbarProps, 'channel' | 'onLeave'>;\n\nconst CallToolbar: FC<CallToolbarProps> = (props) => {\n return (\n <div className='absolute bottom-0 left-0 right-0 flex justify-center'>\n <Toolbar isInRoom {...props} />\n </div>\n );\n};\n\nCallToolbar.displayName = 'CallToolbar';\n\n//\n// Export\n//\n\nexport const Call = {\n Root: CallRoot,\n Grid: CallGrid,\n Audio: CallAudio,\n Toolbar: CallToolbar,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC, useEffect, useRef } from 'react';\n\nexport type AudioStreamProps = {\n tracks: MediaStreamTrack[];\n};\n\nexport const AudioStream: FC<AudioStreamProps> = ({ tracks }) => {\n const mediaStreamRef = useRef(new MediaStream());\n const ref = useRef<HTMLAudioElement>(null);\n\n useEffect(() => {\n const audio = ref.current;\n if (!audio) {\n return;\n }\n\n const mediaStream = mediaStreamRef.current;\n audio.srcObject = mediaStream;\n }, []);\n\n const resetSrcObject = () => {\n const audio = ref.current;\n const mediaStream = mediaStreamRef.current;\n if (!audio || !mediaStream) {\n return;\n }\n\n // Need to set srcObject again in Chrome and call play() again for Safari\n // https://www.youtube.com/live/Tkx3OGrwVk8?si=K--P_AzNnAGrjraV&t=2533\n // Calling play() this way to make Chrome happy otherwise it throws an error.\n audio.addEventListener('canplay', () => audio.play(), { once: true });\n audio.srcObject = mediaStream;\n };\n\n return (\n <>\n <audio ref={ref} autoPlay />\n {tracks.map((track) => (\n <AudioTrack key={track.id} track={track} mediaStream={mediaStreamRef.current} resetSrcObject={resetSrcObject} />\n ))}\n </>\n );\n};\n\ntype AudioTrackParams = {\n track: MediaStreamTrack;\n mediaStream: MediaStream;\n resetSrcObject: () => void;\n};\n\nconst AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackParams) => {\n useEffect(() => {\n const currentTrack = track;\n mediaStream.addTrack(currentTrack);\n resetSrcObject();\n return () => {\n mediaStream.removeTrack(currentTrack);\n resetSrcObject();\n };\n }, [track, mediaStream]);\n\n return null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type JSX, forwardRef, memo, useEffect, useRef } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nexport type VideoObjectProps = Omit<JSX.IntrinsicElements['video'], 'className' | 'ref'> &\n ThemedClassName<{\n videoStream?: MediaStream;\n flip?: boolean;\n // TODO(burdon): If screenshare then contain.\n contain?: boolean;\n }>;\n\nexport const VideoObject = memo(\n forwardRef<HTMLVideoElement, VideoObjectProps>(({ videoStream, classNames, flip, contain, ...rest }, ref) => {\n const internalRef = useRef<HTMLVideoElement | null>(null);\n\n useEffect(() => {\n const video = internalRef.current;\n if (video && videoStream) {\n video.srcObject = videoStream;\n video.setAttribute('autoplay', 'true');\n video.setAttribute('playsinline', 'true');\n }\n }, [videoStream, internalRef.current]);\n\n // NOTE: The video element typically has a max size of 1280x720.\n return (\n <video\n className={mx(\n 'is-full aspect-video',\n flip && 'scale-x-[-1]',\n contain ? 'object-contain' : 'object-cover',\n classNames,\n )}\n ref={(v) => {\n internalRef.current = v;\n if (ref === null) {\n return;\n }\n\n if (typeof ref === 'function') {\n ref(v);\n } else {\n ref.current = v;\n }\n }}\n {...rest}\n />\n );\n }),\n);\n\nVideoObject.displayName = 'VideoObject';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { memo, useMemo } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\n\nimport { type EncodedTrackName, type UserState } from '../../calls';\nimport { ThreadCapabilities } from '../../types';\nimport { VideoObject } from '../Media';\nimport { ResponsiveGridItem, type ResponsiveGridItemProps } from '../ResponsiveGrid';\n\nexport const SCREENSHARE_SUFFIX = '_screenshare';\n\nexport const Participant = memo(({ item: user, debug, ...props }: ResponsiveGridItemProps<UserState>) => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const self = useAtomValue(call.selfAtom);\n const media = useAtomValue(call.mediaAtom);\n const isSelf: boolean = self.id !== undefined && user.id !== undefined && user.id.startsWith(self.id);\n const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);\n\n // Get pulled video stream for non-self users.\n const pulledVideoStream = useMemo<MediaStream | undefined>(() => {\n if (isSelf) {\n return undefined;\n }\n const trackName =\n isScreenshare && user.tracks?.screenshareEnabled\n ? (user.tracks?.screenshare as EncodedTrackName)\n : !isScreenshare && user.tracks?.videoEnabled\n ? (user.tracks?.video as EncodedTrackName)\n : undefined;\n return trackName ? media.pulledVideoStreams[trackName]?.stream : undefined;\n }, [\n isSelf,\n isScreenshare,\n media.pulledVideoStreams,\n user.tracks?.screenshare,\n user.tracks?.video,\n user.tracks?.screenshareEnabled,\n user.tracks?.videoEnabled,\n ]);\n\n const videoStream = useMemo<MediaStream | undefined>(() => {\n if (isSelf) {\n return isScreenshare ? media.screenshareVideoStream : media.videoStream;\n }\n return pulledVideoStream;\n }, [isSelf, isScreenshare, media.videoStream, media.screenshareVideoStream, pulledVideoStream]);\n\n return (\n <ResponsiveGridItem\n {...props}\n item={user}\n name={user.name}\n self={isSelf}\n screenshare={!!media.screenshareVideoStream}\n video={media.videoEnabled}\n mute={user ? !user.tracks?.audioEnabled : false}\n wave={user.raisedHand}\n speaking={user.speaking}\n debug={debug}\n >\n <VideoObject\n videoStream={videoStream}\n flip={isSelf && !isScreenshare}\n contain={!!isScreenshare}\n classNames='rounded-md'\n />\n </ResponsiveGridItem>\n );\n});\n\nParticipant.displayName = 'Participant';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren } from 'react';\n\nimport { mx } from '@dxos/ui-theme';\n\n/**\n * A container component that maintains the child's aspect ratio while centering its content.\n * The container will scale to fit within its parent's bounds while preserving the aspect ratio.\n *\n * @example\n * <ResponsiveContainer>\n * <VideoObject />\n * </ResponsiveContainer>\n */\nexport const ResponsiveContainer = ({ children }: PropsWithChildren) => {\n return (\n // Outer container that takes full size of parent.\n <div role='none' className='relative flex is-full bs-full'>\n {/* Absolute positioning layer for centering content. */}\n <div role='none' className='absolute inset-0 flex justify-center items-center'>\n {/* Content container that maintains given aspect ratio and proper scaling. */}\n <div role='none' className={mx('max-bs-full max-is-full is-auto bs-auto aspect-video')}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { invariant } from '@dxos/invariant';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { type Size } from '@dxos/react-ui-dnd';\nimport { mx } from '@dxos/ui-theme';\n\nimport { ResponsiveContainer } from './ResponsiveContainer';\nimport { type ResponsiveGridItemProps } from './ResponsiveGridItem';\n\nconst ASPECT_RATIO = 16 / 9;\nconst MIN_GALLERY_HEIGHT = 250;\n\nconst DEFAULT_GAP = 8;\n\nconst maxImageSize = 'is-[2560px] bs-[1440px]';\n\n/**\n * Props for the ResponsiveGrid component.\n */\nexport type ResponsiveGridProps<T extends object = any> = ThemedClassName<{\n /** Cell component. */\n Cell: ComponentType<ResponsiveGridItemProps<T>>;\n\n /** Space between grid items in pixels. */\n gap?: number;\n\n /** Function to get the ID of an item. */\n getId?: (item: T) => string;\n\n /** Array of items to display in the grid. */\n items: T[];\n\n /** ID of the pinned item. */\n pinned?: string;\n\n /** Whether to hide the gallery (unpinned items) when an item is pinned. */\n autoHideGallery?: boolean;\n\n /** Whether the divider is resizable. */\n resizable?: boolean;\n\n /** Debug mode. */\n debug?: boolean;\n\n /** Callback when the pinned item changes. */\n onPinnedChange?: (pinned: string | undefined) => void;\n}>;\n\nconst defaultGetId: ResponsiveGridProps<any>['getId'] = (item: any) => item.id;\n\n/**\n * A responsive grid component that automatically adjusts its layout to optimize space usage.\n * Maintains aspect ratio of items while ensuring uniform gaps between them.\n */\nexport const ResponsiveGrid = <T extends object = any>({\n classNames,\n Cell,\n gap = DEFAULT_GAP,\n getId = defaultGetId,\n items,\n pinned,\n autoHideGallery = false,\n debug,\n onPinnedChange,\n}: ResponsiveGridProps<T>) => {\n const {\n width: containerWidth = 0,\n height: containerHeight = 0,\n ref: containerRef,\n } = useResizeDetector<HTMLDivElement>({ refreshRate: 100 });\n const [dividerHeight, setDividerHeight] = useState<Size>(0);\n useEffect(() => {\n if (containerWidth && containerHeight) {\n const { height } = fitAspectRatio(containerWidth, containerHeight, ASPECT_RATIO);\n setDividerHeight(Math.min(height, containerHeight - MIN_GALLERY_HEIGHT));\n }\n }, [containerWidth, containerHeight]);\n\n const pinnedItem = useMemo(() => items.find((item) => getId(item) === pinned), [items, pinned]);\n const mainItems = useMemo(() => items.filter((item) => getId(item) !== pinned), [items, pinned]);\n const hideGallery = autoHideGallery && pinnedItem !== undefined;\n\n //\n // Recalculate optimal layout when container size or items change.\n //\n const [{ time, columns, cellWidth }, setLayout] = useState<Layout>({ time: 0, columns: 0, cellWidth: 0 });\n const { width = 0, height = 0, ref: gridContainerRef } = useResizeDetector<HTMLDivElement>({ refreshRate: 200 });\n useEffect(() => {\n if (containerHeight && width && height) {\n const layout = calculateLayout(width, height, mainItems.length, gap);\n setLayout({ time: Date.now(), ...layout });\n }\n }, [containerHeight, width, height, mainItems.length, gap, pinned]);\n\n //\n // We use the browser to layout invisible divs and then calculate the absolute position of these items,\n // which are animated into position.\n //\n const [bounds, setBounds] = useState<[T, DOMRectBounds][]>([]);\n useLayoutEffect(() => {\n if ((!hideGallery && !gridContainerRef.current) || !containerHeight) {\n return;\n }\n\n // TODO(burdon): Consider directly setting bounds on DOM elementsinstead of state update?\n const t = setTimeout(() => {\n setBounds(\n items\n .filter((item) => !hideGallery || item === pinnedItem)\n .map((item) => {\n invariant(containerRef.current);\n const el = containerRef.current.querySelector(`[data-grid-item=\"${getId(item)}\"]`);\n if (!el) {\n return null;\n }\n\n const bounds = getRelativeBounds(containerRef.current, el as HTMLElement);\n return [item, bounds];\n })\n .filter((item): item is [T, DOMRectBounds] => item !== null),\n );\n });\n\n return () => clearTimeout(t);\n }, [containerHeight, items, pinnedItem, hideGallery, time]);\n\n const handleClick = useCallback(\n (item: T) => onPinnedChange?.(getId(item) === pinned ? undefined : getId(item)),\n [pinned, onPinnedChange],\n );\n\n return (\n <div ref={containerRef} className={mx('relative is-full bs-full', classNames)}>\n {/* Placeholder elements to calculate layout. */}\n <div className='absolute inset-0 flex flex-col grow gap-2'>\n {/* Pinned item. */}\n {pinnedItem && (\n <div\n className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'bs-full')}\n style={hideGallery ? {} : { height: dividerHeight }}\n >\n <SoloItem id={getId(pinnedItem)} debug={debug} />\n </div>\n )}\n\n {/* Gallery. */}\n {!hideGallery && (\n <div\n ref={gridContainerRef}\n className='flex grow-[1] overflow-hidden justify-center items-center'\n style={hideGallery ? {} : { minHeight: MIN_GALLERY_HEIGHT }}\n >\n {mainItems.length === 1 && (\n <div style={{ width: cellWidth }} className='flex bs-full'>\n <SoloItem id={getId(mainItems[0])} debug={debug} />\n </div>\n )}\n\n {mainItems.length > 1 && columns > 0 && (\n <div\n role='grid'\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, ${cellWidth}px)`,\n gap: `${gap}px`,\n }}\n >\n {mainItems.map((item) => (\n <div\n key={getId(item)}\n {...{ 'data-grid-item': getId(item) }}\n className={mx(\n 'aspect-video max-bs-full max-is-full is-auto bs-auto',\n debug && 'border border-primary-500',\n )}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Absolutely positioned items. */}\n <div className={mx(debug && 'opacity-10')}>\n {bounds.map(([item, bounds]) => (\n <Cell\n key={getId(item)}\n classNames='absolute transition-all duration-500'\n item={item}\n style={bounds}\n pinned={getId(item) === pinned}\n onClick={items.length > 1 ? handleClick : undefined}\n />\n ))}\n </div>\n </div>\n );\n};\n\nconst SoloItem: FC<Pick<ResponsiveGridProps, 'debug'> & { id: string }> = ({ debug, id }) => {\n return (\n <ResponsiveContainer>\n <div\n {...{ 'data-grid-item': id }}\n className={mx('aspect-video overflow-hidden', debug && 'z-20 border-2 border-primary-500')}\n >\n {/* Maximum size placeholder image forces aspect ratio. */}\n <img alt='placeholder video' className={mx('opacity-0', maxImageSize)} />\n </div>\n </ResponsiveContainer>\n );\n};\n\ntype DOMRectBounds = Pick<DOMRect, 'top' | 'left' | 'width' | 'height'>;\n\n// TODO(burdon): Reconcile with react-ui-gameboard.\nconst getRelativeBounds = (container: HTMLElement, el: HTMLElement): DOMRectBounds => {\n const containerRect = container.getBoundingClientRect();\n const elementRect = el.getBoundingClientRect();\n return {\n top: elementRect.top - containerRect.top,\n left: elementRect.left - containerRect.left,\n width: elementRect.width,\n height: elementRect.height,\n };\n};\n\ntype Layout = {\n time?: number;\n columns: number;\n cellWidth: number;\n};\n\n/**\n * Calculates the optimal number of columns for a grid layout that minimizes wasted space.\n * @param containerWidth - Width of the container in pixels.\n * @param containerHeight - Height of the container in pixels.\n * @param count - Total number of items to display.\n * @param gap - Space between items in pixels.\n * @param aspectRatio - Desired aspect ratio of items (width/height).\n * @returns The optimal number of columns.\n */\nconst calculateLayout = (\n containerWidth: number,\n containerHeight: number,\n count: number,\n gap: number,\n aspectRatio = ASPECT_RATIO,\n): Layout => {\n if (count === 0) {\n return { columns: 1, cellWidth: 1 };\n }\n\n let minWastedSpace = Infinity;\n let bestColumns = 1;\n let cellWidth = 0;\n\n // Try different rows counts to find the optimal layout that minimizes wasted space.\n for (let rows = 1; rows <= count; rows++) {\n const cols = Math.ceil(count / rows);\n\n // Calculate available space accounting for gaps.\n const { width: itemWidth, height: itemHeight } = fitItemsToGrid(\n containerWidth,\n containerHeight,\n cols,\n rows,\n aspectRatio,\n gap,\n );\n\n // Calculate total wasted space for this configuration.\n const usedWidth = itemWidth * cols + gap * cols - 1;\n const usedHeight = itemHeight * rows + gap * rows - 1;\n\n // Determine if optimal.\n const wastedSpace = containerWidth * containerHeight - usedWidth * usedHeight;\n if (wastedSpace < minWastedSpace) {\n minWastedSpace = wastedSpace;\n bestColumns = cols;\n cellWidth = itemWidth;\n }\n }\n\n return { columns: bestColumns, cellWidth };\n};\n\n/**\n * Returns the size of the largest rectangle with the given aspect ration that fits within the grid.\n */\nconst fitItemsToGrid = (\n outerWidth: number,\n outerHeight: number,\n numCols: number,\n numRows: number,\n aspectRatio: number,\n gap: number,\n): { width: number; height: number } => {\n // Calculate available space accounting for gaps.\n const availableWidth = outerWidth - gap * (numCols - 1);\n const availableHeight = outerHeight - gap * (numRows - 1);\n\n // Calculate max dimensions.\n const maxCellWidth = availableWidth / numCols;\n const maxCellHeight = availableHeight / numRows;\n\n // Use fitAspectRatio to get dimensions that fit within max cell size while maintaining the desired aspect ratio\n return fitAspectRatio(maxCellWidth, maxCellHeight, aspectRatio);\n};\n\n/**\n * Returns the size of the largest rectangle the given aspect ratio that fits within the outer rectangle.\n */\nconst fitAspectRatio = (\n outerWidth: number,\n outerHeight: number,\n aspectRatio: number,\n): { width: number; height: number } => {\n if (outerWidth <= 0 || outerHeight <= 0 || aspectRatio <= 0) {\n return { width: 0, height: 0 };\n }\n\n // First try fitting to width.\n let width = outerWidth;\n let height = width / aspectRatio;\n\n // If too tall, fit to height instead.\n if (height > outerHeight) {\n height = outerHeight;\n width = height * aspectRatio;\n }\n\n return { width, height };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type CSSProperties, type PropsWithChildren, useEffect, useState } from 'react';\n\nimport { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { Waveform } from '@dxos/react-ui-sfx';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nexport type ResponsiveGridItemProps<T extends object = any> = PropsWithChildren<\n ThemedClassName<{\n item: T;\n style?: CSSProperties;\n pinned?: boolean;\n name?: string;\n self?: boolean;\n screenshare?: boolean;\n video?: boolean;\n mute?: boolean;\n wave?: boolean;\n speaking?: boolean;\n debug?: boolean;\n onClick?: (item: T) => void;\n }>\n>;\n\n/**\n * Cell container.\n */\nexport const ResponsiveGridItem = <T extends object = any>({\n children,\n classNames,\n item,\n style,\n name,\n self,\n pinned,\n screenshare,\n video,\n mute,\n wave,\n speaking,\n onClick,\n}: ResponsiveGridItemProps<T>) => {\n const { t } = useTranslation(meta.id);\n const iconProps: Record<string, { icon: string; label: string; classNames?: string }> = {\n wave: {\n icon: 'ph--hand-waving--duotone',\n label: t('icon wave'),\n classNames: 'animate-pulse bg-orange-500',\n },\n mute: {\n icon: 'ph--microphone-slash--regular',\n label: t('icon muted'),\n },\n };\n\n const props = wave && !pinned ? iconProps.wave : mute ? iconProps.mute : speaking ? iconProps.speaking : undefined;\n\n // Debounce speaking indicator.\n const [speakingIndicator, setSpeakingIndicator] = useState(speaking);\n useEffect(() => {\n if (speaking) {\n setSpeakingIndicator(true);\n } else {\n const timeout = setTimeout(() => {\n setSpeakingIndicator(false);\n }, 1_000);\n return () => clearTimeout(timeout);\n }\n }, [speaking]);\n\n return (\n <div\n className={mx(\n 'relative is-full bs-full group',\n 'rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500',\n speakingIndicator ? 'outline-green-500' : !video && 'outline-separator',\n classNames,\n )}\n style={style}\n >\n {children}\n\n {/* Action. */}\n {onClick && (\n <div className='z-10 absolute top-1 right-1 flex'>\n <IconButton\n classNames={mx('p-1 min-bs-1 rounded', groupHoverControlItemWithTransition)}\n iconOnly\n icon={pinned ? 'ph--x--regular' : 'ph--arrows-out--regular'}\n size={pinned ? 5 : 4}\n label={pinned ? t('icon unpin') : t('icon pin')}\n onClick={() => onClick?.(item)}\n />\n </div>\n )}\n\n {/* Name. */}\n {name && (\n <div className='z-10 absolute bottom-1 left-8 right-1 flex justify-end gap-1 items-center'>\n {/* TODO(burdon): Replace with avatar for everyone. */}\n {/* {self && <Icon icon='ph--asterisk--regular' size={pinned ? 5 : 4} />} */}\n {screenshare && <Icon icon='ph--broadcast--regular' size={pinned ? 5 : 4} />}\n <div\n className={mx(\n 'bg-neutral-800 text-neutral-100 plb-0.5 truncate rounded',\n pinned ? 'pli-2' : 'pli-1 text-xs',\n )}\n >\n {name}\n </div>\n </div>\n )}\n\n {/* Activity. */}\n <div className='z-10 absolute bottom-1 left-1 flex'>\n {(speaking && <Waveform active size={pinned ? 5 : 4} />) ||\n (props && (\n <IconButton\n classNames={mx('p-1 min-bs-1 rounded', props?.classNames)}\n icon={props?.icon}\n label={props?.label}\n size={pinned ? 5 : 4}\n iconOnly\n />\n ))}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { type UserState } from '../../calls';\nimport { ResponsiveGrid } from '../ResponsiveGrid';\n\nimport { Participant, SCREENSHARE_SUFFIX } from './Participant';\n\nconst getId = (user: UserState): string => user.id!;\n\nexport type ParticipantGridProps = ThemedClassName<{\n self: UserState;\n users: UserState[];\n fullscreen?: boolean;\n debug?: boolean;\n}>;\n\nexport const ParticipantGrid = ({ classNames, self, users, fullscreen, debug }: ParticipantGridProps) => {\n const [pinned, setPinned] = useState<string | undefined>();\n\n const allUsers = useMemo(() => {\n const allUsers: (UserState & { isSelf?: boolean })[] = [];\n users.forEach((user) => {\n if (!user.joined) {\n return;\n }\n\n allUsers.push({ ...user, isSelf: user.id === self.id });\n if (user.tracks?.screenshareEnabled) {\n const screenshare: UserState = {\n ...user,\n id: user.id + SCREENSHARE_SUFFIX,\n tracks: {\n ...user.tracks,\n video: user.tracks.screenshare,\n videoEnabled: user.tracks.screenshareEnabled,\n } as any, // TODO(burdon): Remove cast.\n };\n\n allUsers.push(screenshare);\n }\n });\n\n return allUsers;\n }, [self, users]);\n\n useEffect(() => {\n if (pinned) {\n // Check expanded user is still in call.\n if (!allUsers.find((user) => user.id === pinned)) {\n setPinned(undefined);\n }\n }\n }, [pinned, allUsers]);\n\n // TODO(burdon): Put self last.\n const sortedUsers: UserState[] = allUsers.sort((a, b) => {\n if (a.isSelf) {\n return 1;\n } else if (b.isSelf) {\n return -1;\n } else if (a.tracks?.screenshareEnabled) {\n return -1;\n } else if (b.tracks?.screenshareEnabled) {\n return 1;\n } else {\n return 0;\n }\n });\n\n // TODO(burdon): Show ghost view of user for a second before leaving.\n return (\n <ResponsiveGrid<UserState>\n classNames={classNames}\n Cell={Participant}\n debug={debug}\n getId={getId}\n items={sortedUsers}\n pinned={pinned}\n autoHideGallery={fullscreen}\n onPinnedChange={setPinned}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useActions, useNode } from '@dxos/plugin-graph';\nimport {\n Icon,\n IconButton,\n type IconButtonProps,\n Toolbar as NaturalToolbar,\n type ThemedClassName,\n toLocalizedString,\n useTranslation,\n} from '@dxos/react-ui';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { ThreadCapabilities } from '../../types';\nimport { type Channel } from '../../types';\n\nexport type ToolbarProps = ThemedClassName<{\n channel?: Channel.Channel;\n participants?: number;\n autoHideControls?: boolean;\n isInRoom?: boolean;\n onJoin?: () => void;\n onLeave?: () => void;\n}>;\n\n// TODO(wittjosiah): Use ToolbarMenu.\nexport const Toolbar = ({\n classNames,\n channel,\n participants,\n autoHideControls = true,\n onJoin,\n onLeave,\n}: ToolbarProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n const call = useCapability(ThreadCapabilities.CallManager);\n const media = useAtomValue(call.mediaAtom);\n const joined = useAtomValue(call.joinedAtom);\n const raisedHand = useAtomValue(call.raisedHandAtom);\n\n // Channel app graph node.\n const node = useNode(graph, channel && Obj.getDXN(channel).toString());\n const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');\n\n // Screen sharing.\n const isScreensharing = media.screenshareTrack !== undefined;\n const canSharescreen =\n typeof navigator.mediaDevices !== 'undefined' && navigator.mediaDevices.getDisplayMedia !== undefined;\n\n // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.\n return (\n <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>\n <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>\n <ToggleButton\n active={media.audioEnabled}\n state={{\n on: {\n icon: 'ph--microphone--regular',\n label: t('mic off'),\n onClick: () => call.turnAudioOff(),\n classNames: 'bg-callActive',\n },\n off: {\n icon: 'ph--microphone-slash--duotone',\n label: t('mic on'),\n onClick: () => call.turnAudioOn(),\n classNames: [joined && 'bg-callAlert'],\n },\n }}\n />\n <ToggleButton\n active={media.videoEnabled}\n state={{\n on: {\n icon: 'ph--video-camera--regular',\n label: t('camera off'),\n onClick: () => call.turnVideoOff(),\n },\n off: {\n icon: 'ph--video-camera-slash--duotone',\n label: t('camera on'),\n onClick: () => call.turnVideoOn(),\n },\n }}\n />\n\n {(participants !== undefined && (\n <div className='flex justify-center items-center gap-2 is-[5rem] text-xs text-subdued'>\n <Icon icon='ph--users--regular' size={4} />\n <div>{participants}</div>\n </div>\n )) || <NaturalToolbar.Separator variant='gap' />}\n\n {joined && (\n <>\n <ToggleButton\n disabled={!canSharescreen}\n active={isScreensharing}\n state={{\n on: {\n icon: 'ph--monitor--regular',\n label: t('screenshare off'),\n onClick: () => call.turnScreenshareOff(),\n },\n off: {\n icon: 'ph--monitor-arrow-up--duotone',\n label: t('screenshare on'),\n onClick: () => call.turnScreenshareOn(),\n },\n }}\n />\n\n {/* Companion actions. */}\n {actions\n .filter((action): action is Node.Action => Node.isAction(action))\n .map((action) => (\n <IconButton\n key={action.id}\n {...defaultButtonProps}\n icon={action.properties.icon}\n label={toLocalizedString(action.properties.label, t)}\n classNames={action.properties.classNames}\n onClick={() => node && void runAction(action, { parent: node })}\n />\n ))}\n\n <ToggleButton\n active={raisedHand}\n state={{\n on: {\n icon: 'ph--hand-waving--regular',\n label: t('lower hand'),\n onClick: () => call.setRaisedHand(false),\n classNames: [joined && 'bg-callAlert'],\n },\n off: {\n icon: 'ph--hand-palm--duotone',\n label: t('raise hand'),\n onClick: () => call.setRaisedHand(true),\n },\n }}\n />\n </>\n )}\n {joined ? (\n <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />\n ) : (\n <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />\n )}\n </NaturalToolbar.Root>\n </div>\n );\n};\n\nToolbar.displayName = 'MeetingToolbar';\n\ntype ToolbarButtonProps = Pick<IconButtonProps, 'disabled'> & {\n active?: boolean;\n state: {\n on: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n off: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n };\n};\n\nconst defaultButtonProps: Partial<IconButtonProps> = {\n size: 5,\n iconOnly: true,\n};\n\nconst ToggleButton = ({ active, state }: ToolbarButtonProps) => (\n <IconButton\n {...defaultButtonProps}\n classNames={[active ? (state.on.classNames ?? 'bg-callActive') : state.off.classNames]}\n icon={active ? state.on.icon : state.off.icon}\n label={active ? state.on.label : state.off.label}\n onClick={active ? state.on.onClick : state.off.onClick}\n />\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { WebRTCStats, type WebRTCStatsEvent } from '@peermetrics/webrtc-stats';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { truncateKey } from '@dxos/debug';\nimport { JsonView, Panel } from '@dxos/devtools';\nimport { log } from '@dxos/log';\nimport { IconButton, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';\n\nimport { type EncodedTrackName, type GlobalState } from '../calls';\nimport { meta } from '../meta';\n\nexport type CallDebugPanelProps = ThemedClassName<{ state?: GlobalState }>;\n\nexport const CallDebugPanel = ({ state }: CallDebugPanelProps) => {\n const { t } = useTranslation(meta.id);\n\n const [open, setOpen] = useState(false);\n const handleToggle = () => setOpen(!open);\n const [showServiceHistory, setShowServiceHistory] = useState(false);\n const handleToggleServiceHistory = () => setShowServiceHistory(!showServiceHistory);\n\n const handleCopyRaw = async () => {\n await navigator.clipboard.writeText(JSON.stringify({ users: state?.call?.users, stats }, null, 2));\n };\n\n const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);\n const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);\n\n const webrtcStats = useMemo(\n () =>\n new WebRTCStats({\n getStatsInterval: 1000,\n }),\n [],\n );\n const [stats, setStats] = useState<WebRTCStatsEvent['data']>();\n\n useEffect(() => {\n const pc = state?.media.peer?.session?.peerConnection;\n const handleStats = (stats: WebRTCStatsEvent) => {\n setStats(stats.data);\n };\n let added = false;\n if (pc && showDetailedWebRTCStats) {\n webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });\n webrtcStats.on('stats', handleStats as never);\n added = true;\n }\n return () => {\n try {\n if (pc && added) {\n webrtcStats.removeConnection({ pc });\n webrtcStats.removeListener('stats', handleStats as never);\n }\n } catch (error) {\n log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });\n }\n };\n }, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);\n\n const rows = useMemo(() => getCallStatusTable(state), [state?.call.users, state?.media.pulledAudioTracks]);\n\n return (\n <Panel\n id='meeting-status'\n icon='ph--video-conference--regular'\n open={open}\n onToggle={handleToggle}\n title={t('meeting status title')}\n info={<div className='flex items-center gap-2'> {state?.call.joined ? 'Active' : 'Inactive'}</div>}\n maxHeight={0}\n >\n <div className='flex flex-col is-full text-xs'>\n <div className='flex items-center gap-2 items-center'>\n <Input.Root>\n <Input.Switch checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />\n <Input.Label>{t('show webrtc stats title')}</Input.Label>\n </Input.Root>\n </div>\n <div className='flex items-center gap-2 items-center'>\n <Input.Root>\n <Input.Switch checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />\n <Input.Label>{t('show calls history title')}</Input.Label>\n </Input.Root>\n </div>\n <div className='flex items-center gap-2 items-center'>\n <IconButton icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />\n </div>\n <Table rows={rows} />\n {showDetailedWebRTCStats && <JsonView data={{ stats }} />}\n {showServiceHistory && <JsonView data={{ history: state?.media.peer?.history.get() }} />}\n </div>\n </Panel>\n );\n};\n\nconst getCallStatusTable = (state?: GlobalState): TableProps['rows'] => {\n if (!state || !state.call?.users) {\n return [];\n }\n\n const self = state.call.self;\n const users = state.call.users\n .filter((user) => user.id !== self!.id)\n .map((user) => {\n const isOk = {\n audio:\n user.tracks?.audio &&\n state.media.pulledAudioTracks[user.tracks?.audio as EncodedTrackName]?.ctx.disposed === false,\n video:\n user.tracks?.video &&\n state.media.pulledVideoStreams[user.tracks?.video as EncodedTrackName]?.ctx.disposed === false,\n screenshare:\n user.tracks?.screenshare &&\n state.media.pulledVideoStreams[user.tracks?.screenshare as EncodedTrackName]?.ctx.disposed === false,\n };\n\n return {\n ...user,\n isOk,\n };\n });\n\n return [\n ['users', state.call.users.length ?? 0],\n [\n '*self* ' + (self?.name ?? truncateKey(self!.id, 8)),\n self?.tracks?.audio && state.media.pushedAudioTrack ? 'AUD ✅' : 'AUD ❌',\n self?.tracks?.video && state.media.pushedVideoTrack ? 'VID ✅' : 'VID ❌',\n self?.tracks?.screenshareEnabled\n ? self.tracks.screenshareEnabled && state.media.pushedScreenshareTrack\n ? 'SCR ✅'\n : 'SCR ❌'\n : undefined,\n ],\n\n ...users.map((user) => [\n user.name ?? truncateKey(user.id, 8),\n user.isOk.audio ? 'AUD ✅' : 'AUD ❌',\n user.isOk.video ? 'VID ✅' : 'VID ❌',\n user.tracks?.screenshareEnabled ? (user.isOk.screenshare ? 'SCR ✅' : 'SCR ❌') : undefined,\n ]),\n ['ICE', state.media.peer?.session?.peerConnection.iceConnectionState ?? 'no connection'],\n ];\n};\n\nexport namespace Unit {\n export const KB = (n?: number) => ((n ?? 0) / 1_000).toFixed(2);\n}\n\nexport type TableProps = {\n rows: (string | number | undefined)[][];\n};\n\nexport const Table = ({ rows }: TableProps) => {\n return (\n <div className='is-full text-xs font-mono'>\n {rows.map(([prefix, label, value, unit], i) => (\n <div key={i} className='grid grid-cols-[3fr_1fr_1fr_1fr]'>\n <div className='p-1'>{prefix}</div>\n <div className='p-1'>{label}</div>\n <div className='p-1'>{value}</div>\n <div className='p-1'>{unit}</div>\n </div>\n ))}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Ref } from '@dxos/echo';\nimport { type Space, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread as ThreadComponent,\n type ThreadRootProps,\n threadLayout,\n} from '@dxos/react-ui-thread';\nimport { Message, type Thread } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer } from './MessageContainer';\n\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(meta.id);\n return (\n <div role='none' className='flex items-center'>\n <StackItem.SigilButton attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </StackItem.SigilButton>\n <StackItem.HeadingLabel attendableId={attendableId}>{t('chat heading')}</StackItem.HeadingLabel>\n </div>\n );\n};\n\nexport type ChatContainerProps = ThemedClassName<\n {\n space: Space;\n thread: Thread.Thread;\n context?: Obj.Unknown;\n autoFocusTextbox?: boolean;\n } & Pick<ThreadRootProps, 'current'>\n>;\n\nexport const ChatContainer = ({\n classNames,\n space,\n thread,\n context,\n current,\n autoFocusTextbox,\n}: ChatContainerProps) => {\n const { t } = useTranslation(meta.id);\n const id = Obj.getDXN(thread).toString();\n const identity = useIdentity()!;\n const members = useMembers(space?.id);\n const activity = useStatus(space, id);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(id, identity);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: ({ text }) => (messageRef.current = text) }),\n command,\n ],\n [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n Obj.change(thread, (t) => {\n t.messages.push(\n Ref.make(\n Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender: { identityDid: identity.did },\n blocks: [{ _tag: 'text', text: messageRef.current }],\n properties: context ? { context: Ref.make(context) } : undefined,\n }),\n ),\n );\n });\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n return (\n <ThreadComponent.Root\n current={current}\n id={id}\n classNames={[\n 'bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden',\n 'transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0',\n classNames,\n ]}\n >\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport classNames='col-span-2'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {thread.messages\n .map((message) => message.target)\n .filter(isNonNullable)\n .map((message) => (\n <MessageContainer key={message.id} message={message} members={members} />\n ))}\n </div>\n {/* NOTE(thure): This can't also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref'd element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n <ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>\n </ThreadComponent.Root>\n );\n};\n\nexport default ChatContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n {\n tag: tags.tagName,\n class: mx('dx-tag dx-tag--indigo text-baseText font-medium'),\n },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { type Obj, Ref } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity, useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { useTextEditor } from '@dxos/react-ui-editor';\nimport { Card } from '@dxos/react-ui-mosaic';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type ContentBlock, type Message } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useOnEditAnalytics } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\n\nexport const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';\nexport const buttonClassNames = '!p-1 transition-opacity';\n\nexport type MessageContainerProps = {\n message: Obj.Obj<Message.Message> | Ref.Ref<Obj.Obj<Message.Message>>;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n onAcceptProposal?: (id: string) => void;\n};\n\nexport const MessageContainer = ({\n message: messageOrRef,\n members,\n editable = false,\n onDelete,\n onAcceptProposal,\n}: MessageContainerProps) => {\n const { t } = useTranslation(meta.id);\n const [message, updateMessage] = useObject(messageOrRef);\n const identity = useIdentity();\n const [editing, setEditing] = useState(false);\n\n const textBlockIndex = message?.blocks.findIndex((block) => block._tag === 'text') ?? -1;\n\n const handleEdit = useCallback(() => setEditing((editing) => !editing), []);\n const handleDelete = useCallback(() => message && onDelete?.(message.id), [message, onDelete]);\n const handleAcceptProposal = useCallback(\n () => message && onAcceptProposal?.(message.id),\n [message, onAcceptProposal],\n );\n const handleTextBlockChange = useCallback(\n (newText: string) => {\n updateMessage((m) => {\n const targetBlock = m.blocks[textBlockIndex];\n if (targetBlock && targetBlock._tag === 'text') {\n targetBlock.text = newText;\n }\n });\n },\n [updateMessage, textBlockIndex],\n );\n\n const textBlock =\n message && textBlockIndex !== -1 ? (message.blocks[textBlockIndex] as ContentBlock.Text) : undefined;\n useOnEditAnalytics(message, textBlock, !!editing);\n\n if (!message) {\n return null;\n }\n\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = identity?.did === messageMetadata.authorId;\n const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');\n const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <div role='none' className={buttonGroupClassNames}>\n {userIsAuthor && editable && (\n <IconButton\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n variant='ghost'\n icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}\n iconOnly\n label={t(editing ? 'save message label' : 'edit message label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleEdit}\n />\n )}\n {/* TODO(wittjosiah): Proposal controls should probably be hoisted to thread level. */}\n {proposalBlock && onAcceptProposal && (\n <IconButton\n data-testid='thread.message.accept'\n variant='ghost'\n icon='ph--check--regular'\n iconOnly\n label={t('accept proposal label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleAcceptProposal}\n />\n )}\n {onDelete && (\n <IconButton\n data-testid='thread.message.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete message label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleDelete}\n />\n )}\n </div>\n </MessageHeading>\n {textBlock && (\n <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} onSave={handleTextBlockChange} />\n )}\n {proposalBlock && <ProposalBlock block={proposalBlock} />}\n {Ref.Array.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference as Obj.Unknown} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Obj.Unknown }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n onSave,\n}: {\n block: ContentBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n onSave?: (newText: string) => void;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(block.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n onSave?.(inMemoryContentRef.current);\n }, [onSave]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {\n return (\n <div role='none' className='mie-4 italic'>\n {block.text}\n </div>\n );\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {\n // TODO(burdon): Use annotation to get title.\n let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <Card.Root\n className={mx('grid col-span-3 plb-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface.Surface role='card-content' limit={1} data={{ subject }} fallback={title} />\n </Card.Root>\n );\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, useAtomValue } from '@effect-atom/atom-react';\nimport React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useCapabilities, useCapability } from '@dxos/app-framework/ui';\nimport { type SurfaceComponentProps } from '@dxos/app-toolkit/ui';\nimport { Context } from '@dxos/context';\nimport { failUndefined } from '@dxos/debug';\nimport { Obj } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { ElevationProvider, Input, useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\nimport { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { meta } from '../meta';\nimport { ThreadCapabilities } from '../types';\nimport { type Channel } from '../types';\n\nimport { Call } from './Call';\nimport ChatContainer from './ChatContainer';\n\nexport type ChannelContainerProps = SurfaceComponentProps<\n Channel.Channel | undefined,\n {\n roomId?: string;\n fullscreen?: boolean;\n }\n>;\n\n/**\n * Renders a call when active, otherwise renders the channel chat.\n */\n// TODO(burdon): Create Radix style layout.\nexport const ChannelContainer = ({ role, subject: channel, roomId: roomIdProp, fullscreen }: ChannelContainerProps) => {\n const space = getSpace(channel);\n const callManager = useCapability(ThreadCapabilities.CallManager);\n const joined = useAtomValue(callManager.joinedAtom);\n const currentRoomId = useAtomValue(callManager.roomIdAtom);\n const attendableId = channel ? Obj.getDXN(channel).toString() : undefined;\n const roomId = roomIdProp ?? attendableId ?? failUndefined();\n const identity = useIdentity();\n const isNamed = !!identity?.profile?.displayName;\n const joinSound = useSoundEffect('JoinCall');\n const leaveSound = useSoundEffect('LeaveCall');\n\n const extensions = useCapabilities(ThreadCapabilities.CallExtension);\n useEffect(() => {\n const ctx = new Context();\n callManager.left.on(ctx, (roomId) => {\n extensions.forEach((extension) => {\n void extension.onLeave?.(roomId);\n });\n });\n\n callManager.callStateUpdated.on(ctx, (state) => {\n extensions.forEach((extension) => {\n void extension.onCallStateUpdated?.(state);\n });\n });\n\n callManager.mediaStateUpdated.on(ctx, (state) => {\n extensions.forEach((extension) => {\n void extension.onMediaStateUpdated?.(state);\n });\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [callManager, extensions]);\n\n /**\n * Join the call.\n */\n // TODO(wittjosiah): Show preview before joining?\n const handleJoin = useCallback(async () => {\n if (!roomId || !channel) {\n return;\n }\n\n if (joined) {\n await callManager.leave();\n }\n\n try {\n void joinSound.play();\n callManager.setRoomId(roomId);\n await callManager.join();\n await Promise.all(extensions.map((extension) => extension.onJoin?.({ channel, roomId })));\n } catch (err) {\n // TODO(burdon): Error sound.\n log.catch(err);\n }\n }, [extensions, channel, roomId, joined]);\n\n /**\n * Leave the call.\n */\n const handleLeave = useCallback(async () => {\n try {\n void leaveSound.play();\n } catch (err) {\n // TODO(burdon): Error sound.\n log.catch(err);\n } finally {\n void callManager.turnAudioOff();\n void callManager.turnVideoOff();\n void callManager.turnScreenshareOff();\n void callManager.leave();\n }\n }, [extensions, roomId]);\n\n const isJoined = joined && currentRoomId === roomId;\n\n return (\n <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>\n {isJoined && !isNamed && <DisplayNameMissing />}\n {isJoined && isNamed && (\n <Call.Root>\n <Call.Grid fullscreen={fullscreen} />\n <Call.Toolbar channel={channel} onLeave={handleLeave} />\n </Call.Root>\n )}\n {!isJoined && channel && channel.defaultThread.target && space && (\n <>\n <ChannelToolbar attendableId={attendableId} role={role} onJoinCall={handleJoin} />\n <ChatContainer space={space} thread={channel.defaultThread.target} classNames='container-max-width' />\n </>\n )}\n </StackItem.Content>\n );\n};\n\nexport default ChannelContainer;\n\nconst DisplayNameMissing = () => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n const [displayName, setDisplayName] = useState('');\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => setDisplayName(event.target.value), []);\n const handleSave = useCallback(() => client.halo.updateProfile({ displayName }), [client, displayName]);\n\n return (\n <Settings.Group classNames='p-4 place-content-center'>\n <Settings.ItemInput title={t('display name label')} description={t('display name description')}>\n <Input.TextInput\n value={displayName}\n onChange={handleChange}\n placeholder={t('display name input placeholder')}\n classNames='md:min-is-64'\n />\n </Settings.ItemInput>\n <Settings.GroupButton disabled={!displayName} onClick={handleSave}>\n {t('set display name label')}\n </Settings.GroupButton>\n </Settings.Group>\n );\n};\n\nconst useChannelToolbarActions = (onJoinCall?: () => void) => {\n const creator = useMemo(\n () =>\n Atom.make(() => {\n return {\n nodes: [\n createMenuItemGroup('root', {\n label: ['channel toolbar title', { ns: meta.id }],\n }),\n createMenuAction('video-call', () => onJoinCall?.(), {\n label: ['start video call label', { ns: meta.id }],\n icon: 'ph--video-camera--regular',\n type: 'video-call',\n }),\n ],\n edges: [{ source: 'root', target: 'video-call' }],\n };\n }),\n [],\n );\n\n return useMenuActions(creator);\n};\n\ntype ChannelToolbarProps = {\n attendableId?: string;\n role?: string;\n onJoinCall?: () => void;\n};\n\nconst ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {\n const menuProps = useChannelToolbarActions(onJoinCall);\n\n return (\n <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>\n <MenuProvider {...menuProps} attendableId={attendableId}>\n <ToolbarMenu textBlockWidth />\n </MenuProvider>\n </ElevationProvider>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\n\nimport { ThreadCapabilities } from '../types';\n\nimport { ChannelContainer } from './ChannelContainer';\n\nexport const CallSidebar = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const roomId = useAtomValue(call.roomIdAtom);\n return <ChannelContainer subject={undefined} roomId={roomId} />;\n};\n\nexport default CallSidebar;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { useCapabilities, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { AppCapabilities, CollaborationOperation, LayoutOperation } from '@dxos/app-toolkit';\nimport { Filter, Obj, Query, Relation } from '@dxos/echo';\nimport { Ref, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Layout } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { AnchoredTo, Thread } from '@dxos/types';\nimport { mx } from '@dxos/ui-theme';\n\nimport { CommentsContainer, type CommentsContainerProps } from '../components';\nimport { meta } from '../meta';\nimport { ThreadCapabilities, ThreadOperation, type ViewState } from '../types';\n\nconst initialViewState: ViewState = { showResolvedThreads: false };\n\nexport const ThreadCompanion = ({ subject }: { subject: any }) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const identity = useIdentity();\n const subjectId = Obj.getDXN(subject).toString();\n const registry = useCapability(Capabilities.AtomRegistry);\n\n const stateAtom = useCapability(ThreadCapabilities.State);\n const viewStoreAtom = useCapability(ThreadCapabilities.ViewState);\n const state = useAtomValue(stateAtom);\n const viewStore = useAtomValue(viewStoreAtom);\n const drafts = state.drafts[subjectId];\n\n // Get or initialize view state for this subject.\n const viewState = useMemo(() => {\n if (!viewStore[subjectId]) {\n registry.set(viewStoreAtom, { ...viewStore, [subjectId]: { ...initialViewState } });\n return initialViewState;\n }\n return viewStore[subjectId];\n }, [viewStore, subjectId, registry, viewStoreAtom]);\n const { showResolvedThreads } = viewState;\n\n const onChangeViewState = useCallback(\n (nextValue: string) => {\n registry.set(viewStoreAtom, {\n ...registry.get(viewStoreAtom),\n [subjectId]: { ...registry.get(viewStoreAtom)[subjectId], showResolvedThreads: nextValue === 'all' },\n });\n },\n [registry, viewStoreAtom, subjectId],\n );\n\n const anchorSorts = useCapabilities(AppCapabilities.AnchorSort);\n const sort = useMemo(\n () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,\n [anchorSorts, subject],\n );\n\n const db = Obj.getDatabase(subject);\n const objectsAnchoredTo = useQuery(db, Query.select(Filter.id(subject.id)).targetOf(AnchoredTo.AnchoredTo));\n const anchors = objectsAnchoredTo\n .toSorted((a, b) => sort?.(a, b) ?? 0)\n .filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))\n .concat(drafts ?? []);\n\n const attended = useAttended();\n\n const handleAttend = useCallback(\n (anchor: AnchoredTo.AnchoredTo) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const threadId = Obj.getDXN(thread).toString();\n\n if (state.current !== threadId) {\n registry.set(stateAtom, { ...registry.get(stateAtom), current: threadId });\n\n // TODO(wittjosiah): Should this be a thread-specific intent?\n // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.\n // This may be overloading this intent or highjacking its intended purpose.\n void invokePromise(LayoutOperation.ScrollIntoView, {\n subject: Obj.getDXN(subject).toString(),\n cursor: anchor.anchor,\n ref: threadId,\n });\n }\n },\n [state.current, invokePromise, subject, registry, stateAtom],\n );\n\n const handleComment = useCallback(\n async (anchor: AnchoredTo.AnchoredTo, text: string) => {\n await invokePromise(ThreadOperation.AddMessage, {\n anchor,\n subject,\n sender: { identityDid: identity?.did },\n text,\n });\n\n const thread = Relation.getSource(anchor) as Thread.Thread;\n registry.set(stateAtom, { ...registry.get(stateAtom), current: Obj.getDXN(thread).toString() });\n },\n [invokePromise, identity, subject, registry, stateAtom],\n );\n\n const handleResolve = useCallback(\n (anchor: AnchoredTo.AnchoredTo) =>\n invokePromise(ThreadOperation.ToggleResolved, {\n thread: Relation.getSource(anchor) as Thread.Thread,\n }),\n [invokePromise],\n );\n\n const handleThreadDelete = useCallback(\n (anchor: AnchoredTo.AnchoredTo) => invokePromise(ThreadOperation.Delete, { anchor, subject }),\n [invokePromise, subject],\n );\n\n const handleMessageDelete = useCallback(\n (anchor: AnchoredTo.AnchoredTo, messageId: string) =>\n invokePromise(ThreadOperation.DeleteMessage, {\n anchor,\n subject,\n messageId,\n }),\n [invokePromise, subject],\n );\n\n const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(\n async (anchor, messageId) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));\n const message = thread.messages[messageIndex]?.target;\n const proposal = message?.blocks.find((block) => block._tag === 'proposal');\n if (!proposal || !anchor.anchor) {\n return;\n }\n\n await invokePromise(CollaborationOperation.AcceptProposal, {\n subject,\n anchor: anchor.anchor,\n proposal,\n });\n await invokePromise(ThreadOperation.ToggleResolved, { thread });\n },\n [invokePromise, subject],\n );\n\n const comments = (\n <CommentsContainer\n anchors={anchors}\n currentId={attended.includes(subjectId) ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n );\n\n return (\n <Layout.Main toolbar>\n <Tabs.Root\n value={showResolvedThreads ? 'all' : 'unresolved'}\n orientation='horizontal'\n classNames={[\n 'contents [&_[role=\"tabpanel\"]]:min-bs-0 [&_[role=\"tabpanel\"]]:overflow-y-auto [&_[role=\"tabpanel\"]]:scrollbar-thin',\n ]}\n onValueChange={onChangeViewState}\n >\n {/* TODO(burdon): Standardize (like Tollbar). */}\n <Tabs.Tablist classNames={mx('bg-toolbarSurface border-be border-subduedSeparator')}>\n <Tabs.Tab value='unresolved' classNames='text-sm'>\n {t('show unresolved label')}\n </Tabs.Tab>\n <Tabs.Tab value='all' classNames='text-sm'>\n {t('show all label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n <div className='overflow-y-auto'>\n <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>\n <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>\n </div>\n </Tabs.Root>\n </Layout.Main>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\n\nimport { meta } from '../meta';\n\nimport { CommentsThreadContainer, type CommentsThreadContainerProps } from './CommentsThreadContainer';\n\nexport type CommentsContainerProps = Omit<CommentsThreadContainerProps, 'anchor' | 'current'> & {\n anchors: AnchoredTo.AnchoredTo[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Root container for collection of comment threads.\n */\nexport const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsContainerProps) => {\n const { t } = useTranslation(meta.id);\n\n // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.\n const filteredAnchors = showResolvedThreads\n ? anchors.filter((anchor) => !!Relation.getSource(anchor))\n : anchors.filter((anchor) => {\n const thread = Relation.getSource(anchor);\n return thread && thread.status !== 'resolved';\n });\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n if (filteredAnchors.length === 0) {\n return (\n <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>\n <Callout.Root>\n <Callout.Title>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='inline-block' />,\n },\n }}\n />\n </Callout.Title>\n </Callout.Root>\n </div>\n );\n }\n\n return (\n <div>\n {filteredAnchors.map((anchor) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const threadId = Obj.getDXN(thread).toString();\n return <CommentsThreadContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;\n })}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread as ThreadComponent,\n type ThreadRootProps,\n} from '@dxos/react-ui-thread';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';\n\nexport type CommentsThreadContainerProps = {\n anchor: AnchoredTo.AnchoredTo;\n onAttend?: (anchor: AnchoredTo.AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo.AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo.AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo.AnchoredTo) => void;\n onAcceptProposal?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const CommentsThreadContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n onAcceptProposal,\n}: CommentsThreadContainerProps) => {\n const { themeMode } = useThemeContext();\n const { t } = useTranslation(meta.id);\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.id);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const [messages] = useObject(thread, 'messages');\n const activity = useStatus(space, Obj.getDXN(thread).toString());\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n\n const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);\n\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [state, setState] = useState({});\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: ({ text }) => (messageRef.current = text) }),\n command,\n ],\n [state],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n setState({});\n\n return true;\n }, [anchor, identity]);\n\n return (\n <ThreadComponent.Root\n id={Obj.getDXN(thread).toString()}\n classNames='pbs-2 border-be border-subduedSeparator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>\n </Tooltip.Trigger>\n ) : (\n <ThreadComponent.Header>{thread.name}</ThreadComponent.Header>\n )}\n <div role='none' className={buttonGroupClassNames}>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <IconButton\n data-testid='thread.resolve'\n variant='ghost'\n icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}\n iconOnly\n label={t('resolve thread label')}\n classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}\n onClick={handleResolve}\n />\n )}\n {onThreadDelete && (\n <IconButton\n data-testid='thread.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete thread label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleThreadDelete}\n />\n )}\n </div>\n </div>\n\n {messages?.map((ref) => (\n <MessageContainer\n key={ref.dxn.toString()}\n editable\n message={ref}\n members={members}\n onDelete={handleMessageDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n ))}\n\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n\n <ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>\n\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </ThreadComponent.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\n\nimport { meta } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport type ThreadSettingsComponentProps = {\n settings: ThreadSettingsProps;\n onSettingsChange: (fn: (current: ThreadSettingsProps) => ThreadSettingsProps) => void;\n};\n\n// TODO(burdon): Settings.\nexport const ThreadSettings = ({ settings: _settings }: ThreadSettingsComponentProps) => {\n const { t: _t } = useTranslation(meta.id);\n return <Settings.Root></Settings.Root>;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useAtomValue", "React", "useCapability", "React", "useEffect", "useRef", "AudioStream", "tracks", "mediaStreamRef", "useRef", "MediaStream", "ref", "useEffect", "audio", "current", "mediaStream", "srcObject", "resetSrcObject", "addEventListener", "play", "once", "autoPlay", "map", "track", "AudioTrack", "key", "id", "currentTrack", "addTrack", "removeTrack", "React", "forwardRef", "memo", "useEffect", "useRef", "mx", "VideoObject", "memo", "forwardRef", "videoStream", "classNames", "flip", "contain", "rest", "ref", "internalRef", "useRef", "useEffect", "video", "current", "srcObject", "setAttribute", "React", "className", "mx", "v", "displayName", "useAtomValue", "React", "memo", "useMemo", "useCapability", "React", "mx", "ResponsiveContainer", "children", "React", "div", "role", "className", "mx", "React", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useState", "useResizeDetector", "invariant", "mx", "ASPECT_RATIO", "MIN_GALLERY_HEIGHT", "DEFAULT_GAP", "maxImageSize", "defaultGetId", "item", "id", "ResponsiveGrid", "classNames", "Cell", "gap", "getId", "items", "pinned", "autoHideGallery", "debug", "onPinnedChange", "width", "containerWidth", "height", "containerHeight", "ref", "containerRef", "useResizeDetector", "refreshRate", "dividerHeight", "setDividerHeight", "useState", "useEffect", "fitAspectRatio", "Math", "min", "pinnedItem", "useMemo", "find", "mainItems", "filter", "hideGallery", "undefined", "time", "columns", "cellWidth", "setLayout", "gridContainerRef", "layout", "calculateLayout", "length", "Date", "now", "bounds", "setBounds", "useLayoutEffect", "current", "t", "setTimeout", "map", "invariant", "el", "querySelector", "getRelativeBounds", "clearTimeout", "handleClick", "useCallback", "React", "div", "className", "mx", "style", "SoloItem", "minHeight", "role", "display", "gridTemplateColumns", "key", "onClick", "ResponsiveContainer", "img", "alt", "container", "containerRect", "getBoundingClientRect", "elementRect", "top", "left", "count", "aspectRatio", "minWastedSpace", "Infinity", "bestColumns", "rows", "cols", "ceil", "itemWidth", "itemHeight", "fitItemsToGrid", "usedWidth", "usedHeight", "wastedSpace", "outerWidth", "outerHeight", "numCols", "numRows", "availableWidth", "availableHeight", "maxCellWidth", "maxCellHeight", "React", "useEffect", "useState", "Icon", "IconButton", "useTranslation", "Waveform", "groupHoverControlItemWithTransition", "mx", "ResponsiveGridItem", "children", "classNames", "item", "style", "name", "self", "pinned", "screenshare", "video", "mute", "wave", "speaking", "onClick", "t", "useTranslation", "meta", "id", "iconProps", "icon", "label", "props", "undefined", "speakingIndicator", "setSpeakingIndicator", "useState", "useEffect", "timeout", "setTimeout", "clearTimeout", "React", "div", "className", "mx", "IconButton", "groupHoverControlItemWithTransition", "iconOnly", "size", "Icon", "Waveform", "active", "SCREENSHARE_SUFFIX", "Participant", "memo", "item", "user", "debug", "props", "call", "useCapability", "ThreadCapabilities", "CallManager", "self", "useAtomValue", "selfAtom", "media", "mediaAtom", "isSelf", "id", "undefined", "startsWith", "isScreenshare", "endsWith", "pulledVideoStream", "useMemo", "trackName", "tracks", "screenshareEnabled", "screenshare", "videoEnabled", "video", "pulledVideoStreams", "stream", "videoStream", "screenshareVideoStream", "React", "ResponsiveGridItem", "name", "mute", "audioEnabled", "wave", "raisedHand", "speaking", "VideoObject", "flip", "contain", "classNames", "displayName", "React", "useEffect", "useMemo", "useState", "getId", "user", "id", "ParticipantGrid", "classNames", "self", "users", "fullscreen", "debug", "pinned", "setPinned", "useState", "allUsers", "useMemo", "forEach", "joined", "push", "isSelf", "tracks", "screenshareEnabled", "screenshare", "SCREENSHARE_SUFFIX", "video", "videoEnabled", "useEffect", "find", "undefined", "sortedUsers", "sort", "a", "b", "React", "ResponsiveGrid", "Cell", "Participant", "items", "autoHideGallery", "onPinnedChange", "useAtomValue", "React", "useCapability", "useAppGraph", "Obj", "Node", "useActionRunner", "useActions", "useNode", "Icon", "IconButton", "Toolbar", "NaturalToolbar", "toLocalizedString", "useTranslation", "groupHoverControlItemWithTransition", "mx", "Toolbar", "classNames", "channel", "participants", "autoHideControls", "onJoin", "onLeave", "t", "useTranslation", "meta", "id", "graph", "useAppGraph", "runAction", "useActionRunner", "call", "useCapability", "ThreadCapabilities", "CallManager", "media", "useAtomValue", "mediaAtom", "joined", "joinedAtom", "raisedHand", "raisedHandAtom", "node", "useNode", "Obj", "getDXN", "toString", "actions", "useActions", "filter", "action", "properties", "disposition", "isScreensharing", "screenshareTrack", "undefined", "canSharescreen", "navigator", "mediaDevices", "getDisplayMedia", "React", "div", "className", "mx", "groupHoverControlItemWithTransition", "NaturalToolbar", "Root", "ToggleButton", "active", "audioEnabled", "state", "on", "icon", "label", "onClick", "turnAudioOff", "off", "turnAudioOn", "videoEnabled", "turnVideoOff", "turnVideoOn", "Icon", "size", "Separator", "variant", "disabled", "turnScreenshareOff", "turnScreenshareOn", "Node", "isAction", "map", "IconButton", "key", "defaultButtonProps", "toLocalizedString", "parent", "setRaisedHand", "displayName", "iconOnly", "CallRoot", "children", "React", "div", "className", "displayName", "CallAudio", "call", "useCapability", "ThreadCapabilities", "CallManager", "audioTracksToPlay", "useAtomValue", "audioTracksToPlayAtom", "AudioStream", "tracks", "CallGrid", "fullscreen", "debug", "useDebugMode", "self", "selfAtom", "users", "usersAtom", "ParticipantGrid", "CallToolbar", "props", "Toolbar", "isInRoom", "Call", "Root", "Grid", "Audio", "WebRTCStats", "React", "useEffect", "useMemo", "useState", "truncateKey", "JsonView", "Panel", "log", "IconButton", "Input", "useTranslation", "CallDebugPanel", "state", "t", "useTranslation", "meta", "id", "open", "setOpen", "useState", "handleToggle", "showServiceHistory", "setShowServiceHistory", "handleToggleServiceHistory", "handleCopyRaw", "navigator", "clipboard", "writeText", "JSON", "stringify", "users", "call", "stats", "showDetailedWebRTCStats", "setShowDetailedWebRTCStats", "handleShowDetailedWebRTCStats", "webrtcStats", "useMemo", "WebRTCStats", "getStatsInterval", "setStats", "useEffect", "pc", "media", "peer", "session", "peerConnection", "handleStats", "data", "added", "addConnection", "peerId", "connectionId", "on", "removeConnection", "removeListener", "error", "log", "rows", "getCallStatusTable", "pulledAudioTracks", "React", "Panel", "icon", "onToggle", "title", "info", "div", "className", "joined", "maxHeight", "Input", "Root", "Switch", "checked", "onCheckedChange", "Label", "IconButton", "label", "onClick", "Table", "JsonView", "history", "get", "self", "filter", "user", "map", "isOk", "audio", "tracks", "ctx", "disposed", "video", "pulledVideoStreams", "screenshare", "length", "name", "truncateKey", "pushedAudioTrack", "pushedVideoTrack", "screenshareEnabled", "pushedScreenshareTrack", "undefined", "iceConnectionState", "Unit", "KB", "n", "toFixed", "prefix", "value", "unit", "i", "key", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "Obj", "Ref", "useMembers", "useIdentity", "Icon", "ScrollArea", "useThemeContext", "useTranslation", "StackItem", "MessageTextbox", "Thread", "ThreadComponent", "threadLayout", "Message", "createBasicExtensions", "createThemeExtensions", "listener", "mx", "isNonNullable", "HighlightStyle", "StreamLanguage", "syntaxHighlighting", "tags", "mx", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "Ref", "useObject", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "useTextEditor", "Card", "MessageHeading", "MessageRoot", "createBasicExtensions", "createThemeExtensions", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "buttonGroupClassNames", "buttonClassNames", "MessageContainer", "message", "messageOrRef", "members", "editable", "onDelete", "onAcceptProposal", "t", "useTranslation", "meta", "id", "updateMessage", "useObject", "identity", "useIdentity", "editing", "setEditing", "useState", "textBlockIndex", "blocks", "findIndex", "block", "_tag", "handleEdit", "useCallback", "handleDelete", "handleAcceptProposal", "handleTextBlockChange", "newText", "m", "targetBlock", "text", "textBlock", "undefined", "useOnEditAnalytics", "senderIdentity", "find", "member", "sender", "identityDid", "did", "identityKey", "PublicKey", "equals", "messageMetadata", "getMessageMetadata", "userIsAuthor", "authorId", "proposalBlock", "references", "filter", "map", "reference", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "div", "role", "className", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "hoverableControlItem", "onClick", "TextboxBlock", "isAuthor", "onSave", "ProposalBlock", "Ref", "Array", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readOnly", "createThemeExtensions", "command", "EditorView", "updateListener", "of", "update", "docChanged", "state", "doc", "toString", "useEffect", "focus", "ref", "forwardRef", "forwardedRef", "title", "name", "type", "content", "Card", "Root", "mx", "Surface", "limit", "data", "fallback", "ChatContainer", "classNames", "space", "thread", "context", "current", "autoFocusTextbox", "t", "useTranslation", "meta", "id", "Obj", "getDXN", "toString", "identity", "useIdentity", "members", "useMembers", "activity", "useStatus", "_count", "_setCount", "useState", "rerenderEditor", "count", "autoFocus", "setAutoFocus", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "length", "change", "messages", "push", "Ref", "make", "Message", "created", "Date", "toISOString", "sender", "identityDid", "did", "blocks", "_tag", "properties", "undefined", "React", "ThreadComponent", "Root", "ScrollArea", "orientation", "Viewport", "div", "role", "className", "mx", "threadLayout", "map", "message", "target", "filter", "isNonNullable", "MessageContainer", "key", "ref", "MessageTextbox", "onSend", "Status", "Atom", "useAtomValue", "React", "useCallback", "useEffect", "useMemo", "useState", "useCapabilities", "useCapability", "Context", "failUndefined", "Obj", "log", "useClient", "getSpace", "useIdentity", "ElevationProvider", "Input", "useTranslation", "Settings", "MenuProvider", "ToolbarMenu", "createMenuAction", "createMenuItemGroup", "useMenuActions", "useSoundEffect", "StackItem", "ChannelContainer", "role", "subject", "channel", "roomId", "roomIdProp", "fullscreen", "space", "getSpace", "callManager", "useCapability", "ThreadCapabilities", "CallManager", "joined", "useAtomValue", "joinedAtom", "currentRoomId", "roomIdAtom", "attendableId", "Obj", "getDXN", "toString", "undefined", "failUndefined", "identity", "useIdentity", "isNamed", "profile", "displayName", "joinSound", "useSoundEffect", "leaveSound", "extensions", "useCapabilities", "CallExtension", "useEffect", "ctx", "Context", "left", "on", "forEach", "extension", "onLeave", "callStateUpdated", "state", "onCallStateUpdated", "mediaStateUpdated", "onMediaStateUpdated", "dispose", "handleJoin", "useCallback", "leave", "play", "setRoomId", "join", "Promise", "all", "map", "onJoin", "err", "log", "catch", "handleLeave", "turnAudioOff", "turnVideoOff", "turnScreenshareOff", "isJoined", "React", "StackItem", "Content", "classNames", "toolbar", "DisplayNameMissing", "Call", "Root", "Grid", "Toolbar", "defaultThread", "target", "ChannelToolbar", "onJoinCall", "ChatContainer", "thread", "DisplayNameMissing", "t", "useTranslation", "meta", "id", "client", "useClient", "displayName", "setDisplayName", "useState", "handleChange", "useCallback", "event", "target", "value", "handleSave", "halo", "updateProfile", "React", "Settings", "Group", "classNames", "ItemInput", "title", "description", "Input", "TextInput", "onChange", "placeholder", "GroupButton", "disabled", "onClick", "useChannelToolbarActions", "onJoinCall", "creator", "useMemo", "Atom", "make", "nodes", "createMenuItemGroup", "label", "ns", "createMenuAction", "icon", "type", "edges", "source", "useMenuActions", "ChannelToolbar", "attendableId", "role", "menuProps", "ElevationProvider", "elevation", "MenuProvider", "ToolbarMenu", "textBlockWidth", "useAtomValue", "React", "useCapability", "CallSidebar", "call", "useCapability", "ThreadCapabilities", "CallManager", "roomId", "useAtomValue", "roomIdAtom", "React", "ChannelContainer", "subject", "undefined", "useAtomValue", "React", "useCallback", "useMemo", "Capabilities", "useCapabilities", "useCapability", "useOperationInvoker", "AppCapabilities", "CollaborationOperation", "LayoutOperation", "Filter", "Obj", "Query", "Relation", "Ref", "useQuery", "useIdentity", "useTranslation", "Layout", "useAttended", "Tabs", "AnchoredTo", "Thread", "mx", "React", "useEffect", "Obj", "Relation", "Callout", "Icon", "Trans", "useTranslation", "React", "useCallback", "useMemo", "useRef", "useState", "Obj", "Relation", "useObject", "getSpace", "useMembers", "useIdentity", "IconButton", "Tag", "Tooltip", "useThemeContext", "useTranslation", "MessageTextbox", "Thread", "ThreadComponent", "createBasicExtensions", "createThemeExtensions", "listener", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "CommentsThreadContainer", "anchor", "current", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "themeMode", "useThemeContext", "t", "useTranslation", "meta", "id", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "detached", "thread", "Relation", "getSource", "messages", "useObject", "activity", "useStatus", "Obj", "getDXN", "toString", "threadScrollRef", "useRef", "textboxMetadata", "getMessageMetadata", "state", "setState", "useState", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "handleThreadDelete", "handleAcceptProposal", "handleComment", "React", "ThreadComponent", "Root", "classNames", "onClickCapture", "onFocusCapture", "div", "role", "className", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Tooltip", "Trigger", "asChild", "content", "side", "Header", "name", "buttonGroupClassNames", "status", "Tag", "palette", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "buttonClassNames", "hoverableControlItem", "onClick", "map", "ref", "MessageContainer", "key", "dxn", "editable", "message", "onDelete", "MessageTextbox", "onSend", "Status", "CommentsContainer", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "meta", "id", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "role", "className", "Callout", "Root", "Title", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "Obj", "getDXN", "toString", "CommentsThreadContainer", "key", "current", "React", "useTranslation", "Settings", "ThreadSettings", "settings", "_settings", "t", "_t", "useTranslation", "meta", "id", "React", "Settings", "Root", "initialViewState", "showResolvedThreads", "ThreadCompanion", "subject", "t", "useTranslation", "meta", "id", "invokePromise", "useOperationInvoker", "identity", "useIdentity", "subjectId", "Obj", "getDXN", "toString", "registry", "useCapability", "Capabilities", "AtomRegistry", "stateAtom", "ThreadCapabilities", "State", "viewStoreAtom", "ViewState", "state", "useAtomValue", "viewStore", "drafts", "viewState", "useMemo", "set", "onChangeViewState", "useCallback", "nextValue", "get", "anchorSorts", "useCapabilities", "AppCapabilities", "AnchorSort", "sort", "find", "key", "getTypename", "db", "getDatabase", "objectsAnchoredTo", "useQuery", "Query", "select", "Filter", "targetOf", "AnchoredTo", "anchors", "toSorted", "a", "b", "filter", "anchor", "instanceOf", "Thread", "Relation", "getSource", "concat", "attended", "useAttended", "handleAttend", "thread", "threadId", "current", "LayoutOperation", "ScrollIntoView", "cursor", "ref", "handleComment", "text", "ThreadOperation", "AddMessage", "sender", "identityDid", "did", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "handleAcceptProposal", "messageIndex", "messages", "findIndex", "Ref", "hasObjectId", "message", "target", "proposal", "blocks", "block", "_tag", "CollaborationOperation", "AcceptProposal", "comments", "React", "CommentsContainer", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "Layout", "Main", "toolbar", "Tabs", "Root", "value", "orientation", "classNames", "onValueChange", "Tablist", "mx", "Tab", "div", "className", "Tabpanel"]
|
|
7
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// src/util.ts
|
|
2
|
-
import * as Match from "effect/Match";
|
|
3
|
-
import { generateName } from "@dxos/display-name";
|
|
4
|
-
import { hexToFallback } from "@dxos/util";
|
|
5
|
-
var getMessageMetadata = (id, identity) => {
|
|
6
|
-
const fallback = hexToFallback(identity?.identityKey.toHex() ?? "0");
|
|
7
|
-
return {
|
|
8
|
-
id,
|
|
9
|
-
authorId: identity?.did,
|
|
10
|
-
authorName: identity?.profile?.displayName ?? (identity?.identityKey ? generateName(identity.identityKey.toHex()) : void 0),
|
|
11
|
-
authorAvatarProps: {
|
|
12
|
-
hue: identity?.profile?.data?.hue ?? fallback.hue,
|
|
13
|
-
emoji: identity?.profile?.data?.emoji ?? fallback.emoji
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
var getAnchor = Match.type().pipe(Match.when({
|
|
18
|
-
mode: "single"
|
|
19
|
-
}, (s) => s.id), Match.when({
|
|
20
|
-
mode: "multi"
|
|
21
|
-
}, (s) => s.ids.length > 0 ? s.ids.join(",") : void 0), Match.when({
|
|
22
|
-
mode: "range"
|
|
23
|
-
}, (s) => s.from && s.to ? `${s.from}:${s.to}` : void 0), Match.when({
|
|
24
|
-
mode: "multi-range"
|
|
25
|
-
}, (s) => s.ranges[0] && `${s.ranges[0].from}:${s.ranges[0].to}`), Match.when(void 0, () => void 0), Match.exhaustive);
|
|
26
|
-
|
|
27
|
-
export {
|
|
28
|
-
getMessageMetadata,
|
|
29
|
-
getAnchor
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=chunk-CP7E2HRE.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/util.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Match from 'effect/Match';\n\nimport { generateName } from '@dxos/display-name';\nimport { type Selection } from '@dxos/plugin-attention';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.did,\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n\nexport const getAnchor = Match.type<Selection | undefined>().pipe(\n Match.when({ mode: 'single' }, (s) => s.id),\n Match.when({ mode: 'multi' }, (s) => (s.ids.length > 0 ? s.ids.join(',') : undefined)),\n Match.when({ mode: 'range' }, (s) => (s.from && s.to ? `${s.from}:${s.to}` : undefined)),\n Match.when({ mode: 'multi-range' }, (s) => s.ranges[0] && `${s.ranges[0].from}:${s.ranges[0].to}`),\n Match.when(undefined, () => undefined),\n Match.exhaustive,\n);\n"],
|
|
5
|
-
"mappings": ";AAIA,YAAYA,WAAW;AAEvB,SAASC,oBAAoB;AAK7B,SAASC,qBAAqB;AAIvB,IAAMC,qBAAqB,CAACC,IAAYC,aAAAA;AAC7C,QAAMC,WAAWC,cAAcF,UAAUG,YAAYC,MAAAA,KAAW,GAAA;AAChE,SAAO;IACLL;IACAM,UAAUL,UAAUM;IACpBC,YACEP,UAAUQ,SAASC,gBAClBT,UAAUG,cAAcO,aAAaV,SAASG,YAAYC,MAAK,CAAA,IAAMO;IACxEC,mBAAmB;MACjBC,KAAKb,UAAUQ,SAASM,MAAMD,OAAOZ,SAASY;MAC9CE,OAAOf,UAAUQ,SAASM,MAAMC,SAASd,SAASc;IACpD;EACF;AACF;AAEO,IAAMC,YAAkBC,WAAI,EAA0BC,KACrDC,WAAK;EAAEC,MAAM;AAAS,GAAG,CAACC,MAAMA,EAAEtB,EAAE,GACpCoB,WAAK;EAAEC,MAAM;AAAQ,GAAG,CAACC,MAAOA,EAAEC,IAAIC,SAAS,IAAIF,EAAEC,IAAIE,KAAK,GAAA,IAAOb,MAAAA,GACrEQ,WAAK;EAAEC,MAAM;AAAQ,GAAG,CAACC,MAAOA,EAAEI,QAAQJ,EAAEK,KAAK,GAAGL,EAAEI,IAAI,IAAIJ,EAAEK,EAAE,KAAKf,MAAAA,GACvEQ,WAAK;EAAEC,MAAM;AAAc,GAAG,CAACC,MAAMA,EAAEM,OAAO,CAAA,KAAM,GAAGN,EAAEM,OAAO,CAAA,EAAGF,IAAI,IAAIJ,EAAEM,OAAO,CAAA,EAAGD,EAAE,EAAE,GAC3FP,WAAKR,QAAW,MAAMA,MAAAA,GACtBiB,gBAAU;",
|
|
6
|
-
"names": ["Match", "generateName", "hexToFallback", "getMessageMetadata", "id", "identity", "fallback", "hexToFallback", "identityKey", "toHex", "authorId", "did", "authorName", "profile", "displayName", "generateName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "getAnchor", "type", "pipe", "when", "mode", "s", "ids", "length", "join", "from", "to", "ranges", "exhaustive"]
|
|
7
|
-
}
|