@dxos/plugin-thread 0.8.2 → 0.8.3-main.7f5a14c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{ChannelContainer-LGYSQMC7.mjs → ChannelContainer-KWXUKR5Q.mjs} +4 -4
- package/dist/lib/browser/{ChatContainer-JWRI73OG.mjs → ChatContainer-RSOKYAMK.mjs} +2 -2
- package/dist/lib/browser/{app-graph-builder-K3CFBN7V.mjs → app-graph-builder-CBWNZCXB.mjs} +10 -10
- package/dist/lib/browser/app-graph-builder-CBWNZCXB.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KMVGJG23.mjs → chunk-3EYX6CV7.mjs} +10 -9
- package/dist/lib/browser/chunk-3EYX6CV7.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5PGLGDIP.mjs → chunk-5IRYNA5K.mjs} +6 -6
- package/dist/lib/browser/chunk-5IRYNA5K.mjs.map +7 -0
- package/dist/lib/browser/chunk-FWBJHKRW.mjs +21 -0
- package/dist/lib/browser/{chunk-G3TS64FP.mjs → chunk-TAFSCSUR.mjs} +4 -4
- package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +4 -4
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-YUYZCTLF.mjs → intent-resolver-I37YU7K3.mjs} +13 -12
- package/dist/lib/browser/intent-resolver-I37YU7K3.mjs.map +7 -0
- package/dist/lib/browser/{markdown-4EC3OCF2.mjs → markdown-LS3XO2KB.mjs} +5 -4
- package/dist/lib/browser/markdown-LS3XO2KB.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-root-EECCWHCW.mjs → react-root-KNCKPHGS.mjs} +5 -5
- package/dist/lib/browser/{react-surface-5QLZAFDL.mjs → react-surface-ASWIBD7H.mjs} +11 -11
- package/dist/lib/browser/react-surface-ASWIBD7H.mjs.map +7 -0
- package/dist/lib/browser/{settings-KVBQQSO5.mjs → settings-ZUY7OX24.mjs} +3 -3
- package/dist/lib/browser/settings-ZUY7OX24.mjs.map +7 -0
- package/dist/lib/node/{ChannelContainer-5EKNEH56.cjs → ChannelContainer-MA5CFESJ.cjs} +9 -9
- package/dist/lib/node/{ChannelContainer-5EKNEH56.cjs.map → ChannelContainer-MA5CFESJ.cjs.map} +2 -2
- package/dist/lib/node/{ChatContainer-EE3FPSYO.cjs → ChatContainer-GCOM3M56.cjs} +8 -8
- package/dist/lib/node/{ChatContainer-EE3FPSYO.cjs.map → ChatContainer-GCOM3M56.cjs.map} +2 -2
- package/dist/lib/node/{app-graph-builder-IRE3GYKE.cjs → app-graph-builder-K5OAVYI6.cjs} +19 -19
- package/dist/lib/node/app-graph-builder-K5OAVYI6.cjs.map +7 -0
- package/dist/lib/node/{chunk-U7NOIXN6.cjs → chunk-3YYSLZE4.cjs} +10 -10
- package/dist/lib/node/{chunk-4B3PPXA6.cjs → chunk-E3WBZTTI.cjs} +12 -12
- package/dist/lib/node/chunk-E3WBZTTI.cjs.map +7 -0
- package/dist/lib/node/{chunk-6B3M6XRE.cjs → chunk-U4SZUERU.cjs} +8 -8
- package/dist/lib/node/chunk-U4SZUERU.cjs.map +7 -0
- package/dist/lib/node/{chunk-JLHENFGK.cjs → chunk-WCQKISL5.cjs} +32 -31
- package/dist/lib/node/chunk-WCQKISL5.cjs.map +7 -0
- package/dist/lib/node/index.cjs +11 -11
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-MZ3HADNY.cjs → intent-resolver-2TX6HSOL.cjs} +29 -28
- package/dist/lib/node/intent-resolver-2TX6HSOL.cjs.map +7 -0
- package/dist/lib/node/{markdown-NJDPXIKD.cjs → markdown-GNFW2XDO.cjs} +21 -20
- package/dist/lib/node/markdown-GNFW2XDO.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-root-IAYQ2DBO.cjs → react-root-BKOXG5AC.cjs} +9 -9
- package/dist/lib/node/{react-surface-AVC5VVIS.cjs → react-surface-Q5DWX3UO.cjs} +23 -23
- package/dist/lib/node/react-surface-Q5DWX3UO.cjs.map +7 -0
- package/dist/lib/node/{settings-H45P5YO2.cjs → settings-5O5V2NOE.cjs} +5 -5
- package/dist/lib/node/settings-5O5V2NOE.cjs.map +7 -0
- package/dist/lib/node-esm/{ChannelContainer-KFS2RWWW.mjs → ChannelContainer-VGVEAUAQ.mjs} +4 -4
- package/dist/lib/node-esm/{ChatContainer-UJYPQMLV.mjs → ChatContainer-F6CSADV7.mjs} +2 -2
- package/dist/lib/node-esm/{app-graph-builder-I5VMPLE4.mjs → app-graph-builder-UWJQE534.mjs} +10 -10
- package/dist/lib/node-esm/app-graph-builder-UWJQE534.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-MNJ3V4XM.mjs → chunk-6EGLDARC.mjs} +10 -9
- package/dist/lib/node-esm/chunk-6EGLDARC.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ODUB4GAB.mjs → chunk-EHDXOE5R.mjs} +7 -7
- package/dist/lib/node-esm/{chunk-X6AUQDTE.mjs → chunk-KP2JBSWF.mjs} +6 -6
- package/dist/lib/node-esm/chunk-KP2JBSWF.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-POKXRTII.mjs → chunk-P6RLFCNT.mjs} +4 -4
- package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +4 -4
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-CU22OPAH.mjs → intent-resolver-FHRK77IS.mjs} +13 -12
- package/dist/lib/node-esm/intent-resolver-FHRK77IS.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-HRGGO7IA.mjs → markdown-HBGB3UPJ.mjs} +5 -4
- package/dist/lib/node-esm/markdown-HBGB3UPJ.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-root-NQMUEI6Z.mjs → react-root-UPDDCRBV.mjs} +5 -5
- package/dist/lib/node-esm/{react-surface-Z4X5VLMY.mjs → react-surface-LU3CZDC4.mjs} +11 -11
- package/dist/lib/node-esm/react-surface-LU3CZDC4.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-IJGUOU3F.mjs → settings-KFEFSAYG.mjs} +3 -3
- package/dist/lib/node-esm/settings-KFEFSAYG.mjs.map +7 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts +3 -2
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
- package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +2 -103
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- package/package.json +42 -42
- package/src/ThreadPlugin.tsx +4 -4
- package/src/capabilities/app-graph-builder.ts +9 -9
- package/src/capabilities/intent-resolver.ts +9 -8
- package/src/capabilities/react-surface.tsx +7 -7
- package/src/capabilities/settings.ts +7 -2
- package/src/components/Call/Toolbar.tsx +2 -2
- package/src/components/Chat.stories.tsx +4 -4
- package/src/components/ChatContainer.tsx +6 -6
- package/src/components/Comments.stories.tsx +6 -5
- package/src/components/MessageContainer.tsx +20 -20
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
- package/src/components/ThreadComplementary.tsx +9 -4
- package/src/components/testing.ts +5 -5
- package/src/extensions/threads.ts +4 -3
- package/src/testing/stories.ts +3 -3
- package/dist/lib/browser/app-graph-builder-K3CFBN7V.mjs.map +0 -7
- package/dist/lib/browser/chunk-5PGLGDIP.mjs.map +0 -7
- package/dist/lib/browser/chunk-CF2MXRCH.mjs +0 -21
- package/dist/lib/browser/chunk-G3TS64FP.mjs.map +0 -7
- package/dist/lib/browser/chunk-KMVGJG23.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-YUYZCTLF.mjs.map +0 -7
- package/dist/lib/browser/markdown-4EC3OCF2.mjs.map +0 -7
- package/dist/lib/browser/react-surface-5QLZAFDL.mjs.map +0 -7
- package/dist/lib/browser/settings-KVBQQSO5.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-IRE3GYKE.cjs.map +0 -7
- package/dist/lib/node/chunk-4B3PPXA6.cjs.map +0 -7
- package/dist/lib/node/chunk-6B3M6XRE.cjs.map +0 -7
- package/dist/lib/node/chunk-JLHENFGK.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-MZ3HADNY.cjs.map +0 -7
- package/dist/lib/node/markdown-NJDPXIKD.cjs.map +0 -7
- package/dist/lib/node/react-surface-AVC5VVIS.cjs.map +0 -7
- package/dist/lib/node/settings-H45P5YO2.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-I5VMPLE4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MNJ3V4XM.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-POKXRTII.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-X6AUQDTE.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-CU22OPAH.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-HRGGO7IA.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-Z4X5VLMY.mjs.map +0 -7
- package/dist/lib/node-esm/settings-IJGUOU3F.mjs.map +0 -7
- /package/dist/lib/browser/{ChannelContainer-LGYSQMC7.mjs.map → ChannelContainer-KWXUKR5Q.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-JWRI73OG.mjs.map → ChatContainer-RSOKYAMK.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-CF2MXRCH.mjs.map → chunk-FWBJHKRW.mjs.map} +0 -0
- /package/dist/lib/browser/{react-root-EECCWHCW.mjs.map → react-root-KNCKPHGS.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-U7NOIXN6.cjs.map → chunk-3YYSLZE4.cjs.map} +0 -0
- /package/dist/lib/node/{react-root-IAYQ2DBO.cjs.map → react-root-BKOXG5AC.cjs.map} +0 -0
- /package/dist/lib/node-esm/{ChannelContainer-KFS2RWWW.mjs.map → ChannelContainer-VGVEAUAQ.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-UJYPQMLV.mjs.map → ChatContainer-F6CSADV7.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-ODUB4GAB.mjs.map → chunk-EHDXOE5R.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-root-NQMUEI6Z.mjs.map → react-root-UPDDCRBV.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/ChannelContainer.tsx", "../../../src/components/Call/Call.tsx", "../../../src/components/Call/Toolbar.tsx", "../../../src/components/Media/AudioStream.tsx", "../../../src/components/Media/VideoObject.tsx", "../../../src/components/Participant/Participant.tsx", "../../../src/components/ResponsiveGrid/ResponsiveContainer.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGrid.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGridItem.tsx", "../../../src/components/Participant/ParticipantGrid.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport React, { useCallback, useEffect, useMemo, useState, type ChangeEvent } from 'react';\n\nimport { useCapabilities, useCapability } from '@dxos/app-framework';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation, Input, ElevationProvider } from '@dxos/react-ui';\nimport { ControlGroup, ControlItemInput, ControlGroupButton } from '@dxos/react-ui-form';\nimport { ToolbarMenu, MenuProvider, createMenuAction, useMenuActions, createMenuItemGroup } from '@dxos/react-ui-menu';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { Call } from './Call';\nimport ChatContainer from './ChatContainer';\nimport { ThreadCapabilities } from '../capabilities';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ChannelType } from '../types';\n\nexport type ChannelContainerProps = {\n channel?: ChannelType;\n roomId?: string;\n role?: string;\n fullscreen?: boolean;\n};\n\n/**\n * Renders a call when active, otherwise renders the channel chat.\n */\nexport const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }: ChannelContainerProps) => {\n const space = getSpace(channel);\n const callManager = useCapability(ThreadCapabilities.CallManager);\n const roomId = channel ? fullyQualifiedId(channel) : _roomId;\n const identity = useIdentity();\n const isNamed = !!identity?.profile?.displayName;\n const joinSound = useSoundEffect('JoinCall');\n const leaveSound = useSoundEffect('LeaveCall');\n\n const extensions = useCapabilities(ThreadCapabilities.CallExtension);\n useEffect(() => {\n const ctx = new Context();\n callManager.left.on(ctx, (roomId) => {\n extensions.forEach((extension) => {\n void extension.onLeave?.(roomId);\n });\n });\n\n callManager.callStateUpdated.on(ctx, (state) => {\n extensions.forEach((extension) => {\n void extension.onCallStateUpdated?.(state);\n });\n });\n\n callManager.mediaStateUpdated.on(ctx, (state) => {\n extensions.forEach((extension) => {\n void extension.onMediaStateUpdated?.(state);\n });\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [callManager, extensions]);\n\n /**\n * Join the call.\n */\n // TODO(wittjosiah): Show preview before joining?\n const handleJoin = useCallback(async () => {\n if (!roomId || !channel) {\n return;\n }\n\n if (callManager.joined) {\n await callManager.leave();\n }\n\n try {\n void joinSound.play();\n callManager.setRoomId(roomId);\n await callManager.join();\n await Promise.all(extensions.map((extension) => extension.onJoin?.({ channel, roomId })));\n } catch (err) {\n // TODO(burdon): Error sound.\n log.catch(err);\n }\n }, [extensions, channel, roomId]);\n\n /**\n * Leave the call.\n */\n const handleLeave = useCallback(async () => {\n try {\n void leaveSound.play();\n } catch (err) {\n // TODO(burdon): Error sound.\n log.catch(err);\n } finally {\n void callManager.turnAudioOff();\n void callManager.turnVideoOff();\n void callManager.turnScreenshareOff();\n void callManager.leave();\n }\n }, [extensions, roomId]);\n\n const isJoined = callManager.joined && callManager.roomId === roomId;\n\n return (\n <StackItem.Content toolbar={!isJoined} classNames={isJoined && 'h-full'}>\n {isJoined && !isNamed && <DisplayNameMissing />}\n {isJoined && isNamed && (\n <Call.Root>\n <Call.Grid fullscreen={fullscreen} />\n <Call.Toolbar channel={channel} onLeave={handleLeave} />\n </Call.Root>\n )}\n {!isJoined && channel && channel.defaultThread.target && space && (\n <>\n <ChannelToolbar attendableId={fullyQualifiedId(channel)} role={role} onJoinCall={handleJoin} />\n <ChatContainer space={space} thread={channel.defaultThread.target} />\n </>\n )}\n </StackItem.Content>\n );\n};\n\nexport default ChannelContainer;\n\nconst DisplayNameMissing = () => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const client = useClient();\n const [displayName, setDisplayName] = useState('');\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => setDisplayName(event.target.value), []);\n const handleSave = useCallback(() => client.halo.updateProfile({ displayName }), [client, displayName]);\n\n return (\n <ControlGroup classNames='p-4 place-content-center'>\n <ControlItemInput title={t('display name label')} description={t('display name description')}>\n <Input.TextInput\n value={displayName}\n onChange={handleChange}\n placeholder={t('display name input placeholder')}\n classNames='md:min-is-64'\n />\n </ControlItemInput>\n <ControlGroupButton disabled={!displayName} onClick={handleSave}>\n {t('set display name label')}\n </ControlGroupButton>\n </ControlGroup>\n );\n};\n\nconst useChannelToolbarActions = (onJoinCall?: () => void) => {\n const creator = useMemo(\n () =>\n Rx.make(() => {\n const nodes = [];\n const edges = [];\n\n const rootGroup = createMenuItemGroup('root', {\n label: ['channel toolbar title', { ns: THREAD_PLUGIN }],\n });\n nodes.push(rootGroup);\n\n const sortAction = createMenuAction('video-call', () => onJoinCall?.(), {\n label: ['start video call label', { ns: THREAD_PLUGIN }],\n icon: 'ph--video-camera--regular',\n type: 'video-call',\n });\n nodes.push(sortAction);\n edges.push({ source: 'root', target: sortAction.id });\n\n return { nodes, edges };\n }),\n [],\n );\n\n return useMenuActions(creator);\n};\n\ntype ChannelToolbarProps = {\n attendableId?: string;\n role?: string;\n onJoinCall?: () => void;\n};\n\nconst ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {\n const menuProps = useChannelToolbarActions(onJoinCall);\n\n return (\n <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>\n <MenuProvider {...menuProps} attendableId={attendableId}>\n <ToolbarMenu />\n </MenuProvider>\n </ElevationProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, type FC } from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { Toolbar, type ToolbarProps } from './Toolbar';\nimport { ThreadCapabilities } from '../../capabilities';\nimport { useDebugMode } from '../../hooks';\nimport { AudioStream } from '../Media';\nimport { ParticipantGrid } from '../Participant';\n\n//\n// Root\n//\n\ntype CallRootProps = PropsWithChildren<ThemedClassName>;\n\nconst CallRoot: FC<CallRootProps> = ({ children }) => {\n return <div className='relative flex flex-col grow overflow-hidden'>{children}</div>;\n};\n\nCallRoot.displayName = 'CallRoot';\n\n//\n// Audio\n//\n\ntype CallAudioProps = {};\n\nconst CallAudio: FC<CallAudioProps> = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n\n return <AudioStream tracks={call.pulledAudioTracks} />;\n};\n\nCallAudio.displayName = 'CallAudio';\n\n//\n// Room\n//\n\ntype CallGridProps = {\n fullscreen?: boolean;\n};\n\nconst CallGrid: FC<CallGridProps> = ({ fullscreen }) => {\n const debug = useDebugMode();\n const call = useCapability(ThreadCapabilities.CallManager);\n\n return (\n <div className='grid grow p-4 dark:bg-neutral-900'>\n <ParticipantGrid self={call.self} users={call.users} debug={debug} fullscreen={fullscreen} />\n </div>\n );\n};\n\nCallGrid.displayName = 'CallGrid';\n\n//\n// Toolbar\n//\n\ntype CallToolbarProps = Pick<ToolbarProps, 'channel' | 'onLeave'>;\n\nconst CallToolbar: FC<CallToolbarProps> = (props) => {\n return (\n <div className='absolute bottom-0 left-0 right-0 flex justify-center'>\n <Toolbar isInRoom {...props} />\n </div>\n );\n};\n\nCallToolbar.displayName = 'CallToolbar';\n\n//\n// Export\n//\n\nexport const Call = {\n Root: CallRoot,\n Grid: CallGrid,\n Audio: CallAudio,\n Toolbar: CallToolbar,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useAppGraph, useCapability } from '@dxos/app-framework';\nimport { useNode, useActions } from '@dxos/plugin-graph';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport {\n Icon,\n IconButton,\n type IconButtonProps,\n type ThemedClassName,\n Toolbar as NativeToolbar,\n toLocalizedString,\n useTranslation,\n} from '@dxos/react-ui';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';\n\nimport { ThreadCapabilities } from '../../capabilities';\nimport { THREAD_PLUGIN } from '../../meta';\nimport { type ChannelType } from '../../types';\n\nexport type ToolbarProps = ThemedClassName<{\n channel?: ChannelType;\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(THREAD_PLUGIN);\n const { graph } = useAppGraph();\n const call = useCapability(ThreadCapabilities.CallManager);\n\n // Channel app graph node.\n const node = useNode(graph, channel && fullyQualifiedId(channel));\n const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');\n\n // Screen sharing.\n const isScreensharing = call.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 <NativeToolbar.Root classNames={['p-2 bg-modalSurface rounded-lg shadow-lg', classNames]}>\n <ToggleButton\n active={call.media.audioEnabled}\n state={{\n on: {\n icon: 'ph--microphone--regular',\n label: t('mic off'),\n onClick: () => call.turnAudioOff(),\n classNames: 'bg-callActive',\n },\n off: {\n icon: 'ph--microphone-slash--duotone',\n label: t('mic on'),\n onClick: () => call.turnAudioOn(),\n classNames: [call.joined && 'bg-callAlert'],\n },\n }}\n />\n <ToggleButton\n active={call.media.videoEnabled}\n state={{\n on: {\n icon: 'ph--video-camera--regular',\n label: t('camera off'),\n onClick: () => call.turnVideoOff(),\n },\n off: {\n icon: 'ph--video-camera-slash--duotone',\n label: t('camera on'),\n onClick: () => call.turnVideoOn(),\n },\n }}\n />\n\n {(participants !== undefined && (\n <div className='flex justify-center items-center gap-2 is-[5rem] text-xs text-subdued'>\n <Icon icon='ph--users--regular' size={4} />\n <div>{participants}</div>\n </div>\n )) || <NativeToolbar.Separator variant='gap' />}\n\n {call.joined && (\n <>\n <ToggleButton\n disabled={!canSharescreen}\n active={isScreensharing}\n state={{\n on: {\n icon: 'ph--monitor--regular',\n label: t('screenshare off'),\n onClick: () => call.turnScreenshareOff(),\n },\n off: {\n icon: 'ph--monitor-arrow-up--duotone',\n label: t('screenshare on'),\n onClick: () => call.turnScreenshareOn(),\n },\n }}\n />\n\n {/* Companion actions. */}\n {actions.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={() => action.data({ node })}\n />\n ))}\n\n <ToggleButton\n active={call.raisedHand}\n state={{\n on: {\n icon: 'ph--hand-waving--regular',\n label: t('lower hand'),\n onClick: () => call.setRaisedHand(false),\n classNames: [call.joined && 'bg-callAlert'],\n },\n off: {\n icon: 'ph--hand-palm--duotone',\n label: t('raise hand'),\n onClick: () => call.setRaisedHand(true),\n },\n }}\n />\n </>\n )}\n {call.joined ? (\n <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />\n ) : (\n <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />\n )}\n </NativeToolbar.Root>\n </div>\n );\n};\n\nToolbar.displayName = 'MeetingToolbar';\n\ntype ToolbarButtonProps = Pick<IconButtonProps, 'disabled'> & {\n active?: boolean;\n state: {\n on: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n off: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n };\n};\n\nconst defaultButtonProps: Partial<IconButtonProps> = {\n size: 5,\n iconOnly: true,\n};\n\nconst ToggleButton = ({ active, state }: ToolbarButtonProps) => (\n <IconButton\n {...defaultButtonProps}\n classNames={[active ? state.on.classNames ?? 'bg-callActive' : state.off.classNames]}\n icon={active ? state.on.icon : state.off.icon}\n label={active ? state.on.label : state.off.label}\n onClick={active ? state.on.onClick : state.off.onClick}\n />\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport 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 AudioTrackProps = {\n track: MediaStreamTrack;\n mediaStream: MediaStream;\n resetSrcObject: () => void;\n};\n\nconst AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackProps) => {\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/react-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 React, { memo, useMemo } from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\n\nimport { type EncodedTrackName, type UserState } from '../../calls';\nimport { ThreadCapabilities } from '../../capabilities';\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 isSelf: boolean = call.self.id !== undefined && user.id !== undefined && user.id.startsWith(call.self.id);\n const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);\n const pulledVideoStream = call.getVideoStream(\n isScreenshare || !isSelf ? (user.tracks?.video as EncodedTrackName) : undefined,\n );\n\n const videoStream = useMemo<MediaStream | undefined>(() => {\n if (isSelf && !isScreenshare) {\n return call.media.videoStream;\n } else if (isSelf && isScreenshare) {\n return call.media.screenshareVideoStream;\n } else if (!isSelf) {\n return pulledVideoStream;\n }\n }, [isSelf, isScreenshare, call.media.videoStream, call.media.screenshareVideoStream, pulledVideoStream]);\n\n return (\n <ResponsiveGridItem\n {...props}\n item={user}\n name={user.name}\n self={isSelf}\n screenshare={!!call.media.screenshareVideoStream}\n video={call.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/react-ui-theme';\n\n/**\n * A container component that maintains the child's aspect ratio while centering its content.\n * The container will scale to fit within its parent's bounds while preserving the aspect ratio.\n *\n * @example\n * <ResponsiveContainer>\n * <VideoObject />\n * </ResponsiveContainer>\n */\nexport const ResponsiveContainer = ({ children }: PropsWithChildren) => {\n return (\n // Outer container that takes full size of parent.\n <div role='none' className='relative flex w-full h-full'>\n {/* Absolute positioning layer for centering content. */}\n <div role='none' className='absolute inset-0 flex justify-center items-center'>\n {/* Content container that maintains given aspect ratio and proper scaling. */}\n <div role='none' className={mx('max-h-full max-w-full w-auto h-auto aspect-video')}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ComponentType, type FC, useLayoutEffect, useState, useEffect, useMemo, useCallback } 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/react-ui-theme';\n\nimport { ResponsiveContainer } from './ResponsiveContainer';\nimport { type ResponsiveGridItemProps } from './ResponsiveGridItem';\n\nconst ASPECT_RATIO = 16 / 9;\nconst MIN_GALLERY_HEIGHT = 250;\n\nconst DEFAULT_GAP = 8;\n\nconst maxImageSize = '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('relative w-full h-full', classNames)}>\n {/* Placeholder elements to calculate layout. */}\n <div className='absolute inset-0 flex flex-col grow gap-2'>\n {/* Pinned item. */}\n {pinnedItem && (\n <div\n className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && '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 <ResponsiveContainer>\n <div\n {...{ 'data-grid-item': id }}\n className={mx('aspect-video overflow-hidden', debug && 'z-20 border-2 border-primary-500')}\n >\n {/* Maximum size placeholder image forces aspect ratio. */}\n <img alt='placeholder video' className={mx('opacity-0', maxImageSize)} />\n </div>\n </ResponsiveContainer>\n );\n};\n\ntype DOMRectBounds = Pick<DOMRect, 'top' | 'left' | 'width' | 'height'>;\n\n// TODO(burdon): Reconcile with react-ui-gameboard.\nconst getRelativeBounds = (container: HTMLElement, el: HTMLElement): DOMRectBounds => {\n const containerRect = container.getBoundingClientRect();\n const elementRect = el.getBoundingClientRect();\n return {\n top: elementRect.top - containerRect.top,\n left: elementRect.left - containerRect.left,\n width: elementRect.width,\n height: elementRect.height,\n };\n};\n\ntype Layout = {\n time?: number;\n columns: number;\n cellWidth: number;\n};\n\n/**\n * Calculates the optimal number of columns for a grid layout that minimizes wasted space.\n * @param containerWidth - Width of the container in pixels.\n * @param containerHeight - Height of the container in pixels.\n * @param count - Total number of items to display.\n * @param gap - Space between items in pixels.\n * @param aspectRatio - Desired aspect ratio of items (width/height).\n * @returns The optimal number of columns.\n */\nconst calculateLayout = (\n containerWidth: number,\n containerHeight: number,\n count: number,\n gap: number,\n aspectRatio = ASPECT_RATIO,\n): Layout => {\n if (count === 0) {\n return { columns: 1, cellWidth: 1 };\n }\n\n let minWastedSpace = Infinity;\n let bestColumns = 1;\n let cellWidth = 0;\n\n // Try different rows counts to find the optimal layout that minimizes wasted space.\n for (let rows = 1; rows <= count; rows++) {\n const cols = Math.ceil(count / rows);\n\n // Calculate available space accounting for gaps.\n const { width: itemWidth, height: itemHeight } = fitItemsToGrid(\n containerWidth,\n containerHeight,\n cols,\n rows,\n aspectRatio,\n gap,\n );\n\n // Calculate total wasted space for this configuration.\n const usedWidth = itemWidth * cols + gap * cols - 1;\n const usedHeight = itemHeight * rows + gap * rows - 1;\n\n // Determine if optimal.\n const wastedSpace = containerWidth * containerHeight - usedWidth * usedHeight;\n if (wastedSpace < minWastedSpace) {\n minWastedSpace = wastedSpace;\n bestColumns = cols;\n cellWidth = itemWidth;\n }\n }\n\n return { columns: bestColumns, cellWidth };\n};\n\n/**\n * Returns the size of the largest rectangle with the given aspect ration that fits within the grid.\n */\nconst fitItemsToGrid = (\n outerWidth: number,\n outerHeight: number,\n numCols: number,\n numRows: number,\n aspectRatio: number,\n gap: number,\n): { width: number; height: number } => {\n // Calculate available space accounting for gaps.\n const availableWidth = outerWidth - gap * (numCols - 1);\n const availableHeight = outerHeight - gap * (numRows - 1);\n\n // Calculate max dimensions.\n const maxCellWidth = availableWidth / numCols;\n const maxCellHeight = availableHeight / numRows;\n\n // Use fitAspectRatio to get dimensions that fit within max cell size while maintaining the desired aspect ratio\n return fitAspectRatio(maxCellWidth, maxCellHeight, aspectRatio);\n};\n\n/**\n * Returns the size of the largest rectangle the given aspect ratio that fits within the outer rectangle.\n */\nconst fitAspectRatio = (\n outerWidth: number,\n outerHeight: number,\n aspectRatio: number,\n): { width: number; height: number } => {\n if (outerWidth <= 0 || outerHeight <= 0 || aspectRatio <= 0) {\n return { width: 0, height: 0 };\n }\n\n // First try fitting to width.\n let width = outerWidth;\n let height = width / aspectRatio;\n\n // If too tall, fit to height instead.\n if (height > outerHeight) {\n height = outerHeight;\n width = height * aspectRatio;\n }\n\n return { width, height };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useState, type CSSProperties, type PropsWithChildren } from 'react';\n\nimport { Icon, IconButton, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { Waveform } from '@dxos/react-ui-sfx';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';\n\nimport { THREAD_PLUGIN } 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(THREAD_PLUGIN);\n const iconProps: Record<string, { icon: string; label: string; classNames?: string }> = {\n wave: {\n icon: 'ph--hand-waving--duotone',\n label: t('icon wave'),\n classNames: 'animate-pulse bg-orange-500',\n },\n mute: {\n icon: 'ph--microphone-slash--regular',\n label: t('icon muted'),\n },\n };\n\n const props = wave && !pinned ? iconProps.wave : mute ? iconProps.mute : speaking ? iconProps.speaking : undefined;\n\n // Debounce speaking indicator.\n const [speakingIndicator, setSpeakingIndicator] = useState(speaking);\n useEffect(() => {\n if (speaking) {\n setSpeakingIndicator(true);\n } else {\n const timeout = setTimeout(() => {\n setSpeakingIndicator(false);\n }, 1_000);\n return () => clearTimeout(timeout);\n }\n }, [speaking]);\n\n return (\n <div\n className={mx(\n 'relative w-full h-full group',\n 'rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500',\n speakingIndicator ? 'outline-green-500' : !video && 'outline-separator',\n classNames,\n )}\n style={style}\n >\n {children}\n\n {/* Action. */}\n {onClick && (\n <div className='z-10 absolute top-1 right-1 flex'>\n <IconButton\n classNames={mx('p-1 min-bs-1 rounded', groupHoverControlItemWithTransition)}\n iconOnly\n icon={pinned ? 'ph--x--regular' : 'ph--arrows-out--regular'}\n size={pinned ? 5 : 4}\n label={pinned ? t('icon unpin') : t('icon pin')}\n onClick={() => onClick?.(item)}\n />\n </div>\n )}\n\n {/* Name. */}\n {name && (\n <div className='z-10 absolute bottom-1 left-8 right-1 flex justify-end gap-1 items-center'>\n {/* TODO(burdon): Replace with avatar for everyone. */}\n {/* {self && <Icon icon='ph--asterisk--regular' size={pinned ? 5 : 4} />} */}\n {screenshare && <Icon icon='ph--broadcast--regular' size={pinned ? 5 : 4} />}\n <div\n className={mx('bg-neutral-800 text-neutral-100 py-0.5 truncate rounded', pinned ? 'px-2' : 'px-1 text-xs')}\n >\n {name}\n </div>\n </div>\n )}\n\n {/* Activity. */}\n <div className='z-10 absolute bottom-1 left-1 flex'>\n {(speaking && <Waveform active size={pinned ? 5 : 4} />) ||\n (props && (\n <IconButton\n classNames={mx('p-1 min-bs-1 rounded', props?.classNames)}\n icon={props?.icon}\n label={props?.label}\n size={pinned ? 5 : 4}\n iconOnly\n />\n ))}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { Participant, SCREENSHARE_SUFFIX } from './Participant';\nimport { type UserState } from '../../calls';\nimport { ResponsiveGrid } from '../ResponsiveGrid';\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_react", "import_app_framework", "import_echo", "import_react_ui", "import_react_ui_theme", "import_react_ui_sfx", "Toolbar", "classNames", "channel", "participants", "autoHideControls", "onJoin", "onLeave", "t", "useTranslation", "THREAD_PLUGIN", "graph", "useAppGraph", "call", "useCapability", "ThreadCapabilities", "CallManager", "node", "useNode", "fullyQualifiedId", "actions", "useActions", "id", "filter", "action", "properties", "disposition", "isScreensharing", "media", "screenshareTrack", "undefined", "canSharescreen", "navigator", "mediaDevices", "getDisplayMedia", "React", "div", "className", "mx", "groupHoverControlItemWithTransition", "NativeToolbar", "Root", "ToggleButton", "active", "audioEnabled", "state", "on", "icon", "label", "onClick", "turnAudioOff", "off", "turnAudioOn", "joined", "videoEnabled", "turnVideoOff", "turnVideoOn", "Icon", "size", "Separator", "variant", "disabled", "turnScreenshareOff", "turnScreenshareOn", "map", "IconButton", "key", "defaultButtonProps", "toLocalizedString", "data", "raisedHand", "setRaisedHand", "displayName", "iconOnly", "AudioStream", "tracks", "mediaStreamRef", "useRef", "MediaStream", "ref", "useEffect", "audio", "current", "mediaStream", "srcObject", "resetSrcObject", "addEventListener", "play", "once", "autoPlay", "track", "AudioTrack", "currentTrack", "addTrack", "removeTrack", "VideoObject", "memo", "forwardRef", "videoStream", "flip", "contain", "rest", "internalRef", "video", "setAttribute", "v", "ResponsiveContainer", "children", "role", "ASPECT_RATIO", "MIN_GALLERY_HEIGHT", "DEFAULT_GAP", "maxImageSize", "defaultGetId", "item", "ResponsiveGrid", "Cell", "gap", "getId", "items", "pinned", "autoHideGallery", "debug", "onPinnedChange", "width", "containerWidth", "height", "containerHeight", "containerRef", "useResizeDetector", "refreshRate", "dividerHeight", "setDividerHeight", "useState", "fitAspectRatio", "Math", "min", "pinnedItem", "useMemo", "find", "mainItems", "hideGallery", "time", "columns", "cellWidth", "setLayout", "gridContainerRef", "layout", "calculateLayout", "length", "Date", "now", "bounds", "setBounds", "useLayoutEffect", "setTimeout", "invariant", "el", "querySelector", "getRelativeBounds", "clearTimeout", "handleClick", "useCallback", "style", "SoloItem", "minHeight", "display", "gridTemplateColumns", "img", "alt", "container", "containerRect", "getBoundingClientRect", "elementRect", "top", "left", "count", "aspectRatio", "minWastedSpace", "Infinity", "bestColumns", "rows", "cols", "ceil", "itemWidth", "itemHeight", "fitItemsToGrid", "usedWidth", "usedHeight", "wastedSpace", "outerWidth", "outerHeight", "numCols", "numRows", "availableWidth", "availableHeight", "maxCellWidth", "maxCellHeight", "ResponsiveGridItem", "name", "self", "screenshare", "mute", "wave", "speaking", "iconProps", "props", "speakingIndicator", "setSpeakingIndicator", "timeout", "Waveform", "SCREENSHARE_SUFFIX", "Participant", "user", "isSelf", "startsWith", "isScreenshare", "endsWith", "pulledVideoStream", "getVideoStream", "screenshareVideoStream", "ParticipantGrid", "users", "fullscreen", "setPinned", "allUsers", "forEach", "push", "screenshareEnabled", "sortedUsers", "sort", "a", "b", "CallRoot", "CallAudio", "pulledAudioTracks", "CallGrid", "useDebugMode", "CallToolbar", "isInRoom", "Call", "Grid", "Audio", "ChannelContainer", "roomId", "_roomId", "space", "getSpace", "callManager", "identity", "useIdentity", "isNamed", "profile", "joinSound", "useSoundEffect", "leaveSound", "extensions", "useCapabilities", "CallExtension", "ctx", "Context", "extension", "callStateUpdated", "onCallStateUpdated", "mediaStateUpdated", "onMediaStateUpdated", "dispose", "handleJoin", "leave", "setRoomId", "join", "Promise", "all", "err", "log", "catch", "handleLeave", "isJoined", "StackItem", "Content", "toolbar", "DisplayNameMissing", "defaultThread", "target", "ChannelToolbar", "attendableId", "onJoinCall", "ChatContainer", "thread", "client", "useClient", "setDisplayName", "handleChange", "event", "value", "handleSave", "halo", "updateProfile", "ControlGroup", "ControlItemInput", "title", "description", "Input", "TextInput", "onChange", "placeholder", "ControlGroupButton", "useChannelToolbarActions", "creator", "Rx", "make", "nodes", "edges", "rootGroup", "createMenuItemGroup", "ns", "sortAction", "createMenuAction", "type", "source", "useMenuActions", "menuProps", "ElevationProvider", "elevation", "MenuProvider", "ToolbarMenu"]
|
|
7
|
+
}
|
|
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var chunk_WCQKISL5_exports = {};
|
|
30
|
+
__export(chunk_WCQKISL5_exports, {
|
|
31
31
|
CallDebugPanel: () => CallDebugPanel,
|
|
32
32
|
CallSidebar: () => CallSidebar,
|
|
33
33
|
ChannelContainer: () => ChannelContainer2,
|
|
@@ -35,11 +35,11 @@ __export(chunk_JLHENFGK_exports, {
|
|
|
35
35
|
ThreadComplementary: () => ThreadComplementary,
|
|
36
36
|
ThreadSettings: () => ThreadSettings
|
|
37
37
|
});
|
|
38
|
-
module.exports = __toCommonJS(
|
|
38
|
+
module.exports = __toCommonJS(chunk_WCQKISL5_exports);
|
|
39
39
|
var import_chunk_TKHJVC2C = require("./chunk-TKHJVC2C.cjs");
|
|
40
|
-
var
|
|
40
|
+
var import_chunk_U4SZUERU = require("./chunk-U4SZUERU.cjs");
|
|
41
41
|
var import_chunk_4YSNVPWU = require("./chunk-4YSNVPWU.cjs");
|
|
42
|
-
var
|
|
42
|
+
var import_chunk_E3WBZTTI = require("./chunk-E3WBZTTI.cjs");
|
|
43
43
|
var import_chunk_FUXJAVFZ = require("./chunk-FUXJAVFZ.cjs");
|
|
44
44
|
var import_chunk_LR5NENBE = require("./chunk-LR5NENBE.cjs");
|
|
45
45
|
var import_chunk_HLMCEE5K = require("./chunk-HLMCEE5K.cjs");
|
|
@@ -56,8 +56,9 @@ var import_app_framework = require("@dxos/app-framework");
|
|
|
56
56
|
var import_tracking3 = require("@preact-signals/safe-react/tracking");
|
|
57
57
|
var import_react3 = __toESM(require("react"));
|
|
58
58
|
var import_app_framework2 = require("@dxos/app-framework");
|
|
59
|
+
var import_echo = require("@dxos/echo");
|
|
59
60
|
var import_echo_schema = require("@dxos/echo-schema");
|
|
60
|
-
var
|
|
61
|
+
var import_echo2 = require("@dxos/react-client/echo");
|
|
61
62
|
var import_halo = require("@dxos/react-client/halo");
|
|
62
63
|
var import_react_ui2 = require("@dxos/react-ui");
|
|
63
64
|
var import_react_ui_attention = require("@dxos/react-ui-attention");
|
|
@@ -70,7 +71,7 @@ var import_react5 = require("@phosphor-icons/react");
|
|
|
70
71
|
var import_react6 = __toESM(require("react"));
|
|
71
72
|
var import_echo_schema2 = require("@dxos/echo-schema");
|
|
72
73
|
var import_live_object = require("@dxos/live-object");
|
|
73
|
-
var
|
|
74
|
+
var import_echo3 = require("@dxos/react-client/echo");
|
|
74
75
|
var import_halo2 = require("@dxos/react-client/halo");
|
|
75
76
|
var import_react_ui3 = require("@dxos/react-ui");
|
|
76
77
|
var import_react_ui_editor = require("@dxos/react-ui-editor");
|
|
@@ -81,7 +82,7 @@ var import_tracking5 = require("@preact-signals/safe-react/tracking");
|
|
|
81
82
|
var import_react7 = require("@phosphor-icons/react");
|
|
82
83
|
var import_react8 = __toESM(require("react"));
|
|
83
84
|
var import_echo_schema3 = require("@dxos/echo-schema");
|
|
84
|
-
var
|
|
85
|
+
var import_echo4 = require("@dxos/react-client/echo");
|
|
85
86
|
var import_react_ui4 = require("@dxos/react-ui");
|
|
86
87
|
var import_react_ui_theme2 = require("@dxos/react-ui-theme");
|
|
87
88
|
var import_tracking6 = require("@preact-signals/safe-react/tracking");
|
|
@@ -199,7 +200,7 @@ var CallSidebar = () => {
|
|
|
199
200
|
var _effect = (0, import_tracking2.useSignals)();
|
|
200
201
|
try {
|
|
201
202
|
const call = (0, import_app_framework.useCapability)(import_chunk_4YSNVPWU.ThreadCapabilities.CallManager);
|
|
202
|
-
return /* @__PURE__ */ import_react2.default.createElement(
|
|
203
|
+
return /* @__PURE__ */ import_react2.default.createElement(import_chunk_U4SZUERU.ChannelContainer, {
|
|
203
204
|
roomId: call.roomId
|
|
204
205
|
});
|
|
205
206
|
} finally {
|
|
@@ -265,15 +266,15 @@ var CommentContainer = ({ anchor, current, onAttend, onComment, onResolve, onMes
|
|
|
265
266
|
var _effect = (0, import_tracking4.useSignals)();
|
|
266
267
|
try {
|
|
267
268
|
const identity = (0, import_halo2.useIdentity)();
|
|
268
|
-
const space = (0,
|
|
269
|
-
const members = (0,
|
|
269
|
+
const space = (0, import_echo3.getSpace)(anchor);
|
|
270
|
+
const members = (0, import_echo3.useMembers)(space?.key);
|
|
270
271
|
const detached = !anchor.anchor;
|
|
271
272
|
const thread = anchor[import_echo_schema2.RelationSourceId];
|
|
272
|
-
const activity = (0, import_chunk_FUXJAVFZ.useStatus)(space, (0,
|
|
273
|
+
const activity = (0, import_chunk_FUXJAVFZ.useStatus)(space, (0, import_echo3.fullyQualifiedId)(thread));
|
|
273
274
|
const { t } = (0, import_react_ui3.useTranslation)(import_chunk_HLMCEE5K.THREAD_PLUGIN);
|
|
274
275
|
const threadScrollRef = (0, import_react6.useRef)(null);
|
|
275
276
|
const { themeMode } = (0, import_react_ui3.useThemeContext)();
|
|
276
|
-
const textboxMetadata = (0, import_chunk_LR5NENBE.getMessageMetadata)((0,
|
|
277
|
+
const textboxMetadata = (0, import_chunk_LR5NENBE.getMessageMetadata)((0, import_echo3.fullyQualifiedId)(thread), identity);
|
|
277
278
|
const [_count, _setCount] = (0, import_react6.useState)(0);
|
|
278
279
|
const rerenderEditor = () => _setCount((count) => count + 1);
|
|
279
280
|
const messageRef = (0, import_react6.useRef)("");
|
|
@@ -287,7 +288,7 @@ var CommentContainer = ({ anchor, current, onAttend, onComment, onResolve, onMes
|
|
|
287
288
|
(0, import_react_ui_editor.listener)({
|
|
288
289
|
onChange: (text) => messageRef.current = text
|
|
289
290
|
}),
|
|
290
|
-
|
|
291
|
+
import_chunk_E3WBZTTI.command
|
|
291
292
|
], [
|
|
292
293
|
_count
|
|
293
294
|
]);
|
|
@@ -328,7 +329,7 @@ var CommentContainer = ({ anchor, current, onAttend, onComment, onResolve, onMes
|
|
|
328
329
|
onClickCapture: handleAttend,
|
|
329
330
|
onFocusCapture: handleAttend,
|
|
330
331
|
current,
|
|
331
|
-
id: (0,
|
|
332
|
+
id: (0, import_echo3.fullyQualifiedId)(thread)
|
|
332
333
|
}, /* @__PURE__ */ import_react6.default.createElement("div", {
|
|
333
334
|
role: "none",
|
|
334
335
|
className: (0, import_react_ui_theme.mx)("col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]", import_react_ui_theme.hoverableControls, import_react_ui_theme.hoverableFocusedWithinControls)
|
|
@@ -347,7 +348,7 @@ var CommentContainer = ({ anchor, current, onAttend, onComment, onResolve, onMes
|
|
|
347
348
|
onResolve: handleResolve
|
|
348
349
|
}), onThreadDelete && /* @__PURE__ */ import_react6.default.createElement(DeleteThreadButton, {
|
|
349
350
|
onDelete: handleThreadDelete
|
|
350
|
-
}))), import_live_object.RefArray.targets(thread.messages?.filter(import_util.isNonNullable) ?? []).map((message) => /* @__PURE__ */ import_react6.default.createElement(
|
|
351
|
+
}))), import_live_object.RefArray.targets(thread.messages?.filter(import_util.isNonNullable) ?? []).map((message) => /* @__PURE__ */ import_react6.default.createElement(import_chunk_E3WBZTTI.MessageContainer, {
|
|
351
352
|
key: message.id,
|
|
352
353
|
editable: true,
|
|
353
354
|
message,
|
|
@@ -388,7 +389,7 @@ var CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props })
|
|
|
388
389
|
]);
|
|
389
390
|
return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, filteredAnchors.length > 0 ? filteredAnchors.map((anchor) => {
|
|
390
391
|
const thread = anchor[import_echo_schema3.RelationSourceId];
|
|
391
|
-
const threadId = (0,
|
|
392
|
+
const threadId = (0, import_echo4.fullyQualifiedId)(thread);
|
|
392
393
|
return /* @__PURE__ */ import_react8.default.createElement(CommentContainer, {
|
|
393
394
|
key: threadId,
|
|
394
395
|
anchor,
|
|
@@ -421,8 +422,8 @@ var ThreadSettings = ({ settings }) => {
|
|
|
421
422
|
_effect.f();
|
|
422
423
|
}
|
|
423
424
|
};
|
|
424
|
-
var ChannelContainer2 = (0, import_react4.lazy)(() => import("./ChannelContainer-
|
|
425
|
-
var ChatContainer = (0, import_react4.lazy)(() => import("./ChatContainer-
|
|
425
|
+
var ChannelContainer2 = (0, import_react4.lazy)(() => import("./ChannelContainer-MA5CFESJ.cjs"));
|
|
426
|
+
var ChatContainer = (0, import_react4.lazy)(() => import("./ChatContainer-GCOM3M56.cjs"));
|
|
426
427
|
var ThreadComplementary = ({ subject }) => {
|
|
427
428
|
var _effect = (0, import_tracking3.useSignals)();
|
|
428
429
|
try {
|
|
@@ -430,32 +431,32 @@ var ThreadComplementary = ({ subject }) => {
|
|
|
430
431
|
const identity = (0, import_halo.useIdentity)();
|
|
431
432
|
const { t } = (0, import_react_ui2.useTranslation)(import_chunk_HLMCEE5K.THREAD_PLUGIN);
|
|
432
433
|
const { state, getViewState } = (0, import_app_framework2.useCapability)(import_chunk_4YSNVPWU.ThreadCapabilities.MutableState);
|
|
433
|
-
const viewState = getViewState((0,
|
|
434
|
+
const viewState = getViewState((0, import_echo2.fullyQualifiedId)(subject));
|
|
434
435
|
const { showResolvedThreads } = viewState;
|
|
435
436
|
const onChangeViewState = (0, import_react3.useCallback)((nextValue) => {
|
|
436
437
|
viewState.showResolvedThreads = nextValue === "all";
|
|
437
438
|
}, [
|
|
438
439
|
viewState
|
|
439
440
|
]);
|
|
440
|
-
const drafts = state.drafts[(0,
|
|
441
|
+
const drafts = state.drafts[(0, import_echo2.fullyQualifiedId)(subject)];
|
|
441
442
|
const anchorSorts = (0, import_app_framework2.useCapabilities)(import_app_framework2.Capabilities.AnchorSort);
|
|
442
|
-
const sort = (0, import_react3.useMemo)(() => anchorSorts.find(({ key }) => key ===
|
|
443
|
+
const sort = (0, import_react3.useMemo)(() => anchorSorts.find(({ key }) => key === import_echo.Obj.getTypename(subject))?.sort, [
|
|
443
444
|
anchorSorts,
|
|
444
445
|
subject
|
|
445
446
|
]);
|
|
446
|
-
const space = (0,
|
|
447
|
-
const objectsAnchoredTo = (0,
|
|
448
|
-
const anchors = objectsAnchoredTo.toSorted((a, b) => sort?.(a, b) ?? 0).filter((anchor) =>
|
|
447
|
+
const space = (0, import_echo2.getSpace)(subject);
|
|
448
|
+
const objectsAnchoredTo = (0, import_echo2.useQuery)(space, import_echo.Query.select(import_echo.Filter.ids(subject.id)).targetOf(import_schema.AnchoredTo));
|
|
449
|
+
const anchors = objectsAnchoredTo.toSorted((a, b) => sort?.(a, b) ?? 0).filter((anchor) => import_echo.Obj.instanceOf(import_chunk_TKHJVC2C.ThreadType, anchor[import_echo_schema.RelationSourceId])).concat(drafts ?? []);
|
|
449
450
|
const attended = (0, import_react_ui_attention.useAttended)();
|
|
450
|
-
const qualifiedSubjectId = (0,
|
|
451
|
+
const qualifiedSubjectId = (0, import_echo2.fullyQualifiedId)(subject);
|
|
451
452
|
const handleAttend = (0, import_react3.useCallback)((anchor) => {
|
|
452
453
|
const thread = anchor[import_echo_schema.RelationSourceId];
|
|
453
|
-
const threadId = (0,
|
|
454
|
+
const threadId = (0, import_echo2.fullyQualifiedId)(thread);
|
|
454
455
|
if (state.current !== threadId) {
|
|
455
456
|
state.current = threadId;
|
|
456
457
|
void dispatch((0, import_app_framework2.createIntent)(import_app_framework2.LayoutAction.ScrollIntoView, {
|
|
457
458
|
part: "current",
|
|
458
|
-
subject: (0,
|
|
459
|
+
subject: (0, import_echo2.fullyQualifiedId)(subject),
|
|
459
460
|
options: {
|
|
460
461
|
cursor: anchor.anchor,
|
|
461
462
|
ref: threadId
|
|
@@ -477,7 +478,7 @@ var ThreadComplementary = ({ subject }) => {
|
|
|
477
478
|
text
|
|
478
479
|
}));
|
|
479
480
|
const thread = anchor[import_echo_schema.RelationSourceId];
|
|
480
|
-
state.current = (0,
|
|
481
|
+
state.current = (0, import_echo2.fullyQualifiedId)(thread);
|
|
481
482
|
}, [
|
|
482
483
|
dispatch,
|
|
483
484
|
identity,
|
|
@@ -521,7 +522,7 @@ var ThreadComplementary = ({ subject }) => {
|
|
|
521
522
|
orientation: "horizontal",
|
|
522
523
|
classNames: 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin'
|
|
523
524
|
}, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.Tablist, {
|
|
524
|
-
classNames: "p-1 gap-1
|
|
525
|
+
classNames: "p-1 gap-1 overflow-y-hidden border-be border-subduedSeparator"
|
|
525
526
|
}, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_tabs.Tabs.Tab, {
|
|
526
527
|
value: "unresolved",
|
|
527
528
|
classNames: "text-sm"
|
|
@@ -546,4 +547,4 @@ var ThreadComplementary = ({ subject }) => {
|
|
|
546
547
|
ThreadComplementary,
|
|
547
548
|
ThreadSettings
|
|
548
549
|
});
|
|
549
|
-
//# sourceMappingURL=chunk-
|
|
550
|
+
//# sourceMappingURL=chunk-WCQKISL5.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/CallDebugPanel.tsx", "../../../src/components/CallSidebar.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/components/index.ts", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/ThreadSettings.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { WebRTCStats } from '@peermetrics/webrtc-stats';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { Panel } from '@dxos/devtools';\nimport { log } from '@dxos/log';\nimport { Input, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { Json } from '@dxos/react-ui-syntax-highlighter';\n\nimport { type GlobalState } from '../calls';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type CallDebugPanelProps = ThemedClassName<{\n state?: GlobalState;\n}>;\n\nexport const CallDebugPanel = ({ state }: CallDebugPanelProps) => {\n const users = state?.call?.users;\n const self = state?.call?.self;\n const { t } = useTranslation(THREAD_PLUGIN);\n\n const [open, setOpen] = useState(false);\n const handleToggle = () => setOpen(!open);\n const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);\n const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);\n\n const webrtcStats = useMemo(\n () =>\n new WebRTCStats({\n getStatsInterval: 1000,\n }),\n [],\n );\n\n const [stats, setStats] = useState<Record<string, any>>({});\n useEffect(() => {\n const pc = state?.media.peer?.session?.peerConnection;\n const handleStats = (stats: Record<string, any>) => setStats(stats.data);\n let added = false;\n if (pc && showDetailedWebRTCStats) {\n webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });\n webrtcStats.on('stats', handleStats);\n added = true;\n }\n return () => {\n try {\n if (pc && added) {\n webrtcStats.removeConnection({ pc });\n webrtcStats.removeListener('stats', handleStats);\n }\n } catch (error) {\n log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });\n }\n };\n }, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);\n\n return (\n <Panel\n id='meeting-status'\n icon='ph--video-conference--regular'\n open={open}\n onToggle={handleToggle}\n title={t('meeting status title')}\n maxHeight={false}\n info={\n <div className='flex items-center gap-2'>\n <span title='Joined'>{self?.joined ? 'Active' : 'Inactive'}</span>\n {users?.length !== undefined && <span title='Users'>{users?.length ?? 0} User(s)</span>}\n </div>\n }\n >\n <div className='flex flex-col gap-2 overflow-y-auto'>\n <div className='flex items-row gap-2'>\n <Input.Root>\n <Input.Label classNames={'text-sm'}>{t('show webrtc stats title')}</Input.Label>\n <Input.Checkbox checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />\n </Input.Root>\n </div>\n <Json\n classNames='text-sm'\n data={{\n users,\n activities: state?.call?.activities,\n ...(showDetailedWebRTCStats\n ? {\n webrtc: {\n connectionState: state?.media.peer?.session?.peerConnection.connectionState,\n iceConnectionState: state?.media.peer?.session?.peerConnection.iceConnectionState,\n stats,\n },\n }\n : {}),\n tracks: state?.media.peer?.session?.peerConnection.getTransceivers().map((transceiver) => {\n const track =\n transceiver.direction === 'recvonly' ? transceiver.receiver.track : transceiver.sender.track;\n return {\n id: track?.id,\n kind: track?.kind,\n direction: transceiver.direction,\n enabled: track?.enabled,\n muted: track?.muted,\n readyState: track?.readyState,\n settings: track?.getSettings(),\n };\n }),\n callsServiceHistory: state?.media.peer?.history.get(),\n }}\n />\n </div>\n </Panel>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\n\nimport { ChannelContainer } from './ChannelContainer';\nimport { ThreadCapabilities } from '../capabilities';\n\nexport const CallSidebar = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n return <ChannelContainer roomId={call.roomId} />;\n};\n\nexport default CallSidebar;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n createIntent,\n LayoutAction,\n useCapability,\n useCapabilities,\n useIntentDispatcher,\n Capabilities,\n} from '@dxos/app-framework';\nimport { Filter, Obj, Query } from '@dxos/echo';\nimport { RelationSourceId } from '@dxos/echo-schema';\nimport { fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { AnchoredTo } from '@dxos/schema';\n\nimport { ThreadCapabilities } from '../capabilities';\nimport { CommentsContainer } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ThreadAction, ThreadType } from '../types';\n\nexport const ThreadComplementary = ({ subject }: { subject: any }) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const { t } = useTranslation(THREAD_PLUGIN);\n\n const { state, getViewState } = useCapability(ThreadCapabilities.MutableState);\n const viewState = getViewState(fullyQualifiedId(subject));\n const { showResolvedThreads } = viewState;\n const onChangeViewState = useCallback(\n (nextValue: string) => {\n viewState.showResolvedThreads = nextValue === 'all';\n },\n [viewState],\n );\n const drafts = state.drafts[fullyQualifiedId(subject)];\n\n const anchorSorts = useCapabilities(Capabilities.AnchorSort);\n const sort = useMemo(\n () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,\n [anchorSorts, subject],\n );\n\n const space = getSpace(subject);\n const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));\n const anchors = objectsAnchoredTo\n .toSorted((a, b) => sort?.(a, b) ?? 0)\n .filter((anchor) => Obj.instanceOf(ThreadType, anchor[RelationSourceId]))\n .concat(drafts ?? []);\n\n const attended = useAttended();\n const qualifiedSubjectId = fullyQualifiedId(subject);\n\n const handleAttend = useCallback(\n (anchor: AnchoredTo) => {\n const thread = anchor[RelationSourceId] as ThreadType;\n const threadId = fullyQualifiedId(thread);\n\n if (state.current !== threadId) {\n state.current = threadId;\n\n // TODO(wittjosiah): Should this be a thread-specific intent?\n // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.\n // This may be overloading this intent or highjacking its intended purpose.\n void dispatch(\n createIntent(LayoutAction.ScrollIntoView, {\n part: 'current',\n subject: fullyQualifiedId(subject),\n options: {\n cursor: anchor.anchor,\n ref: threadId,\n },\n }),\n );\n }\n },\n [state.current, dispatch, subject],\n );\n\n const handleComment = useCallback(\n async (anchor: AnchoredTo, text: string) => {\n await dispatch(\n createIntent(ThreadAction.AddMessage, { anchor, subject, sender: { identityDid: identity?.did }, text }),\n );\n\n const thread = anchor[RelationSourceId] as ThreadType;\n state.current = fullyQualifiedId(thread);\n },\n [dispatch, identity, subject],\n );\n\n const handleResolve = useCallback(\n (anchor: AnchoredTo) =>\n dispatch(createIntent(ThreadAction.ToggleResolved, { thread: anchor[RelationSourceId] as ThreadType })),\n [dispatch],\n );\n\n const handleThreadDelete = useCallback(\n (anchor: AnchoredTo) => dispatch(createIntent(ThreadAction.Delete, { anchor, subject })),\n [dispatch, subject],\n );\n\n const handleMessageDelete = useCallback(\n (anchor: AnchoredTo, messageId: string) =>\n dispatch(createIntent(ThreadAction.DeleteMessage, { anchor, subject, messageId })),\n [dispatch, subject],\n );\n\n const comments = (\n <CommentsContainer\n anchors={anchors}\n currentId={attended.includes(qualifiedSubjectId) ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n />\n );\n\n return (\n <StackItem.Content toolbar>\n <Tabs.Root\n value={showResolvedThreads ? 'all' : 'unresolved'}\n onValueChange={onChangeViewState}\n orientation='horizontal'\n classNames='contents [&_[role=\"tabpanel\"]]:min-bs-0 [&_[role=\"tabpanel\"]]:overflow-y-auto [&_[role=\"tabpanel\"]]:scrollbar-thin'\n >\n {/* TODO(burdon): Should have common container/frags with toolbar. Standardize border-be for all StackItem toolbars. */}\n <Tabs.Tablist classNames='p-1 gap-1 overflow-y-hidden border-be border-subduedSeparator'>\n <Tabs.Tab value='unresolved' classNames='text-sm'>\n {t('show unresolved label')}\n </Tabs.Tab>\n <Tabs.Tab value='all' classNames='text-sm'>\n {t('show all label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>\n <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>\n </Tabs.Root>\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const ChannelContainer = lazy(() => import('./ChannelContainer'));\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './Call';\nexport * from './CallDebugPanel';\nexport * from './CallSidebar';\nexport * from './CommentContainer';\nexport * from './CommentsContainer';\nexport * from './MessageContainer';\nexport * from './ThreadComplementary';\nexport * from './ThreadSettings';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { RelationSourceId } from '@dxos/echo-schema';\nimport { RefArray } from '@dxos/live-object';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread,\n ThreadFooter,\n ThreadHeading,\n type ThreadProps,\n} from '@dxos/react-ui-thread';\nimport { type AnchoredTo } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nconst sizeClass = getSize(4);\n\n// TODO(thure): #8149\nconst commentControlClassNames = '!p-1 !min-bs-0 transition-opacity';\n\nconst ToggleResolvedButton = ({\n isResolved,\n onResolve,\n}: {\n isResolved: boolean | undefined;\n onResolve: () => void;\n}) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');\n return (\n <Tooltip.Trigger asChild content={label}>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={[commentControlClassNames, !isResolved && hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}\n </Button>\n </Tooltip.Trigger>\n );\n};\n\nconst DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t('delete thread label');\n return (\n <Tooltip.Trigger asChild content={label}>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={[commentControlClassNames, hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n );\n};\n\nexport type CommentContainerProps = {\n anchor: AnchoredTo;\n onAttend?: (anchor: AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo) => void;\n} & Pick<ThreadProps, 'current'>;\n\nexport const CommentContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: CommentContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.key);\n const detached = !anchor.anchor;\n const thread = anchor[RelationSourceId] as ThreadType;\n const activity = useStatus(space, fullyQualifiedId(thread));\n const { t } = useTranslation(THREAD_PLUGIN);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const 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 [_count],\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\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [anchor, identity]);\n\n return (\n <Thread onClickCapture={handleAttend} onFocusCapture={handleAttend} current={current} id={fullyQualifiedId(thread)}>\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <ThreadHeading detached>{thread.name}</ThreadHeading>\n </Tooltip.Trigger>\n ) : (\n <ThreadHeading>{thread.name}</ThreadHeading>\n )}\n <div className='flex flex-row items-center pli-1'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={handleResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={handleThreadDelete} />}\n </div>\n </div>\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer\n key={message.id}\n editable\n message={message}\n members={members}\n onDelete={handleMessageDelete}\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 <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { ChatText } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { RelationSourceId } from '@dxos/echo-schema';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useTranslation, Trans } from '@dxos/react-ui';\nimport { descriptionMessage, mx } from '@dxos/react-ui-theme';\nimport { type AnchoredTo } from '@dxos/schema';\n\nimport { CommentContainer, type CommentContainerProps } from './CommentContainer';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadType } from '../types';\n\nexport type ThreadsContainerProps = Omit<CommentContainerProps, 'anchor' | 'current'> & {\n anchors: AnchoredTo[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.\n const filteredAnchors = showResolvedThreads\n ? anchors.filter((anchor) => !!anchor[RelationSourceId])\n : anchors.filter((anchor) => {\n const thread = anchor[RelationSourceId];\n return thread && thread.status !== 'resolved';\n });\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredAnchors.length > 0 ? (\n filteredAnchors.map((anchor) => {\n const thread = anchor[RelationSourceId] as ThreadType;\n const threadId = fullyQualifiedId(thread);\n return <CommentContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;\n })\n ) : (\n <div role='alert' className={mx(descriptionMessage, 'place-self-center rounded-lg text-center m-4')}>\n <h2 className='mbe-2 font-medium text-baseText'>{t('no comments title')}</h2>\n <p>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <ChatText className='inline-block' />,\n },\n }}\n />\n </p>\n </div>\n )}\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// import { useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer } from '@dxos/react-ui-form';\n\n// import { THREAD_PLUGIN } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {\n // const { t } = useTranslation(THREAD_PLUGIN);\n\n return <DeprecatedFormContainer></DeprecatedFormContainer>;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_react", "import_app_framework", "import_echo", "import_react_ui", "import_echo_schema", "import_halo", "import_react_ui_theme", "CallDebugPanel", "state", "users", "call", "self", "t", "useTranslation", "THREAD_PLUGIN", "open", "setOpen", "useState", "handleToggle", "showDetailedWebRTCStats", "setShowDetailedWebRTCStats", "handleShowDetailedWebRTCStats", "webrtcStats", "useMemo", "WebRTCStats", "getStatsInterval", "stats", "setStats", "useEffect", "pc", "media", "peer", "session", "peerConnection", "handleStats", "data", "added", "addConnection", "peerId", "connectionId", "on", "removeConnection", "removeListener", "error", "log", "React", "Panel", "id", "icon", "onToggle", "title", "maxHeight", "info", "div", "className", "span", "joined", "length", "undefined", "Input", "Root", "Label", "classNames", "Checkbox", "checked", "onCheckedChange", "Json", "activities", "webrtc", "connectionState", "iceConnectionState", "tracks", "getTransceivers", "map", "transceiver", "track", "direction", "receiver", "sender", "kind", "enabled", "muted", "readyState", "settings", "getSettings", "callsServiceHistory", "history", "get", "CallSidebar", "useCapability", "ThreadCapabilities", "CallManager", "ChannelContainer", "roomId", "sizeClass", "getSize", "commentControlClassNames", "ToggleResolvedButton", "isResolved", "onResolve", "label", "Tooltip", "Trigger", "asChild", "content", "Button", "variant", "data-testid", "onClick", "hoverableControlItem", "CheckCircle", "weight", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "anchor", "current", "onAttend", "onComment", "onMessageDelete", "onThreadDelete", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "detached", "thread", "RelationSourceId", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "rerenderEditor", "count", "messageRef", "extensions", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "handleThreadDelete", "handleComment", "Thread", "onClickCapture", "onFocusCapture", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "side", "ThreadHeading", "name", "status", "Tag", "palette", "RefArray", "targets", "messages", "filter", "isNonNullable", "message", "MessageContainer", "editable", "MessageTextbox", "onSend", "ThreadFooter", "ref", "CommentsContainer", "anchors", "currentId", "showResolvedThreads", "props", "filteredAnchors", "document", "getElementById", "threadId", "descriptionMessage", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "ThreadSettings", "DeprecatedFormContainer", "lazy", "ChatContainer", "ThreadComplementary", "subject", "dispatchPromise", "dispatch", "useIntentDispatcher", "getViewState", "MutableState", "viewState", "onChangeViewState", "nextValue", "drafts", "anchorSorts", "useCapabilities", "Capabilities", "AnchorSort", "sort", "find", "Obj", "getTypename", "objectsAnchoredTo", "useQuery", "Query", "select", "Filter", "ids", "targetOf", "AnchoredTo", "toSorted", "a", "b", "instanceOf", "ThreadType", "concat", "attended", "useAttended", "qualifiedSubjectId", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "ThreadAction", "AddMessage", "identityDid", "did", "ToggleResolved", "Delete", "messageId", "DeleteMessage", "comments", "includes", "StackItem", "Content", "toolbar", "Tabs", "value", "onValueChange", "orientation", "Tablist", "Tab", "Tabpanel"]
|
|
7
|
+
}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -44,16 +44,16 @@ __export(node_exports, {
|
|
|
44
44
|
module.exports = __toCommonJS(node_exports);
|
|
45
45
|
var import_chunk_44I33JDT = require("./chunk-44I33JDT.cjs");
|
|
46
46
|
var import_chunk_TKHJVC2C = require("./chunk-TKHJVC2C.cjs");
|
|
47
|
-
var
|
|
47
|
+
var import_chunk_3YYSLZE4 = require("./chunk-3YYSLZE4.cjs");
|
|
48
48
|
var import_chunk_4YSNVPWU = require("./chunk-4YSNVPWU.cjs");
|
|
49
49
|
var import_chunk_FUXJAVFZ = require("./chunk-FUXJAVFZ.cjs");
|
|
50
50
|
var import_chunk_HLMCEE5K = require("./chunk-HLMCEE5K.cjs");
|
|
51
51
|
var import_app_framework = require("@dxos/app-framework");
|
|
52
|
+
var import_echo = require("@dxos/echo");
|
|
52
53
|
var import_plugin_client = require("@dxos/plugin-client");
|
|
53
54
|
var import_plugin_markdown = require("@dxos/plugin-markdown");
|
|
54
55
|
var import_plugin_space = require("@dxos/plugin-space");
|
|
55
56
|
var import_types = require("@dxos/plugin-space/types");
|
|
56
|
-
var import_echo = require("@dxos/react-client/echo");
|
|
57
57
|
var import_react_ui_thread = require("@dxos/react-ui-thread");
|
|
58
58
|
var import_schema = require("@dxos/schema");
|
|
59
59
|
var translations_default = [
|
|
@@ -131,7 +131,7 @@ var ThreadPlugin = () => (0, import_app_framework.definePlugin)(import_chunk_HLM
|
|
|
131
131
|
(0, import_app_framework.defineModule)({
|
|
132
132
|
id: `${import_chunk_HLMCEE5K.meta.id}/module/call-manager`,
|
|
133
133
|
activatesOn: import_plugin_client.ClientEvents.ClientReady,
|
|
134
|
-
activate:
|
|
134
|
+
activate: import_chunk_3YYSLZE4.CallManager
|
|
135
135
|
}),
|
|
136
136
|
// TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.
|
|
137
137
|
// defineModule({
|
|
@@ -145,7 +145,7 @@ var ThreadPlugin = () => (0, import_app_framework.definePlugin)(import_chunk_HLM
|
|
|
145
145
|
// Should this be a different event?
|
|
146
146
|
// Should settings store be renamed to be more generic?
|
|
147
147
|
activatesOn: import_app_framework.Events.SetupSettings,
|
|
148
|
-
activate:
|
|
148
|
+
activate: import_chunk_3YYSLZE4.ThreadState
|
|
149
149
|
}),
|
|
150
150
|
(0, import_app_framework.defineModule)({
|
|
151
151
|
id: `${import_chunk_HLMCEE5K.meta.id}/module/translations`,
|
|
@@ -169,7 +169,7 @@ var ThreadPlugin = () => (0, import_app_framework.definePlugin)(import_chunk_HLM
|
|
|
169
169
|
id: import_chunk_TKHJVC2C.ThreadType.typename,
|
|
170
170
|
metadata: {
|
|
171
171
|
// TODO(wittjosiah): Move out of metadata.
|
|
172
|
-
loadReferences: async (thread) => await import_echo.
|
|
172
|
+
loadReferences: async (thread) => await import_echo.Ref.Array.loadAll(thread.messages ?? [])
|
|
173
173
|
}
|
|
174
174
|
}),
|
|
175
175
|
(0, import_app_framework.contributes)(import_app_framework.Capabilities.Metadata, {
|
|
@@ -187,7 +187,7 @@ var ThreadPlugin = () => (0, import_app_framework.definePlugin)(import_chunk_HLM
|
|
|
187
187
|
case "node":
|
|
188
188
|
return {
|
|
189
189
|
id: item.id,
|
|
190
|
-
label: item.
|
|
190
|
+
label: item.name,
|
|
191
191
|
data: item
|
|
192
192
|
};
|
|
193
193
|
case "object":
|
|
@@ -233,27 +233,27 @@ var ThreadPlugin = () => (0, import_app_framework.definePlugin)(import_chunk_HLM
|
|
|
233
233
|
(0, import_app_framework.defineModule)({
|
|
234
234
|
id: `${import_chunk_HLMCEE5K.meta.id}/module/markdown`,
|
|
235
235
|
activatesOn: import_plugin_markdown.MarkdownEvents.SetupExtensions,
|
|
236
|
-
activate:
|
|
236
|
+
activate: import_chunk_3YYSLZE4.Markdown
|
|
237
237
|
}),
|
|
238
238
|
(0, import_app_framework.defineModule)({
|
|
239
239
|
id: `${import_chunk_HLMCEE5K.meta.id}/module/react-root`,
|
|
240
240
|
activatesOn: import_app_framework.Events.Startup,
|
|
241
|
-
activate:
|
|
241
|
+
activate: import_chunk_3YYSLZE4.ReactRoot
|
|
242
242
|
}),
|
|
243
243
|
(0, import_app_framework.defineModule)({
|
|
244
244
|
id: `${import_chunk_HLMCEE5K.meta.id}/module/react-surface`,
|
|
245
245
|
activatesOn: import_app_framework.Events.SetupReactSurface,
|
|
246
|
-
activate:
|
|
246
|
+
activate: import_chunk_3YYSLZE4.ReactSurface
|
|
247
247
|
}),
|
|
248
248
|
(0, import_app_framework.defineModule)({
|
|
249
249
|
id: `${import_chunk_HLMCEE5K.meta.id}/module/intent-resolver`,
|
|
250
250
|
activatesOn: import_app_framework.Events.SetupIntentResolver,
|
|
251
|
-
activate:
|
|
251
|
+
activate: import_chunk_3YYSLZE4.IntentResolver
|
|
252
252
|
}),
|
|
253
253
|
(0, import_app_framework.defineModule)({
|
|
254
254
|
id: `${import_chunk_HLMCEE5K.meta.id}/module/app-graph-builder`,
|
|
255
255
|
activatesOn: import_app_framework.Events.SetupAppGraph,
|
|
256
|
-
activate:
|
|
256
|
+
activate: import_chunk_3YYSLZE4.AppGraphBuilder
|
|
257
257
|
})
|
|
258
258
|
]);
|
|
259
259
|
// Annotate the CommonJS export names for ESM import in node:
|