@dxos/plugin-thread 0.8.4-main.422d1c7879 → 0.8.4-main.4f23b4e393
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/neutral/CallDebugPanel-CXWTCS7A.mjs +172 -0
- package/dist/lib/neutral/CallDebugPanel-CXWTCS7A.mjs.map +7 -0
- package/dist/lib/neutral/CallSidebar-4USJZ2SB.mjs +25 -0
- package/dist/lib/neutral/CallSidebar-4USJZ2SB.mjs.map +7 -0
- package/dist/lib/neutral/ChannelChat-6YTD5HWL.mjs +10 -0
- package/dist/lib/neutral/ChannelContainer-XHBF2NCK.mjs +9 -0
- package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs +208 -0
- package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs.map +7 -0
- package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs +61 -0
- package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs.map +7 -0
- package/dist/lib/neutral/ThreadPlugin.mjs +89 -0
- package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
- package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
- package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
- package/dist/lib/neutral/ThreadSettings-5Z5XIHG3.mjs +15 -0
- package/dist/lib/neutral/ThreadSettings-5Z5XIHG3.mjs.map +7 -0
- package/dist/lib/{browser/add-message-VPPFFLFL.mjs → neutral/add-message-HV5R66K4.mjs} +12 -22
- package/dist/lib/neutral/add-message-HV5R66K4.mjs.map +7 -0
- package/dist/lib/neutral/app-graph-builder-JDLHZ4XO.mjs +173 -0
- package/dist/lib/neutral/app-graph-builder-JDLHZ4XO.mjs.map +7 -0
- package/dist/lib/neutral/append-channel-message-PO33DR5V.mjs +40 -0
- package/dist/lib/neutral/append-channel-message-PO33DR5V.mjs.map +7 -0
- package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
- package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
- package/dist/lib/neutral/blueprints/index.mjs +8 -0
- package/dist/lib/neutral/call-manager-JFA4DLWR.mjs +24 -0
- package/dist/lib/neutral/call-manager-JFA4DLWR.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +29 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-44D7D4ZX.mjs +20 -0
- package/dist/lib/neutral/chunk-44D7D4ZX.mjs.map +7 -0
- package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-5T5LPLBN.mjs} +5 -6
- package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-CROE4U4O.mjs +100 -0
- package/dist/lib/neutral/chunk-CROE4U4O.mjs.map +7 -0
- package/dist/lib/neutral/chunk-D5LGFCUY.mjs +55 -0
- package/dist/lib/neutral/chunk-D5LGFCUY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FWSMZWBO.mjs +178 -0
- package/dist/lib/neutral/chunk-FWSMZWBO.mjs.map +7 -0
- package/dist/lib/neutral/chunk-JLY4NVTA.mjs +38 -0
- package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
- package/dist/lib/neutral/chunk-KRXHIW4P.mjs +164 -0
- package/dist/lib/neutral/chunk-KRXHIW4P.mjs.map +7 -0
- package/dist/lib/neutral/chunk-MXJYXUS2.mjs +8 -0
- package/dist/lib/neutral/chunk-MXJYXUS2.mjs.map +7 -0
- package/dist/lib/{browser/chunk-VPM44Z35.mjs → neutral/chunk-OZRSYMYO.mjs} +101 -85
- package/dist/lib/neutral/chunk-OZRSYMYO.mjs.map +7 -0
- package/dist/lib/{browser/index.mjs → neutral/chunk-PZ7WTAA2.mjs} +88 -900
- package/dist/lib/neutral/chunk-PZ7WTAA2.mjs.map +7 -0
- package/dist/lib/neutral/chunk-S2AKEA2K.mjs +202 -0
- package/dist/lib/neutral/chunk-S2AKEA2K.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +1230 -0
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +19 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/{browser/create-UGT7V733.mjs → neutral/create-C3CICN35.mjs} +8 -11
- package/dist/lib/neutral/create-C3CICN35.mjs.map +7 -0
- package/dist/lib/neutral/create-channel-UEQESOFT.mjs +19 -0
- package/dist/lib/neutral/create-channel-UEQESOFT.mjs.map +7 -0
- package/dist/lib/neutral/create-object-HIEWSBZB.mjs +27 -0
- package/dist/lib/neutral/create-object-HIEWSBZB.mjs.map +7 -0
- package/dist/lib/{browser/create-proposals-CMK7S7VS.mjs → neutral/create-proposals-OZ4NCBBS.mjs} +5 -6
- package/dist/lib/neutral/create-proposals-OZ4NCBBS.mjs.map +7 -0
- package/dist/lib/{browser/delete-FSFVU6ZA.mjs → neutral/delete-AVFYFWMY.mjs} +8 -10
- package/dist/lib/neutral/delete-AVFYFWMY.mjs.map +7 -0
- package/dist/lib/{browser/delete-message-XL5M5J33.mjs → neutral/delete-message-EV2MKRTB.mjs} +9 -19
- package/dist/lib/neutral/delete-message-EV2MKRTB.mjs.map +7 -0
- package/dist/lib/neutral/hooks/index.mjs +19 -0
- package/dist/lib/neutral/hooks/index.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +68 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/markdown-BUORNCPG.mjs +83 -0
- package/dist/lib/neutral/markdown-BUORNCPG.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +10 -0
- package/dist/lib/neutral/meta.mjs.map +7 -0
- package/dist/lib/neutral/on-create-space-NQF7WGEB.mjs +23 -0
- package/dist/lib/neutral/on-create-space-NQF7WGEB.mjs.map +7 -0
- package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
- package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +8 -0
- package/dist/lib/neutral/operations/index.mjs.map +7 -0
- package/dist/lib/neutral/plugin.mjs +16 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/react-root-VMMNUSSL.mjs +18 -0
- package/dist/lib/neutral/react-root-VMMNUSSL.mjs.map +7 -0
- package/dist/lib/neutral/react-surface-WPSVOTVG.mjs +94 -0
- package/dist/lib/neutral/react-surface-WPSVOTVG.mjs.map +7 -0
- package/dist/lib/{browser/restore-2ZGMKUSD.mjs → neutral/restore-MGLYOJ3Y.mjs} +6 -7
- package/dist/lib/neutral/restore-MGLYOJ3Y.mjs.map +7 -0
- package/dist/lib/{browser/restore-message-OYEGWPII.mjs → neutral/restore-message-ZIOA2MQJ.mjs} +8 -17
- package/dist/lib/neutral/restore-message-ZIOA2MQJ.mjs.map +7 -0
- package/dist/lib/{browser/select-VG2XLULE.mjs → neutral/select-CVCGBDHA.mjs} +7 -9
- package/dist/lib/neutral/select-CVCGBDHA.mjs.map +7 -0
- package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
- package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
- package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
- package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
- package/dist/lib/neutral/testing/index.mjs +58 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/lib/{browser/toggle-resolved-MM6YC5BU.mjs → neutral/toggle-resolved-ZM4BHON5.mjs} +8 -17
- package/dist/lib/neutral/toggle-resolved-ZM4BHON5.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +90 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +12 -0
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
- package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
- 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/thread-blueprint.d.ts +2 -2
- 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.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +2 -2
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
- 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 +9 -3
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +70 -70
- package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -1
- package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -1
- 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.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 +70 -70
- 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/ResponsivePanel.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +70 -70
- package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +70 -70
- package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -1
- 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 +1 -1
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -1
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +70 -70
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -1
- 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/{ChatContainer/ChatContainer.stories.d.ts → ThreadContainer/ThreadContainer.stories.d.ts} +71 -71
- 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 +2 -1
- package/dist/types/src/containers/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 +2 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/operations/add-message.d.ts +3 -3
- package/dist/types/src/operations/add-message.d.ts.map +1 -1
- 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 +3 -3
- package/dist/types/src/operations/create-channel.d.ts.map +1 -1
- package/dist/types/src/operations/create-proposals.d.ts +3 -3
- package/dist/types/src/operations/create-proposals.d.ts.map +1 -1
- package/dist/types/src/operations/create.d.ts +3 -3
- package/dist/types/src/operations/create.d.ts.map +1 -1
- package/dist/types/src/operations/delete-message.d.ts +3 -3
- package/dist/types/src/operations/delete-message.d.ts.map +1 -1
- package/dist/types/src/operations/delete.d.ts +3 -3
- package/dist/types/src/operations/delete.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +1 -2
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/on-create-space.d.ts +3 -3
- package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
- package/dist/types/src/operations/restore-message.d.ts +3 -3
- package/dist/types/src/operations/restore-message.d.ts.map +1 -1
- package/dist/types/src/operations/restore.d.ts +3 -3
- package/dist/types/src/operations/restore.d.ts.map +1 -1
- package/dist/types/src/operations/select.d.ts +3 -3
- package/dist/types/src/operations/select.d.ts.map +1 -1
- package/dist/types/src/operations/toggle-resolved.d.ts +3 -3
- package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/testing/data.d.ts.map +1 -1
- 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 +70 -70
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/ThreadCapabilities.d.ts +26 -0
- package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
- package/dist/types/src/{operations/definitions.d.ts → types/ThreadOperation.d.ts} +864 -1673
- package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +3 -2
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +1 -1
- 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 +124 -86
- package/src/ThreadPlugin.node.ts +39 -0
- package/src/ThreadPlugin.test.ts +37 -0
- package/src/ThreadPlugin.tsx +13 -57
- package/src/blueprints/thread-blueprint.ts +3 -4
- package/src/calls/util/calls-service.ts +3 -1
- package/src/calls/util/stub-media-streams.ts +3 -1
- package/src/capabilities/app-graph-builder.ts +21 -19
- package/src/capabilities/blueprint-definition.ts +2 -0
- package/src/capabilities/call-manager.ts +1 -1
- package/src/capabilities/create-object.ts +29 -0
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/markdown.ts +6 -2
- package/src/capabilities/operation-handler.ts +1 -1
- package/src/capabilities/react-surface.tsx +13 -7
- package/src/capabilities/settings.ts +1 -3
- package/src/capabilities/undo-mappings.ts +1 -1
- package/src/components/Call/Call.tsx +5 -5
- package/src/components/Call/Toolbar.tsx +1 -1
- package/src/components/Chat/Chat.tsx +258 -0
- package/src/components/Chat/index.ts +5 -0
- package/src/components/CommentsPanel/CommentsPanel.stories.tsx +6 -4
- package/src/components/CommentsPanel/CommentsPanel.tsx +4 -4
- package/src/components/CommentsPanel/CommentsThread.tsx +2 -3
- package/src/components/Lobby/Lobby.tsx +5 -4
- package/src/components/MessagePanel/MessagePanel.tsx +8 -9
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +2 -1
- package/src/components/ResponsiveGrid/ResponsivePanel.stories.tsx +2 -1
- package/src/components/ResponsiveGrid/ResponsivePanel.tsx +3 -5
- package/src/components/ThreadSettings/ThreadSettings.stories.tsx +2 -1
- package/src/components/index.ts +1 -0
- package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
- package/src/containers/ChannelChat/index.ts +8 -0
- package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +54 -10
- package/src/containers/ChannelContainer/ChannelContainer.tsx +4 -4
- package/src/containers/ThreadCompanion/ThreadCompanion.tsx +10 -12
- package/src/containers/{ChatContainer/ChatContainer.stories.tsx → ThreadContainer/ThreadContainer.stories.tsx} +10 -11
- package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
- package/src/containers/ThreadContainer/index.ts +8 -0
- package/src/containers/index.ts +2 -1
- package/src/extensions/command.ts +1 -1
- package/src/extensions/threads.ts +9 -9
- package/src/hooks/analytics.ts +1 -1
- package/src/index.ts +4 -3
- package/src/operations/add-message.ts +7 -7
- package/src/operations/append-channel-message.ts +37 -0
- package/src/operations/create-channel.ts +4 -4
- package/src/operations/create-proposals.ts +3 -3
- package/src/operations/create.ts +4 -4
- package/src/operations/delete-message.ts +6 -6
- package/src/operations/delete.ts +4 -4
- package/src/operations/index.ts +2 -4
- package/src/operations/on-create-space.ts +4 -4
- package/src/operations/restore-message.ts +5 -5
- package/src/operations/restore.ts +4 -4
- package/src/operations/select.ts +3 -3
- package/src/operations/toggle-resolved.ts +5 -5
- package/src/plugin.ts +11 -0
- package/src/testing/index.ts +1 -1
- package/src/translations.ts +1 -1
- package/src/types/ThreadCapabilities.ts +41 -0
- package/src/{operations/definitions.ts → types/ThreadOperation.ts} +14 -13
- package/src/types/index.ts +4 -2
- package/src/types/types.ts +0 -2
- package/src/util.ts +36 -4
- package/dist/lib/browser/add-message-VPPFFLFL.mjs.map +0 -7
- package/dist/lib/browser/blueprints/index.mjs.map +0 -7
- package/dist/lib/browser/chunk-MESW3R4Q.mjs +0 -61
- package/dist/lib/browser/chunk-MESW3R4Q.mjs.map +0 -7
- package/dist/lib/browser/chunk-VPM44Z35.mjs.map +0 -7
- package/dist/lib/browser/create-UGT7V733.mjs.map +0 -7
- package/dist/lib/browser/create-channel-EF67LCS6.mjs +0 -21
- package/dist/lib/browser/create-channel-EF67LCS6.mjs.map +0 -7
- package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs +0 -28
- package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs.map +0 -7
- package/dist/lib/browser/create-proposals-CMK7S7VS.mjs.map +0 -7
- package/dist/lib/browser/delete-FSFVU6ZA.mjs.map +0 -7
- package/dist/lib/browser/delete-message-XL5M5J33.mjs.map +0 -7
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/on-create-space-VYS2JGVT.mjs +0 -25
- package/dist/lib/browser/on-create-space-VYS2JGVT.mjs.map +0 -7
- package/dist/lib/browser/operations/index.mjs +0 -14
- package/dist/lib/browser/operations/index.mjs.map +0 -7
- package/dist/lib/browser/restore-2ZGMKUSD.mjs.map +0 -7
- package/dist/lib/browser/restore-message-OYEGWPII.mjs.map +0 -7
- package/dist/lib/browser/select-VG2XLULE.mjs.map +0 -7
- package/dist/lib/browser/toggle-resolved-MM6YC5BU.mjs.map +0 -7
- package/dist/lib/browser/types/index.mjs +0 -12
- package/dist/lib/node-esm/add-message-XWKHLNS6.mjs +0 -98
- package/dist/lib/node-esm/add-message-XWKHLNS6.mjs.map +0 -7
- package/dist/lib/node-esm/blueprints/index.mjs +0 -38
- package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
- package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs +0 -260
- package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs +0 -62
- package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs.map +0 -7
- package/dist/lib/node-esm/create-XAYNDVU2.mjs +0 -56
- package/dist/lib/node-esm/create-XAYNDVU2.mjs.map +0 -7
- package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs +0 -22
- package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs.map +0 -7
- package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs +0 -29
- package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs.map +0 -7
- package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs +0 -58
- package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs.map +0 -7
- package/dist/lib/node-esm/delete-WRODXR3E.mjs +0 -60
- package/dist/lib/node-esm/delete-WRODXR3E.mjs.map +0 -7
- package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs +0 -65
- package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -2335
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs +0 -26
- package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs.map +0 -7
- package/dist/lib/node-esm/operations/index.mjs +0 -15
- package/dist/lib/node-esm/operations/index.mjs.map +0 -7
- package/dist/lib/node-esm/restore-T3QA7TSL.mjs +0 -34
- package/dist/lib/node-esm/restore-T3QA7TSL.mjs.map +0 -7
- package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs +0 -43
- package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs.map +0 -7
- package/dist/lib/node-esm/select-Q4UDWJJF.mjs +0 -27
- package/dist/lib/node-esm/select-Q4UDWJJF.mjs.map +0 -7
- package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs +0 -46
- package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -13
- package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +0 -16
- package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +0 -1
- package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +0 -1
- package/dist/types/src/containers/ChatContainer/index.d.ts +0 -4
- package/dist/types/src/containers/ChatContainer/index.d.ts.map +0 -1
- package/dist/types/src/operations/create-channel-thread.d.ts +0 -5
- package/dist/types/src/operations/create-channel-thread.d.ts.map +0 -1
- package/dist/types/src/operations/definitions.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 -715
- package/dist/types/src/types/Channel.d.ts.map +0 -1
- package/dist/types/src/types/capabilities.d.ts +0 -24
- package/dist/types/src/types/capabilities.d.ts.map +0 -1
- package/src/containers/ChatContainer/ChatContainer.tsx +0 -131
- package/src/containers/ChatContainer/index.ts +0 -8
- package/src/operations/create-channel-thread.ts +0 -26
- package/src/testing/stories.ts +0 -51
- package/src/types/Channel.ts +0 -37
- package/src/types/capabilities.ts +0 -36
- /package/dist/lib/{browser/chunk-J5LGTIGS.mjs.map → neutral/ChannelChat-6YTD5HWL.mjs.map} +0 -0
- /package/dist/lib/{browser/types/index.mjs.map → neutral/ChannelContainer-XHBF2NCK.mjs.map} +0 -0
- /package/dist/lib/{node-esm/types → neutral/blueprints}/index.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
- /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/index.ts", "../../../../src/components/Call/Call.tsx", "../../../../src/components/Media/AudioStream.tsx", "../../../../src/components/Media/VideoObject.tsx", "../../../../src/components/Participant/Participant.tsx", "../../../../src/components/ResponsiveGrid/ResponsivePanel.tsx", "../../../../src/components/ResponsiveGrid/ResponsiveGrid.tsx", "../../../../src/components/ResponsiveGrid/ResponsiveGridItem.tsx", "../../../../src/components/Participant/ParticipantGrid.tsx", "../../../../src/components/Call/Toolbar.tsx", "../../../../src/components/Chat/Chat.tsx", "../../../../src/components/MessagePanel/MessagePanel.tsx", "../../../../src/components/CommentsPanel/CommentsPanel.tsx", "../../../../src/components/CommentsPanel/CommentsThread.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport * from './Call';\nexport * from './Chat';\nexport * from './CommentsPanel';\nexport * from './MessagePanel';\n\nexport const ThreadSettings: ComponentType<any> = lazy(() => import('./ThreadSettings'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { 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';\n\nimport { AudioStream } from '../Media';\nimport { ParticipantGrid } from '../Participant';\nimport { Toolbar, type ToolbarProps } from './Toolbar';\n\n//\n// Root\n//\n\ntype CallRootProps = PropsWithChildren<ThemedClassName>;\n\nconst CallRoot = ({ children }: CallRootProps) => {\n return <div className='relative dx-container flex flex-col'>{children}</div>;\n};\n\nCallRoot.displayName = 'CallRoot';\n\n//\n// Audio\n//\n\ntype CallAudioProps = {};\n\nconst CallAudio = (_props: 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 = ({ fullscreen }: CallGridProps) => {\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 = (props: CallToolbarProps) => {\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 'w-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 { ThreadCapabilities } from '#types';\n\nimport { type EncodedTrackName, type UserState } from '../../calls';\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 * <ResponsivePanel>\n * <VideoObject />\n * </ResponsivePanel>\n */\nexport const ResponsivePanel = ({ children }: PropsWithChildren) => {\n return (\n // Outer container that takes full size of parent.\n <div className='dx-expander relative flex'>\n {/* Absolute positioning layer for centering content. */}\n <div className='absolute inset-0 flex justify-center items-center'>\n {/* Content container that maintains given aspect ratio and proper scaling. */}\n <div className={mx('max-h-full max-w-full w-auto h-auto aspect-video')}>{children}</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 { type ResponsiveGridItemProps } from './ResponsiveGridItem';\nimport { ResponsivePanel } from './ResponsivePanel';\n\nconst ASPECT_RATIO = 16 / 9;\nconst MIN_GALLERY_HEIGHT = 250;\n\nconst DEFAULT_GAP = 8;\n\nconst maxImageSize = 'w-[2560px] h-[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('dx-expander relative', 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 && 'h-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 h-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-h-full max-w-full w-auto h-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 <ResponsivePanel>\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 </ResponsivePanel>\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.label'),\n classNames: 'animate-pulse bg-orange-500',\n },\n mute: {\n icon: 'ph--microphone-slash--regular',\n label: t('icon-muted.label'),\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 'dx-expander relative 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-h-1 rounded-sm', groupHoverControlItemWithTransition)}\n iconOnly\n icon={pinned ? 'ph--x--regular' : 'ph--arrows-out--regular'}\n size={pinned ? 5 : 4}\n label={pinned ? t('icon-unpin.label') : t('icon-pin.label')}\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 py-0.5 truncate rounded-sm',\n pinned ? 'px-2' : 'px-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-h-1 rounded-sm', 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';\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 { type Channel } from '@dxos/types';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\nimport { ThreadCapabilities } 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-modal-surface 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.button'),\n onClick: () => call.turnAudioOff(),\n classNames: 'bg-call-active',\n },\n off: {\n icon: 'ph--microphone-slash--duotone',\n label: t('mic-on.button'),\n onClick: () => call.turnAudioOn(),\n },\n }}\n />\n <ToggleButton\n active={media.videoEnabled}\n state={{\n on: {\n icon: 'ph--video-camera--regular',\n label: t('camera-off.button'),\n onClick: () => call.turnVideoOff(),\n },\n off: {\n icon: 'ph--video-camera-slash--duotone',\n label: t('camera-on.button'),\n onClick: () => call.turnVideoOn(),\n },\n }}\n />\n\n {(participants !== undefined && (\n <div className='flex justify-center items-center gap-2 w-[5rem] text-xs text-subdued'>\n <Icon icon='ph--users--regular' />\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.button'),\n onClick: () => call.turnScreenshareOff(),\n },\n off: {\n icon: 'ph--monitor-arrow-up--duotone',\n label: t('screenshare-on.button'),\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.button'),\n onClick: () => call.setRaisedHand(false),\n },\n off: {\n icon: 'ph--hand-palm--duotone',\n label: t('raise-hand.button'),\n onClick: () => call.setRaisedHand(true),\n },\n }}\n />\n </>\n )}\n {joined ? (\n <IconButton\n variant='destructive'\n icon='ph--phone-x--regular'\n label={t('leave-call.button')}\n onClick={onLeave}\n />\n ) : (\n <IconButton\n variant='primary'\n icon='ph--phone-incoming--regular'\n label={t('join-call.button')}\n onClick={onJoin}\n />\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-call-active') : 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 2026 DXOS.org\n//\n\nimport React, { type RefObject, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type MessageMetadata,\n MessageTextbox,\n Thread as ThreadComponent,\n type ThreadRootProps,\n threadLayout,\n} from '@dxos/react-ui-thread';\nimport { type Message } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener, type Extension } from '@dxos/ui-editor';\nimport { composable, composableProps, mx } from '@dxos/ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nimport { command } from '../../extensions';\nimport { getMessageMetadata } from '../../util';\nimport { MessagePanel } from '../MessagePanel';\n\nexport type ChatProps = ThemedClassName<\n {\n /** Stable id used for the underlying thread root and message metadata. */\n id: string;\n /** Identity used to attribute outgoing messages in the textbox metadata. */\n identity?: Identity;\n /** Space members for rendering sender names/avatars on incoming messages. */\n members: SpaceMember[];\n /** Messages to render in order. */\n messages: readonly Message.Message[];\n /** Activity indicator (e.g. processing) shown beneath the textbox. */\n activity?: boolean;\n /**\n * Called with the user's textbox content when they press send.\n * Returning `true` signals the message was accepted; the textbox is then cleared.\n */\n onSend: (text: string) => boolean;\n autoFocusTextbox?: boolean;\n /**\n * Where the composer sits relative to the messages.\n * - `'top'` (default) — composer follows the messages at intrinsic height,\n * suitable for inline comment threads.\n * - `'bottom'` — composer pinned to the bottom of the panel, messages\n * scrolling above it. Suitable for full-panel multi-party chat.\n */\n orientation?: ChatOrientation;\n /**\n * When true, hide the composer textbox and activity indicator. Used for\n * channels whose source-of-truth lives elsewhere (e.g. externally-synced\n * Slack/Discord channels keyed by a foreign id) — sending isn't meaningful\n * because there is no local-write path back to the source.\n */\n readOnly?: boolean;\n } & Pick<ThreadRootProps, 'current'>\n>;\n\nexport type ChatOrientation = 'top' | 'bottom';\n\n/**\n * Pure chat UI: scrollable message list + composer textbox + activity indicator.\n * Owns its own UI state (textbox content, scroll position, editor extensions) but\n * does not load data or invoke operations — the caller passes messages and an\n * `onSend` callback. Used by both `ThreadContainer` (AutoMerge `Thread`) and\n * `ChannelContainer`'s feed-backed channel chat.\n */\nexport const Chat = composable<HTMLDivElement, ChatProps>(\n (\n {\n id,\n identity,\n members,\n messages,\n activity,\n onSend,\n autoFocusTextbox,\n current,\n orientation = 'top',\n readOnly,\n ...props\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.id);\n const { themeMode } = useThemeContext();\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n\n // Force the editor to remount after a successful send so its content resets.\n const [_count, _setCount] = useState(0);\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 const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => sentinelRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n // NOTE: Auto-scroll on new messages is intentionally not implemented here. Smooth-scroll\n // animations were causing ResizeObserver feedback loops with CodeMirror/ScrollArea. The\n // proper fix is \"scroll only if user is already at the bottom\" — deferred to a follow-up.\n\n const handleSend = () => {\n const text = messageRef.current;\n if (!text?.length) {\n return false;\n }\n\n const accepted = onSend(text);\n if (!accepted) {\n return false;\n }\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n _setCount((count) => count + 1);\n return true;\n };\n\n const filteredMessages = messages.filter(isNonNullable);\n const renderState: ChatRenderState = {\n messages: filteredMessages,\n members,\n activity,\n extensions,\n autoFocus,\n handleSend,\n textboxMetadata,\n scrollRef,\n sentinelRef,\n readOnly,\n };\n\n return orientation === 'bottom' ? (\n <ChannelLayout\n {...composableProps(props, { classNames: 'flex flex-col bs-full min-h-0' })}\n id={id}\n ref={forwardedRef}\n state={renderState}\n />\n ) : (\n <ThreadLayout\n {...composableProps(props, { classNames: 'dx-container grid-rows-[1fr_min-content_min-content]' })}\n id={id}\n current={current}\n ref={forwardedRef}\n state={renderState}\n />\n );\n },\n);\n\n//\n// Internal layout helpers — share state via the ChatRenderState bag.\n//\n\ntype ChatRenderState = {\n messages: Message.Message[];\n members: SpaceMember[];\n activity?: boolean;\n extensions: Extension[];\n autoFocus?: boolean;\n handleSend: () => boolean;\n textboxMetadata: MessageMetadata;\n scrollRef: RefObject<HTMLDivElement | null>;\n sentinelRef: RefObject<HTMLDivElement | null>;\n readOnly?: boolean;\n};\n\ntype LayoutProps = React.HTMLAttributes<HTMLDivElement> & {\n id: string;\n state: ChatRenderState;\n};\n\n/** Thread layout — composer follows messages at intrinsic height. */\nconst ThreadLayout = React.forwardRef<HTMLDivElement, LayoutProps & Pick<ThreadRootProps, 'current'>>(\n ({ id, current, state, ...props }, ref) => {\n const { t } = useTranslation(meta.id);\n const { messages, members, activity, extensions, autoFocus, handleSend, textboxMetadata, sentinelRef, readOnly } =\n state;\n return (\n <ThreadComponent.Root {...props} id={id} current={current} ref={ref}>\n <ScrollArea.Root classNames='col-span-2' orientation='vertical'>\n <ScrollArea.Viewport ref={sentinelRef}>\n <div className={mx(threadLayout, 'place-self-end')}>\n {messages.map((message) => (\n <MessagePanel key={message.id} message={message} members={members} />\n ))}\n </div>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n {!readOnly && (\n <>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />\n <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>\n </>\n )}\n </ThreadComponent.Root>\n );\n },\n);\n\n/** Channel layout — composer pinned to the bottom, messages scroll above it. */\nconst ChannelLayout = React.forwardRef<HTMLDivElement, LayoutProps>(({ id, state, ...props }, ref) => {\n const { t } = useTranslation(meta.id);\n const {\n messages,\n members,\n activity,\n extensions,\n autoFocus,\n handleSend,\n textboxMetadata,\n scrollRef,\n sentinelRef,\n readOnly,\n } = state;\n return (\n <div {...props} id={id} ref={ref}>\n <div ref={scrollRef} className='flex-1 min-h-0 overflow-y-auto'>\n {messages.map((message) => (\n <div key={message.id} className='grid grid-cols-[var(--dx-rail-size)_1fr] w-full'>\n <MessagePanel message={message} members={members} />\n </div>\n ))}\n <div ref={sentinelRef} />\n </div>\n {!readOnly && (\n <>\n <div className='shrink-0 grid grid-cols-[var(--dx-rail-size)_1fr]'>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />\n </div>\n <div className='shrink-0 px-2 pb-1 text-xs text-description'>{activity ? t('activity.message') : null}</div>\n </>\n )}\n </div>\n );\n});\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 { AppSurface } from '@dxos/app-toolkit/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 { Card } from '@dxos/react-ui';\nimport { useTextEditor } from '@dxos/react-ui-editor';\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';\n\nimport { command } from '../../extensions/command';\nimport { getMessageMetadata } from '../../util';\n\nexport const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pe-2';\nexport const buttonClassNames = 'p-1! transition-opacity';\n\nexport type MessagePanelProps = {\n message: Obj.OfShape<Message.Message> | Ref.Ref<Obj.OfShape<Message.Message>>;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n onAcceptProposal?: (id: string) => void;\n};\n\nexport const MessagePanel = ({\n message: messageOrRef,\n members,\n editable = false,\n onDelete,\n onAcceptProposal,\n}: MessagePanelProps) => {\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 // Pass `message.sender` as the fallback so externally-synced messages\n // (Slack, etc.) display the source-side sender name instead of \"Anonymous\"\n // when no DXOS identity matches.\n const messageMetadata = getMessageMetadata(message.id, senderIdentity, message.sender);\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 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 ref={parentRef} className='me-4' {...focusAttributes} />;\n};\n\nconst ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {\n return <div className='me-4 italic'>{block.text}</div>;\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 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface.Surface\n type={AppSurface.Card}\n limit={1}\n data={{ subject } satisfies AppSurface.ObjectCardData}\n fallback={title}\n />\n </Card.Root>\n );\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { Icon, Message, Trans, useTranslation } from '@dxos/react-ui';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nimport { CommentsThread, type CommentsThreadProps } from './CommentsThread';\n\nexport type CommentsPanelProps = Omit<CommentsThreadProps, '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 CommentsPanel = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsPanelProps) => {\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 // TODO(dmaretskyi): Do Obj.instanceOf check instead.\n return thread && (thread as any).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 className='p-form-padding'>\n <Message.Root>\n <Message.Content>\n <Trans\n {...{\n t,\n i18nKey: 'no-comments.message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='dx-icon-inline' />,\n },\n }}\n />\n </Message.Content>\n </Message.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 <CommentsThread 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';\n\nimport { command } from '../../extensions/command';\nimport { getMessageMetadata } from '../../util';\nimport { MessagePanel, buttonClassNames, buttonGroupClassNames } from '../MessagePanel';\n\nexport type CommentsThreadProps = {\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 CommentsThread = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n onAcceptProposal,\n}: CommentsThreadProps) => {\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 = useCallback<NonNullable<MessageTextboxProps['onSend']>>(() => {\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='pt-2 border-b border-subdued-separator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n className={mx(\n 'col-span-2 grid grid-cols-[var(--dx-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 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 <MessagePanel\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 <div className='h-px -mt-px' ref={threadScrollRef} />\n </ThreadComponent.Root>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["lazy", "useAtomValue", "React", "useCapability", "useDebugMode", "ThreadCapabilities", "React", "useEffect", "useRef", "AudioStream", "tracks", "mediaStreamRef", "MediaStream", "ref", "audio", "current", "mediaStream", "srcObject", "resetSrcObject", "addEventListener", "play", "once", "autoPlay", "map", "track", "AudioTrack", "key", "id", "currentTrack", "addTrack", "removeTrack", "React", "forwardRef", "memo", "useEffect", "useRef", "mx", "VideoObject", "videoStream", "classNames", "flip", "contain", "rest", "ref", "internalRef", "video", "current", "srcObject", "setAttribute", "className", "v", "displayName", "useAtomValue", "React", "memo", "useMemo", "useCapability", "ThreadCapabilities", "React", "mx", "ResponsivePanel", "children", "div", "className", "React", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useState", "useResizeDetector", "invariant", "mx", "ASPECT_RATIO", "DEFAULT_GAP", "maxImageSize", "defaultGetId", "refreshRate", "getId", "dividerHeight", "useEffect", "containerWidth", "containerHeight", "setDividerHeight", "Math", "height", "pinned", "columns", "cellWidth", "width", "layout", "setLayout", "time", "now", "mainItems", "gap", "hideGallery", "gridContainerRef", "invariant", "containerRef", "el", "current", "querySelector", "item", "bounds", "filter", "clearTimeout", "t", "pinnedItem", "onPinnedChange", "React", "classNames", "className", "mx", "id", "debug", "ref", "style", "minHeight", "role", "display", "gridTemplateColumns", "map", "onClick", "SoloItem", "alt", "getBoundingClientRect", "top", "elementRect", "left", "minWastedSpace", "itemWidth", "itemHeight", "usedWidth", "cols", "wastedSpace", "bestColumns", "availableWidth", "outerWidth", "numCols", "maxCellWidth", "maxCellHeight", "outerHeight", "aspectRatio", "React", "useEffect", "useState", "Icon", "IconButton", "useTranslation", "Waveform", "groupHoverControlItemWithTransition", "mx", "meta", "ResponsiveGridItem", "children", "classNames", "item", "style", "name", "self", "pinned", "screenshare", "video", "mute", "wave", "speaking", "onClick", "t", "id", "iconProps", "icon", "label", "props", "undefined", "speakingIndicator", "setSpeakingIndicator", "timeout", "setTimeout", "clearTimeout", "div", "className", "iconOnly", "size", "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", "meta", "ThreadCapabilities", "classNames", "channel", "participants", "autoHideControls", "onJoin", "onLeave", "t", "id", "graph", "runAction", "call", "CallManager", "media", "mediaAtom", "joined", "joinedAtom", "raisedHand", "raisedHandAtom", "node", "getDXN", "toString", "actions", "filter", "action", "properties", "disposition", "isScreensharing", "screenshareTrack", "undefined", "canSharescreen", "navigator", "mediaDevices", "getDisplayMedia", "div", "className", "Root", "ToggleButton", "active", "audioEnabled", "state", "on", "icon", "label", "onClick", "turnAudioOff", "off", "turnAudioOn", "videoEnabled", "turnVideoOff", "turnVideoOn", "Separator", "variant", "disabled", "turnScreenshareOff", "turnScreenshareOn", "isAction", "map", "key", "defaultButtonProps", "parent", "setRaisedHand", "displayName", "size", "iconOnly", "CallRoot", "children", "React", "div", "className", "displayName", "CallAudio", "_props", "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", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "ScrollArea", "useThemeContext", "useTranslation", "MessageTextbox", "Thread", "ThreadComponent", "threadLayout", "createBasicExtensions", "createThemeExtensions", "listener", "composable", "composableProps", "mx", "isNonNullable", "meta", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "AppSurface", "Ref", "useObject", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "Card", "useTextEditor", "MessageHeading", "MessageRoot", "createBasicExtensions", "createThemeExtensions", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "useOnEditAnalytics", "meta", "buttonGroupClassNames", "buttonClassNames", "MessagePanel", "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", "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", "AppSurface", "limit", "data", "fallback", "Chat", "composable", "id", "identity", "members", "messages", "activity", "onSend", "autoFocusTextbox", "current", "orientation", "readOnly", "props", "forwardedRef", "t", "useTranslation", "meta", "themeMode", "useThemeContext", "scrollRef", "useRef", "sentinelRef", "autoFocus", "setAutoFocus", "useState", "_count", "_setCount", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleSend", "length", "accepted", "count", "filteredMessages", "filter", "isNonNullable", "renderState", "React", "ChannelLayout", "composableProps", "classNames", "ref", "state", "ThreadLayout", "forwardRef", "ThreadComponent", "Root", "ScrollArea", "Viewport", "div", "className", "mx", "threadLayout", "map", "message", "MessagePanel", "key", "MessageTextbox", "Status", "React", "useEffect", "Obj", "Relation", "Icon", "Message", "Trans", "useTranslation", "meta", "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", "useStatus", "meta", "CommentsThread", "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", "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", "MessagePanel", "key", "dxn", "editable", "message", "onDelete", "MessageTextbox", "onSend", "Status", "CommentsPanel", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "meta", "id", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "className", "Message", "Root", "Content", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "Obj", "getDXN", "toString", "CommentsThread", "key", "current", "ThreadSettings", "lazy"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import "../chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/containers/index.ts
|
|
4
|
+
import { lazy } from "react";
|
|
5
|
+
var CallDebugPanel = lazy(() => import("../CallDebugPanel-CXWTCS7A.mjs"));
|
|
6
|
+
var CallSidebar = lazy(() => import("../CallSidebar-4USJZ2SB.mjs"));
|
|
7
|
+
var ChannelChat = lazy(() => import("../ChannelChat-6YTD5HWL.mjs"));
|
|
8
|
+
var ChannelContainer = lazy(() => import("../ChannelContainer-XHBF2NCK.mjs"));
|
|
9
|
+
var ThreadContainer = lazy(() => import("../ThreadContainer-XYEPEOSD.mjs"));
|
|
10
|
+
var ThreadCompanion = lazy(() => import("../ThreadCompanion-NQWPS2H6.mjs"));
|
|
11
|
+
export {
|
|
12
|
+
CallDebugPanel,
|
|
13
|
+
CallSidebar,
|
|
14
|
+
ChannelChat,
|
|
15
|
+
ChannelContainer,
|
|
16
|
+
ThreadCompanion,
|
|
17
|
+
ThreadContainer
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/containers/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const CallDebugPanel: ComponentType<any> = lazy(() => import('./CallDebugPanel'));\nexport const CallSidebar: ComponentType<any> = lazy(() => import('./CallSidebar'));\nexport const ChannelChat: ComponentType<any> = lazy(() => import('./ChannelChat'));\nexport const ChannelContainer: ComponentType<any> = lazy(() => import('./ChannelContainer'));\nexport const ThreadContainer: ComponentType<any> = lazy(() => import('./ThreadContainer'));\nexport const ThreadCompanion: ComponentType<any> = lazy(() => import('./ThreadCompanion'));\n"],
|
|
5
|
+
"mappings": ";;;AAIA,SAA6BA,YAAY;AAElC,IAAMC,iBAAqCD,KAAK,MAAM,OAAO,gCAAA,CAAA;AAC7D,IAAME,cAAkCF,KAAK,MAAM,OAAO,6BAAA,CAAA;AAC1D,IAAMG,cAAkCH,KAAK,MAAM,OAAO,6BAAA,CAAA;AAC1D,IAAMI,mBAAuCJ,KAAK,MAAM,OAAO,kCAAA,CAAA;AAC/D,IAAMK,kBAAsCL,KAAK,MAAM,OAAO,iCAAA,CAAA;AAC9D,IAAMM,kBAAsCN,KAAK,MAAM,OAAO,iCAAA,CAAA;",
|
|
6
|
+
"names": ["lazy", "CallDebugPanel", "CallSidebar", "ChannelChat", "ChannelContainer", "ThreadContainer", "ThreadCompanion"]
|
|
7
|
+
}
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import {
|
|
6
|
-
ThreadCapabilities
|
|
7
|
-
} from "./chunk-MESW3R4Q.mjs";
|
|
2
|
+
ThreadCapabilities_exports,
|
|
3
|
+
ThreadOperation_exports
|
|
4
|
+
} from "./chunk-OZRSYMYO.mjs";
|
|
8
5
|
import "./chunk-J5LGTIGS.mjs";
|
|
9
6
|
|
|
10
7
|
// src/operations/create.ts
|
|
11
8
|
import * as Effect from "effect/Effect";
|
|
12
9
|
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
13
10
|
import { LayoutOperation } from "@dxos/app-toolkit";
|
|
11
|
+
import { Operation } from "@dxos/compute";
|
|
14
12
|
import { Obj, Relation } from "@dxos/echo";
|
|
15
|
-
import { Operation } from "@dxos/operation";
|
|
16
13
|
import { linkedSegment } from "@dxos/react-ui-attention";
|
|
17
14
|
import { AnchoredTo, Thread } from "@dxos/types";
|
|
18
|
-
var handler = Create.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ name, anchor: _anchor, subject }) {
|
|
15
|
+
var handler = ThreadOperation_exports.Create.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ name, anchor: _anchor, subject }) {
|
|
19
16
|
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
20
|
-
const stateAtom = yield* Capability.get(
|
|
17
|
+
const stateAtom = yield* Capability.get(ThreadCapabilities_exports.State);
|
|
21
18
|
const subjectId = Obj.getDXN(subject).toString();
|
|
22
19
|
const thread = Thread.make({
|
|
23
20
|
name
|
|
@@ -41,7 +38,7 @@ var handler = Create.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ n
|
|
|
41
38
|
]
|
|
42
39
|
}
|
|
43
40
|
});
|
|
44
|
-
yield* Operation.invoke(Select, {
|
|
41
|
+
yield* Operation.invoke(ThreadOperation_exports.Select, {
|
|
45
42
|
current: Obj.getDXN(thread).toString()
|
|
46
43
|
});
|
|
47
44
|
yield* Operation.invoke(LayoutOperation.UpdateCompanion, {
|
|
@@ -52,4 +49,4 @@ var create_default = handler;
|
|
|
52
49
|
export {
|
|
53
50
|
create_default as default
|
|
54
51
|
};
|
|
55
|
-
//# sourceMappingURL=create-
|
|
52
|
+
//# sourceMappingURL=create-C3CICN35.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/create.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Obj, Relation } from '@dxos/echo';\nimport { linkedSegment } from '@dxos/react-ui-attention';\nimport { AnchoredTo, Thread } from '@dxos/types';\n\nimport { ThreadCapabilities } from '../types';\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.Create> = ThreadOperation.Create.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ name, anchor: _anchor, subject }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const stateAtom = yield* Capability.get(ThreadCapabilities.State);\n const subjectId = Obj.getDXN(subject).toString();\n const thread = Thread.make({ name });\n const anchor = Relation.make(AnchoredTo.AnchoredTo, {\n [Relation.Source]: thread,\n [Relation.Target]: subject,\n anchor: _anchor,\n });\n\n const state = registry.get(stateAtom);\n const existingDrafts = state.drafts[subjectId];\n registry.set(stateAtom, {\n ...state,\n drafts: {\n ...state.drafts,\n [subjectId]: existingDrafts ? [...existingDrafts, anchor] : [anchor],\n },\n });\n\n yield* Operation.invoke(ThreadOperation.Select, { current: Obj.getDXN(thread).toString() });\n yield* Operation.invoke(LayoutOperation.UpdateCompanion, {\n subject: linkedSegment('comments'),\n });\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,uBAAuB;AAChC,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,gBAAgB;AAC9B,SAASC,qBAAqB;AAC9B,SAASC,YAAYC,cAAc;AAKnC,IAAMC,UAAgEC,wBAAgBC,OAAOC,KAC3FC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,MAAMC,QAAQC,SAASC,QAAO,GAAE;AAC7D,QAAMC,WAAW,OAAOC,WAAWC,IAAIC,aAAaC,YAAY;AAChE,QAAMC,YAAY,OAAOJ,WAAWC,IAAII,2BAAmBC,KAAK;AAChE,QAAMC,YAAYC,IAAIC,OAAOX,OAAAA,EAASY,SAAQ;AAC9C,QAAMC,SAASC,OAAOC,KAAK;IAAElB;EAAK,CAAA;AAClC,QAAMC,SAASkB,SAASD,KAAKE,WAAWA,YAAY;IAClD,CAACD,SAASE,MAAM,GAAGL;IACnB,CAACG,SAASG,MAAM,GAAGnB;IACnBF,QAAQC;EACV,CAAA;AAEA,QAAMqB,QAAQnB,SAASE,IAAIG,SAAAA;AAC3B,QAAMe,iBAAiBD,MAAME,OAAOb,SAAAA;AACpCR,WAASsB,IAAIjB,WAAW;IACtB,GAAGc;IACHE,QAAQ;MACN,GAAGF,MAAME;MACT,CAACb,SAAAA,GAAYY,iBAAiB;WAAIA;QAAgBvB;UAAU;QAACA;;IAC/D;EACF,CAAA;AAEA,SAAOJ,UAAU8B,OAAOjC,wBAAgBkC,QAAQ;IAAEC,SAAShB,IAAIC,OAAOE,MAAAA,EAAQD,SAAQ;EAAG,CAAA;AACzF,SAAOlB,UAAU8B,OAAOG,gBAAgBC,iBAAiB;IACvD5B,SAAS6B,cAAc,UAAA;EACzB,CAAA;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,iBAAevC;",
|
|
6
|
+
"names": ["Effect", "Capabilities", "Capability", "LayoutOperation", "Operation", "Obj", "Relation", "linkedSegment", "AnchoredTo", "Thread", "handler", "ThreadOperation", "Create", "pipe", "Operation", "withHandler", "fnUntraced", "name", "anchor", "_anchor", "subject", "registry", "Capability", "get", "Capabilities", "AtomRegistry", "stateAtom", "ThreadCapabilities", "State", "subjectId", "Obj", "getDXN", "toString", "thread", "Thread", "make", "Relation", "AnchoredTo", "Source", "Target", "state", "existingDrafts", "drafts", "set", "invoke", "Select", "current", "LayoutOperation", "UpdateCompanion", "linkedSegment"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ThreadOperation_exports
|
|
3
|
+
} from "./chunk-OZRSYMYO.mjs";
|
|
4
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
5
|
+
|
|
6
|
+
// src/operations/create-channel.ts
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import { Operation } from "@dxos/compute";
|
|
9
|
+
import { Channel } from "@dxos/types";
|
|
10
|
+
var handler = ThreadOperation_exports.CreateChannel.pipe(Operation.withHandler((input) => Effect.sync(() => ({
|
|
11
|
+
object: Channel.make({
|
|
12
|
+
name: input.name
|
|
13
|
+
})
|
|
14
|
+
}))));
|
|
15
|
+
var create_channel_default = handler;
|
|
16
|
+
export {
|
|
17
|
+
create_channel_default as default
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=create-channel-UEQESOFT.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/create-channel.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Channel } from '@dxos/types';\n\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.CreateChannel> = ThreadOperation.CreateChannel.pipe(\n Operation.withHandler((input) =>\n Effect.sync(() => ({\n object: Channel.make({ name: input.name }),\n })),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,iBAAiB;AAC1B,SAASC,eAAe;AAIxB,IAAMC,UAAuEC,wBAAgBC,cAAcC,KACzGC,UAAUC,YAAY,CAACC,UACdC,YAAK,OAAO;EACjBC,QAAQC,QAAQC,KAAK;IAAEC,MAAML,MAAMK;EAAK,CAAA;AAC1C,EAAA,CAAA,CAAA;AAIJ,IAAA,yBAAeX;",
|
|
6
|
+
"names": ["Effect", "Operation", "Channel", "handler", "ThreadOperation", "CreateChannel", "pipe", "Operation", "withHandler", "input", "sync", "object", "Channel", "make", "name"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/capabilities/create-object.ts
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { Capability } from "@dxos/app-framework";
|
|
6
|
+
import { Operation } from "@dxos/compute";
|
|
7
|
+
import { SpaceOperation } from "@dxos/plugin-space";
|
|
8
|
+
import { SpaceCapabilities } from "@dxos/plugin-space";
|
|
9
|
+
import { Channel } from "@dxos/types";
|
|
10
|
+
var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
11
|
+
return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
|
|
12
|
+
id: Channel.Channel.typename,
|
|
13
|
+
createObject: (props, options) => Effect.gen(function* () {
|
|
14
|
+
const object = Channel.make(props);
|
|
15
|
+
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
16
|
+
object,
|
|
17
|
+
target: options.target,
|
|
18
|
+
hidden: true,
|
|
19
|
+
targetNodeId: options.targetNodeId
|
|
20
|
+
});
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
}));
|
|
24
|
+
export {
|
|
25
|
+
create_object_default as default
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=create-object-HIEWSBZB.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/create-object.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { Channel } from '@dxos/types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Channel.Channel.typename,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Channel.make(props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n hidden: true,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
|
|
5
|
+
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAClC,SAASC,eAAe;AAExB,IAAA,wBAAeJ,WAAWK,WACjBC,kBAAW,aAAA;AAChB,SAAON,WAAWO,YAAYJ,kBAAkBK,mBAAmB;IACjEC,IAAIL,QAAQA,QAAQM;IACpBC,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAMC,SAASX,QAAQY,KAAKJ,KAAAA;AAC5B,aAAO,OAAOX,UAAUgB,OAAOf,eAAegB,WAAW;QACvDH;QACAI,QAAQN,QAAQM;QAChBC,QAAQ;QACRC,cAAcR,QAAQQ;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
|
|
6
|
+
"names": ["Effect", "Capability", "Operation", "SpaceOperation", "SpaceCapabilities", "Channel", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "typename", "createObject", "props", "options", "gen", "object", "make", "invoke", "AddObject", "target", "hidden", "targetNodeId"]
|
|
7
|
+
}
|
package/dist/lib/{browser/create-proposals-CMK7S7VS.mjs → neutral/create-proposals-OZ4NCBBS.mjs}
RENAMED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-MESW3R4Q.mjs";
|
|
2
|
+
ThreadOperation_exports
|
|
3
|
+
} from "./chunk-OZRSYMYO.mjs";
|
|
5
4
|
import "./chunk-J5LGTIGS.mjs";
|
|
6
5
|
|
|
7
6
|
// src/operations/create-proposals.ts
|
|
@@ -9,11 +8,11 @@ import * as Array from "effect/Array";
|
|
|
9
8
|
import * as Effect from "effect/Effect";
|
|
10
9
|
import * as Function from "effect/Function";
|
|
11
10
|
import { computeDiffsWithCursors } from "@dxos/assistant";
|
|
11
|
+
import { Operation } from "@dxos/compute";
|
|
12
12
|
import { Database, Obj, Ref, Relation } from "@dxos/echo";
|
|
13
13
|
import { createDocAccessor } from "@dxos/echo-db";
|
|
14
|
-
import { Operation } from "@dxos/operation";
|
|
15
14
|
import { AnchoredTo, Message, Thread } from "@dxos/types";
|
|
16
|
-
var handler = CreateProposals.pipe(Operation.withHandler(Effect.fn(function* ({ doc, diffs }) {
|
|
15
|
+
var handler = ThreadOperation_exports.CreateProposals.pipe(Operation.withHandler(Effect.fn(function* ({ doc, diffs }) {
|
|
17
16
|
const object = yield* Database.load(doc);
|
|
18
17
|
const content = yield* Effect.promise(() => object.content.load());
|
|
19
18
|
const accessor = createDocAccessor(content, [
|
|
@@ -54,4 +53,4 @@ var create_proposals_default = handler;
|
|
|
54
53
|
export {
|
|
55
54
|
create_proposals_default as default
|
|
56
55
|
};
|
|
57
|
-
//# sourceMappingURL=create-proposals-
|
|
56
|
+
//# sourceMappingURL=create-proposals-OZ4NCBBS.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/create-proposals.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Array from 'effect/Array';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\n\nimport { computeDiffsWithCursors } from '@dxos/assistant';\nimport { Operation } from '@dxos/compute';\nimport { Database, Obj, Ref, Relation } from '@dxos/echo';\nimport { createDocAccessor } from '@dxos/echo-db';\nimport { AnchoredTo, Message, Thread } from '@dxos/types';\n\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.CreateProposals> = ThreadOperation.CreateProposals.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ doc, diffs }) {\n const object = yield* Database.load(doc);\n const content = yield* Effect.promise(() => object.content.load());\n const accessor = createDocAccessor(content, ['content']);\n\n yield* Function.pipe(\n computeDiffsWithCursors(accessor, diffs),\n Array.map(\n Effect.fnUntraced(function* ({ cursor, text }) {\n const proposal = Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender: { role: 'assistant' },\n blocks: [{ _tag: 'proposal', text }],\n });\n const thread = Thread.make({ name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });\n const relation = Relation.make(AnchoredTo.AnchoredTo, {\n [Relation.Source]: thread,\n [Relation.Target]: object,\n anchor: cursor,\n });\n yield* Database.add(thread);\n yield* Database.add(relation);\n }),\n ),\n Effect.allWith({ concurrency: 'unbounded' }),\n );\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,YAAYA,WAAW;AACvB,YAAYC,YAAY;AACxB,YAAYC,cAAc;AAE1B,SAASC,+BAA+B;AACxC,SAASC,iBAAiB;AAC1B,SAASC,UAAUC,KAAKC,KAAKC,gBAAgB;AAC7C,SAASC,yBAAyB;AAClC,SAASC,YAAYC,SAASC,cAAc;AAI5C,IAAMC,UAAyEC,wBAAgBC,gBAAgBC,KAC7GC,UAAUC,YACDC,UAAG,WAAW,EAAEC,KAAKC,MAAK,GAAE;AACjC,QAAMC,SAAS,OAAOC,SAASC,KAAKJ,GAAAA;AACpC,QAAMK,UAAU,OAAcC,eAAQ,MAAMJ,OAAOG,QAAQD,KAAI,CAAA;AAC/D,QAAMG,WAAWC,kBAAkBH,SAAS;IAAC;GAAU;AAEvD,SAAgBT,cACda,wBAAwBF,UAAUN,KAAAA,GAC5BS,UACGC,kBAAW,WAAW,EAAEC,QAAQC,KAAI,GAAE;AAC3C,UAAMC,WAAWC,IAAIC,KAAKC,QAAQA,SAAS;MACzCC,UAAS,oBAAIC,KAAAA,GAAOC,YAAW;MAC/BC,QAAQ;QAAEC,MAAM;MAAY;MAC5BC,QAAQ;QAAC;UAAEC,MAAM;UAAYX;QAAK;;IACpC,CAAA;AACA,UAAMY,SAASC,OAAOV,KAAK;MAAEW,MAAM;MAAYC,UAAU;QAACC,IAAIb,KAAKF,QAAAA;;MAAYgB,QAAQ;IAAS,CAAA;AAChG,UAAMC,WAAWC,SAAShB,KAAKiB,WAAWA,YAAY;MACpD,CAACD,SAASE,MAAM,GAAGT;MACnB,CAACO,SAASG,MAAM,GAAGjC;MACnBkC,QAAQxB;IACV,CAAA;AACA,WAAOT,SAASkC,IAAIZ,MAAAA;AACpB,WAAOtB,SAASkC,IAAIN,QAAAA;EACtB,CAAA,CAAA,GAEKO,eAAQ;IAAEC,aAAa;EAAY,CAAA,CAAA;AAE9C,CAAA,CAAA,CAAA;AAIJ,IAAA,2BAAe9C;",
|
|
6
|
+
"names": ["Array", "Effect", "Function", "computeDiffsWithCursors", "Operation", "Database", "Obj", "Ref", "Relation", "createDocAccessor", "AnchoredTo", "Message", "Thread", "handler", "ThreadOperation", "CreateProposals", "pipe", "Operation", "withHandler", "fn", "doc", "diffs", "object", "Database", "load", "content", "promise", "accessor", "createDocAccessor", "computeDiffsWithCursors", "map", "fnUntraced", "cursor", "text", "proposal", "Obj", "make", "Message", "created", "Date", "toISOString", "sender", "role", "blocks", "_tag", "thread", "Thread", "name", "messages", "Ref", "status", "relation", "Relation", "AnchoredTo", "Source", "Target", "anchor", "add", "allWith", "concurrency"]
|
|
7
|
+
}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
ThreadCapabilities
|
|
6
|
-
} from "./chunk-MESW3R4Q.mjs";
|
|
2
|
+
ThreadCapabilities_exports,
|
|
3
|
+
ThreadOperation_exports
|
|
4
|
+
} from "./chunk-OZRSYMYO.mjs";
|
|
7
5
|
import "./chunk-J5LGTIGS.mjs";
|
|
8
6
|
|
|
9
7
|
// src/operations/delete.ts
|
|
10
8
|
import * as Effect from "effect/Effect";
|
|
11
9
|
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
12
10
|
import { sleep } from "@dxos/async";
|
|
11
|
+
import { Operation } from "@dxos/compute";
|
|
13
12
|
import { Obj, Relation } from "@dxos/echo";
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
var handler = Delete.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ subject, anchor, thread: _thread }) {
|
|
13
|
+
import { ObservabilityOperation } from "@dxos/plugin-observability";
|
|
14
|
+
var handler = ThreadOperation_exports.Delete.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ subject, anchor, thread: _thread }) {
|
|
17
15
|
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
18
|
-
const stateAtom = yield* Capability.get(
|
|
16
|
+
const stateAtom = yield* Capability.get(ThreadCapabilities_exports.State);
|
|
19
17
|
const thread = _thread ?? Relation.getSource(anchor);
|
|
20
18
|
const subjectId = Obj.getDXN(subject).toString();
|
|
21
19
|
const state = registry.get(stateAtom);
|
|
@@ -56,4 +54,4 @@ var delete_default = handler;
|
|
|
56
54
|
export {
|
|
57
55
|
delete_default as default
|
|
58
56
|
};
|
|
59
|
-
//# sourceMappingURL=delete-
|
|
57
|
+
//# sourceMappingURL=delete-AVFYFWMY.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/delete.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { sleep } from '@dxos/async';\nimport { Operation } from '@dxos/compute';\nimport { Obj, Relation } from '@dxos/echo';\nimport { ObservabilityOperation } from '@dxos/plugin-observability';\nimport { Thread } from '@dxos/types';\n\nimport { ThreadCapabilities } from '../types';\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.Delete> = ThreadOperation.Delete.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ subject, anchor, thread: _thread }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const stateAtom = yield* Capability.get(ThreadCapabilities.State);\n const thread = _thread ?? (Relation.getSource(anchor) as Thread.Thread);\n const subjectId = Obj.getDXN(subject).toString();\n const state = registry.get(stateAtom);\n const draft = state.drafts[subjectId];\n if (draft) {\n const index = draft.findIndex((a: { id: string }) => a.id === anchor.id);\n if (index !== -1) {\n registry.set(stateAtom, {\n ...state,\n drafts: {\n ...state.drafts,\n [subjectId]: state.drafts[subjectId]?.filter((_, i) => i !== index),\n },\n });\n return {};\n }\n }\n\n const db = Obj.getDatabase(thread);\n if (!db) {\n return {};\n }\n\n // TODO(wittjosiah): Without sleep, rendering crashes at `Relation.setSource(anchor)`.\n db.remove(anchor);\n yield* Effect.promise(() => sleep(100));\n db.remove(thread);\n\n yield* Operation.schedule(ObservabilityOperation.SendEvent, {\n name: 'threads.delete',\n properties: {\n spaceId: db.spaceId,\n threadId: thread.id,\n },\n });\n\n return { thread, anchor };\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,aAAa;AACtB,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,gBAAgB;AAC9B,SAASC,8BAA8B;AAMvC,IAAMC,UAAgEC,wBAAgBC,OAAOC,KAC3FC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,SAASC,QAAQC,QAAQC,QAAO,GAAE;AAC/D,QAAMC,WAAW,OAAOC,WAAWC,IAAIC,aAAaC,YAAY;AAChE,QAAMC,YAAY,OAAOJ,WAAWC,IAAII,2BAAmBC,KAAK;AAChE,QAAMT,SAASC,WAAYS,SAASC,UAAUZ,MAAAA;AAC9C,QAAMa,YAAYC,IAAIC,OAAOhB,OAAAA,EAASiB,SAAQ;AAC9C,QAAMC,QAAQd,SAASE,IAAIG,SAAAA;AAC3B,QAAMU,QAAQD,MAAME,OAAON,SAAAA;AAC3B,MAAIK,OAAO;AACT,UAAME,QAAQF,MAAMG,UAAU,CAACC,MAAsBA,EAAEC,OAAOvB,OAAOuB,EAAE;AACvE,QAAIH,UAAU,IAAI;AAChBjB,eAASqB,IAAIhB,WAAW;QACtB,GAAGS;QACHE,QAAQ;UACN,GAAGF,MAAME;UACT,CAACN,SAAAA,GAAYI,MAAME,OAAON,SAAAA,GAAYY,OAAO,CAACC,GAAGC,MAAMA,MAAMP,KAAAA;QAC/D;MACF,CAAA;AACA,aAAO,CAAC;IACV;EACF;AAEA,QAAMQ,KAAKd,IAAIe,YAAY5B,MAAAA;AAC3B,MAAI,CAAC2B,IAAI;AACP,WAAO,CAAC;EACV;AAGAA,KAAGE,OAAO9B,MAAAA;AACV,SAAc+B,eAAQ,MAAMC,MAAM,GAAA,CAAA;AAClCJ,KAAGE,OAAO7B,MAAAA;AAEV,SAAOL,UAAUqC,SAASC,uBAAuBC,WAAW;IAC1DC,MAAM;IACNC,YAAY;MACVC,SAASV,GAAGU;MACZC,UAAUtC,OAAOsB;IACnB;EACF,CAAA;AAEA,SAAO;IAAEtB;IAAQD;EAAO;AAC1B,CAAA,CAAA,CAAA;AAIJ,IAAA,iBAAeR;",
|
|
6
|
+
"names": ["Effect", "Capabilities", "Capability", "sleep", "Operation", "Obj", "Relation", "ObservabilityOperation", "handler", "ThreadOperation", "Delete", "pipe", "Operation", "withHandler", "fnUntraced", "subject", "anchor", "thread", "_thread", "registry", "Capability", "get", "Capabilities", "AtomRegistry", "stateAtom", "ThreadCapabilities", "State", "Relation", "getSource", "subjectId", "Obj", "getDXN", "toString", "state", "draft", "drafts", "index", "findIndex", "a", "id", "set", "filter", "_", "i", "db", "getDatabase", "remove", "promise", "sleep", "schedule", "ObservabilityOperation", "SendEvent", "name", "properties", "spaceId", "threadId"]
|
|
7
|
+
}
|
package/dist/lib/{browser/delete-message-XL5M5J33.mjs → neutral/delete-message-EV2MKRTB.mjs}
RENAMED
|
@@ -1,29 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} from "./chunk-VPM44Z35.mjs";
|
|
5
|
-
import "./chunk-MESW3R4Q.mjs";
|
|
2
|
+
ThreadOperation_exports
|
|
3
|
+
} from "./chunk-OZRSYMYO.mjs";
|
|
6
4
|
import "./chunk-J5LGTIGS.mjs";
|
|
7
5
|
|
|
8
6
|
// src/operations/delete-message.ts
|
|
9
7
|
import * as Effect from "effect/Effect";
|
|
8
|
+
import { Operation } from "@dxos/compute";
|
|
10
9
|
import { Obj, Relation } from "@dxos/echo";
|
|
11
10
|
import { invariant } from "@dxos/invariant";
|
|
12
|
-
import {
|
|
13
|
-
import { ObservabilityOperation } from "@dxos/plugin-observability/operations";
|
|
11
|
+
import { ObservabilityOperation } from "@dxos/plugin-observability";
|
|
14
12
|
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/operations/delete-message.ts";
|
|
15
|
-
var handler = DeleteMessage.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ subject, anchor, messageId }) {
|
|
13
|
+
var handler = ThreadOperation_exports.DeleteMessage.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ subject, anchor, messageId }) {
|
|
16
14
|
const thread = Relation.getSource(anchor);
|
|
17
15
|
const db = Obj.getDatabase(subject);
|
|
18
|
-
invariant(db, "Database not found", {
|
|
19
|
-
F: __dxlog_file,
|
|
20
|
-
L: 20,
|
|
21
|
-
S: this,
|
|
22
|
-
A: [
|
|
23
|
-
"db",
|
|
24
|
-
"'Database not found'"
|
|
25
|
-
]
|
|
26
|
-
});
|
|
16
|
+
invariant(db, "Database not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 13, S: this, A: ["db", "'Database not found'"] });
|
|
27
17
|
const msgIndex = thread.messages.findIndex((ref) => ref.target?.id === messageId);
|
|
28
18
|
const msg = thread.messages[msgIndex]?.target;
|
|
29
19
|
if (!msg) {
|
|
@@ -32,7 +22,7 @@ var handler = DeleteMessage.pipe(Operation.withHandler(Effect.fnUntraced(functio
|
|
|
32
22
|
};
|
|
33
23
|
}
|
|
34
24
|
if (msgIndex === 0 && thread.messages.length === 1) {
|
|
35
|
-
yield* Operation.invoke(Delete, {
|
|
25
|
+
yield* Operation.invoke(ThreadOperation_exports.Delete, {
|
|
36
26
|
subject,
|
|
37
27
|
anchor
|
|
38
28
|
});
|
|
@@ -40,7 +30,7 @@ var handler = DeleteMessage.pipe(Operation.withHandler(Effect.fnUntraced(functio
|
|
|
40
30
|
messageIndex: -1
|
|
41
31
|
};
|
|
42
32
|
}
|
|
43
|
-
Obj.
|
|
33
|
+
Obj.update(thread, (thread2) => {
|
|
44
34
|
thread2.messages.splice(msgIndex, 1);
|
|
45
35
|
});
|
|
46
36
|
yield* Operation.schedule(ObservabilityOperation.SendEvent, {
|
|
@@ -61,4 +51,4 @@ var delete_message_default = handler;
|
|
|
61
51
|
export {
|
|
62
52
|
delete_message_default as default
|
|
63
53
|
};
|
|
64
|
-
//# sourceMappingURL=delete-message-
|
|
54
|
+
//# sourceMappingURL=delete-message-EV2MKRTB.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/delete-message.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Obj, Relation } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ObservabilityOperation } from '@dxos/plugin-observability';\nimport { Thread } from '@dxos/types';\n\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.DeleteMessage> = ThreadOperation.DeleteMessage.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ subject, anchor, messageId }) {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const db = Obj.getDatabase(subject);\n invariant(db, 'Database not found');\n\n const msgIndex = thread.messages.findIndex((ref) => ref.target?.id === messageId);\n const msg = thread.messages[msgIndex]?.target;\n if (!msg) {\n return { messageIndex: -1 };\n }\n\n if (msgIndex === 0 && thread.messages.length === 1) {\n // TODO(wittjosiah): This doesn't support restoring the thread.\n yield* Operation.invoke(ThreadOperation.Delete, { subject, anchor });\n return { messageIndex: -1 };\n }\n\n Obj.update(thread, (thread) => {\n thread.messages.splice(msgIndex, 1);\n });\n\n yield* Operation.schedule(ObservabilityOperation.SendEvent, {\n name: 'threads.message.delete',\n properties: {\n spaceId: db.spaceId,\n threadId: thread.id,\n threadLength: thread.messages.length,\n messageId,\n },\n });\n\n return { message: msg, messageIndex: msgIndex };\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,gBAAgB;AAC9B,SAASC,iBAAiB;AAC1B,SAASC,8BAA8B;AAKvC,IAAA,eAA6EC;IAIvE,UAAWC,wBAAgBC,cAAAA,KAAAA,UAAAA,YAAAA,kBAAAA,WAAAA,EAAAA,SAAAA,QAAAA,UAAAA,GAAAA;AAC3BC,QAAAA,SAAc,SAAA,UAAA,MAAA;AAEd,QAAMC,KAAAA,IAAAA,YAAkBC,OAASC;AACjC,YAAMC,IAAMC,sBAAgBJ,EAAAA,YAAWK,YAAAA,GAAAA,cAAAA,GAAAA,IAAAA,GAAAA,MAAAA,GAAAA,CAAAA,MAAAA,sBAAAA,EAAAA,CAAAA;AACvC,QAAKF,WAAK,OAAA,SAAA,UAAA,CAAA,QAAA,IAAA,QAAA,OAAA,SAAA;QACR,MAAO,OAAA,SAAA,QAAA,GAAA;YAAEG;AAAiB,WAAA;MAC5B,cAAA;IAEIN;;MAEF,aAAOO,KAAUC,OAAOZ,SAAAA,WAAgBa,GAAQ;WAAWC,UAAAA,OAAAA,wBAAAA,QAAAA;MAAO;MAClE;;AAA0B,WAAA;MAC5B,cAAA;IAEIC;;AAEJ,MAAA,OAAA,QAAA,CAAAP,YAAA;AAEA,IAAAA,QAAOG,SAAUK,OAASC,UAAAA,CAAAA;;SAExBC,UAAY,SAAA,uBAAA,WAAA;UACVC;gBACAC;MACAC,SAAAA,GAAAA;MACAC,UAAAA,OAAAA;MACF,cAAA,OAAA,SAAA;MACF;IAEA;;SAAuBZ;IAAuB,SAAA;IAChD,cAAA;EAIJ;;;",
|
|
6
|
+
"names": ["Effect", "Operation", "Obj", "Relation", "invariant", "ObservabilityOperation", "ThreadOperation", "Obj", "subject", "invariant", "msgIndex", "messages", "findIndex", "msg", "thread", "target", "messageIndex", "Operation", "invoke", "Delete", "anchor", "update", "schedule", "ObservabilityOperation", "properties", "spaceId", "threadId", "threadLength", "messageId"]
|
|
7
|
+
}
|