@dxos/plugin-thread 0.6.8-main.046e6cf

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.
Files changed (106) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +15 -0
  3. package/dist/lib/browser/ThreadArticle-J4VCLPMS.mjs +18 -0
  4. package/dist/lib/browser/ThreadArticle-J4VCLPMS.mjs.map +7 -0
  5. package/dist/lib/browser/ThreadMain-VV7MGQZJ.mjs +26 -0
  6. package/dist/lib/browser/ThreadMain-VV7MGQZJ.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-5IBJO53M.mjs +21 -0
  8. package/dist/lib/browser/chunk-5IBJO53M.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-CQ2RYETH.mjs +410 -0
  10. package/dist/lib/browser/chunk-CQ2RYETH.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-TL3JITN7.mjs +19 -0
  12. package/dist/lib/browser/chunk-TL3JITN7.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +1062 -0
  14. package/dist/lib/browser/index.mjs.map +7 -0
  15. package/dist/lib/browser/meta.json +1 -0
  16. package/dist/lib/browser/meta.mjs +11 -0
  17. package/dist/lib/browser/meta.mjs.map +7 -0
  18. package/dist/lib/browser/types.mjs +8 -0
  19. package/dist/lib/browser/types.mjs.map +7 -0
  20. package/dist/lib/node/ThreadArticle-CSENFNNT.cjs +44 -0
  21. package/dist/lib/node/ThreadArticle-CSENFNNT.cjs.map +7 -0
  22. package/dist/lib/node/ThreadMain-XP4YSF7U.cjs +52 -0
  23. package/dist/lib/node/ThreadMain-XP4YSF7U.cjs.map +7 -0
  24. package/dist/lib/node/chunk-3VAAUEU5.cjs +431 -0
  25. package/dist/lib/node/chunk-3VAAUEU5.cjs.map +7 -0
  26. package/dist/lib/node/chunk-BWBONZGU.cjs +55 -0
  27. package/dist/lib/node/chunk-BWBONZGU.cjs.map +7 -0
  28. package/dist/lib/node/chunk-WPPLQNMJ.cjs +38 -0
  29. package/dist/lib/node/chunk-WPPLQNMJ.cjs.map +7 -0
  30. package/dist/lib/node/index.cjs +1067 -0
  31. package/dist/lib/node/index.cjs.map +7 -0
  32. package/dist/lib/node/meta.cjs +32 -0
  33. package/dist/lib/node/meta.cjs.map +7 -0
  34. package/dist/lib/node/meta.json +1 -0
  35. package/dist/lib/node/types.cjs +30 -0
  36. package/dist/lib/node/types.cjs.map +7 -0
  37. package/dist/types/src/ThreadPlugin.d.ts +4 -0
  38. package/dist/types/src/ThreadPlugin.d.ts.map +1 -0
  39. package/dist/types/src/components/Chat.stories.d.ts +46 -0
  40. package/dist/types/src/components/Chat.stories.d.ts.map +1 -0
  41. package/dist/types/src/components/ChatContainer.d.ts +7 -0
  42. package/dist/types/src/components/ChatContainer.d.ts.map +1 -0
  43. package/dist/types/src/components/CommentContainer.d.ts +4 -0
  44. package/dist/types/src/components/CommentContainer.d.ts.map +1 -0
  45. package/dist/types/src/components/Comments.stories.d.ts +44 -0
  46. package/dist/types/src/components/Comments.stories.d.ts.map +1 -0
  47. package/dist/types/src/components/CommentsContainer.d.ts +26 -0
  48. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -0
  49. package/dist/types/src/components/MessageContainer.d.ts +9 -0
  50. package/dist/types/src/components/MessageContainer.d.ts.map +1 -0
  51. package/dist/types/src/components/ThreadArticle.d.ts +5 -0
  52. package/dist/types/src/components/ThreadArticle.d.ts.map +1 -0
  53. package/dist/types/src/components/ThreadMain.d.ts +7 -0
  54. package/dist/types/src/components/ThreadMain.d.ts.map +1 -0
  55. package/dist/types/src/components/ThreadSettings.d.ts +6 -0
  56. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -0
  57. package/dist/types/src/components/command-extension.d.ts +3 -0
  58. package/dist/types/src/components/command-extension.d.ts.map +1 -0
  59. package/dist/types/src/components/index.d.ts +22 -0
  60. package/dist/types/src/components/index.d.ts.map +1 -0
  61. package/dist/types/src/components/testing.d.ts +67 -0
  62. package/dist/types/src/components/testing.d.ts.map +1 -0
  63. package/dist/types/src/components/types.d.ts +28 -0
  64. package/dist/types/src/components/types.d.ts.map +1 -0
  65. package/dist/types/src/hooks/analytics.d.ts +4 -0
  66. package/dist/types/src/hooks/analytics.d.ts.map +1 -0
  67. package/dist/types/src/hooks/index.d.ts +3 -0
  68. package/dist/types/src/hooks/index.d.ts.map +1 -0
  69. package/dist/types/src/hooks/useStatus.d.ts +3 -0
  70. package/dist/types/src/hooks/useStatus.d.ts.map +1 -0
  71. package/dist/types/src/index.d.ts +6 -0
  72. package/dist/types/src/index.d.ts.map +1 -0
  73. package/dist/types/src/meta.d.ts +16 -0
  74. package/dist/types/src/meta.d.ts.map +1 -0
  75. package/dist/types/src/translations.d.ts +34 -0
  76. package/dist/types/src/translations.d.ts.map +1 -0
  77. package/dist/types/src/types.d.ts +19 -0
  78. package/dist/types/src/types.d.ts.map +1 -0
  79. package/dist/types/src/types.test.d.ts +2 -0
  80. package/dist/types/src/types.test.d.ts.map +1 -0
  81. package/dist/types/src/util.d.ts +6 -0
  82. package/dist/types/src/util.d.ts.map +1 -0
  83. package/package.json +99 -0
  84. package/src/ThreadPlugin.tsx +744 -0
  85. package/src/components/Chat.stories.tsx +76 -0
  86. package/src/components/ChatContainer.tsx +127 -0
  87. package/src/components/CommentContainer.tsx +206 -0
  88. package/src/components/Comments.stories.tsx +66 -0
  89. package/src/components/CommentsContainer.tsx +114 -0
  90. package/src/components/MessageContainer.tsx +200 -0
  91. package/src/components/ThreadArticle.tsx +18 -0
  92. package/src/components/ThreadMain.tsx +27 -0
  93. package/src/components/ThreadSettings.tsx +23 -0
  94. package/src/components/command-extension.ts +36 -0
  95. package/src/components/index.ts +16 -0
  96. package/src/components/testing.ts +46 -0
  97. package/src/components/types.ts +32 -0
  98. package/src/hooks/analytics.ts +39 -0
  99. package/src/hooks/index.ts +6 -0
  100. package/src/hooks/useStatus.ts +39 -0
  101. package/src/index.ts +12 -0
  102. package/src/meta.tsx +20 -0
  103. package/src/translations.ts +41 -0
  104. package/src/types.test.ts +13 -0
  105. package/src/types.ts +41 -0
  106. package/src/util.ts +26 -0
