@dxos/plugin-thread 0.6.10-main.e92b5eb → 0.6.10-staging.00555f6

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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ChatContainer
3
- } from "./chunk-CQ2RYETH.mjs";
3
+ } from "./chunk-P7ZE5N5M.mjs";
4
4
  import "./chunk-5IBJO53M.mjs";
5
5
 
6
6
  // packages/plugins/plugin-thread/src/components/ThreadArticle.tsx
@@ -15,4 +15,4 @@ var ThreadArticle_default = ThreadArticle;
15
15
  export {
16
16
  ThreadArticle_default as default
17
17
  };
18
- //# sourceMappingURL=ThreadArticle-J4VCLPMS.mjs.map
18
+ //# sourceMappingURL=ThreadArticle-O64ZECMF.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ChatContainer
3
- } from "./chunk-CQ2RYETH.mjs";
3
+ } from "./chunk-P7ZE5N5M.mjs";
4
4
  import "./chunk-5IBJO53M.mjs";
5
5
 
6
6
  // packages/plugins/plugin-thread/src/components/ThreadMain.tsx
@@ -23,4 +23,4 @@ var ThreadMain_default = ThreadMain;
23
23
  export {
24
24
  ThreadMain_default as default
25
25
  };
26
- //# sourceMappingURL=ThreadMain-VV7MGQZJ.mjs.map
26
+ //# sourceMappingURL=ThreadMain-ZDCRC6RG.mjs.map
@@ -124,7 +124,7 @@ var styles = HighlightStyle.define([
124
124
  tag: tags.tagName,
125
125
  class: mx(tagRoot({
126
126
  palette: "cyan"
127
- }), "text-base font-medium")
127
+ }), "text-baseText font-medium")
128
128
  }
129
129
  ]);
130
130
  var command = [
@@ -407,4 +407,4 @@ export {
407
407
  ChatHeading,
408
408
  ChatContainer
409
409
  };
410
- //# sourceMappingURL=chunk-CQ2RYETH.mjs.map
410
+ //# sourceMappingURL=chunk-P7ZE5N5M.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/useStatus.ts", "../../../src/hooks/analytics.ts", "../../../src/components/ChatContainer.tsx", "../../../src/components/MessageContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/util.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\n\n// TODO(burdon): Generalize and factor out.\nexport const useStatus = (space?: Space, channel?: string) => {\n const [processing, setProcessing] = useState(false);\n useEffect(() => {\n if (!space || !channel) {\n return;\n }\n\n const unsubscribe = space.listen(`status/${channel}`, (status) => {\n const { event } = status.payload ?? {};\n setProcessing(event === 'processing');\n });\n\n const t = setInterval(() => {\n setProcessing((prev: any) => {\n if (typeof prev?.ts === 'number' && Date.now() - prev.ts > 30_000) {\n return undefined;\n } else {\n return prev;\n }\n });\n }, 1_000);\n\n return () => {\n unsubscribe();\n clearInterval(t);\n };\n }, [space, channel]);\n\n return processing;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport { type ReactiveObject } from '@dxos/echo-schema';\nimport { ObservabilityAction } from '@dxos/plugin-observability/meta';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useOnTransition } from '@dxos/react-ui';\n\nexport const useAnalyticsCallback = (spaceId: string | undefined, name: string, meta?: any) => {\n const dispatch = useIntentDispatcher();\n\n return useCallback(\n (dynamicMeta?: any) => {\n void dispatch({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name,\n properties: { ...meta, ...dynamicMeta, spaceId },\n },\n });\n },\n [dispatch, name, meta, spaceId],\n );\n};\n\nexport const useOnEditAnalytics = (message: ReactiveObject<any>, editing: boolean) => {\n const space = getSpace(message);\n\n const onEditAnalytics = useAnalyticsCallback(space?.id, 'threads.comment-edited', {\n messageId: message.id,\n messageLength: message.text.length,\n });\n\n useOnTransition(editing, true, false, onEditAnalytics);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Chat } from '@phosphor-icons/react';\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { create } from '@dxos/echo-schema';\nimport { MessageType } from '@dxos/plugin-space/types';\nimport { getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { PlankHeading, plankHeadingIconProps } from '@dxos/react-ui-deck';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, threadLayout } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\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 <PlankHeading.Button attendableId={attendableId}>\n <Chat {...plankHeadingIconProps} />\n </PlankHeading.Button>\n <PlankHeading.Label attendableId={attendableId}>{t('chat heading')}</PlankHeading.Label>\n </div>\n );\n};\n\nexport const ChatContainer = ({ thread, context, current, autoFocusTextbox }: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\n const activity = useStatus(space, thread.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(thread.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 create(MessageType, {\n sender: { identityKey: identity.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: messageRef.current,\n context,\n }),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n const handleDelete = (id: string) => {\n const messageIndex = thread.messages.filter(nonNullable).findIndex((message) => message.id === id);\n if (messageIndex !== -1) {\n thread.messages.splice(messageIndex, 1);\n }\n };\n\n return (\n <Thread\n current={current}\n id={thread.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.filter(nonNullable).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleDelete} />\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", "//\n// Copyright 2024 DXOS.org\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 { type Expando, type EchoReactiveObject } from '@dxos/echo-schema';\nimport { type MessageType } from '@dxos/plugin-space/types';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport {\n Button,\n ButtonGroup,\n DensityProvider,\n Tooltip,\n useOnTransition,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport { Mosaic, type MosaicTileComponent } from '@dxos/react-ui-mosaic';\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 { nonNullable } from '@dxos/util';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_ITEM, THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nconst messageControlClassNames = ['p-1 min-bs-0 transition-opacity items-start', hoverableControlItem];\n\nexport const MessageContainer = ({\n message,\n members,\n onDelete,\n}: {\n message: MessageType;\n members: SpaceMember[];\n onDelete?: (id: string) => void;\n}) => {\n const senderIdentity = members.find(\n (member) => message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.identityKey.toHex() === 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\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <ButtonGroup classNames='mie-1'>\n {userIsAuthor && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\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 <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {editLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n {onDelete && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\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 <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {deleteLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n </ButtonGroup>\n </MessageHeading>\n <TextboxBlock message={message} isAuthor={userIsAuthor} editing={editing} />\n {message.parts?.filter(nonNullable).map((part, index) => <MessagePart key={index} part={part} />)}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return (\n <Mosaic.Container id={part.id}>\n <Mosaic.DraggableTile type={THREAD_ITEM} path={part.id} item={part} Component={MessageBlockObjectTile} />\n </Mosaic.Container>\n );\n};\n\nconst TextboxBlock = ({\n message,\n isAuthor,\n editing,\n}: {\n message: MessageType;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(message.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n message.text = inMemoryContentRef.current;\n }, [message]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: message.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 [message.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n useOnEditAnalytics(message, !!editing);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile: MosaicTileComponent<EchoReactiveObject<any>> = forwardRef(\n ({ draggableStyle, draggableProps, item, active, ...props }, forwardedRef) => {\n let title = item.name ?? item.title ?? item.__typename ?? '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 style={draggableStyle}\n ref={forwardedRef}\n >\n <DensityProvider density='fine'>\n <Surface\n role='card'\n limit={1}\n data={{ content: item }}\n draggableProps={draggableProps}\n fallback={title}\n {...props}\n />\n </DensityProvider>\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, tagRoot } 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 {\n tag: tags.tagName,\n class: mx(tagRoot({ palette: 'cyan' }), 'text-base font-medium'),\n },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.identityKey.toHex(),\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\n\n// TODO(burdon): Generalize and factor out.\nexport const useStatus = (space?: Space, channel?: string) => {\n const [processing, setProcessing] = useState(false);\n useEffect(() => {\n if (!space || !channel) {\n return;\n }\n\n const unsubscribe = space.listen(`status/${channel}`, (status) => {\n const { event } = status.payload ?? {};\n setProcessing(event === 'processing');\n });\n\n const t = setInterval(() => {\n setProcessing((prev: any) => {\n if (typeof prev?.ts === 'number' && Date.now() - prev.ts > 30_000) {\n return undefined;\n } else {\n return prev;\n }\n });\n }, 1_000);\n\n return () => {\n unsubscribe();\n clearInterval(t);\n };\n }, [space, channel]);\n\n return processing;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport { type ReactiveObject } from '@dxos/echo-schema';\nimport { ObservabilityAction } from '@dxos/plugin-observability/meta';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useOnTransition } from '@dxos/react-ui';\n\nexport const useAnalyticsCallback = (spaceId: string | undefined, name: string, meta?: any) => {\n const dispatch = useIntentDispatcher();\n\n return useCallback(\n (dynamicMeta?: any) => {\n void dispatch({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name,\n properties: { ...meta, ...dynamicMeta, spaceId },\n },\n });\n },\n [dispatch, name, meta, spaceId],\n );\n};\n\nexport const useOnEditAnalytics = (message: ReactiveObject<any>, editing: boolean) => {\n const space = getSpace(message);\n\n const onEditAnalytics = useAnalyticsCallback(space?.id, 'threads.comment-edited', {\n messageId: message.id,\n messageLength: message.text.length,\n });\n\n useOnTransition(editing, true, false, onEditAnalytics);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Chat } from '@phosphor-icons/react';\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { create } from '@dxos/echo-schema';\nimport { MessageType } from '@dxos/plugin-space/types';\nimport { getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { PlankHeading, plankHeadingIconProps } from '@dxos/react-ui-deck';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, threadLayout } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\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 <PlankHeading.Button attendableId={attendableId}>\n <Chat {...plankHeadingIconProps} />\n </PlankHeading.Button>\n <PlankHeading.Label attendableId={attendableId}>{t('chat heading')}</PlankHeading.Label>\n </div>\n );\n};\n\nexport const ChatContainer = ({ thread, context, current, autoFocusTextbox }: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\n const activity = useStatus(space, thread.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(thread.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 create(MessageType, {\n sender: { identityKey: identity.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: messageRef.current,\n context,\n }),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n const handleDelete = (id: string) => {\n const messageIndex = thread.messages.filter(nonNullable).findIndex((message) => message.id === id);\n if (messageIndex !== -1) {\n thread.messages.splice(messageIndex, 1);\n }\n };\n\n return (\n <Thread\n current={current}\n id={thread.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.filter(nonNullable).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleDelete} />\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", "//\n// Copyright 2024 DXOS.org\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 { type Expando, type EchoReactiveObject } from '@dxos/echo-schema';\nimport { type MessageType } from '@dxos/plugin-space/types';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport {\n Button,\n ButtonGroup,\n DensityProvider,\n Tooltip,\n useOnTransition,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport { Mosaic, type MosaicTileComponent } from '@dxos/react-ui-mosaic';\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 { nonNullable } from '@dxos/util';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_ITEM, THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nconst messageControlClassNames = ['p-1 min-bs-0 transition-opacity items-start', hoverableControlItem];\n\nexport const MessageContainer = ({\n message,\n members,\n onDelete,\n}: {\n message: MessageType;\n members: SpaceMember[];\n onDelete?: (id: string) => void;\n}) => {\n const senderIdentity = members.find(\n (member) => message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.identityKey.toHex() === 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\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <ButtonGroup classNames='mie-1'>\n {userIsAuthor && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\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 <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {editLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n {onDelete && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\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 <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {deleteLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n </ButtonGroup>\n </MessageHeading>\n <TextboxBlock message={message} isAuthor={userIsAuthor} editing={editing} />\n {message.parts?.filter(nonNullable).map((part, index) => <MessagePart key={index} part={part} />)}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return (\n <Mosaic.Container id={part.id}>\n <Mosaic.DraggableTile type={THREAD_ITEM} path={part.id} item={part} Component={MessageBlockObjectTile} />\n </Mosaic.Container>\n );\n};\n\nconst TextboxBlock = ({\n message,\n isAuthor,\n editing,\n}: {\n message: MessageType;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(message.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n message.text = inMemoryContentRef.current;\n }, [message]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: message.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 [message.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n useOnEditAnalytics(message, !!editing);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile: MosaicTileComponent<EchoReactiveObject<any>> = forwardRef(\n ({ draggableStyle, draggableProps, item, active, ...props }, forwardedRef) => {\n let title = item.name ?? item.title ?? item.__typename ?? '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 style={draggableStyle}\n ref={forwardedRef}\n >\n <DensityProvider density='fine'>\n <Surface\n role='card'\n limit={1}\n data={{ content: item }}\n draggableProps={draggableProps}\n fallback={title}\n {...props}\n />\n </DensityProvider>\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, tagRoot } 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 {\n tag: tags.tagName,\n class: mx(tagRoot({ palette: 'cyan' }), 'text-baseText font-medium'),\n },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.identityKey.toHex(),\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["useEffect", "useState", "useStatus", "space", "channel", "processing", "setProcessing", "useState", "useEffect", "unsubscribe", "listen", "status", "event", "payload", "t", "setInterval", "prev", "ts", "Date", "now", "undefined", "clearInterval", "useCallback", "useIntentDispatcher", "ObservabilityAction", "getSpace", "useOnTransition", "useAnalyticsCallback", "spaceId", "name", "meta", "dispatch", "useIntentDispatcher", "useCallback", "dynamicMeta", "action", "ObservabilityAction", "SEND_EVENT", "data", "properties", "useOnEditAnalytics", "message", "editing", "space", "getSpace", "onEditAnalytics", "id", "messageId", "messageLength", "text", "length", "useOnTransition", "Chat", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "create", "MessageType", "getSpace", "useMembers", "useIdentity", "ScrollArea", "useThemeContext", "useTranslation", "PlankHeading", "plankHeadingIconProps", "createBasicExtensions", "createThemeExtensions", "listener", "mx", "MessageTextbox", "Thread", "ThreadFooter", "threadLayout", "nonNullable", "EditorView", "Check", "PencilSimple", "X", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "PublicKey", "useIdentity", "Button", "ButtonGroup", "DensityProvider", "Tooltip", "useOnTransition", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "Mosaic", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageHeading", "MessageRoot", "nonNullable", "StreamLanguage", "HighlightStyle", "syntaxHighlighting", "tags", "mx", "tagRoot", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "tagRoot", "palette", "command", "syntaxHighlighting", "generateName", "hexToFallback", "getMessageMetadata", "id", "identity", "fallback", "hexToFallback", "identityKey", "toHex", "authorId", "authorName", "profile", "displayName", "generateName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "messageControlClassNames", "hoverableControlItem", "MessageContainer", "message", "members", "onDelete", "senderIdentity", "find", "member", "sender", "identityKey", "PublicKey", "equals", "identity", "messageMetadata", "getMessageMetadata", "id", "userIsAuthor", "useIdentity", "toHex", "authorId", "editing", "setEditing", "useState", "handleDelete", "useCallback", "t", "useTranslation", "THREAD_PLUGIN", "editLabel", "deleteLabel", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "ButtonGroup", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "span", "className", "Check", "getSize", "PencilSimple", "Portal", "Content", "Arrow", "X", "TextboxBlock", "isAuthor", "parts", "filter", "nonNullable", "map", "part", "index", "MessagePart", "key", "Mosaic", "Container", "DraggableTile", "type", "THREAD_ITEM", "path", "item", "Component", "MessageBlockObjectTile", "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", "useOnEditAnalytics", "div", "role", "ref", "forwardRef", "draggableStyle", "draggableProps", "active", "props", "forwardedRef", "title", "name", "__typename", "content", "mx", "style", "DensityProvider", "density", "Surface", "limit", "data", "fallback", "ChatHeading", "attendableId", "t", "useTranslation", "THREAD_PLUGIN", "React", "div", "role", "className", "PlankHeading", "Button", "Chat", "plankHeadingIconProps", "Label", "ChatContainer", "thread", "context", "current", "autoFocusTextbox", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "activity", "useStatus", "id", "_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", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "handleDelete", "messageIndex", "filter", "nonNullable", "findIndex", "message", "splice", "Thread", "classNames", "ScrollArea", "Root", "Viewport", "mx", "threadLayout", "map", "MessageContainer", "onDelete", "ref", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "ThreadFooter"]
7
7
  }
