@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
|
@@ -1,7 +0,0 @@
|
|
|
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, getTypename, isInstanceOf, Query, 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(() => anchorSorts.find(({ key }) => key === getTypename(subject))?.sort, [anchorSorts, subject]);\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) => isInstanceOf(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 <Tabs.Tablist classNames='p-1 gap-1 bs-[--rail-action] border-be border-separator'>\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_react_ui", "import_echo_schema", "import_echo", "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", "getTypename", "objectsAnchoredTo", "useQuery", "Query", "select", "Filter", "ids", "targetOf", "AnchoredTo", "toSorted", "a", "b", "isInstanceOf", "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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/intent-resolver.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { batch } from '@preact/signals-core';\n\nimport { Capabilities, contributes, createIntent, createResolver, type PluginContext } from '@dxos/app-framework';\nimport { RelationSourceId, RelationTargetId } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';\nimport { ObservabilityAction } from '@dxos/plugin-observability/types';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { live, fullyQualifiedId, getSpace, Ref } from '@dxos/react-client/echo';\nimport { AnchoredTo, DataType } from '@dxos/schema';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ChannelType, ThreadAction, ThreadType } from '../types';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.IntentResolver, [\n createResolver({\n intent: ThreadAction.CreateChannel,\n resolve: ({ name }) => ({\n data: {\n object: live(ChannelType, {\n name,\n defaultThread: Ref.make(live(ThreadType, { messages: [], status: 'active' })),\n threads: [],\n }),\n },\n }),\n }),\n createResolver({\n intent: ThreadAction.CreateChannelThread,\n resolve: ({ channel }) => {\n const thread = live(ThreadType, { messages: [], status: 'active' });\n channel.threads.push(Ref.make(thread));\n return {\n data: {\n object: thread,\n },\n };\n },\n }),\n // TODO(wittjosiah): Break this up into more composable pieces.\n createResolver({\n intent: ThreadAction.Create,\n resolve: ({ name, anchor: _anchor, subject }) => {\n const space = getSpace(subject);\n invariant(space, 'Space not found');\n\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n const subjectId = fullyQualifiedId(subject);\n const thread = live(ThreadType, { name, messages: [], status: 'staged' });\n const anchor = live(AnchoredTo, {\n [RelationSourceId]: thread,\n [RelationTargetId]: subject,\n anchor: _anchor,\n });\n const draft = state.drafts[subjectId];\n if (draft) {\n draft.push(anchor);\n } else {\n state.drafts[subjectId] = [anchor];\n }\n\n return {\n intents: [\n createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),\n createIntent(DeckAction.ChangeCompanion, {\n primary: subjectId,\n companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,\n }),\n ],\n };\n },\n }),\n createResolver({\n intent: ThreadAction.Select,\n resolve: ({ current }) => {\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n state.current = current;\n },\n }),\n createResolver({\n intent: ThreadAction.ToggleResolved,\n resolve: ({ thread }) => {\n if (thread.status === 'active' || thread.status === undefined) {\n thread.status = 'resolved';\n } else if (thread.status === 'resolved') {\n thread.status = 'active';\n }\n\n const space = getSpace(thread);\n invariant(space, 'Space not found');\n const spaceId = space.id;\n\n return {\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.toggle-resolved',\n properties: {\n spaceId,\n threadId: thread.id,\n },\n }),\n ],\n };\n },\n }),\n createResolver({\n intent: ThreadAction.Delete,\n resolve: ({ subject, anchor, thread: _thread }, undo) => {\n const thread = _thread ?? (anchor[RelationSourceId] as ThreadType);\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n const subjectId = fullyQualifiedId(subject);\n const draft = state.drafts[subjectId];\n if (draft) {\n // Check if we're deleting a draft; if so, remove it.\n const index = draft.findIndex((a) => a.id === anchor.id);\n if (index !== -1) {\n draft.splice(index, 1);\n return;\n }\n }\n\n const space = getSpace(anchor);\n if (!space) {\n return;\n }\n\n if (!undo) {\n batch(() => {\n space.db.remove(thread);\n space.db.remove(anchor);\n });\n\n return {\n undoable: {\n message: ['thread deleted label', { ns: THREAD_PLUGIN }],\n data: { thread, anchor },\n },\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.delete',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n },\n }),\n ],\n };\n } else {\n batch(() => {\n space.db.add(thread);\n space.db.add(anchor);\n });\n\n return {\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.undo-delete',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n },\n }),\n ],\n };\n }\n },\n }),\n createResolver({\n intent: ThreadAction.AddMessage,\n resolve: ({ anchor, subject, sender, text }) => {\n const thread = anchor[RelationSourceId] as ThreadType;\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n const subjectId = fullyQualifiedId(subject);\n const space = getSpace(subject);\n invariant(space, 'Space not found');\n const intents = [];\n\n const message = live(DataType.Message, {\n sender,\n created: new Date().toISOString(),\n blocks: [{ type: 'text', text }],\n // TODO(wittjosiah): Context based on attention.\n // context: context ? makeRef(context) : undefined,\n });\n thread.messages.push(Ref.make(message));\n\n const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);\n if (draft) {\n // Move draft to document.\n thread.status = 'active';\n // TODO(wittjosiah): This causes the thread to flash as it transitions from draft to db.\n state.drafts[subjectId] = state.drafts[subjectId]?.filter((a) => a.id !== anchor.id);\n intents.push(createIntent(SpaceAction.AddObject, { object: thread, target: space, hidden: true }));\n intents.push(\n createIntent(SpaceAction.AddRelation, {\n space,\n schema: AnchoredTo,\n source: thread,\n target: subject,\n fields: { anchor: draft.anchor },\n }),\n );\n intents.push(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.create',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n },\n }),\n );\n }\n\n intents.push(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.message.add',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n threadLength: thread.messages.length,\n messageId: message.id,\n messageLength: text.length,\n },\n }),\n );\n\n return { intents };\n },\n }),\n createResolver({\n intent: ThreadAction.DeleteMessage,\n resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {\n const thread = anchor[RelationSourceId] as ThreadType;\n const space = getSpace(subject);\n invariant(space, 'Space not found');\n\n if (!undo) {\n const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));\n const message = thread.messages[messageIndex]?.target;\n if (!message) {\n return;\n }\n\n if (messageIndex === 0 && thread.messages.length === 1) {\n // If the message is the only message in the thread, delete the thread.\n return {\n intents: [createIntent(ThreadAction.Delete, { subject, anchor })],\n };\n } else {\n thread.messages.splice(messageIndex, 1);\n }\n\n return {\n undoable: {\n message: ['message deleted label', { ns: THREAD_PLUGIN }],\n data: { message, messageIndex },\n },\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.message.delete',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n messageId: message.id,\n },\n }),\n ],\n };\n } else {\n if (messageIndex === undefined || !message) {\n return;\n }\n\n thread.messages.splice(messageIndex, 0, Ref.make(message));\n return {\n intents: [\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.message.undo-delete',\n properties: {\n spaceId: space.id,\n threadId: thread.id,\n messageId: message.id,\n },\n }),\n ],\n };\n }\n },\n }),\n ]);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_types", "context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "ThreadAction", "CreateChannel", "resolve", "name", "data", "object", "live", "ChannelType", "defaultThread", "Ref", "make", "ThreadType", "messages", "status", "threads", "CreateChannelThread", "channel", "thread", "push", "Create", "anchor", "_anchor", "subject", "space", "getSpace", "invariant", "state", "getCapability", "ThreadCapabilities", "MutableState", "subjectId", "fullyQualifiedId", "AnchoredTo", "RelationSourceId", "RelationTargetId", "draft", "drafts", "intents", "createIntent", "Select", "current", "DeckAction", "ChangeCompanion", "primary", "companion", "ATTENDABLE_PATH_SEPARATOR", "ToggleResolved", "undefined", "spaceId", "id", "ObservabilityAction", "SendEvent", "properties", "threadId", "Delete", "_thread", "undo", "index", "findIndex", "a", "splice", "batch", "db", "remove", "undoable", "message", "ns", "THREAD_PLUGIN", "add", "AddMessage", "sender", "text", "DataType", "Message", "created", "Date", "toISOString", "blocks", "type", "find", "filter", "SpaceAction", "AddObject", "target", "hidden", "AddRelation", "schema", "source", "fields", "threadLength", "length", "messageId", "messageLength", "DeleteMessage", "messageIndex", "hasObjectId"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/markdown.ts", "../../../src/extensions/threads.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\n\nimport { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';\nimport { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';\nimport { MarkdownCapabilities } from '@dxos/plugin-markdown';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { commentClickedEffect, commentsState, type EditorState, overlap } from '@dxos/react-ui-editor';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { threads } from '../extensions';\n\nexport default (context: PluginContext) =>\n contributes(MarkdownCapabilities.Extensions, [\n ({ document: doc }) => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n return threads(state, doc, dispatch);\n },\n ({ document: doc }) => {\n const { state } = context.getCapability(ThreadCapabilities.MutableState);\n\n return EditorView.updateListener.of((update) => {\n if (update.docChanged || update.selectionSet) {\n state.toolbar[fullyQualifiedId(doc)] = selectionOverlapsComment(update.state);\n }\n });\n },\n ({ document: doc }) => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const id = fullyQualifiedId(doc);\n\n return EditorView.updateListener.of((update) => {\n update.transactions.forEach((transaction) => {\n transaction.effects.forEach(async (effect) => {\n if (effect.is(commentClickedEffect)) {\n void dispatch(\n createIntent(DeckAction.ChangeCompanion, {\n primary: id,\n companion: `${id}${ATTENDABLE_PATH_SEPARATOR}comments`,\n }),\n );\n }\n });\n });\n });\n },\n ]);\n\nconst selectionOverlapsComment = (state: EditorState): boolean => {\n // May not be defined if thread plugin not installed.\n const commentState = state.field(commentsState, false);\n if (commentState === undefined) {\n return false;\n }\n\n const { selection } = state;\n for (const range of selection.ranges) {\n if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {\n return true;\n }\n }\n\n return false;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { computed, effect } from '@preact/signals-core';\n\nimport { createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { Filter, isInstanceOf, Query, RelationSourceId } from '@dxos/echo-schema';\nimport { type DocumentType } from '@dxos/plugin-markdown/types';\nimport { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from '@dxos/react-client/echo';\nimport { comments, createExternalCommentSync } from '@dxos/react-ui-editor';\nimport { AnchoredTo } from '@dxos/schema';\n\nimport { ThreadAction, ThreadType, type ThreadState } from '../types';\n\n// TODO(burdon): Factor out.\nconst getName = (doc: DocumentType, anchor: string): string | undefined => {\n if (doc.content) {\n const [start, end] = anchor.split(':');\n return getTextInRange(createDocAccessor(doc.content.target!, ['content']), start, end);\n }\n};\n\n/**\n * Construct plugins.\n */\nexport const threads = (state: ThreadState, doc?: DocumentType, dispatch?: PromiseIntentDispatcher): Extension => {\n const space = doc && getSpace(doc);\n if (!doc || !space || !dispatch) {\n // Include no-op comments extension here to ensure that the facets are always present when they are expected.\n // TODO(wittjosiah): The Editor should only look for these facets when comments are available.\n return [comments()];\n }\n\n const query = space.db.query(Query.select(Filter.ids(doc.id)).targetOf(AnchoredTo));\n const unsubscribe = query.subscribe();\n\n const anchors = computed(() =>\n query.objects\n .filter((anchor) => {\n const thread = anchor[RelationSourceId];\n return isInstanceOf(ThreadType, thread) && thread.status !== 'resolved';\n })\n .concat(state.drafts[fullyQualifiedId(doc)] ?? []),\n );\n\n return [\n EditorView.domEventHandlers({\n destroy: () => {\n unsubscribe();\n },\n }),\n\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n anchors.value.forEach((anchor) => {\n if (anchor.anchor) {\n // Only update if the name has changed, otherwise this will cause an infinite loop.\n // Skip if the name is empty; this means comment text was deleted, but thread name should remain.\n const name = getName(doc, anchor.anchor);\n const thread = anchor[RelationSourceId] as ThreadType;\n if (name && name !== thread.name) {\n thread.name = name;\n }\n }\n });\n }\n }),\n\n createExternalCommentSync(\n fullyQualifiedId(doc),\n (sink) => effect(() => sink()),\n () =>\n anchors.value\n .filter((anchor) => anchor.anchor)\n .map((anchor) => ({ id: fullyQualifiedId(anchor[RelationSourceId]), cursor: anchor.anchor })),\n ),\n\n comments({\n id: fullyQualifiedId(doc),\n onCreate: ({ cursor }) => {\n const name = getName(doc, cursor);\n void dispatch(createIntent(ThreadAction.Create, { anchor: cursor, name, subject: doc }));\n },\n onDelete: ({ id }) => {\n const draft = state.drafts[fullyQualifiedId(doc)];\n if (draft) {\n const index = draft.findIndex((thread) => fullyQualifiedId(thread) === id);\n if (index !== -1) {\n draft.splice(index, 1);\n }\n }\n\n const thread = query.objects.find((object) => getSource(object).id === id);\n if (thread) {\n thread.anchor = undefined;\n }\n },\n onUpdate: ({ id, cursor }) => {\n const draft = state.drafts[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id);\n if (draft) {\n const thread = draft[RelationSourceId] as ThreadType;\n thread.name = getName(doc, cursor);\n draft.anchor = cursor;\n }\n\n const relation = query.objects.find((object) => getSource(object).id === id);\n if (relation) {\n const thread = getSource(relation);\n if (isInstanceOf(ThreadType, thread)) {\n thread.name = getName(doc, cursor);\n relation.anchor = cursor;\n }\n }\n },\n onSelect: ({ selection }) => {\n const current = selection.current ?? selection.closest;\n if (current) {\n void dispatch(createIntent(ThreadAction.Select, { current }));\n }\n },\n }),\n ];\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,kBAA2B;AAE3B,2BAA4E;AAC5E,mBAAsD;AACtD,6BAAqC;AACrC,kBAAiC;AACjC,6BAA+E;ACL/E,IAAAA,eAA2B;AAC3B,0BAAiC;AAEjC,IAAAC,wBAA2D;AAC3D,yBAA8D;AAE9D,IAAAC,eAAyF;AACzF,IAAAC,0BAAoD;AACpD,oBAA2B;AAK3B,IAAMC,UAAU,CAACC,KAAmBC,WAAAA;AAClC,MAAID,IAAIE,SAAS;AACf,UAAM,CAACC,OAAOC,GAAAA,IAAOH,OAAOI,MAAM,GAAA;AAClC,eAAOC,iCAAeC,gCAAkBP,IAAIE,QAAQM,QAAS;MAAC;KAAU,GAAGL,OAAOC,GAAAA;EACpF;AACF;AAKO,IAAMK,UAAU,CAACC,OAAoBV,KAAoBW,aAAAA;AAC9D,QAAMC,QAAQZ,WAAOa,uBAASb,GAAAA;AAC9B,MAAI,CAACA,OAAO,CAACY,SAAS,CAACD,UAAU;AAG/B,WAAO;UAACG,kCAAAA;;EACV;AAEA,QAAMC,QAAQH,MAAMI,GAAGD,MAAME,yBAAMC,OAAOC,0BAAOC,IAAIpB,IAAIqB,EAAE,CAAA,EAAGC,SAASC,wBAAAA,CAAAA;AACvE,QAAMC,cAAcT,MAAMU,UAAS;AAEnC,QAAMC,cAAUC,8BAAS,MACvBZ,MAAMa,QACHC,OAAO,CAAC5B,WAAAA;AACP,UAAM6B,SAAS7B,OAAO8B,mCAAAA;AACtB,eAAOC,iCAAaC,kCAAYH,MAAAA,KAAWA,OAAOI,WAAW;EAC/D,CAAA,EACCC,OAAOzB,MAAM0B,WAAOC,+BAAiBrC,GAAAA,CAAAA,KAAS,CAAA,CAAE,CAAA;AAGrD,SAAO;IACLsC,wBAAWC,iBAAiB;MAC1BC,SAAS,MAAA;AACPhB,oBAAAA;MACF;IACF,CAAA;IAEAc,wBAAWG,eAAeC,GAAG,CAACC,WAAAA;AAC5B,UAAIA,OAAOC,YAAY;AACrBlB,gBAAQmB,MAAMC,QAAQ,CAAC7C,WAAAA;AACrB,cAAIA,OAAOA,QAAQ;AAGjB,kBAAM8C,OAAOhD,QAAQC,KAAKC,OAAOA,MAAM;AACvC,kBAAM6B,SAAS7B,OAAO8B,mCAAAA;AACtB,gBAAIgB,QAAQA,SAASjB,OAAOiB,MAAM;AAChCjB,qBAAOiB,OAAOA;YAChB;UACF;QACF,CAAA;MACF;IACF,CAAA;QAEAC,uDACEX,+BAAiBrC,GAAAA,GACjB,CAACiD,aAASC,4BAAO,MAAMD,KAAAA,CAAAA,GACvB,MACEvB,QAAQmB,MACLhB,OAAO,CAAC5B,WAAWA,OAAOA,MAAM,EAChCkD,IAAI,CAAClD,YAAY;MAAEoB,QAAIgB,+BAAiBpC,OAAO8B,mCAAAA,CAAiB;MAAGqB,QAAQnD,OAAOA;IAAO,EAAA,CAAA;QAGhGa,kCAAS;MACPO,QAAIgB,+BAAiBrC,GAAAA;MACrBqD,UAAU,CAAC,EAAED,OAAM,MAAE;AACnB,cAAML,OAAOhD,QAAQC,KAAKoD,MAAAA;AAC1B,aAAKzC,aAAS2C,oCAAaC,mCAAaC,QAAQ;UAAEvD,QAAQmD;UAAQL;UAAMU,SAASzD;QAAI,CAAA,CAAA;MACvF;MACA0D,UAAU,CAAC,EAAErC,GAAE,MAAE;AACf,cAAMsC,QAAQjD,MAAM0B,WAAOC,+BAAiBrC,GAAAA,CAAAA;AAC5C,YAAI2D,OAAO;AACT,gBAAMC,QAAQD,MAAME,UAAU,CAAC/B,gBAAWO,+BAAiBP,OAAAA,MAAYT,EAAAA;AACvE,cAAIuC,UAAU,IAAI;AAChBD,kBAAMG,OAAOF,OAAO,CAAA;UACtB;QACF;AAEA,cAAM9B,SAASf,MAAMa,QAAQmC,KAAK,CAACC,eAAWC,wBAAUD,MAAAA,EAAQ3C,OAAOA,EAAAA;AACvE,YAAIS,QAAQ;AACVA,iBAAO7B,SAASiE;QAClB;MACF;MACAC,UAAU,CAAC,EAAE9C,IAAI+B,OAAM,MAAE;AACvB,cAAMO,QAAQjD,MAAM0B,WAAOC,+BAAiBrC,GAAAA,CAAAA,GAAO+D,KAAK,CAACjC,eAAWO,+BAAiBP,MAAAA,MAAYT,EAAAA;AACjG,YAAIsC,OAAO;AACT,gBAAM7B,SAAS6B,MAAM5B,mCAAAA;AACrBD,iBAAOiB,OAAOhD,QAAQC,KAAKoD,MAAAA;AAC3BO,gBAAM1D,SAASmD;QACjB;AAEA,cAAMgB,WAAWrD,MAAMa,QAAQmC,KAAK,CAACC,eAAWC,wBAAUD,MAAAA,EAAQ3C,OAAOA,EAAAA;AACzE,YAAI+C,UAAU;AACZ,gBAAMtC,aAASmC,wBAAUG,QAAAA;AACzB,kBAAIpC,iCAAaC,kCAAYH,MAAAA,GAAS;AACpCA,mBAAOiB,OAAOhD,QAAQC,KAAKoD,MAAAA;AAC3BgB,qBAASnE,SAASmD;UACpB;QACF;MACF;MACAiB,UAAU,CAAC,EAAEC,UAAS,MAAE;AACtB,cAAMC,UAAUD,UAAUC,WAAWD,UAAUE;AAC/C,YAAID,SAAS;AACX,eAAK5D,aAAS2C,oCAAaC,mCAAakB,QAAQ;YAAEF;UAAQ,CAAA,CAAA;QAC5D;MACF;IACF,CAAA;;AAEJ;AD9GA,IAAA,mBAAe,CAACG,gBACdC,kCAAYC,4CAAqBC,YAAY;EAC3C,CAAC,EAAEC,UAAU9E,IAAG,MAAE;AAChB,UAAM,EAAE+E,iBAAiBpE,SAAQ,IAAK+D,QAAQM,cAAcC,kCAAaC,gBAAgB;AACzF,UAAM,EAAExE,MAAK,IAAKgE,QAAQM,cAAcG,yCAAmBC,YAAY;AACvE,WAAO3E,QAAQC,OAAOV,KAAKW,QAAAA;EAC7B;EACA,CAAC,EAAEmE,UAAU9E,IAAG,MAAE;AAChB,UAAM,EAAEU,MAAK,IAAKgE,QAAQM,cAAcG,yCAAmBC,YAAY;AAEvE,WAAO9C,YAAAA,WAAWG,eAAeC,GAAG,CAACC,WAAAA;AACnC,UAAIA,OAAOC,cAAcD,OAAO0C,cAAc;AAC5C3E,cAAM4E,YAAQjD,YAAAA,kBAAiBrC,GAAAA,CAAAA,IAAQuF,yBAAyB5C,OAAOjC,KAAK;MAC9E;IACF,CAAA;EACF;EACA,CAAC,EAAEoE,UAAU9E,IAAG,MAAE;AAChB,UAAM,EAAE+E,iBAAiBpE,SAAQ,IAAK+D,QAAQM,cAAcC,kCAAaC,gBAAgB;AACzF,UAAM7D,SAAKgB,YAAAA,kBAAiBrC,GAAAA;AAE5B,WAAOsC,YAAAA,WAAWG,eAAeC,GAAG,CAACC,WAAAA;AACnCA,aAAO6C,aAAa1C,QAAQ,CAAC2C,gBAAAA;AAC3BA,oBAAYC,QAAQ5C,QAAQ,OAAOI,YAAAA;AACjC,cAAIA,QAAOyC,GAAGC,2CAAAA,GAAuB;AACnC,iBAAKjF,aACH2C,qBAAAA,cAAauC,wBAAWC,iBAAiB;cACvCC,SAAS1E;cACT2E,WAAW,GAAG3E,EAAAA,GAAK4E,sCAAAA;YACrB,CAAA,CAAA;UAEJ;QACF,CAAA;MACF,CAAA;IACF,CAAA;EACF;CACD;AAEH,IAAMV,2BAA2B,CAAC7E,UAAAA;AAEhC,QAAMwF,eAAexF,MAAMyF,MAAMC,sCAAe,KAAA;AAChD,MAAIF,iBAAiBhC,QAAW;AAC9B,WAAO;EACT;AAEA,QAAM,EAAEI,UAAS,IAAK5D;AACtB,aAAW2F,SAAS/B,UAAUgC,QAAQ;AACpC,QAAIJ,aAAapF,SAASyF,KAAK,CAAC,EAAEF,OAAOG,aAAY,UAAOC,gCAAQD,cAAcH,KAAAA,CAAAA,GAAS;AACzF,aAAO;IACT;EACF;AAEA,SAAO;AACT;",
|
|
6
|
-
"names": ["import_view", "import_app_framework", "import_echo", "import_react_ui_editor", "getName", "doc", "anchor", "content", "start", "end", "split", "getTextInRange", "createDocAccessor", "target", "threads", "state", "dispatch", "space", "getSpace", "comments", "query", "db", "Query", "select", "Filter", "ids", "id", "targetOf", "AnchoredTo", "unsubscribe", "subscribe", "anchors", "computed", "objects", "filter", "thread", "RelationSourceId", "isInstanceOf", "ThreadType", "status", "concat", "drafts", "fullyQualifiedId", "EditorView", "domEventHandlers", "destroy", "updateListener", "of", "update", "docChanged", "value", "forEach", "name", "createExternalCommentSync", "sink", "effect", "map", "cursor", "onCreate", "createIntent", "ThreadAction", "Create", "subject", "onDelete", "draft", "index", "findIndex", "splice", "find", "object", "getSource", "undefined", "onUpdate", "relation", "onSelect", "selection", "current", "closest", "Select", "context", "contributes", "MarkdownCapabilities", "Extensions", "document", "dispatchPromise", "getCapability", "Capabilities", "IntentDispatcher", "ThreadCapabilities", "MutableState", "selectionSet", "toolbar", "selectionOverlapsComment", "transactions", "transaction", "effects", "is", "commentClickedEffect", "DeckAction", "ChangeCompanion", "primary", "companion", "ATTENDABLE_PATH_SEPARATOR", "commentState", "field", "commentsState", "range", "ranges", "some", "commentRange", "overlap"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/react-surface.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface, useCapability } from '@dxos/app-framework';\nimport { isInstanceOf, type Ref } from '@dxos/echo-schema';\nimport { SettingsStore } from '@dxos/local-storage';\nimport { getSpace, isEchoObject } from '@dxos/react-client/echo';\n\nimport { ThreadCapabilities } from './capabilities';\nimport {\n CallSidebar,\n CallDebugPanel,\n ChannelContainer,\n ThreadComplementary,\n ThreadSettings,\n ChatContainer,\n} from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ChannelType, ThreadType, type ThreadSettingsProps } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${THREAD_PLUGIN}/channel`,\n role: 'article',\n filter: (data): data is { subject: ChannelType } => isInstanceOf(ChannelType, data.subject),\n component: ({ data: { subject: channel }, role }) => <ChannelContainer channel={channel} role={role} />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/chat-companion`,\n role: 'article',\n filter: (data): data is { companionTo: ChannelType; subject: 'chat' } =>\n isInstanceOf(ChannelType, data.companionTo) && data.subject === 'chat',\n component: ({ data: { companionTo: channel } }) => {\n const space = getSpace(channel);\n const thread = channel.defaultThread.target;\n if (!space || !thread) {\n return null;\n }\n\n return <ChatContainer thread={thread} space={space} />;\n },\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/thread`,\n role: 'article',\n filter: (data): data is { subject: ThreadType } => isInstanceOf(ThreadType, data.subject),\n component: ({ data: { subject: thread } }) => {\n const space = getSpace(thread);\n if (!space || !thread) {\n return null;\n }\n\n return <ChatContainer thread={thread} space={space} />;\n },\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/comments`,\n role: 'article',\n filter: (data): data is { companionTo: { threads: Ref<ThreadType>[] } } =>\n data.subject === 'comments' && isEchoObject(data.companionTo),\n // TODO(wittjosiah): This isn't scrolling properly in a plank.\n component: ({ data }) => <ThreadComplementary subject={data.companionTo} />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/plugin-settings`,\n role: 'article',\n filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>\n data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,\n component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/assistant`,\n role: 'deck-companion--active-call',\n component: () => <CallSidebar />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/devtools-overview`,\n role: 'devtools-overview',\n component: () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n return <CallDebugPanel state={call.state} />;\n },\n }),\n ]);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,mBAAkB;AAElB,2BAAwE;AACxE,yBAAuC;AACvC,2BAA8B;AAC9B,kBAAuC;AAcvC,IAAA,wBAAe,UACbA,kCAAYC,kCAAaC,cAAc;MACrCC,oCAAc;IACZC,IAAI,GAAGC,mCAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,aAA2CC,iCAAaC,mCAAaF,KAAKG,OAAO;IAC1FC,WAAW,CAAC,EAAEJ,MAAM,EAAEG,SAASE,QAAO,GAAIP,KAAI,MAAO,6BAAAQ,QAAA,cAACC,wCAAAA;MAAiBF;MAAkBP;;EAC3F,CAAA;MACAH,oCAAc;IACZC,IAAI,GAAGC,mCAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,aACPC,iCAAaC,mCAAaF,KAAKQ,WAAW,KAAKR,KAAKG,YAAY;IAClEC,WAAW,CAAC,EAAEJ,MAAM,EAAEQ,aAAaH,QAAO,EAAE,MAAE;AAC5C,YAAMI,YAAQC,sBAASL,OAAAA;AACvB,YAAMM,SAASN,QAAQO,cAAcC;AACrC,UAAI,CAACJ,SAAS,CAACE,QAAQ;AACrB,eAAO;MACT;AAEA,aAAO,6BAAAL,QAAA,cAACQ,qCAAAA;QAAcH;QAAgBF;;IACxC;EACF,CAAA;MACAd,oCAAc;IACZC,IAAI,GAAGC,mCAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,aAA0CC,iCAAac,kCAAYf,KAAKG,OAAO;IACxFC,WAAW,CAAC,EAAEJ,MAAM,EAAEG,SAASQ,OAAM,EAAE,MAAE;AACvC,YAAMF,YAAQC,sBAASC,MAAAA;AACvB,UAAI,CAACF,SAAS,CAACE,QAAQ;AACrB,eAAO;MACT;AAEA,aAAO,6BAAAL,QAAA,cAACQ,qCAAAA;QAAcH;QAAgBF;;IACxC;EACF,CAAA;MACAd,oCAAc;IACZC,IAAI,GAAGC,mCAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SACPA,KAAKG,YAAY,kBAAca,0BAAahB,KAAKQ,WAAW;;IAE9DJ,WAAW,CAAC,EAAEJ,KAAI,MAAO,6BAAAM,QAAA,cAACW,2CAAAA;MAAoBd,SAASH,KAAKQ;;EAC9D,CAAA;MACAb,oCAAc;IACZC,IAAI,GAAGC,mCAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SACPA,KAAKG,mBAAmBe,sCAAiBlB,KAAKG,QAAQgB,WAAWtB;IACnEO,WAAW,CAAC,EAAEJ,MAAM,EAAEG,QAAO,EAAE,MAAO,6BAAAG,QAAA,cAACc,sCAAAA;MAAeC,UAAUlB,QAAQmB;;EAC1E,CAAA;MACA3B,oCAAc;IACZC,IAAI,GAAGC,mCAAAA;IACPC,MAAM;IACNM,WAAW,MAAM,6BAAAE,QAAA,cAACiB,mCAAAA,IAAAA;EACpB,CAAA;MACA5B,oCAAc;IACZC,IAAI,GAAGC,mCAAAA;IACPC,MAAM;IACNM,WAAW,MAAA;AACT,YAAMoB,WAAOC,oCAAcC,yCAAmBC,WAAW;AACzD,aAAO,6BAAArB,QAAA,cAACsB,sCAAAA;QAAeC,OAAOL,KAAKK;;IACrC;EACF,CAAA;CACD;",
|
|
6
|
-
"names": ["contributes", "Capabilities", "ReactSurface", "createSurface", "id", "THREAD_PLUGIN", "role", "filter", "data", "isInstanceOf", "ChannelType", "subject", "component", "channel", "React", "ChannelContainer", "companionTo", "space", "getSpace", "thread", "defaultThread", "target", "ChatContainer", "ThreadType", "isEchoObject", "ThreadComplementary", "SettingsStore", "prefix", "ThreadSettings", "settings", "value", "CallSidebar", "call", "useCapability", "ThreadCapabilities", "CallManager", "CallDebugPanel", "state"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/settings.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes } from '@dxos/app-framework';\nimport { live } from '@dxos/live-object';\n\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadSettingsProps, ThreadSettingsSchema } from '../types';\n\nexport default () => {\n const settings = live<ThreadSettingsProps>({});\n return contributes(Capabilities.Settings, { schema: ThreadSettingsSchema, prefix: THREAD_PLUGIN, value: settings });\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,2BAA0C;AAC1C,yBAAqB;AAKrB,IAAA,mBAAe,MAAA;AACb,QAAMA,eAAWC,yBAA0B,CAAC,CAAA;AAC5C,aAAOC,kCAAYC,kCAAaC,UAAU;IAAEC,QAAQC;IAAsBC,QAAQC;IAAeC,OAAOT;EAAS,CAAA;AACnH;",
|
|
6
|
-
"names": ["settings", "live", "contributes", "Capabilities", "Settings", "schema", "ThreadSettingsSchema", "prefix", "THREAD_PLUGIN", "value"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/app-graph-builder.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';\nimport { getTypename, isInstanceOf } from '@dxos/echo-schema';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { createExtension, ROOT_ID, rxFromSignal } from '@dxos/plugin-graph';\nimport { fullyQualifiedId, isEchoObject } from '@dxos/react-client/echo';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { meta, THREAD_PLUGIN } from '../meta';\nimport { ChannelType, ThreadAction } from '../types';\nimport { getAnchor } from '../util';\n\nexport default (context: PluginContext) => {\n const resolve = (typename: string) =>\n context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${THREAD_PLUGIN}/active-call`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map((node) => {\n const [call] = get(context.capabilities(ThreadCapabilities.CallManager));\n return get(\n rxFromSignal(() =>\n call?.joined\n ? [\n {\n id: `${node.id}${ATTENDABLE_PATH_SEPARATOR}active-call`,\n type: DECK_COMPANION_TYPE,\n data: null,\n properties: {\n label: ['call panel label', { ns: THREAD_PLUGIN }],\n icon: 'ph--video-conference--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ]\n : [],\n ),\n );\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n // TODO(wittjosiah): The channel shouldn't become the companion during a call.\n // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.\n createExtension({\n id: `${THREAD_PLUGIN}/channel-chat-companion`,\n connector: (node) => {\n return Rx.make((get) => {\n return pipe(\n get(node),\n Option.flatMap((node) => (isInstanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),\n Option.map((channel) => {\n const callManager = context.getCapability(ThreadCapabilities.CallManager);\n const joined = get(\n rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)),\n );\n if (!joined) {\n return [];\n }\n\n return [\n {\n id: `${fullyQualifiedId(channel)}${ATTENDABLE_PATH_SEPARATOR}chat`,\n type: PLANK_COMPANION_TYPE,\n data: 'chat',\n properties: {\n label: ['channel companion label', { ns: THREAD_PLUGIN }],\n icon: 'ph--hash--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n );\n });\n },\n }),\n createExtension({\n id: `${meta.id}/comments-companion`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => {\n if (!isEchoObject(node.data) || isInstanceOf(ChannelType, node.data)) {\n return Option.none();\n }\n const metadata = resolve(getTypename(node.data)!);\n return typeof metadata.comments === 'string' ? Option.some(node) : Option.none();\n }),\n Option.map((node) => [\n {\n id: [node.id, 'comments'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'comments',\n properties: {\n label: ['comments label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n disposition: 'hidden',\n position: 'hoist',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/comment-toolbar`,\n actions: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => {\n if (!isEchoObject(node.data) || isInstanceOf(ChannelType, node.data)) {\n return Option.none();\n }\n const metadata = resolve(getTypename(node.data)!);\n return typeof metadata.comments === 'string' ? Option.some(node.data) : Option.none();\n }),\n Option.map((object) => {\n const selectionManager = context.getCapability(AttentionCapabilities.Selection);\n const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};\n const disabled = get(\n rxFromSignal(() => {\n const metadata = resolve(getTypename(object)!);\n const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);\n const anchor = getAnchor(selection);\n const invalidSelection = !anchor;\n const overlappingComment = toolbar[fullyQualifiedId(object)];\n return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;\n }),\n );\n\n return [\n {\n id: `${fullyQualifiedId(object)}/comment`,\n data: () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const metadata = resolve(getTypename(object)!);\n const selection = selectionManager.getSelection(fullyQualifiedId(object));\n // TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.\n // Requires all components which support selection (e.g. table/kanban) to support anchored comments.\n const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();\n const name = metadata.getAnchorLabel?.(object, anchor);\n void dispatch(createIntent(ThreadAction.Create, { anchor, name, subject: object }));\n },\n properties: {\n label: ['add comment label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n disposition: 'toolbar',\n disabled,\n testId: 'thread.comment.add',\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n ]);\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Rx", "Option", "pipe", "Capabilities", "contributes", "createIntent", "getTypename", "isInstanceOf", "AttentionCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "DECK_COMPANION_TYPE", "createExtension", "ROOT_ID", "rxFromSignal", "fullyQualifiedId", "isEchoObject", "context", "resolve", "typename", "getCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "THREAD_PLUGIN", "connector", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "ROOT_ID", "some", "none", "map", "call", "capabilities", "ThreadCapabilities", "CallManager", "rxFromSignal", "joined", "ATTENDABLE_PATH_SEPARATOR", "type", "DECK_COMPANION_TYPE", "data", "properties", "label", "ns", "icon", "position", "disposition", "getOrElse", "isInstanceOf", "ChannelType", "channel", "callManager", "getCapability", "roomId", "fullyQualifiedId", "PLANK_COMPANION_TYPE", "meta", "isEchoObject", "getTypename", "comments", "join", "actions", "object", "selectionManager", "AttentionCapabilities", "Selection", "toolbar", "State", "state", "disabled", "selection", "getSelection", "selectionMode", "anchor", "getAnchor", "invalidSelection", "overlappingComment", "dispatchPromise", "dispatch", "IntentDispatcher", "Date", "now", "toString", "name", "getAnchorLabel", "createIntent", "ThreadAction", "Create", "subject", "testId"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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, getTypename, isInstanceOf, Query, 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(() => anchorSorts.find(({ key }) => key === getTypename(subject))?.sort, [anchorSorts, subject]);\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) => isInstanceOf(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 <Tabs.Tablist classNames='p-1 gap-1 bs-[--rail-action] border-be border-separator'>\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": ["WebRTCStats", "React", "useEffect", "useMemo", "useState", "Panel", "log", "Input", "useTranslation", "Json", "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", "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", "React", "useCapability", "CallSidebar", "call", "useCapability", "ThreadCapabilities", "CallManager", "React", "ChannelContainer", "roomId", "React", "useCallback", "useMemo", "createIntent", "LayoutAction", "useCapability", "useCapabilities", "useIntentDispatcher", "Capabilities", "Filter", "getTypename", "isInstanceOf", "Query", "RelationSourceId", "fullyQualifiedId", "getSpace", "useQuery", "useIdentity", "useTranslation", "useAttended", "StackItem", "Tabs", "AnchoredTo", "lazy", "CheckCircle", "X", "React", "useCallback", "useMemo", "useRef", "useState", "RelationSourceId", "RefArray", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Button", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadFooter", "ThreadHeading", "isNonNullable", "sizeClass", "getSize", "commentControlClassNames", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "React", "Tooltip", "Trigger", "asChild", "content", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "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", "useState", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "id", "handleThreadDelete", "handleComment", "Thread", "onClickCapture", "onFocusCapture", "div", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "side", "ThreadHeading", "name", "status", "Tag", "palette", "RefArray", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "editable", "MessageTextbox", "onSend", "ThreadFooter", "ref", "ChatText", "React", "useEffect", "RelationSourceId", "fullyQualifiedId", "useTranslation", "Trans", "descriptionMessage", "mx", "CommentsContainer", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "THREAD_PLUGIN", "filteredAnchors", "filter", "anchor", "RelationSourceId", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "React", "length", "map", "threadId", "fullyQualifiedId", "CommentContainer", "key", "current", "div", "role", "className", "mx", "descriptionMessage", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "React", "DeprecatedFormContainer", "ThreadSettings", "settings", "React", "DeprecatedFormContainer", "ChannelContainer", "lazy", "ChatContainer", "ThreadComplementary", "subject", "dispatchPromise", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "t", "useTranslation", "THREAD_PLUGIN", "state", "getViewState", "useCapability", "ThreadCapabilities", "MutableState", "viewState", "fullyQualifiedId", "showResolvedThreads", "onChangeViewState", "useCallback", "nextValue", "drafts", "anchorSorts", "useCapabilities", "Capabilities", "AnchorSort", "sort", "useMemo", "find", "key", "getTypename", "space", "getSpace", "objectsAnchoredTo", "useQuery", "Query", "select", "Filter", "ids", "id", "targetOf", "AnchoredTo", "anchors", "toSorted", "a", "b", "filter", "anchor", "isInstanceOf", "ThreadType", "RelationSourceId", "concat", "attended", "useAttended", "qualifiedSubjectId", "handleAttend", "thread", "threadId", "current", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "ref", "handleComment", "text", "ThreadAction", "AddMessage", "sender", "identityDid", "did", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "comments", "React", "CommentsContainer", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "StackItem", "Content", "toolbar", "Tabs", "Root", "value", "onValueChange", "orientation", "classNames", "Tablist", "Tab", "Tabpanel"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/ChatContainer.tsx", "../../../src/components/MessageContainer.tsx", "../../../src/components/command-extension.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { live, makeRef } from '@dxos/live-object';\nimport { type AnyLiveObject, fullyQualifiedId, type Space, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/react-ui-theme';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread,\n ThreadFooter,\n threadLayout,\n type ThreadProps,\n} from '@dxos/react-ui-thread';\nimport { DataType } 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\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n return (\n <div role='none' className='flex items-center'>\n <StackItem.SigilButton attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </StackItem.SigilButton>\n <StackItem.HeadingLabel attendableId={attendableId}>{t('chat heading')}</StackItem.HeadingLabel>\n </div>\n );\n};\n\nexport type ChatContainerProps = {\n space: Space;\n thread: ThreadType;\n context?: AnyLiveObject<any>;\n autoFocusTextbox?: boolean;\n} & Pick<ThreadProps, 'current'>;\n\nexport const ChatContainer = ({ space, thread, context, current, autoFocusTextbox }: ChatContainerProps) => {\n const id = fullyQualifiedId(thread);\n const identity = useIdentity()!;\n const members = useMembers(space?.key);\n const activity = useStatus(space, id);\n const { t } = useTranslation(THREAD_PLUGIN);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(id, identity);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n thread.messages.push(\n makeRef(\n live(DataType.Message, {\n sender: { identityDid: identity.did },\n created: new Date().toISOString(),\n blocks: [{ type: 'text', text: messageRef.current }],\n properties: context ? { context: makeRef(context) } : undefined,\n }),\n ),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n return (\n <Thread\n current={current}\n id={id}\n classNames='bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0'\n >\n <ScrollArea.Root classNames='col-span-2'>\n <ScrollArea.Viewport classNames='overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {thread.messages\n .map((message) => message.target)\n .filter(isNonNullable)\n .map((message) => (\n <MessageContainer key={message.id} message={message} members={members} />\n ))}\n </div>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\n </Thread>\n );\n};\n\nexport default ChatContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { Check, PencilSimple, X } from '@phosphor-icons/react';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework';\nimport { RefArray } from '@dxos/live-object';\nimport { PublicKey } from '@dxos/react-client';\nimport { type AnyLiveObject, type Expando, type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type DataType } from '@dxos/schema';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\n// TODO(thure): #8149\nconst messageControlClassNames = ['!p-1 !min-bs-0 transition-opacity', hoverableControlItem];\n\nexport type MessageContainerProps = {\n message: DataType.Message;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n};\n\nexport const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const { t } = useTranslation(THREAD_PLUGIN);\n const editLabel = t(editing ? 'save message label' : 'edit message label');\n const deleteLabel = t('delete message label');\n const textBlock = message.blocks.find((block) => block.type === 'text');\n const references = message.blocks.filter((block) => block.type === 'reference').map((block) => block.reference);\n\n useOnEditAnalytics(message, textBlock, !!editing);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <ButtonGroup classNames='mie-1'>\n {userIsAuthor && editable && (\n <Tooltip.Trigger asChild content={editLabel}>\n <Button\n variant='ghost'\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n classNames={messageControlClassNames}\n onClick={() => setEditing((editing) => !editing)}\n >\n <span className='sr-only'>{editLabel}</span>\n {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}\n </Button>\n </Tooltip.Trigger>\n )}\n {onDelete && (\n <Tooltip.Trigger asChild content={deleteLabel}>\n <Button\n variant='ghost'\n data-testid='thread.message.delete'\n classNames={messageControlClassNames}\n onClick={() => handleDelete()}\n >\n <span className='sr-only'>{deleteLabel}</span>\n <X className={getSize(4)} />\n </Button>\n </Tooltip.Trigger>\n )}\n </ButtonGroup>\n </MessageHeading>\n {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}\n {RefArray.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n}: {\n block: DataType.MessageBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\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 block.text = inMemoryContentRef.current;\n }, [block]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: AnyLiveObject<any> }>(\n ({ subject }, forwardedRef) => {\n let title = subject.name ?? subject.title ?? subject.type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface role='card' limit={1} data={{ subject }} fallback={title} />\n </div>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "useLayoutEffect", "useMemo", "useRef", "useState", "live", "makeRef", "fullyQualifiedId", "useMembers", "useIdentity", "Icon", "ScrollArea", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "StackItem", "mx", "MessageTextbox", "Thread", "ThreadFooter", "threadLayout", "DataType", "isNonNullable", "EditorView", "Check", "PencilSimple", "X", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "RefArray", "PublicKey", "useIdentity", "Button", "ButtonGroup", "Tooltip", "useOnTransition", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageHeading", "MessageRoot", "StreamLanguage", "HighlightStyle", "syntaxHighlighting", "tags", "mx", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "messageControlClassNames", "hoverableControlItem", "MessageContainer", "message", "members", "editable", "onDelete", "senderIdentity", "find", "member", "sender", "identityDid", "identity", "did", "identityKey", "PublicKey", "equals", "messageMetadata", "getMessageMetadata", "id", "userIsAuthor", "useIdentity", "authorId", "editing", "setEditing", "useState", "handleDelete", "useCallback", "t", "useTranslation", "THREAD_PLUGIN", "editLabel", "deleteLabel", "textBlock", "blocks", "block", "type", "references", "filter", "map", "reference", "useOnEditAnalytics", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "ButtonGroup", "Tooltip", "Trigger", "asChild", "content", "Button", "variant", "data-testid", "onClick", "span", "className", "Check", "getSize", "PencilSimple", "X", "TextboxBlock", "isAuthor", "RefArray", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "text", "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", "div", "role", "ref", "forwardRef", "forwardedRef", "title", "name", "mx", "Surface", "limit", "data", "fallback", "ChatHeading", "attendableId", "t", "useTranslation", "THREAD_PLUGIN", "React", "div", "role", "className", "StackItem", "SigilButton", "Icon", "icon", "size", "HeadingLabel", "ChatContainer", "space", "thread", "context", "current", "autoFocusTextbox", "id", "fullyQualifiedId", "identity", "useIdentity", "members", "useMembers", "key", "activity", "useStatus", "_count", "_setCount", "useState", "rerenderEditor", "count", "autoFocus", "setAutoFocus", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "length", "messages", "push", "makeRef", "live", "DataType", "Message", "sender", "identityDid", "did", "created", "Date", "toISOString", "blocks", "type", "properties", "undefined", "Thread", "classNames", "ScrollArea", "Root", "Viewport", "mx", "threadLayout", "map", "message", "target", "filter", "isNonNullable", "MessageContainer", "ref", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "ThreadFooter"]
|
|
7
|
-
}
|