package/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ MIT License
2
+ Copyright (c) 2022 DXOS
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+
6
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @dxos/plugin-thread
2
+
3
+ Surface plugin for thread entities.
4
+
5
+ ## DXOS Resources
6
+
7
+ - [Website](https://dxos.org)
8
+ - [Developer Documentation](https://docs.dxos.org)
9
+ - Talk to us on [Discord](https://dxos.org/discord)
10
+
11
+ ## Contributions
12
+
13
+ Your ideas, issues, and code are most welcome. Please take a look at our [community code of conduct](https://github.com/dxos/dxos/blob/main/CODE_OF_CONDUCT.md), the [issue guide](https://github.com/dxos/dxos/blob/main/CONTRIBUTING.md#submitting-issues), and the [PR contribution guide](https://github.com/dxos/dxos/blob/main/CONTRIBUTING.md#submitting-prs).
14
+
15
+ License: [MIT](./LICENSE) Copyright 2023 © DXOS
@@ -0,0 +1,18 @@
1
+ import {
2
+ ChatContainer
3
+ } from "./chunk-CQ2RYETH.mjs";
4
+ import "./chunk-5IBJO53M.mjs";
5
+
6
+ // packages/plugins/plugin-thread/src/components/ThreadArticle.tsx
7
+ import React from "react";
8
+ var ThreadArticle = (props) => {
9
+ return /* @__PURE__ */ React.createElement("div", {
10
+ role: "none",
11
+ className: "row-span-2"
12
+ }, /* @__PURE__ */ React.createElement(ChatContainer, props));
13
+ };
14
+ var ThreadArticle_default = ThreadArticle;
15
+ export {
16
+ ThreadArticle_default as default
17
+ };
18
+ //# sourceMappingURL=ThreadArticle-J4VCLPMS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ThreadArticle.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type ComponentProps, type FC } from 'react';\n\nimport { ChatContainer } from './ChatContainer';\n\nconst ThreadArticle: FC<Pick<ComponentProps<typeof ChatContainer>, 'thread' | 'context'>> = (props) => {\n // TODO(burdon): Factor out Main container across plugins?\n return (\n <div role='none' className='row-span-2'>\n <ChatContainer {...props} />\n </div>\n );\n};\n\nexport default ThreadArticle;\n"],
5
+ "mappings": ";;;;;;AAIA,OAAOA,WAA6C;AAIpD,IAAMC,gBAAsF,CAACC,UAAAA;AAE3F,SACE,sBAAA,cAACC,OAAAA;IAAIC,MAAK;IAAOC,WAAU;KACzB,sBAAA,cAACC,eAAkBJ,KAAAA,CAAAA;AAGzB;AAEA,IAAA,wBAAeD;",
6
+ "names": ["React", "ThreadArticle", "props", "div", "role", "className", "ChatContainer"]
7
+ }
@@ -0,0 +1,26 @@
1
+ import {
2
+ ChatContainer
3
+ } from "./chunk-CQ2RYETH.mjs";
4
+ import "./chunk-5IBJO53M.mjs";
5
+
6
+ // packages/plugins/plugin-thread/src/components/ThreadMain.tsx
7
+ import React from "react";
8
+ import { Main } from "@dxos/react-ui";
9
+ import { baseSurface, topbarBlockPaddingStart, fixedInsetFlexLayout, bottombarBlockPaddingEnd } from "@dxos/react-ui-theme";
10
+ var ThreadMain = ({ thread }) => {
11
+ return /* @__PURE__ */ React.createElement(Main.Content, {
12
+ classNames: [
13
+ baseSurface,
14
+ fixedInsetFlexLayout,
15
+ topbarBlockPaddingStart,
16
+ bottombarBlockPaddingEnd
17
+ ]
18
+ }, /* @__PURE__ */ React.createElement(ChatContainer, {
19
+ thread
20
+ }));
21
+ };
22
+ var ThreadMain_default = ThreadMain;
23
+ export {
24
+ ThreadMain_default as default
25
+ };
26
+ //# sourceMappingURL=ThreadMain-VV7MGQZJ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ThreadMain.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type FC } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { Main } from '@dxos/react-ui';\nimport {\n baseSurface,\n topbarBlockPaddingStart,\n fixedInsetFlexLayout,\n bottombarBlockPaddingEnd,\n} from '@dxos/react-ui-theme';\n\nimport { ChatContainer } from './ChatContainer';\n\nconst ThreadMain: FC<{ thread: ThreadType }> = ({ thread }) => {\n // TODO(burdon): Factor out Main container across plugins?\n return (\n <Main.Content classNames={[baseSurface, fixedInsetFlexLayout, topbarBlockPaddingStart, bottombarBlockPaddingEnd]}>\n <ChatContainer thread={thread} />\n </Main.Content>\n );\n};\n\nexport default ThreadMain;\n"],
5
+ "mappings": ";;;;;;AAIA,OAAOA,WAAwB;AAG/B,SAASC,YAAY;AACrB,SACEC,aACAC,yBACAC,sBACAC,gCACK;AAIP,IAAMC,aAAyC,CAAC,EAAEC,OAAM,MAAE;AAExD,SACE,sBAAA,cAACC,KAAKC,SAAO;IAACC,YAAY;MAACC;MAAaC;MAAsBC;MAAyBC;;KACrF,sBAAA,cAACC,eAAAA;IAAcR;;AAGrB;AAEA,IAAA,qBAAeD;",
6
+ "names": ["React", "Main", "baseSurface", "topbarBlockPaddingStart", "fixedInsetFlexLayout", "bottombarBlockPaddingEnd", "ThreadMain", "thread", "Main", "Content", "classNames", "baseSurface", "fixedInsetFlexLayout", "topbarBlockPaddingStart", "bottombarBlockPaddingEnd", "ChatContainer"]
7
+ }
@@ -0,0 +1,21 @@
1
+ // packages/plugins/plugin-thread/src/meta.tsx
2
+ import { Chat } from "@phosphor-icons/react";
3
+ import React from "react";
4
+ import { pluginMeta } from "@dxos/app-framework";
5
+ var THREAD_PLUGIN = "dxos.org/plugin/thread";
6
+ var THREAD_ITEM = `${THREAD_PLUGIN}/item`;
7
+ var meta_default = pluginMeta({
8
+ id: THREAD_PLUGIN,
9
+ name: "Threads",
10
+ // TODO(wittjosiah): Update once scope of threads expands.
11
+ description: "Comment threads on documents.",
12
+ iconComponent: (props) => /* @__PURE__ */ React.createElement(Chat, props),
13
+ iconSymbol: "ph--chat--regular"
14
+ });
15
+
16
+ export {
17
+ THREAD_PLUGIN,
18
+ THREAD_ITEM,
19
+ meta_default
20
+ };
21
+ //# sourceMappingURL=chunk-5IBJO53M.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Chat, type IconProps } from '@phosphor-icons/react';\nimport React from 'react';\n\nimport { pluginMeta } from '@dxos/app-framework';\n\nexport const THREAD_PLUGIN = 'dxos.org/plugin/thread';\nexport const THREAD_ITEM = `${THREAD_PLUGIN}/item`;\n\nexport default pluginMeta({\n id: THREAD_PLUGIN,\n name: 'Threads',\n // TODO(wittjosiah): Update once scope of threads expands.\n description: 'Comment threads on documents.',\n iconComponent: (props: IconProps) => <Chat {...props} />,\n iconSymbol: 'ph--chat--regular',\n});\n"],
5
+ "mappings": ";AAIA,SAASA,YAA4B;AACrC,OAAOC,WAAW;AAElB,SAASC,kBAAkB;AAEpB,IAAMC,gBAAgB;AACtB,IAAMC,cAAc,GAAGD,aAAAA;AAE9B,IAAA,eAAeE,WAAW;EACxBC,IAAIH;EACJI,MAAM;;EAENC,aAAa;EACbC,eAAe,CAACC,UAAqB,sBAAA,cAACC,MAASD,KAAAA;EAC/CE,YAAY;AACd,CAAA;",
6
+ "names": ["Chat", "React", "pluginMeta", "THREAD_PLUGIN", "THREAD_ITEM", "pluginMeta", "id", "name", "description", "iconComponent", "props", "Chat", "iconSymbol"]
7
+ }
@@ -0,0 +1,410 @@
1
+ import {
2
+ THREAD_ITEM,
3
+ THREAD_PLUGIN
4
+ } from "./chunk-5IBJO53M.mjs";
5
+
6
+ // packages/plugins/plugin-thread/src/hooks/useStatus.ts
7
+ import { useEffect, useState } from "react";
8
+ var useStatus = (space, channel) => {
9
+ const [processing, setProcessing] = useState(false);
10
+ useEffect(() => {
11
+ if (!space || !channel) {
12
+ return;
13
+ }
14
+ const unsubscribe = space.listen(`status/${channel}`, (status) => {
15
+ const { event } = status.payload ?? {};
16
+ setProcessing(event === "processing");
17
+ });
18
+ const t = setInterval(() => {
19
+ setProcessing((prev) => {
20
+ if (typeof prev?.ts === "number" && Date.now() - prev.ts > 3e4) {
21
+ return void 0;
22
+ } else {
23
+ return prev;
24
+ }
25
+ });
26
+ }, 1e3);
27
+ return () => {
28
+ unsubscribe();
29
+ clearInterval(t);
30
+ };
31
+ }, [
32
+ space,
33
+ channel
34
+ ]);
35
+ return processing;
36
+ };
37
+
38
+ // packages/plugins/plugin-thread/src/hooks/analytics.ts
39
+ import { useCallback } from "react";
40
+ import { useIntentDispatcher } from "@dxos/app-framework";
41
+ import { ObservabilityAction } from "@dxos/plugin-observability/meta";
42
+ import { getSpace } from "@dxos/react-client/echo";
43
+ import { useOnTransition } from "@dxos/react-ui";
44
+ var useAnalyticsCallback = (spaceId, name, meta) => {
45
+ const dispatch = useIntentDispatcher();
46
+ return useCallback((dynamicMeta) => {
47
+ void dispatch({
48
+ action: ObservabilityAction.SEND_EVENT,
49
+ data: {
50
+ name,
51
+ properties: {
52
+ ...meta,
53
+ ...dynamicMeta,
54
+ spaceId
55
+ }
56
+ }
57
+ });
58
+ }, [
59
+ dispatch,
60
+ name,
61
+ meta,
62
+ spaceId
63
+ ]);
64
+ };
65
+ var useOnEditAnalytics = (message, editing) => {
66
+ const space = getSpace(message);
67
+ const onEditAnalytics = useAnalyticsCallback(space?.id, "threads.comment-edited", {
68
+ messageId: message.id,
69
+ messageLength: message.text.length
70
+ });
71
+ useOnTransition(editing, true, false, onEditAnalytics);
72
+ };
73
+
74
+ // packages/plugins/plugin-thread/src/components/ChatContainer.tsx
75
+ import { Chat } from "@phosphor-icons/react";
76
+ import React2, { useLayoutEffect, useMemo, useRef as useRef2, useState as useState3 } from "react";
77
+ import { create } from "@dxos/echo-schema";
78
+ import { MessageType } from "@dxos/plugin-space/types";
79
+ import { getSpace as getSpace2, useMembers } from "@dxos/react-client/echo";
80
+ import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
81
+ import { ScrollArea, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
82
+ import { PlankHeading, plankHeadingIconProps } from "@dxos/react-ui-deck";
83
+ import { createBasicExtensions as createBasicExtensions2, createThemeExtensions as createThemeExtensions2, listener } from "@dxos/react-ui-editor";
84
+ import { mx as mx3 } from "@dxos/react-ui-theme";
85
+ import { MessageTextbox, Thread, ThreadFooter, threadLayout } from "@dxos/react-ui-thread";
86
+ import { nonNullable as nonNullable2 } from "@dxos/util";
87
+
88
+ // packages/plugins/plugin-thread/src/components/MessageContainer.tsx
89
+ import { EditorView } from "@codemirror/view";
90
+ import { Check, PencilSimple, X } from "@phosphor-icons/react";
91
+ import React, { forwardRef, useCallback as useCallback2, useEffect as useEffect2, useRef, useState as useState2 } from "react";
92
+ import { Surface } from "@dxos/app-framework";
93
+ import { PublicKey } from "@dxos/react-client";
94
+ import { useIdentity } from "@dxos/react-client/halo";
95
+ import { Button, ButtonGroup, DensityProvider, Tooltip, useOnTransition as useOnTransition2, useThemeContext, useTranslation } from "@dxos/react-ui";
96
+ import { createBasicExtensions, createThemeExtensions, useTextEditor } from "@dxos/react-ui-editor";
97
+ import { Mosaic } from "@dxos/react-ui-mosaic";
98
+ import { getSize, hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx as mx2 } from "@dxos/react-ui-theme";
99
+ import { MessageHeading, MessageRoot } from "@dxos/react-ui-thread";
100
+ import { nonNullable } from "@dxos/util";
101
+
102
+ // packages/plugins/plugin-thread/src/components/command-extension.ts
103
+ import { StreamLanguage, HighlightStyle, syntaxHighlighting } from "@codemirror/language";
104
+ import { tags } from "@dxos/react-ui-editor";
105
+ import { mx, tagRoot } from "@dxos/react-ui-theme";
106
+ var parser = StreamLanguage.define({
107
+ startState: () => ({
108
+ count: 0
109
+ }),
110
+ token: (stream, state) => {
111
+ state.count++;
112
+ if (stream.eatSpace()) {
113
+ return null;
114
+ }
115
+ if (state.count === 1 && stream.match(/^(\/\w+)/)) {
116
+ return "tagName";
117
+ }
118
+ stream.next();
119
+ return null;
120
+ }
121
+ });
122
+ var styles = HighlightStyle.define([
123
+ {
124
+ tag: tags.tagName,
125
+ class: mx(tagRoot({
126
+ palette: "cyan"
127
+ }), "text-base font-medium")
128
+ }
129
+ ]);
130
+ var command = [
131
+ parser,
132
+ syntaxHighlighting(styles)
133
+ ];
134
+
135
+ // packages/plugins/plugin-thread/src/util.ts
136
+ import { generateName } from "@dxos/display-name";
137
+ import { hexToFallback } from "@dxos/util";
138
+ var getMessageMetadata = (id, identity) => {
139
+ const fallback = hexToFallback(identity?.identityKey.toHex() ?? "0");
140
+ return {
141
+ id,
142
+ authorId: identity?.identityKey.toHex(),
143
+ authorName: identity?.profile?.displayName ?? (identity?.identityKey ? generateName(identity.identityKey.toHex()) : void 0),
144
+ authorAvatarProps: {
145
+ hue: identity?.profile?.data?.hue ?? fallback.hue,
146
+ emoji: identity?.profile?.data?.emoji ?? fallback.emoji
147
+ }
148
+ };
149
+ };
150
+
151
+ // packages/plugins/plugin-thread/src/components/MessageContainer.tsx
152
+ var messageControlClassNames = [
153
+ "p-1 min-bs-0 transition-opacity items-start",
154
+ hoverableControlItem
155
+ ];
156
+ var MessageContainer = ({ message, members, onDelete }) => {
157
+ const senderIdentity = members.find((member) => message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey))?.identity;
158
+ const messageMetadata = getMessageMetadata(message.id, senderIdentity);
159
+ const userIsAuthor = useIdentity()?.identityKey.toHex() === messageMetadata.authorId;
160
+ const [editing, setEditing] = useState2(false);
161
+ const handleDelete = useCallback2(() => onDelete?.(message.id), [
162
+ message,
163
+ onDelete
164
+ ]);
165
+ const { t } = useTranslation(THREAD_PLUGIN);
166
+ const editLabel = t(editing ? "save message label" : "edit message label");
167
+ const deleteLabel = t("delete message label");
168
+ return /* @__PURE__ */ React.createElement(MessageRoot, {
169
+ ...messageMetadata,
170
+ classNames: [
171
+ hoverableControls,
172
+ hoverableFocusedWithinControls
173
+ ]
174
+ }, /* @__PURE__ */ React.createElement(MessageHeading, {
175
+ authorName: messageMetadata.authorName,
176
+ timestamp: messageMetadata.timestamp
177
+ }, /* @__PURE__ */ React.createElement(ButtonGroup, {
178
+ classNames: "mie-1"
179
+ }, userIsAuthor && /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
180
+ asChild: true
181
+ }, /* @__PURE__ */ React.createElement(Button, {
182
+ variant: "ghost",
183
+ "data-testid": editing ? "thread.message.save" : "thread.message.edit",
184
+ classNames: messageControlClassNames,
185
+ onClick: () => setEditing((editing2) => !editing2)
186
+ }, /* @__PURE__ */ React.createElement("span", {
187
+ className: "sr-only"
188
+ }, editLabel), editing ? /* @__PURE__ */ React.createElement(Check, {
189
+ className: getSize(4)
190
+ }) : /* @__PURE__ */ React.createElement(PencilSimple, {
191
+ className: getSize(4)
192
+ }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
193
+ classNames: "z-[21]"
194
+ }, editLabel, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))), onDelete && /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
195
+ asChild: true
196
+ }, /* @__PURE__ */ React.createElement(Button, {
197
+ variant: "ghost",
198
+ "data-testid": "thread.message.delete",
199
+ classNames: messageControlClassNames,
200
+ onClick: handleDelete
201
+ }, /* @__PURE__ */ React.createElement("span", {
202
+ className: "sr-only"
203
+ }, deleteLabel), /* @__PURE__ */ React.createElement(X, {
204
+ className: getSize(4)
205
+ }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
206
+ classNames: "z-[21]"
207
+ }, deleteLabel, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))))), /* @__PURE__ */ React.createElement(TextboxBlock, {
208
+ message,
209
+ isAuthor: userIsAuthor,
210
+ editing
211
+ }), message.parts?.filter(nonNullable).map((part, index) => /* @__PURE__ */ React.createElement(MessagePart, {
212
+ key: index,
213
+ part
214
+ })));
215
+ };
216
+ var MessagePart = ({ part }) => {
217
+ return /* @__PURE__ */ React.createElement(Mosaic.Container, {
218
+ id: part.id
219
+ }, /* @__PURE__ */ React.createElement(Mosaic.DraggableTile, {
220
+ type: THREAD_ITEM,
221
+ path: part.id,
222
+ item: part,
223
+ Component: MessageBlockObjectTile
224
+ }));
225
+ };
226
+ var TextboxBlock = ({ message, isAuthor, editing }) => {
227
+ const { themeMode } = useThemeContext();
228
+ const inMemoryContentRef = useRef(message.text);
229
+ const handleDocumentChange = useCallback2((newState) => {
230
+ inMemoryContentRef.current = newState;
231
+ }, []);
232
+ const saveDocumentChange = useCallback2(() => {
233
+ message.text = inMemoryContentRef.current;
234
+ }, [
235
+ message
236
+ ]);
237
+ useOnTransition2(editing, true, false, saveDocumentChange);
238
+ const { parentRef, focusAttributes, view } = useTextEditor(() => ({
239
+ initialValue: message.text,
240
+ extensions: [
241
+ createBasicExtensions({
242
+ readonly: !isAuthor || !editing
243
+ }),
244
+ createThemeExtensions({
245
+ themeMode
246
+ }),
247
+ command,
248
+ EditorView.updateListener.of((update) => {
249
+ if (update.docChanged) {
250
+ handleDocumentChange(update.state.doc.toString());
251
+ }
252
+ })
253
+ ]
254
+ }), [
255
+ message.text,
256
+ editing,
257
+ isAuthor,
258
+ themeMode,
259
+ handleDocumentChange
260
+ ]);
261
+ useEffect2(() => {
262
+ editing && view?.focus();
263
+ }, [
264
+ editing,
265
+ view
266
+ ]);
267
+ useOnEditAnalytics(message, !!editing);
268
+ return /* @__PURE__ */ React.createElement("div", {
269
+ role: "none",
270
+ ref: parentRef,
271
+ className: "mie-4",
272
+ ...focusAttributes
273
+ });
274
+ };
275
+ var MessageBlockObjectTile = /* @__PURE__ */ forwardRef(({ draggableStyle, draggableProps, item, active, ...props }, forwardedRef) => {
276
+ let title = item.name ?? item.title ?? item.__typename ?? "Object";
277
+ if (typeof title !== "string") {
278
+ title = title?.content ?? "";
279
+ }
280
+ return /* @__PURE__ */ React.createElement("div", {
281
+ role: "group",
282
+ className: mx2("grid col-span-3 py-1 pr-4", hoverableControls, hoverableFocusedWithinControls),
283
+ style: draggableStyle,
284
+ ref: forwardedRef
285
+ }, /* @__PURE__ */ React.createElement(DensityProvider, {
286
+ density: "fine"
287
+ }, /* @__PURE__ */ React.createElement(Surface, {
288
+ role: "card",
289
+ limit: 1,
290
+ data: {
291
+ content: item
292
+ },
293
+ draggableProps,
294
+ fallback: title,
295
+ ...props
296
+ })));
297
+ });
298
+
299
+ // packages/plugins/plugin-thread/src/components/ChatContainer.tsx
300
+ var ChatHeading = ({ attendableId }) => {
301
+ const { t } = useTranslation2(THREAD_PLUGIN);
302
+ return /* @__PURE__ */ React2.createElement("div", {
303
+ role: "none",
304
+ className: "flex items-center"
305
+ }, /* @__PURE__ */ React2.createElement(PlankHeading.Button, {
306
+ attendableId
307
+ }, /* @__PURE__ */ React2.createElement(Chat, plankHeadingIconProps)), /* @__PURE__ */ React2.createElement(PlankHeading.Label, {
308
+ attendableId
309
+ }, t("chat heading")));
310
+ };
311
+ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
312
+ const identity = useIdentity2();
313
+ const space = getSpace2(thread);
314
+ const members = useMembers(space?.key);
315
+ const activity = useStatus(space, thread.id);
316
+ const { t } = useTranslation2(THREAD_PLUGIN);
317
+ const [_count, _setCount] = useState3(0);
318
+ const rerenderEditor = () => _setCount((count) => count + 1);
319
+ const [autoFocus, setAutoFocus] = useState3(autoFocusTextbox);
320
+ const threadScrollRef = useRef2(null);
321
+ const { themeMode } = useThemeContext2();
322
+ const textboxMetadata = getMessageMetadata(thread.id, identity);
323
+ const messageRef = useRef2("");
324
+ const extensions = useMemo(() => [
325
+ createBasicExtensions2({
326
+ placeholder: t("message placeholder")
327
+ }),
328
+ createThemeExtensions2({
329
+ themeMode
330
+ }),
331
+ listener({
332
+ onChange: (text) => messageRef.current = text
333
+ }),
334
+ command
335
+ ], [
336
+ themeMode,
337
+ _count
338
+ ]);
339
+ const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
340
+ behavior,
341
+ block: "end"
342
+ }), 10);
343
+ useLayoutEffect(() => {
344
+ scrollToEnd("instant");
345
+ }, []);
346
+ const handleCreate = () => {
347
+ if (!messageRef.current?.length) {
348
+ return false;
349
+ }
350
+ thread.messages.push(create(MessageType, {
351
+ sender: {
352
+ identityKey: identity.identityKey.toHex()
353
+ },
354
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
355
+ text: messageRef.current,
356
+ context
357
+ }));
358
+ messageRef.current = "";
359
+ setAutoFocus(true);
360
+ scrollToEnd("smooth");
361
+ rerenderEditor();
362
+ return true;
363
+ };
364
+ const handleDelete = (id) => {
365
+ const messageIndex = thread.messages.filter(nonNullable2).findIndex((message) => message.id === id);
366
+ if (messageIndex !== -1) {
367
+ thread.messages.splice(messageIndex, 1);
368
+ }
369
+ };
370
+ return /* @__PURE__ */ React2.createElement(Thread, {
371
+ current,
372
+ id: thread.id,
373
+ 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"
374
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Root, {
375
+ classNames: "col-span-2"
376
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Viewport, {
377
+ 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]"
378
+ }, /* @__PURE__ */ React2.createElement("div", {
379
+ role: "none",
380
+ className: mx3(threadLayout, "place-self-end")
381
+ }, thread.messages.filter(nonNullable2).map((message) => /* @__PURE__ */ React2.createElement(MessageContainer, {
382
+ key: message.id,
383
+ message,
384
+ members,
385
+ onDelete: handleDelete
386
+ }))), /* @__PURE__ */ React2.createElement("div", {
387
+ role: "none",
388
+ className: "bs-px -mbs-px",
389
+ ref: threadScrollRef
390
+ }), /* @__PURE__ */ React2.createElement(ScrollArea.Scrollbar, null, /* @__PURE__ */ React2.createElement(ScrollArea.Thumb, null)))), /* @__PURE__ */ React2.createElement(MessageTextbox, {
391
+ extensions,
392
+ autoFocus,
393
+ onSend: handleCreate,
394
+ ...textboxMetadata
395
+ }), /* @__PURE__ */ React2.createElement(ThreadFooter, {
396
+ activity
397
+ }, t("activity message")));
398
+ };
399
+
400
+ export {
401
+ command,
402
+ useStatus,
403
+ useAnalyticsCallback,
404
+ useOnEditAnalytics,
405
+ getMessageMetadata,
406
+ MessageContainer,
407
+ ChatHeading,
408
+ ChatContainer
409
+ };
410
+ //# sourceMappingURL=chunk-CQ2RYETH.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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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",
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
+ }
@@ -0,0 +1,19 @@
1
+ import {
2
+ THREAD_PLUGIN
3
+ } from "./chunk-5IBJO53M.mjs";
4
+
5
+ // packages/plugins/plugin-thread/src/types.ts
6
+ var THREAD_ACTION = `${THREAD_PLUGIN}/action`;
7
+ var ThreadAction;
8
+ (function(ThreadAction2) {
9
+ ThreadAction2[ThreadAction2["CREATE"] = `${THREAD_ACTION}/create`] = "CREATE";
10
+ ThreadAction2[ThreadAction2["SELECT"] = `${THREAD_ACTION}/select`] = "SELECT";
11
+ ThreadAction2[ThreadAction2["DELETE"] = `${THREAD_ACTION}/delete`] = "DELETE";
12
+ ThreadAction2[ThreadAction2["DELETE_MESSAGE"] = `${THREAD_ACTION}/delete-message`] = "DELETE_MESSAGE";
13
+ ThreadAction2[ThreadAction2["TOGGLE_RESOLVED"] = `${THREAD_ACTION}/toggle-resolved`] = "TOGGLE_RESOLVED";
14
+ })(ThreadAction || (ThreadAction = {}));
15
+
16
+ export {
17
+ ThreadAction
18
+ };
19
+ //# sourceMappingURL=chunk-TL3JITN7.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SettingsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { type SchemaProvides } from '@dxos/plugin-client';\nimport { type MarkdownExtensionProvides } from '@dxos/plugin-markdown';\nimport { type ThreadType } from '@dxos/plugin-space/types';\n\nimport { THREAD_PLUGIN } from './meta';\n\nconst THREAD_ACTION = `${THREAD_PLUGIN}/action`;\nexport enum ThreadAction {\n CREATE = `${THREAD_ACTION}/create`,\n SELECT = `${THREAD_ACTION}/select`,\n DELETE = `${THREAD_ACTION}/delete`,\n DELETE_MESSAGE = `${THREAD_ACTION}/delete-message`,\n TOGGLE_RESOLVED = `${THREAD_ACTION}/toggle-resolved`,\n}\n\nexport type ThreadPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n MetadataRecordsProvides &\n SettingsProvides &\n TranslationsProvides &\n SchemaProvides &\n MarkdownExtensionProvides;\n\nexport type ThreadSettingsProps = { standalone?: boolean };\n\nexport interface ThreadModel {\n root: ThreadType;\n}\n"],
5
+ "mappings": ";;;;;AAkBA,IAAMA,gBAAgB,GAAGC,aAAAA;;UACbC,eAAAA;0CACD,GAAGF,aAAAA,SAAsB,IAAA;0CACzB,GAAGA,aAAAA,SAAsB,IAAA;0CACzB,GAAGA,aAAAA,SAAsB,IAAA;kDACjB,GAAGA,aAAAA,iBAA8B,IAAA;mDAChC,GAAGA,aAAAA,kBAA+B,IAAA;GAL1CE,iBAAAA,eAAAA,CAAAA,EAAAA;",
6
+ "names": ["THREAD_ACTION", "THREAD_PLUGIN", "ThreadAction"]
7
+ }