@@ -10,7 +10,7 @@ import {
10
10
  useAnalyticsCallback,
11
11
  useOnEditAnalytics,
12
12
  useStatus
13
- } from "./chunk-CQ2RYETH.mjs";
13
+ } from "./chunk-P7ZE5N5M.mjs";
14
14
  import {
15
15
  THREAD_ITEM,
16
16
  THREAD_PLUGIN,
@@ -269,7 +269,7 @@ var CommentsContainer = ({ threads, detached = [], currentId, autoFocusCurrentTe
269
269
  role: "alert",
270
270
  className: mx2(descriptionText, "place-self-center border border-dashed border-neutral-400/50 rounded-lg text-center p-4 m-4")
271
271
  }, /* @__PURE__ */ React3.createElement("h2", {
272
- className: "mbe-2 font-medium text-base"
272
+ className: "mbe-2 font-medium text-baseText"
273
273
  }, t("no comments title")), /* @__PURE__ */ React3.createElement("p", null, /* @__PURE__ */ React3.createElement(Trans, {
274
274
  t,
275
275
  i18nKey: "no comments message",
@@ -282,8 +282,8 @@ var CommentsContainer = ({ threads, detached = [], currentId, autoFocusCurrentTe
282
282
  };
283
283
 
284
284
  // packages/plugins/plugin-thread/src/components/index.ts
285
- var ThreadMain = React4.lazy(() => import("./ThreadMain-VV7MGQZJ.mjs"));
286
- var ThreadArticle = React4.lazy(() => import("./ThreadArticle-J4VCLPMS.mjs"));
285
+ var ThreadMain = React4.lazy(() => import("./ThreadMain-ZDCRC6RG.mjs"));
286
+ var ThreadArticle = React4.lazy(() => import("./ThreadArticle-O64ZECMF.mjs"));
287
287
 
288
288
  // packages/plugins/plugin-thread/src/translations.ts
289
289
  var translations_default = [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ThreadPlugin.tsx", "../../../src/components/index.ts", "../../../src/components/ThreadSettings.tsx", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/translations.ts", "../../../src/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Chat, type IconProps } from '@phosphor-icons/react';\nimport { computed, effect } from '@preact/signals-core';\nimport React from 'react';\n\nimport {\n type IntentPluginProvides,\n LayoutAction,\n NavigationAction,\n type LocationProvides,\n type Plugin,\n type PluginDefinition,\n parseIntentPlugin,\n parseNavigationPlugin,\n resolvePlugin,\n parseGraphPlugin,\n SLUG_PATH_SEPARATOR,\n SLUG_COLLECTION_INDICATOR,\n isLayoutParts,\n parseMetadataResolverPlugin,\n type IntentDispatcher,\n} from '@dxos/app-framework';\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport { type EchoReactiveObject, getTypename } from '@dxos/echo-schema';\nimport { create } from '@dxos/echo-schema';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { type AttentionPluginProvides, parseAttentionPlugin } from '@dxos/plugin-attention';\nimport { parseClientPlugin } from '@dxos/plugin-client';\nimport { type ActionGroup, createExtension, isActionGroup } from '@dxos/plugin-graph';\nimport { DocumentType } from '@dxos/plugin-markdown/types';\nimport { ObservabilityAction } from '@dxos/plugin-observability/meta';\nimport { SpaceAction } from '@dxos/plugin-space';\nimport { ThreadType, MessageType, ChannelType } from '@dxos/plugin-space/types';\nimport {\n getSpace,\n getTextInRange,\n Filter,\n createDocAccessor,\n fullyQualifiedId,\n getRangeFromCursor,\n loadObjectReferences,\n} from '@dxos/react-client/echo';\nimport { ScrollArea } from '@dxos/react-ui';\nimport { createAttendableAttributes } from '@dxos/react-ui-attention';\nimport { comments, createExternalCommentSync, listener } from '@dxos/react-ui-editor';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport {\n ThreadMain,\n ThreadSettings,\n CommentsContainer,\n CommentsHeading,\n ChatContainer,\n ChatHeading,\n ThreadArticle,\n} from './components';\nimport meta, { THREAD_ITEM, THREAD_PLUGIN } from './meta';\nimport translations from './translations';\nimport { ThreadAction, type ThreadPluginProvides, type ThreadSettingsProps } from './types';\n\ntype ThreadState = {\n staging: Record<string, ThreadType[]>;\n current?: string | undefined;\n focus?: boolean;\n};\n\ntype SubjectId = string;\nconst initialViewState = { showResolvedThreads: false };\ntype ViewStore = Record<SubjectId, typeof initialViewState>;\n\nexport const ThreadPlugin = (): PluginDefinition<ThreadPluginProvides> => {\n const settings = new LocalStorageStore<ThreadSettingsProps>(THREAD_PLUGIN);\n const state = create<ThreadState>({ staging: {} });\n\n const viewStore = create<ViewStore>({});\n const getViewState = (subjectId: string) => {\n if (!viewStore[subjectId]) {\n viewStore[subjectId] = { ...initialViewState };\n }\n return viewStore[subjectId];\n };\n\n let attentionPlugin: Plugin<AttentionPluginProvides> | undefined;\n let navigationPlugin: Plugin<LocationProvides> | undefined;\n let intentPlugin: Plugin<IntentPluginProvides> | undefined;\n let dispatch: IntentDispatcher | undefined;\n\n const unsubscribeCallbacks = [] as UnsubscribeCallback[];\n\n return {\n meta,\n ready: async (plugins) => {\n settings.prop({ key: 'standalone', type: LocalStorageStore.bool({ allowUndefined: true }) });\n\n attentionPlugin = resolvePlugin(plugins, parseAttentionPlugin);\n navigationPlugin = resolvePlugin(plugins, parseNavigationPlugin);\n intentPlugin = resolvePlugin(plugins, parseIntentPlugin)!;\n dispatch = intentPlugin?.provides.intent.dispatch;\n\n const graphPlugin = resolvePlugin(plugins, parseGraphPlugin);\n const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;\n if (!client) {\n return;\n }\n\n // TODO(wittjosiah): This is a hack to make standalone threads work in the c11y sidebar.\n // This should have a better solution when deck is introduced.\n const channelsQuery = client.spaces.query(Filter.schema(ChannelType));\n const queryUnsubscribe = channelsQuery.subscribe();\n const unsubscribe = effect(() => {\n const attention = attentionPlugin?.provides.attention;\n if (!attention?.attended) {\n return;\n }\n\n const firstAttendedNodeWithComments = Array.from(attention.attended)\n .map((id) => graphPlugin?.provides.graph.findNode(id))\n .find((node) => node?.data instanceof DocumentType && (node.data.threads?.length ?? 0) > 0);\n\n if (firstAttendedNodeWithComments) {\n void intentPlugin?.provides.intent.dispatch({\n action: NavigationAction.OPEN,\n data: {\n activeParts: {\n complementary: `${firstAttendedNodeWithComments.id}${SLUG_PATH_SEPARATOR}comments`,\n },\n },\n });\n }\n });\n\n unsubscribeCallbacks.push(queryUnsubscribe);\n unsubscribeCallbacks.push(unsubscribe);\n },\n unload: async () => {\n unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());\n },\n provides: {\n settings: settings.values,\n metadata: {\n records: {\n [ChannelType.typename]: {\n placeholder: ['channel title placeholder', { ns: THREAD_PLUGIN }],\n icon: (props: IconProps) => <Chat {...props} />,\n iconSymbol: 'ph--chat--regular',\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (channel: ChannelType) => loadObjectReferences(channel, (channel) => channel.threads),\n },\n [ThreadType.typename]: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (thread: ThreadType) => loadObjectReferences(thread, (thread) => thread.messages),\n },\n [MessageType.typename]: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (message: MessageType) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),\n },\n [THREAD_ITEM]: {\n parse: (item: EchoReactiveObject<any>, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.title, data: item };\n case 'object':\n return item;\n case 'view-object':\n return { id: `${item.id}-view`, object: item };\n }\n },\n },\n },\n },\n translations: [...translations, ...threadTranslations],\n echo: { schema: [ChannelType, ThreadType, MessageType] },\n graph: {\n builder: (plugins) => {\n const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;\n const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatch;\n const metadataResolver = resolvePlugin(plugins, parseMetadataResolverPlugin)?.provides.metadata.resolver;\n\n if (!client || !dispatch || !metadataResolver) {\n return [];\n }\n\n return [\n createExtension({\n id: `${THREAD_PLUGIN}/comments-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~comments')) {\n return;\n }\n\n // TODO(Zan): Find util (or make one)\n const docId = id.split('~').at(0);\n const [spaceId, objectId] = docId?.split(':') ?? [];\n const space = client.spaces.get().find((space) => space.id === spaceId);\n const doc = space?.db.getObjectById(objectId);\n\n if (!doc || !docId) {\n return;\n }\n\n const docMeta = metadataResolver(getTypename(doc) ?? '');\n const label = docMeta.label?.(doc) ||\n doc.name ||\n docMeta.placeholder || ['unnamed object threads label', { ns: THREAD_PLUGIN }];\n // const label = docMeta.label?.(doc) || doc.name || docMeta.placeholder;\n\n const viewState = getViewState(docId);\n\n return {\n id,\n type: 'orphan-comments-for-subject',\n data: doc,\n properties: {\n icon: meta.iconComponent,\n label,\n showResolvedThreads: viewState.showResolvedThreads,\n },\n };\n },\n actions: ({ node }) => {\n const dataId = node.id.split('~').at(0);\n\n if (!node.id.endsWith('~comments') || !dataId) {\n return;\n }\n\n const [spaceId, objectId] = dataId.split(':');\n\n const viewState = getViewState(dataId);\n const toggle = () => {\n const newToggleState = !viewState.showResolvedThreads;\n viewState.showResolvedThreads = newToggleState;\n void dispatch({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.toggle-show-resolved',\n properties: { spaceId, threadId: objectId, showResolved: newToggleState },\n },\n });\n };\n\n return [\n {\n id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,\n data: toggle,\n properties: {\n label: ['toggle show resolved', { ns: THREAD_PLUGIN }],\n menuItemType: 'toggle',\n isChecked: viewState.showResolvedThreads,\n testId: 'threadPlugin.toggleShowResolved',\n },\n },\n ];\n },\n }),\n createExtension({\n id: ThreadAction.CREATE,\n filter: (node): node is ActionGroup =>\n !!settings.values.standalone && isActionGroup(node) && node.id.startsWith(SpaceAction.ADD_OBJECT),\n actions: ({ node }) => {\n const id = node.id.split('/').at(-1);\n const [spaceId, objectId] = id?.split(':') ?? [];\n const space = client.spaces.get().find((space) => space.id === spaceId);\n const object = objectId && space?.db.getObjectById(objectId);\n const target = objectId ? object : space;\n if (!target) {\n return;\n }\n\n return [\n {\n id: `${THREAD_PLUGIN}/create/${node.id}`,\n data: async () => {\n await dispatch([\n { plugin: THREAD_PLUGIN, action: ThreadAction.CREATE },\n { action: SpaceAction.ADD_OBJECT, data: { target } },\n { action: NavigationAction.OPEN },\n ]);\n },\n properties: {\n label: ['create channel label', { ns: THREAD_PLUGIN }],\n icon: (props: IconProps) => <Chat {...props} />,\n iconSymbol: 'ph--chat--regular',\n testId: 'threadPlugin.createObject',\n },\n },\n ];\n },\n }),\n ];\n },\n },\n surface: {\n component: ({ data, role }) => {\n switch (role) {\n case 'main': {\n return data.active instanceof ChannelType && data.active.threads[0] ? (\n <ThreadMain thread={data.active.threads[0]} />\n ) : null;\n }\n\n case 'settings': {\n return data.plugin === meta.id ? <ThreadSettings settings={settings.values} /> : null;\n }\n\n case 'article':\n case 'complementary': {\n const location = navigationPlugin?.provides.location;\n\n if (data.object instanceof ChannelType && data.object.threads[0]) {\n const channel = data.object;\n // TODO(zan): Maybe we should have utility for positional main object ids.\n if (isLayoutParts(location?.active) && location.active.main) {\n const layoutEntries = location.active.main;\n\n const currentPosition = layoutEntries.findIndex((entry) => channel.id === entry.id);\n\n if (currentPosition > 0) {\n const objectToTheLeft = layoutEntries[currentPosition - 1];\n const context = getSpace(data.object)?.db.getObjectById(objectToTheLeft.id);\n return <ThreadArticle thread={data.object.threads[0]} context={context} />;\n }\n }\n\n return <ThreadArticle thread={data.object.threads[0]} />;\n }\n\n if (data.subject instanceof DocumentType) {\n const doc = data.subject;\n const accessor = doc.content ? createDocAccessor(doc.content, ['content']) : undefined;\n\n if (!accessor) {\n return null;\n }\n\n const getStartPosition = (cursor: string | undefined) => {\n const range = cursor ? getRangeFromCursor(accessor, cursor) : undefined;\n return range?.start ?? Number.MAX_SAFE_INTEGER;\n };\n\n const threads = doc.threads\n .concat(state.staging[data.subject.id])\n .filter(nonNullable)\n .sort((a, b) => getStartPosition(a.anchor) - getStartPosition(b.anchor));\n\n const detached = data.subject.threads\n .filter(nonNullable)\n .filter(({ anchor }) => !anchor)\n .map((thread) => thread.id);\n\n const qualifiedSubjectId = fullyQualifiedId(doc);\n const attention = attentionPlugin?.provides.attention?.attended ?? new Set([qualifiedSubjectId]);\n const attendableAttrs = createAttendableAttributes(qualifiedSubjectId);\n const space = getSpace(doc);\n const { showResolvedThreads } = getViewState(qualifiedSubjectId);\n\n const dispatchAnalytic = (name: string, meta: any) => {\n void dispatch?.({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name,\n properties: { ...meta, space: space?.id },\n },\n });\n };\n\n return (\n <div role='none' className='contents group/attention' {...attendableAttrs}>\n {role === 'complementary' && <CommentsHeading attendableId={qualifiedSubjectId} />}\n <ScrollArea.Root classNames='row-span-2'>\n <ScrollArea.Viewport>\n <CommentsContainer\n threads={threads}\n detached={detached}\n currentId={attention.has(qualifiedSubjectId) ? state.current : undefined}\n autoFocusCurrentTextbox={state.focus}\n showResolvedThreads={showResolvedThreads}\n onThreadAttend={(thread) => {\n if (state.current !== thread.id) {\n state.current = thread.id;\n void dispatch?.({\n action: LayoutAction.SCROLL_INTO_VIEW,\n data: {\n id: fullyQualifiedId(data.subject!),\n thread: fullyQualifiedId(thread),\n cursor: thread.anchor,\n },\n });\n }\n }}\n onThreadDelete={(thread) =>\n dispatch?.({\n plugin: THREAD_PLUGIN,\n action: ThreadAction.DELETE,\n data: { document: data.subject, thread },\n })\n }\n onMessageDelete={(thread, messageId) =>\n dispatch?.({\n plugin: THREAD_PLUGIN,\n action: ThreadAction.DELETE_MESSAGE,\n data: { document: data.subject, thread, messageId },\n })\n }\n onThreadToggleResolved={(thread) =>\n dispatch?.({\n plugin: THREAD_PLUGIN,\n action: ThreadAction.TOGGLE_RESOLVED,\n data: { thread },\n })\n }\n onComment={(thread) => {\n // TODO(Zan): This might be a bit too much logic for a component. Move to intents?\n const doc = data.subject as DocumentType;\n if (state.staging[doc.id]?.find((t) => t === thread)) {\n // Move thread from staging to document.\n thread.status = 'active';\n doc.threads ? doc.threads.push(thread) : (doc.threads = [thread]);\n state.staging[doc.id] = state.staging[doc.id]?.filter((t) => t.id !== thread.id);\n dispatchAnalytic('threads.thread-created', { threadId: thread.id });\n }\n\n dispatchAnalytic('threads.message-added', {\n threadId: thread.id,\n threadLength: thread.messages.length,\n });\n }}\n />\n <div role='none' className='bs-10' />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </div>\n );\n } else if (data.subject instanceof ThreadType) {\n return (\n <>\n <ChatHeading attendableId={data.subject.id} />\n <ChatContainer thread={data.subject} />\n </>\n );\n }\n }\n }\n\n return null;\n },\n },\n intent: {\n resolver: async (intent) => {\n switch (intent.action) {\n case ThreadAction.CREATE: {\n return { data: create(ChannelType, { threads: [create(ThreadType, { messages: [] })] }) };\n }\n\n case ThreadAction.SELECT: {\n state.focus = intent.data?.current === state.current ? state.focus : intent.data?.focus;\n state.current = intent.data?.current;\n return { data: true };\n }\n\n case ThreadAction.TOGGLE_RESOLVED: {\n const { thread } = intent.data ?? {};\n if (!(thread instanceof ThreadType)) {\n return;\n }\n\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 const spaceId = space?.id;\n\n return {\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.toggle-resolved', properties: { threadId: thread.id, spaceId } },\n },\n ],\n ],\n };\n }\n\n case ThreadAction.DELETE: {\n const { document: doc, thread } = intent.data ?? {};\n if (!(doc instanceof DocumentType) || !(thread instanceof ThreadType)) {\n return;\n }\n\n const stagingArea = state.staging[doc.id];\n if (stagingArea) {\n // Check if we're deleting a thread that's in the staging area.\n // If so, remove it from the staging area without ceremony.\n const index = state.staging[doc.id]?.findIndex((t) => t.id === thread.id);\n if (index !== -1) {\n state.staging[doc.id]?.splice(index, 1);\n return;\n }\n }\n\n const space = getSpace(thread);\n if (!space || !doc.threads) {\n return;\n }\n\n if (!intent.undo) {\n const index = doc.threads.findIndex((t) => t?.id === thread.id);\n const cursor = doc.threads[index]?.anchor;\n if (index !== -1) {\n doc.threads?.splice(index, 1);\n }\n\n space.db.remove(thread);\n\n return {\n undoable: {\n message: translations[0]['en-US'][THREAD_PLUGIN]['thread deleted label'],\n data: { cursor },\n },\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.delete', properties: { threadId: thread.id, spaceId: space.id } },\n },\n ],\n ],\n };\n } else if (intent.undo) {\n // TODO(wittjosiah): SDK should do this automatically.\n const savedThread = space.db.add(thread);\n doc.threads.push(savedThread);\n\n return {\n data: true,\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.undo-delete', properties: { threadId: thread.id, spaceId: space.id } },\n },\n ],\n ],\n };\n }\n break;\n }\n case ThreadAction.DELETE_MESSAGE: {\n const { document: doc, thread, messageId } = intent.data ?? {};\n const space = getSpace(doc);\n\n if (!(doc instanceof DocumentType) || !(thread instanceof ThreadType) || !space) {\n return;\n }\n\n if (!intent.undo) {\n const message = thread.messages.find((m) => m?.id === messageId);\n const messageIndex = thread.messages.findIndex((m) => m?.id === messageId);\n if (messageIndex === -1 || !message) {\n return undefined;\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: [[{ action: ThreadAction.DELETE, data: { document: doc, thread } }]],\n };\n } else {\n thread.messages.splice(messageIndex, 1);\n }\n\n return {\n undoable: {\n message: translations[0]['en-US'][THREAD_PLUGIN]['message deleted label'],\n data: { message, messageIndex },\n },\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message.delete',\n properties: { threadId: thread.id, spaceId: space.id },\n },\n },\n ],\n ],\n };\n } else if (intent.undo) {\n const message = intent.data?.message;\n const messageIndex = intent.data?.messageIndex;\n\n if (!(message instanceof MessageType) || !(typeof messageIndex === 'number')) {\n return;\n }\n\n thread.messages.splice(messageIndex, 0, message);\n\n return {\n data: true,\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message.undo-delete',\n properties: { threadId: thread.id, spaceId: space.id },\n },\n },\n ],\n ],\n };\n }\n }\n }\n },\n },\n markdown: {\n // TODO(burdon): Factor out extension factory into separate file (for simplicity).\n extensions: ({ document: doc }) => {\n const space = doc && getSpace(doc);\n if (!doc || !space) {\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 // TODO(Zan): When we have the deepsignal specific equivalent of this we should use that instead.\n const threads = computed(() =>\n [...doc.threads.filter(nonNullable), ...(state.staging[doc.id] ?? [])].filter(\n (thread) => !(thread?.status === 'resolved'),\n ),\n );\n\n return [\n listener({\n onChange: () => {\n doc.threads.forEach((thread) => {\n if (thread?.anchor) {\n const [start, end] = thread.anchor.split(':');\n const name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n // TODO(burdon): This seems unsafe; review.\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 if (name && name !== thread.name) {\n thread.name = name;\n }\n }\n });\n },\n }),\n createExternalCommentSync(\n doc.id,\n (sink) => effect(() => sink()),\n () =>\n threads.value\n .filter((thread) => thread?.anchor)\n .map((thread) => ({ id: thread.id, cursor: thread.anchor! })),\n ),\n comments({\n id: doc.id,\n onCreate: ({ cursor }) => {\n const [start, end] = cursor.split(':');\n const name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n const thread = create(ThreadType, { name, anchor: cursor, messages: [], status: 'staged' });\n\n const stagingArea = state.staging[doc.id];\n if (stagingArea) {\n stagingArea.push(thread);\n } else {\n state.staging[doc.id] = [thread];\n }\n\n void intentPlugin?.provides.intent.dispatch([\n {\n action: NavigationAction.OPEN,\n data: {\n activeParts: {\n complementary: `${fullyQualifiedId(doc)}${SLUG_PATH_SEPARATOR}comments${SLUG_COLLECTION_INDICATOR}`,\n },\n },\n },\n {\n action: ThreadAction.SELECT,\n data: { current: thread.id, focus: true },\n },\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'complementary',\n subject: doc,\n state: true,\n },\n },\n ]);\n\n return thread.id;\n },\n onDelete: ({ id }) => {\n // If the thread is in the staging area, remove it.\n const stagingArea = state.staging[doc.id];\n if (stagingArea) {\n const index = stagingArea.findIndex((thread) => thread.id === id);\n if (index !== -1) {\n stagingArea.splice(index, 1);\n }\n }\n\n const thread = doc.threads.find((thread) => thread?.id === id);\n if (thread) {\n thread.anchor = undefined;\n }\n },\n onUpdate: ({ id, cursor }) => {\n const thread =\n state.staging[doc.id]?.find((thread) => thread.id === id) ??\n doc.threads.find((thread) => thread?.id === id);\n\n if (thread instanceof ThreadType && thread.anchor) {\n const [start, end] = thread.anchor.split(':');\n thread.name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n thread.anchor = cursor;\n }\n },\n onSelect: ({ selection: { current, closest } }) => {\n const dispatch = intentPlugin?.provides.intent.dispatch;\n if (dispatch) {\n void dispatch([{ action: ThreadAction.SELECT, data: { current: current ?? closest } }]);\n }\n },\n }),\n ];\n },\n },\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// Lazily load components for content surfaces.\nexport const ThreadMain = React.lazy(() => import('./ThreadMain'));\nexport const ThreadArticle = React.lazy(() => import('./ThreadArticle'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './ThreadSettings';\nexport * from './CommentContainer';\nexport * from './MessageContainer';\nexport * from './CommentsContainer';\nexport * from './ChatContainer';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { SettingsValue } from '@dxos/plugin-settings';\nimport { Input, useTranslation } from '@dxos/react-ui';\n\nimport { 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 (\n <>\n <SettingsValue label={t('settings standalone label')}>\n <Input.Switch checked={settings.standalone} onCheckedChange={(checked) => (settings.standalone = !!checked)} />\n </SettingsValue>\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { create } from '@dxos/echo-schema';\nimport { MessageType } from '@dxos/plugin-space/types';\nimport { 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 { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, ThreadHeading } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nconst sizeClass = getSize(4);\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.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={['min-bs-0 p-1', !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 <Tooltip.Portal>\n <Tooltip.Content classNames={'z-[21]'}>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\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.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={['min-bs-0 p-1', hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport const CommentContainer = ({\n thread,\n detached,\n context,\n current,\n autoFocusTextbox,\n onAttend,\n onThreadDelete,\n onMessageDelete,\n onResolve,\n onComment,\n}: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\n const activity = useStatus(space, thread.id);\n const { t } = useTranslation(THREAD_PLUGIN);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const [autoFocus, setAutoFocus] = useState(!!autoFocusTextbox);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(thread.id, 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): Because of the way the `autoFocus` property is handled by TextEditor,\n // this is the least-bad way of moving focus at the right time, though it is an anti-pattern.\n // Refactor to behave more like <input/>’s `autoFocus` or `autofocus` (yes, they’re different).\n useEffect(() => {\n setAutoFocus(!!autoFocusTextbox);\n }, [autoFocusTextbox]);\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleCreate: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n thread.messages.push(\n create(MessageType, {\n sender: { identityKey: identity.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: messageRef.current,\n context,\n }),\n );\n onComment?.(thread);\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('instant');\n rerenderEditor();\n\n // TODO(burdon): Scroll to bottom.\n return true;\n }, [thread, identity]);\n\n const handleDeleteMessage = (id: string) => onMessageDelete?.(id);\n\n return (\n <Thread onClickCapture={onAttend} onFocusCapture={onAttend} current={current} id={thread.id}>\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.Root>\n <Tooltip.Trigger asChild>\n <ThreadHeading detached>{thread.name ?? t('thread title placeholder')}</ThreadHeading>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]' side='top'>\n {t('detached thread label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : (\n <ThreadHeading>{thread.name ?? t('thread title placeholder')}</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={onResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={onThreadDelete} />}\n </div>\n </div>\n {thread.messages.filter(nonNullable).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleDeleteMessage} />\n ))}\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...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, Quotes } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { useTranslation, Trans } from '@dxos/react-ui';\nimport { PlankHeading, plankHeadingIconProps } from '@dxos/react-ui-deck';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { CommentContainer } from './CommentContainer';\nimport { type ThreadContainerProps } from './types';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type ThreadsContainerProps = Omit<\n ThreadContainerProps,\n 'thread' | 'detached' | 'onAttend' | 'onThreadDelete' | 'onMessageDelete' | 'current' | 'autoFocus'\n> & {\n threads: ThreadType[];\n /**\n * Threads that are no longer anchored to a position in the object.\n */\n detached?: string[];\n currentId?: string;\n autoFocusCurrentTextbox?: boolean;\n showResolvedThreads?: boolean;\n onThreadAttend?: (thread: ThreadType) => void;\n onThreadDelete?: (thread: ThreadType) => void;\n onMessageDelete?: (thread: ThreadType, messageId: string) => void;\n onThreadToggleResolved?: (thread: ThreadType) => void;\n onComment?: (thread: ThreadType) => void;\n};\n\nexport const CommentsHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n\n return (\n <div role='none' className='flex items-center'>\n <PlankHeading.Button attendableId={attendableId}>\n <Quotes {...plankHeadingIconProps} />\n </PlankHeading.Button>\n <PlankHeading.Label attendableId={attendableId}>{t('comments heading')}</PlankHeading.Label>\n </div>\n );\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({\n threads,\n detached = [],\n currentId,\n autoFocusCurrentTextbox,\n showResolvedThreads,\n onThreadAttend,\n onThreadDelete,\n onMessageDelete,\n onThreadToggleResolved,\n ...props\n}: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === 'resolved'));\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredThreads.length > 0 ? (\n filteredThreads.map((thread) => (\n <CommentContainer\n key={thread.id}\n thread={thread}\n current={currentId === thread.id}\n detached={detached.includes(thread.id)}\n autoFocusTextbox={autoFocusCurrentTextbox && currentId === thread.id}\n {...(onThreadAttend && { onAttend: () => onThreadAttend(thread) })}\n {...(onThreadDelete && { onThreadDelete: () => onThreadDelete(thread) })}\n {...(onMessageDelete && { onMessageDelete: (messageId: string) => onMessageDelete(thread, messageId) })}\n {...(onThreadToggleResolved && { onResolve: () => onThreadToggleResolved(thread) })}\n {...props}\n />\n ))\n ) : (\n <div\n role='alert'\n className={mx(\n descriptionText,\n 'place-self-center border border-dashed border-neutral-400/50 rounded-lg text-center p-4 m-4',\n )}\n >\n <h2 className='mbe-2 font-medium text-base'>{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 { THREAD_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [THREAD_PLUGIN]: {\n 'plugin name': 'Threads',\n 'channel name placeholder': 'New channel',\n 'channel title label': 'Title',\n 'delete channel label': 'Delete channel',\n 'create channel label': 'Create channel',\n 'message placeholder': 'Reply…',\n 'settings standalone label': 'Enable channel creation (experimental)',\n 'activity message': 'Processing…',\n 'anonymous label': 'Anonymous',\n 'delete message block label': 'Delete message block',\n 'detached thread label': 'Referenced content was removed',\n 'delete thread label': 'Delete thread',\n 'thread deleted label': 'You deleted a thread.',\n 'message deleted label': 'You deleted a message.',\n 'comments heading': 'Comments',\n 'chat heading': 'Chat',\n 'draft button': 'DRAFT',\n 'no comments title': 'No comments (yet)',\n 'no comments message':\n 'To start a comment thread, select a range of text in a document and click the <commentIcon></commentIcon> Create comment button in the toolbar.',\n 'toggle show resolved': 'Show resolved',\n 'unnamed object threads label': 'Threads',\n 'mark as resolved label': 'Mark as resolved',\n 'mark as unresolved label': 'Mark as unresolved',\n 'save message label': 'Save',\n 'edit message label': 'Edit',\n 'delete message label': 'Delete message',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ThreadPlugin } from './ThreadPlugin';\n\nexport default ThreadPlugin;\n\nexport * from './hooks';\nexport * from './types';\n\nexport * from './ThreadPlugin';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Chat, type IconProps } from '@phosphor-icons/react';\nimport { computed, effect } from '@preact/signals-core';\nimport React from 'react';\n\nimport {\n type IntentPluginProvides,\n LayoutAction,\n NavigationAction,\n type LocationProvides,\n type Plugin,\n type PluginDefinition,\n parseIntentPlugin,\n parseNavigationPlugin,\n resolvePlugin,\n parseGraphPlugin,\n SLUG_PATH_SEPARATOR,\n SLUG_COLLECTION_INDICATOR,\n isLayoutParts,\n parseMetadataResolverPlugin,\n type IntentDispatcher,\n} from '@dxos/app-framework';\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport { type EchoReactiveObject, getTypename } from '@dxos/echo-schema';\nimport { create } from '@dxos/echo-schema';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { type AttentionPluginProvides, parseAttentionPlugin } from '@dxos/plugin-attention';\nimport { parseClientPlugin } from '@dxos/plugin-client';\nimport { type ActionGroup, createExtension, isActionGroup } from '@dxos/plugin-graph';\nimport { DocumentType } from '@dxos/plugin-markdown/types';\nimport { ObservabilityAction } from '@dxos/plugin-observability/meta';\nimport { SpaceAction } from '@dxos/plugin-space';\nimport { ThreadType, MessageType, ChannelType } from '@dxos/plugin-space/types';\nimport {\n getSpace,\n getTextInRange,\n Filter,\n createDocAccessor,\n fullyQualifiedId,\n getRangeFromCursor,\n loadObjectReferences,\n} from '@dxos/react-client/echo';\nimport { ScrollArea } from '@dxos/react-ui';\nimport { createAttendableAttributes } from '@dxos/react-ui-attention';\nimport { comments, createExternalCommentSync, listener } from '@dxos/react-ui-editor';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport {\n ThreadMain,\n ThreadSettings,\n CommentsContainer,\n CommentsHeading,\n ChatContainer,\n ChatHeading,\n ThreadArticle,\n} from './components';\nimport meta, { THREAD_ITEM, THREAD_PLUGIN } from './meta';\nimport translations from './translations';\nimport { ThreadAction, type ThreadPluginProvides, type ThreadSettingsProps } from './types';\n\ntype ThreadState = {\n staging: Record<string, ThreadType[]>;\n current?: string | undefined;\n focus?: boolean;\n};\n\ntype SubjectId = string;\nconst initialViewState = { showResolvedThreads: false };\ntype ViewStore = Record<SubjectId, typeof initialViewState>;\n\nexport const ThreadPlugin = (): PluginDefinition<ThreadPluginProvides> => {\n const settings = new LocalStorageStore<ThreadSettingsProps>(THREAD_PLUGIN);\n const state = create<ThreadState>({ staging: {} });\n\n const viewStore = create<ViewStore>({});\n const getViewState = (subjectId: string) => {\n if (!viewStore[subjectId]) {\n viewStore[subjectId] = { ...initialViewState };\n }\n return viewStore[subjectId];\n };\n\n let attentionPlugin: Plugin<AttentionPluginProvides> | undefined;\n let navigationPlugin: Plugin<LocationProvides> | undefined;\n let intentPlugin: Plugin<IntentPluginProvides> | undefined;\n let dispatch: IntentDispatcher | undefined;\n\n const unsubscribeCallbacks = [] as UnsubscribeCallback[];\n\n return {\n meta,\n ready: async (plugins) => {\n settings.prop({ key: 'standalone', type: LocalStorageStore.bool({ allowUndefined: true }) });\n\n attentionPlugin = resolvePlugin(plugins, parseAttentionPlugin);\n navigationPlugin = resolvePlugin(plugins, parseNavigationPlugin);\n intentPlugin = resolvePlugin(plugins, parseIntentPlugin)!;\n dispatch = intentPlugin?.provides.intent.dispatch;\n\n const graphPlugin = resolvePlugin(plugins, parseGraphPlugin);\n const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;\n if (!client) {\n return;\n }\n\n // TODO(wittjosiah): This is a hack to make standalone threads work in the c11y sidebar.\n // This should have a better solution when deck is introduced.\n const channelsQuery = client.spaces.query(Filter.schema(ChannelType));\n const queryUnsubscribe = channelsQuery.subscribe();\n const unsubscribe = effect(() => {\n const attention = attentionPlugin?.provides.attention;\n if (!attention?.attended) {\n return;\n }\n\n const firstAttendedNodeWithComments = Array.from(attention.attended)\n .map((id) => graphPlugin?.provides.graph.findNode(id))\n .find((node) => node?.data instanceof DocumentType && (node.data.threads?.length ?? 0) > 0);\n\n if (firstAttendedNodeWithComments) {\n void intentPlugin?.provides.intent.dispatch({\n action: NavigationAction.OPEN,\n data: {\n activeParts: {\n complementary: `${firstAttendedNodeWithComments.id}${SLUG_PATH_SEPARATOR}comments`,\n },\n },\n });\n }\n });\n\n unsubscribeCallbacks.push(queryUnsubscribe);\n unsubscribeCallbacks.push(unsubscribe);\n },\n unload: async () => {\n unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());\n },\n provides: {\n settings: settings.values,\n metadata: {\n records: {\n [ChannelType.typename]: {\n placeholder: ['channel title placeholder', { ns: THREAD_PLUGIN }],\n icon: (props: IconProps) => <Chat {...props} />,\n iconSymbol: 'ph--chat--regular',\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (channel: ChannelType) => loadObjectReferences(channel, (channel) => channel.threads),\n },\n [ThreadType.typename]: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (thread: ThreadType) => loadObjectReferences(thread, (thread) => thread.messages),\n },\n [MessageType.typename]: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (message: MessageType) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),\n },\n [THREAD_ITEM]: {\n parse: (item: EchoReactiveObject<any>, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.title, data: item };\n case 'object':\n return item;\n case 'view-object':\n return { id: `${item.id}-view`, object: item };\n }\n },\n },\n },\n },\n translations: [...translations, ...threadTranslations],\n echo: { schema: [ChannelType, ThreadType, MessageType] },\n graph: {\n builder: (plugins) => {\n const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;\n const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatch;\n const metadataResolver = resolvePlugin(plugins, parseMetadataResolverPlugin)?.provides.metadata.resolver;\n\n if (!client || !dispatch || !metadataResolver) {\n return [];\n }\n\n return [\n createExtension({\n id: `${THREAD_PLUGIN}/comments-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~comments')) {\n return;\n }\n\n // TODO(Zan): Find util (or make one)\n const docId = id.split('~').at(0);\n const [spaceId, objectId] = docId?.split(':') ?? [];\n const space = client.spaces.get().find((space) => space.id === spaceId);\n const doc = space?.db.getObjectById(objectId);\n\n if (!doc || !docId) {\n return;\n }\n\n const docMeta = metadataResolver(getTypename(doc) ?? '');\n const label = docMeta.label?.(doc) ||\n doc.name ||\n docMeta.placeholder || ['unnamed object threads label', { ns: THREAD_PLUGIN }];\n // const label = docMeta.label?.(doc) || doc.name || docMeta.placeholder;\n\n const viewState = getViewState(docId);\n\n return {\n id,\n type: 'orphan-comments-for-subject',\n data: doc,\n properties: {\n icon: meta.iconComponent,\n label,\n showResolvedThreads: viewState.showResolvedThreads,\n },\n };\n },\n actions: ({ node }) => {\n const dataId = node.id.split('~').at(0);\n\n if (!node.id.endsWith('~comments') || !dataId) {\n return;\n }\n\n const [spaceId, objectId] = dataId.split(':');\n\n const viewState = getViewState(dataId);\n const toggle = () => {\n const newToggleState = !viewState.showResolvedThreads;\n viewState.showResolvedThreads = newToggleState;\n void dispatch({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.toggle-show-resolved',\n properties: { spaceId, threadId: objectId, showResolved: newToggleState },\n },\n });\n };\n\n return [\n {\n id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,\n data: toggle,\n properties: {\n label: ['toggle show resolved', { ns: THREAD_PLUGIN }],\n menuItemType: 'toggle',\n isChecked: viewState.showResolvedThreads,\n testId: 'threadPlugin.toggleShowResolved',\n },\n },\n ];\n },\n }),\n createExtension({\n id: ThreadAction.CREATE,\n filter: (node): node is ActionGroup =>\n !!settings.values.standalone && isActionGroup(node) && node.id.startsWith(SpaceAction.ADD_OBJECT),\n actions: ({ node }) => {\n const id = node.id.split('/').at(-1);\n const [spaceId, objectId] = id?.split(':') ?? [];\n const space = client.spaces.get().find((space) => space.id === spaceId);\n const object = objectId && space?.db.getObjectById(objectId);\n const target = objectId ? object : space;\n if (!target) {\n return;\n }\n\n return [\n {\n id: `${THREAD_PLUGIN}/create/${node.id}`,\n data: async () => {\n await dispatch([\n { plugin: THREAD_PLUGIN, action: ThreadAction.CREATE },\n { action: SpaceAction.ADD_OBJECT, data: { target } },\n { action: NavigationAction.OPEN },\n ]);\n },\n properties: {\n label: ['create channel label', { ns: THREAD_PLUGIN }],\n icon: (props: IconProps) => <Chat {...props} />,\n iconSymbol: 'ph--chat--regular',\n testId: 'threadPlugin.createObject',\n },\n },\n ];\n },\n }),\n ];\n },\n },\n surface: {\n component: ({ data, role }) => {\n switch (role) {\n case 'main': {\n return data.active instanceof ChannelType && data.active.threads[0] ? (\n <ThreadMain thread={data.active.threads[0]} />\n ) : null;\n }\n\n case 'settings': {\n return data.plugin === meta.id ? <ThreadSettings settings={settings.values} /> : null;\n }\n\n case 'article':\n case 'complementary': {\n const location = navigationPlugin?.provides.location;\n\n if (data.object instanceof ChannelType && data.object.threads[0]) {\n const channel = data.object;\n // TODO(zan): Maybe we should have utility for positional main object ids.\n if (isLayoutParts(location?.active) && location.active.main) {\n const layoutEntries = location.active.main;\n\n const currentPosition = layoutEntries.findIndex((entry) => channel.id === entry.id);\n\n if (currentPosition > 0) {\n const objectToTheLeft = layoutEntries[currentPosition - 1];\n const context = getSpace(data.object)?.db.getObjectById(objectToTheLeft.id);\n return <ThreadArticle thread={data.object.threads[0]} context={context} />;\n }\n }\n\n return <ThreadArticle thread={data.object.threads[0]} />;\n }\n\n if (data.subject instanceof DocumentType) {\n const doc = data.subject;\n const accessor = doc.content ? createDocAccessor(doc.content, ['content']) : undefined;\n\n if (!accessor) {\n return null;\n }\n\n const getStartPosition = (cursor: string | undefined) => {\n const range = cursor ? getRangeFromCursor(accessor, cursor) : undefined;\n return range?.start ?? Number.MAX_SAFE_INTEGER;\n };\n\n const threads = doc.threads\n .concat(state.staging[data.subject.id])\n .filter(nonNullable)\n .sort((a, b) => getStartPosition(a.anchor) - getStartPosition(b.anchor));\n\n const detached = data.subject.threads\n .filter(nonNullable)\n .filter(({ anchor }) => !anchor)\n .map((thread) => thread.id);\n\n const qualifiedSubjectId = fullyQualifiedId(doc);\n const attention = attentionPlugin?.provides.attention?.attended ?? new Set([qualifiedSubjectId]);\n const attendableAttrs = createAttendableAttributes(qualifiedSubjectId);\n const space = getSpace(doc);\n const { showResolvedThreads } = getViewState(qualifiedSubjectId);\n\n const dispatchAnalytic = (name: string, meta: any) => {\n void dispatch?.({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name,\n properties: { ...meta, space: space?.id },\n },\n });\n };\n\n return (\n <div role='none' className='contents group/attention' {...attendableAttrs}>\n {role === 'complementary' && <CommentsHeading attendableId={qualifiedSubjectId} />}\n <ScrollArea.Root classNames='row-span-2'>\n <ScrollArea.Viewport>\n <CommentsContainer\n threads={threads}\n detached={detached}\n currentId={attention.has(qualifiedSubjectId) ? state.current : undefined}\n autoFocusCurrentTextbox={state.focus}\n showResolvedThreads={showResolvedThreads}\n onThreadAttend={(thread) => {\n if (state.current !== thread.id) {\n state.current = thread.id;\n void dispatch?.({\n action: LayoutAction.SCROLL_INTO_VIEW,\n data: {\n id: fullyQualifiedId(data.subject!),\n thread: fullyQualifiedId(thread),\n cursor: thread.anchor,\n },\n });\n }\n }}\n onThreadDelete={(thread) =>\n dispatch?.({\n plugin: THREAD_PLUGIN,\n action: ThreadAction.DELETE,\n data: { document: data.subject, thread },\n })\n }\n onMessageDelete={(thread, messageId) =>\n dispatch?.({\n plugin: THREAD_PLUGIN,\n action: ThreadAction.DELETE_MESSAGE,\n data: { document: data.subject, thread, messageId },\n })\n }\n onThreadToggleResolved={(thread) =>\n dispatch?.({\n plugin: THREAD_PLUGIN,\n action: ThreadAction.TOGGLE_RESOLVED,\n data: { thread },\n })\n }\n onComment={(thread) => {\n // TODO(Zan): This might be a bit too much logic for a component. Move to intents?\n const doc = data.subject as DocumentType;\n if (state.staging[doc.id]?.find((t) => t === thread)) {\n // Move thread from staging to document.\n thread.status = 'active';\n doc.threads ? doc.threads.push(thread) : (doc.threads = [thread]);\n state.staging[doc.id] = state.staging[doc.id]?.filter((t) => t.id !== thread.id);\n dispatchAnalytic('threads.thread-created', { threadId: thread.id });\n }\n\n dispatchAnalytic('threads.message-added', {\n threadId: thread.id,\n threadLength: thread.messages.length,\n });\n }}\n />\n <div role='none' className='bs-10' />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </div>\n );\n } else if (data.subject instanceof ThreadType) {\n return (\n <>\n <ChatHeading attendableId={data.subject.id} />\n <ChatContainer thread={data.subject} />\n </>\n );\n }\n }\n }\n\n return null;\n },\n },\n intent: {\n resolver: async (intent) => {\n switch (intent.action) {\n case ThreadAction.CREATE: {\n return { data: create(ChannelType, { threads: [create(ThreadType, { messages: [] })] }) };\n }\n\n case ThreadAction.SELECT: {\n state.focus = intent.data?.current === state.current ? state.focus : intent.data?.focus;\n state.current = intent.data?.current;\n return { data: true };\n }\n\n case ThreadAction.TOGGLE_RESOLVED: {\n const { thread } = intent.data ?? {};\n if (!(thread instanceof ThreadType)) {\n return;\n }\n\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 const spaceId = space?.id;\n\n return {\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.toggle-resolved', properties: { threadId: thread.id, spaceId } },\n },\n ],\n ],\n };\n }\n\n case ThreadAction.DELETE: {\n const { document: doc, thread } = intent.data ?? {};\n if (!(doc instanceof DocumentType) || !(thread instanceof ThreadType)) {\n return;\n }\n\n const stagingArea = state.staging[doc.id];\n if (stagingArea) {\n // Check if we're deleting a thread that's in the staging area.\n // If so, remove it from the staging area without ceremony.\n const index = state.staging[doc.id]?.findIndex((t) => t.id === thread.id);\n if (index !== -1) {\n state.staging[doc.id]?.splice(index, 1);\n return;\n }\n }\n\n const space = getSpace(thread);\n if (!space || !doc.threads) {\n return;\n }\n\n if (!intent.undo) {\n const index = doc.threads.findIndex((t) => t?.id === thread.id);\n const cursor = doc.threads[index]?.anchor;\n if (index !== -1) {\n doc.threads?.splice(index, 1);\n }\n\n space.db.remove(thread);\n\n return {\n undoable: {\n message: translations[0]['en-US'][THREAD_PLUGIN]['thread deleted label'],\n data: { cursor },\n },\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.delete', properties: { threadId: thread.id, spaceId: space.id } },\n },\n ],\n ],\n };\n } else if (intent.undo) {\n // TODO(wittjosiah): SDK should do this automatically.\n const savedThread = space.db.add(thread);\n doc.threads.push(savedThread);\n\n return {\n data: true,\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.undo-delete', properties: { threadId: thread.id, spaceId: space.id } },\n },\n ],\n ],\n };\n }\n break;\n }\n case ThreadAction.DELETE_MESSAGE: {\n const { document: doc, thread, messageId } = intent.data ?? {};\n const space = getSpace(doc);\n\n if (!(doc instanceof DocumentType) || !(thread instanceof ThreadType) || !space) {\n return;\n }\n\n if (!intent.undo) {\n const message = thread.messages.find((m) => m?.id === messageId);\n const messageIndex = thread.messages.findIndex((m) => m?.id === messageId);\n if (messageIndex === -1 || !message) {\n return undefined;\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: [[{ action: ThreadAction.DELETE, data: { document: doc, thread } }]],\n };\n } else {\n thread.messages.splice(messageIndex, 1);\n }\n\n return {\n undoable: {\n message: translations[0]['en-US'][THREAD_PLUGIN]['message deleted label'],\n data: { message, messageIndex },\n },\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message.delete',\n properties: { threadId: thread.id, spaceId: space.id },\n },\n },\n ],\n ],\n };\n } else if (intent.undo) {\n const message = intent.data?.message;\n const messageIndex = intent.data?.messageIndex;\n\n if (!(message instanceof MessageType) || !(typeof messageIndex === 'number')) {\n return;\n }\n\n thread.messages.splice(messageIndex, 0, message);\n\n return {\n data: true,\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message.undo-delete',\n properties: { threadId: thread.id, spaceId: space.id },\n },\n },\n ],\n ],\n };\n }\n }\n }\n },\n },\n markdown: {\n // TODO(burdon): Factor out extension factory into separate file (for simplicity).\n extensions: ({ document: doc }) => {\n const space = doc && getSpace(doc);\n if (!doc || !space) {\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 // TODO(Zan): When we have the deepsignal specific equivalent of this we should use that instead.\n const threads = computed(() =>\n [...doc.threads.filter(nonNullable), ...(state.staging[doc.id] ?? [])].filter(\n (thread) => !(thread?.status === 'resolved'),\n ),\n );\n\n return [\n listener({\n onChange: () => {\n doc.threads.forEach((thread) => {\n if (thread?.anchor) {\n const [start, end] = thread.anchor.split(':');\n const name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n // TODO(burdon): This seems unsafe; review.\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 if (name && name !== thread.name) {\n thread.name = name;\n }\n }\n });\n },\n }),\n createExternalCommentSync(\n doc.id,\n (sink) => effect(() => sink()),\n () =>\n threads.value\n .filter((thread) => thread?.anchor)\n .map((thread) => ({ id: thread.id, cursor: thread.anchor! })),\n ),\n comments({\n id: doc.id,\n onCreate: ({ cursor }) => {\n const [start, end] = cursor.split(':');\n const name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n const thread = create(ThreadType, { name, anchor: cursor, messages: [], status: 'staged' });\n\n const stagingArea = state.staging[doc.id];\n if (stagingArea) {\n stagingArea.push(thread);\n } else {\n state.staging[doc.id] = [thread];\n }\n\n void intentPlugin?.provides.intent.dispatch([\n {\n action: NavigationAction.OPEN,\n data: {\n activeParts: {\n complementary: `${fullyQualifiedId(doc)}${SLUG_PATH_SEPARATOR}comments${SLUG_COLLECTION_INDICATOR}`,\n },\n },\n },\n {\n action: ThreadAction.SELECT,\n data: { current: thread.id, focus: true },\n },\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'complementary',\n subject: doc,\n state: true,\n },\n },\n ]);\n\n return thread.id;\n },\n onDelete: ({ id }) => {\n // If the thread is in the staging area, remove it.\n const stagingArea = state.staging[doc.id];\n if (stagingArea) {\n const index = stagingArea.findIndex((thread) => thread.id === id);\n if (index !== -1) {\n stagingArea.splice(index, 1);\n }\n }\n\n const thread = doc.threads.find((thread) => thread?.id === id);\n if (thread) {\n thread.anchor = undefined;\n }\n },\n onUpdate: ({ id, cursor }) => {\n const thread =\n state.staging[doc.id]?.find((thread) => thread.id === id) ??\n doc.threads.find((thread) => thread?.id === id);\n\n if (thread instanceof ThreadType && thread.anchor) {\n const [start, end] = thread.anchor.split(':');\n thread.name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n thread.anchor = cursor;\n }\n },\n onSelect: ({ selection: { current, closest } }) => {\n const dispatch = intentPlugin?.provides.intent.dispatch;\n if (dispatch) {\n void dispatch([{ action: ThreadAction.SELECT, data: { current: current ?? closest } }]);\n }\n },\n }),\n ];\n },\n },\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// Lazily load components for content surfaces.\nexport const ThreadMain = React.lazy(() => import('./ThreadMain'));\nexport const ThreadArticle = React.lazy(() => import('./ThreadArticle'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './ThreadSettings';\nexport * from './CommentContainer';\nexport * from './MessageContainer';\nexport * from './CommentsContainer';\nexport * from './ChatContainer';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { SettingsValue } from '@dxos/plugin-settings';\nimport { Input, useTranslation } from '@dxos/react-ui';\n\nimport { 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 (\n <>\n <SettingsValue label={t('settings standalone label')}>\n <Input.Switch checked={settings.standalone} onCheckedChange={(checked) => (settings.standalone = !!checked)} />\n </SettingsValue>\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { create } from '@dxos/echo-schema';\nimport { MessageType } from '@dxos/plugin-space/types';\nimport { 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 { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, ThreadHeading } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nconst sizeClass = getSize(4);\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.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={['min-bs-0 p-1', !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 <Tooltip.Portal>\n <Tooltip.Content classNames={'z-[21]'}>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\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.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={['min-bs-0 p-1', hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport const CommentContainer = ({\n thread,\n detached,\n context,\n current,\n autoFocusTextbox,\n onAttend,\n onThreadDelete,\n onMessageDelete,\n onResolve,\n onComment,\n}: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\n const activity = useStatus(space, thread.id);\n const { t } = useTranslation(THREAD_PLUGIN);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const [autoFocus, setAutoFocus] = useState(!!autoFocusTextbox);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(thread.id, 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): Because of the way the `autoFocus` property is handled by TextEditor,\n // this is the least-bad way of moving focus at the right time, though it is an anti-pattern.\n // Refactor to behave more like <input/>’s `autoFocus` or `autofocus` (yes, they’re different).\n useEffect(() => {\n setAutoFocus(!!autoFocusTextbox);\n }, [autoFocusTextbox]);\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleCreate: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n thread.messages.push(\n create(MessageType, {\n sender: { identityKey: identity.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: messageRef.current,\n context,\n }),\n );\n onComment?.(thread);\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('instant');\n rerenderEditor();\n\n // TODO(burdon): Scroll to bottom.\n return true;\n }, [thread, identity]);\n\n const handleDeleteMessage = (id: string) => onMessageDelete?.(id);\n\n return (\n <Thread onClickCapture={onAttend} onFocusCapture={onAttend} current={current} id={thread.id}>\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.Root>\n <Tooltip.Trigger asChild>\n <ThreadHeading detached>{thread.name ?? t('thread title placeholder')}</ThreadHeading>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]' side='top'>\n {t('detached thread label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : (\n <ThreadHeading>{thread.name ?? t('thread title placeholder')}</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={onResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={onThreadDelete} />}\n </div>\n </div>\n {thread.messages.filter(nonNullable).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleDeleteMessage} />\n ))}\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...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, Quotes } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { useTranslation, Trans } from '@dxos/react-ui';\nimport { PlankHeading, plankHeadingIconProps } from '@dxos/react-ui-deck';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { CommentContainer } from './CommentContainer';\nimport { type ThreadContainerProps } from './types';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type ThreadsContainerProps = Omit<\n ThreadContainerProps,\n 'thread' | 'detached' | 'onAttend' | 'onThreadDelete' | 'onMessageDelete' | 'current' | 'autoFocus'\n> & {\n threads: ThreadType[];\n /**\n * Threads that are no longer anchored to a position in the object.\n */\n detached?: string[];\n currentId?: string;\n autoFocusCurrentTextbox?: boolean;\n showResolvedThreads?: boolean;\n onThreadAttend?: (thread: ThreadType) => void;\n onThreadDelete?: (thread: ThreadType) => void;\n onMessageDelete?: (thread: ThreadType, messageId: string) => void;\n onThreadToggleResolved?: (thread: ThreadType) => void;\n onComment?: (thread: ThreadType) => void;\n};\n\nexport const CommentsHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n\n return (\n <div role='none' className='flex items-center'>\n <PlankHeading.Button attendableId={attendableId}>\n <Quotes {...plankHeadingIconProps} />\n </PlankHeading.Button>\n <PlankHeading.Label attendableId={attendableId}>{t('comments heading')}</PlankHeading.Label>\n </div>\n );\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({\n threads,\n detached = [],\n currentId,\n autoFocusCurrentTextbox,\n showResolvedThreads,\n onThreadAttend,\n onThreadDelete,\n onMessageDelete,\n onThreadToggleResolved,\n ...props\n}: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === 'resolved'));\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredThreads.length > 0 ? (\n filteredThreads.map((thread) => (\n <CommentContainer\n key={thread.id}\n thread={thread}\n current={currentId === thread.id}\n detached={detached.includes(thread.id)}\n autoFocusTextbox={autoFocusCurrentTextbox && currentId === thread.id}\n {...(onThreadAttend && { onAttend: () => onThreadAttend(thread) })}\n {...(onThreadDelete && { onThreadDelete: () => onThreadDelete(thread) })}\n {...(onMessageDelete && { onMessageDelete: (messageId: string) => onMessageDelete(thread, messageId) })}\n {...(onThreadToggleResolved && { onResolve: () => onThreadToggleResolved(thread) })}\n {...props}\n />\n ))\n ) : (\n <div\n role='alert'\n className={mx(\n descriptionText,\n 'place-self-center border border-dashed border-neutral-400/50 rounded-lg text-center p-4 m-4',\n )}\n >\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 { THREAD_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [THREAD_PLUGIN]: {\n 'plugin name': 'Threads',\n 'channel name placeholder': 'New channel',\n 'channel title label': 'Title',\n 'delete channel label': 'Delete channel',\n 'create channel label': 'Create channel',\n 'message placeholder': 'Reply…',\n 'settings standalone label': 'Enable channel creation (experimental)',\n 'activity message': 'Processing…',\n 'anonymous label': 'Anonymous',\n 'delete message block label': 'Delete message block',\n 'detached thread label': 'Referenced content was removed',\n 'delete thread label': 'Delete thread',\n 'thread deleted label': 'You deleted a thread.',\n 'message deleted label': 'You deleted a message.',\n 'comments heading': 'Comments',\n 'chat heading': 'Chat',\n 'draft button': 'DRAFT',\n 'no comments title': 'No comments (yet)',\n 'no comments message':\n 'To start a comment thread, select a range of text in a document and click the <commentIcon></commentIcon> Create comment button in the toolbar.',\n 'toggle show resolved': 'Show resolved',\n 'unnamed object threads label': 'Threads',\n 'mark as resolved label': 'Mark as resolved',\n 'mark as unresolved label': 'Mark as unresolved',\n 'save message label': 'Save',\n 'edit message label': 'Edit',\n 'delete message label': 'Delete message',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ThreadPlugin } from './ThreadPlugin';\n\nexport default ThreadPlugin;\n\nexport * from './hooks';\nexport * from './types';\n\nexport * from './ThreadPlugin';\n"],
5
+ "mappings": "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",
6
6
  "names": ["Chat", "computed", "effect", "React", "LayoutAction", "NavigationAction", "parseIntentPlugin", "parseNavigationPlugin", "resolvePlugin", "parseGraphPlugin", "SLUG_PATH_SEPARATOR", "SLUG_COLLECTION_INDICATOR", "isLayoutParts", "parseMetadataResolverPlugin", "getTypename", "create", "LocalStorageStore", "parseAttentionPlugin", "parseClientPlugin", "createExtension", "isActionGroup", "DocumentType", "ObservabilityAction", "SpaceAction", "ThreadType", "MessageType", "ChannelType", "getSpace", "getTextInRange", "Filter", "createDocAccessor", "fullyQualifiedId", "getRangeFromCursor", "loadObjectReferences", "ScrollArea", "createAttendableAttributes", "comments", "createExternalCommentSync", "listener", "translations", "threadTranslations", "nonNullable", "React", "React", "SettingsValue", "Input", "useTranslation", "ThreadSettings", "settings", "t", "useTranslation", "THREAD_PLUGIN", "SettingsValue", "label", "Input", "Switch", "checked", "standalone", "onCheckedChange", "CheckCircle", "X", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "create", "MessageType", "getSpace", "useMembers", "useIdentity", "Button", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadFooter", "ThreadHeading", "nonNullable", "sizeClass", "getSize", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "React", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "Portal", "Content", "Arrow", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "thread", "detached", "context", "current", "autoFocusTextbox", "onAttend", "onThreadDelete", "onMessageDelete", "onComment", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "activity", "useStatus", "id", "threadScrollRef", "useRef", "autoFocus", "setAutoFocus", "useState", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "useEffect", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleCreate", "useCallback", "messages", "push", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "handleDeleteMessage", "Thread", "onClickCapture", "onFocusCapture", "div", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "ThreadHeading", "name", "side", "status", "Tag", "palette", "filter", "nonNullable", "map", "message", "MessageContainer", "MessageTextbox", "onSend", "ThreadFooter", "ref", "ChatText", "Quotes", "React", "useEffect", "useTranslation", "Trans", "PlankHeading", "plankHeadingIconProps", "descriptionText", "mx", "CommentsHeading", "attendableId", "t", "useTranslation", "THREAD_PLUGIN", "React", "div", "role", "className", "PlankHeading", "Button", "Quotes", "plankHeadingIconProps", "Label", "CommentsContainer", "threads", "detached", "currentId", "autoFocusCurrentTextbox", "showResolvedThreads", "onThreadAttend", "onThreadDelete", "onMessageDelete", "onThreadToggleResolved", "props", "filteredThreads", "filter", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "map", "CommentContainer", "key", "id", "current", "includes", "autoFocusTextbox", "onAttend", "messageId", "onResolve", "mx", "descriptionText", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "ThreadMain", "React", "lazy", "ThreadArticle", "THREAD_PLUGIN", "initialViewState", "showResolvedThreads", "ThreadPlugin", "settings", "LocalStorageStore", "THREAD_PLUGIN", "state", "create", "staging", "viewStore", "getViewState", "subjectId", "attentionPlugin", "navigationPlugin", "intentPlugin", "dispatch", "unsubscribeCallbacks", "meta", "ready", "plugins", "prop", "key", "type", "bool", "allowUndefined", "resolvePlugin", "parseAttentionPlugin", "parseNavigationPlugin", "parseIntentPlugin", "provides", "intent", "graphPlugin", "parseGraphPlugin", "client", "parseClientPlugin", "channelsQuery", "spaces", "query", "Filter", "schema", "ChannelType", "queryUnsubscribe", "subscribe", "unsubscribe", "effect", "attention", "attended", "firstAttendedNodeWithComments", "Array", "from", "map", "id", "graph", "findNode", "find", "node", "data", "DocumentType", "threads", "length", "action", "NavigationAction", "OPEN", "activeParts", "complementary", "SLUG_PATH_SEPARATOR", "push", "unload", "forEach", "values", "metadata", "records", "typename", "placeholder", "ns", "icon", "props", "React", "Chat", "iconSymbol", "loadReferences", "channel", "loadObjectReferences", "ThreadType", "thread", "messages", "MessageType", "message", "THREAD_ITEM", "parse", "item", "label", "title", "object", "translations", "threadTranslations", "echo", "builder", "metadataResolver", "parseMetadataResolverPlugin", "resolver", "createExtension", "endsWith", "docId", "split", "at", "spaceId", "objectId", "space", "get", "doc", "db", "getObjectById", "docMeta", "getTypename", "name", "viewState", "properties", "iconComponent", "actions", "dataId", "toggle", "newToggleState", "ObservabilityAction", "SEND_EVENT", "threadId", "showResolved", "menuItemType", "isChecked", "testId", "ThreadAction", "CREATE", "filter", "standalone", "isActionGroup", "startsWith", "SpaceAction", "ADD_OBJECT", "target", "plugin", "surface", "component", "role", "active", "ThreadMain", "ThreadSettings", "location", "isLayoutParts", "main", "layoutEntries", "currentPosition", "findIndex", "entry", "objectToTheLeft", "context", "getSpace", "ThreadArticle", "subject", "accessor", "content", "createDocAccessor", "undefined", "getStartPosition", "cursor", "range", "getRangeFromCursor", "start", "Number", "MAX_SAFE_INTEGER", "concat", "nonNullable", "sort", "a", "b", "anchor", "detached", "qualifiedSubjectId", "fullyQualifiedId", "Set", "attendableAttrs", "createAttendableAttributes", "dispatchAnalytic", "div", "className", "CommentsHeading", "attendableId", "ScrollArea", "Root", "classNames", "Viewport", "CommentsContainer", "currentId", "has", "current", "autoFocusCurrentTextbox", "focus", "onThreadAttend", "LayoutAction", "SCROLL_INTO_VIEW", "onThreadDelete", "DELETE", "document", "onMessageDelete", "messageId", "DELETE_MESSAGE", "onThreadToggleResolved", "TOGGLE_RESOLVED", "onComment", "t", "status", "threadLength", "Scrollbar", "Thumb", "ChatHeading", "ChatContainer", "SELECT", "intents", "stagingArea", "index", "splice", "undo", "remove", "undoable", "savedThread", "add", "m", "messageIndex", "markdown", "extensions", "comments", "computed", "listener", "onChange", "end", "getTextInRange", "createExternalCommentSync", "sink", "value", "onCreate", "SLUG_COLLECTION_INDICATOR", "SET_LAYOUT", "element", "onDelete", "onUpdate", "onSelect", "selection", "closest", "ThreadPlugin"]
7
7
  }