@dxos/react-ui-thread 0.8.4-main.72ec0f3 → 0.8.4-main.8342792842

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-thread",
3
- "version": "0.8.4-main.72ec0f3",
3
+ "version": "0.8.4-main.8342792842",
4
4
  "description": "A set of components to use with threads, including comments and messages.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/dxos/dxos"
10
+ },
7
11
  "license": "MIT",
8
12
  "author": "DXOS.org",
9
- "sideEffects": true,
13
+ "sideEffects": false,
10
14
  "type": "module",
11
15
  "exports": {
12
16
  ".": {
@@ -24,33 +28,32 @@
24
28
  "src"
25
29
  ],
26
30
  "dependencies": {
27
- "@preact-signals/safe-react": "^0.9.0",
28
31
  "@radix-ui/react-primitive": "2.0.2",
29
32
  "date-fns": "^3.3.1",
30
- "@dxos/react-ui-editor": "0.8.4-main.72ec0f3",
31
- "@dxos/util": "0.8.4-main.72ec0f3"
33
+ "@dxos/ui-editor": "0.8.4-main.8342792842",
34
+ "@dxos/util": "0.8.4-main.8342792842",
35
+ "@dxos/react-ui-editor": "0.8.4-main.8342792842"
32
36
  },
33
37
  "devDependencies": {
34
- "@types/react": "~19.2.2",
35
- "@types/react-dom": "~19.2.2",
36
- "react": "~19.2.0",
37
- "react-dom": "~19.2.0",
38
+ "@types/react": "~19.2.7",
39
+ "@types/react-dom": "~19.2.3",
40
+ "react": "~19.2.3",
41
+ "react-dom": "~19.2.3",
38
42
  "vite": "7.1.9",
39
- "@dxos/echo": "0.8.4-main.72ec0f3",
40
- "@dxos/live-object": "0.8.4-main.72ec0f3",
41
- "@dxos/keys": "0.8.4-main.72ec0f3",
42
- "@dxos/log": "0.8.4-main.72ec0f3",
43
- "@dxos/random": "0.8.4-main.72ec0f3",
44
- "@dxos/react-ui": "0.8.4-main.72ec0f3",
45
- "@dxos/react-ui-theme": "0.8.4-main.72ec0f3",
46
- "@dxos/echo-db": "0.8.4-main.72ec0f3",
47
- "@dxos/storybook-utils": "0.8.4-main.72ec0f3"
43
+ "@dxos/echo": "0.8.4-main.8342792842",
44
+ "@dxos/echo-db": "0.8.4-main.8342792842",
45
+ "@dxos/keys": "0.8.4-main.8342792842",
46
+ "@dxos/log": "0.8.4-main.8342792842",
47
+ "@dxos/random": "0.8.4-main.8342792842",
48
+ "@dxos/react-ui": "0.8.4-main.8342792842",
49
+ "@dxos/storybook-utils": "0.8.4-main.8342792842",
50
+ "@dxos/ui-theme": "0.8.4-main.8342792842"
48
51
  },
49
52
  "peerDependencies": {
50
- "react": "^19.0.0",
51
- "react-dom": "^19.0.0",
52
- "@dxos/react-ui": "0.8.4-main.72ec0f3",
53
- "@dxos/react-ui-theme": "0.8.4-main.72ec0f3"
53
+ "react": "~19.2.3",
54
+ "react-dom": "~19.2.3",
55
+ "@dxos/react-ui": "0.8.4-main.8342792842",
56
+ "@dxos/ui-theme": "0.8.4-main.8342792842"
54
57
  },
55
58
  "publishConfig": {
56
59
  "access": "public"
@@ -7,7 +7,7 @@ import React, { useState } from 'react';
7
7
 
8
8
  import { PublicKey } from '@dxos/keys';
9
9
  import { withTheme } from '@dxos/react-ui/testing';
10
- import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/react-ui-theme';
10
+ import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/ui-theme';
11
11
 
12
12
  import { type MessageEntity, MessageStoryText } from '../testing';
13
13
  import { Thread } from '../Thread';
@@ -39,7 +39,7 @@ const meta = {
39
39
  title: 'ui/react-ui-thread/Message',
40
40
  component: MessageRoot as any,
41
41
  render: DefaultStory,
42
- decorators: [withTheme],
42
+ decorators: [withTheme()],
43
43
  parameters: {
44
44
  layout: 'fullscreen',
45
45
  translations,
@@ -5,10 +5,10 @@
5
5
  import { formatDistanceToNow } from 'date-fns/formatDistanceToNow';
6
6
  import React, { type ComponentPropsWithRef, type ComponentPropsWithoutRef, forwardRef } from 'react';
7
7
 
8
- // TODO(burdon): Remove dep.
9
8
  import { Avatar, type ThemedClassName, useTranslation } from '@dxos/react-ui';
10
- import { type UseTextEditorProps, keymap, listener, useTextEditor } from '@dxos/react-ui-editor';
11
- import { focusRing, mx } from '@dxos/react-ui-theme';
9
+ import { type UseTextEditorProps, useTextEditor } from '@dxos/react-ui-editor';
10
+ import { keymap, listener } from '@dxos/ui-editor';
11
+ import { focusRing, mx } from '@dxos/ui-theme';
12
12
  import { hexToEmoji, hexToHue, isTruthy } from '@dxos/util';
13
13
 
14
14
  import { translationKey } from '../translations';
@@ -5,28 +5,28 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { type FC, useEffect, useMemo, useRef, useState } from 'react';
7
7
 
8
- import { Expando } from '@dxos/echo/internal';
9
- import { live } from '@dxos/echo/internal';
10
- import { createDocAccessor, createObject } from '@dxos/echo-db';
8
+ import { Obj } from '@dxos/echo';
9
+ import { TestSchema } from '@dxos/echo/testing';
11
10
  import { PublicKey } from '@dxos/keys';
12
11
  import { log } from '@dxos/log';
13
12
  import { faker } from '@dxos/random';
14
13
  import { Icon, IconButton, useThemeContext } from '@dxos/react-ui';
15
14
  import { withTheme } from '@dxos/react-ui/testing';
15
+ import { useTextEditor } from '@dxos/react-ui-editor';
16
16
  import {
17
17
  type Comment,
18
18
  type CommentsOptions,
19
+ type EditorView,
19
20
  type Range,
20
- automerge,
21
21
  comments,
22
22
  createBasicExtensions,
23
23
  createThemeExtensions,
24
+ documentId,
24
25
  listener,
25
26
  scrollThreadIntoView,
26
- useComments,
27
- useTextEditor,
28
- } from '@dxos/react-ui-editor';
29
- import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/react-ui-theme';
27
+ setComments,
28
+ } from '@dxos/ui-editor';
29
+ import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/ui-theme';
30
30
 
31
31
  import { MessageBody, MessageHeading, MessageRoot, MessageTextbox } from '../Message';
32
32
  import { type MessageEntity } from '../testing';
@@ -38,13 +38,31 @@ faker.seed(101);
38
38
 
39
39
  const authorId = PublicKey.random().toHex();
40
40
 
41
+ /**
42
+ * @deprecated This hook will be removed in future versions. Use the new comment sync extension instead.
43
+ * Update comments state field.
44
+ */
45
+ const useComments = (view: EditorView | null | undefined, id: string, comments?: Comment[]) => {
46
+ useEffect(() => {
47
+ if (view) {
48
+ // Check same document.
49
+ // NOTE: Hook might be called before editor state is updated.
50
+ if (id === view.state.facet(documentId)) {
51
+ view.dispatch({
52
+ effects: setComments.of({ id, comments: comments ?? [] }),
53
+ });
54
+ }
55
+ }
56
+ });
57
+ };
58
+
41
59
  //
42
60
  // Editor
43
61
  //
44
62
 
45
63
  const Editor: FC<{
46
64
  id?: string;
47
- item: Expando;
65
+ initialValue: string;
48
66
  comments: Comment[];
49
67
  selected?: string;
50
68
  onCreateComment: CommentsOptions['onCreate'];
@@ -53,7 +71,7 @@ const Editor: FC<{
53
71
  onSelectComment: CommentsOptions['onSelect'];
54
72
  }> = ({
55
73
  id = 'test',
56
- item,
74
+ initialValue,
57
75
  selected: selectedValue,
58
76
  comments: commentRanges,
59
77
  onCreateComment,
@@ -67,11 +85,10 @@ const Editor: FC<{
67
85
  const { parentRef, view } = useTextEditor(
68
86
  () => ({
69
87
  id,
70
- initialValue: item.content,
88
+ initialValue: initialValue,
71
89
  extensions: [
72
90
  createBasicExtensions(),
73
91
  createThemeExtensions({ themeMode }),
74
- automerge(createDocAccessor(item, ['content'])),
75
92
  comments({
76
93
  id,
77
94
  onCreate: onCreateComment,
@@ -81,7 +98,7 @@ const Editor: FC<{
81
98
  }),
82
99
  ],
83
100
  }),
84
- [id, item, themeMode],
101
+ [id, initialValue, themeMode],
85
102
  );
86
103
  useComments(view, id, commentRanges);
87
104
  useEffect(() => {
@@ -144,7 +161,7 @@ const StoryThread: FC<{
144
161
 
145
162
  const handleCreateMessage = () => {
146
163
  if (messageRef.current?.length) {
147
- const message = live(Expando, {
164
+ const message = Obj.make(TestSchema.Expando, {
148
165
  timestamp: new Date().toISOString(),
149
166
  sender: { identityKey: authorId },
150
167
  text: messageRef.current,
@@ -200,12 +217,14 @@ const StoryThread: FC<{
200
217
  );
201
218
  };
202
219
 
203
- const Sidebar: FC<{
220
+ type SidebarProps = {
204
221
  threads: StoryCommentThread[];
205
222
  selected?: string;
206
223
  onSelect: (thread: string) => void;
207
224
  onResolve: (thread: string) => void;
208
- }> = ({ threads, selected, onSelect, onResolve }) => {
225
+ };
226
+
227
+ const Sidebar = ({ threads, selected, onSelect, onResolve }: SidebarProps) => {
209
228
  // Sort by y-position.
210
229
  const sortedThreads = useMemo(() => {
211
230
  const sorted = [...threads];
@@ -239,7 +258,7 @@ type StoryProps = {
239
258
  };
240
259
 
241
260
  const DefaultStory = ({ text, autoCreate }: StoryProps) => {
242
- const [item] = useState(createObject(live(Expando, { content: text ?? '' })));
261
+ const [item] = useState(() => Obj.make(TestSchema.Expando, { content: text ?? '' }));
243
262
  const [threads, setThreads] = useState<StoryCommentThread[]>([]);
244
263
  const [selected, setSelected] = useState<string>();
245
264
 
@@ -333,7 +352,7 @@ const DefaultStory = ({ text, autoCreate }: StoryProps) => {
333
352
  <main className='fixed inset-0 grid grid-cols-[1fr_24rem]'>
334
353
  <div role='none' className='max-bs-full overflow-y-auto p-4'>
335
354
  <Editor
336
- item={item}
355
+ initialValue={item.content}
337
356
  selected={selected}
338
357
  comments={comments}
339
358
  onCreateComment={handleCreateComment}
@@ -359,7 +378,7 @@ const meta = {
359
378
  title: 'ui/react-ui-thread/Comments',
360
379
  component: StoryThread as any,
361
380
  render: DefaultStory,
362
- decorators: [withTheme],
381
+ decorators: [withTheme()],
363
382
  parameters: {
364
383
  translations,
365
384
  layout: 'fullscreen',
@@ -8,8 +8,8 @@ import React, { useMemo, useRef, useState } from 'react';
8
8
  import { PublicKey } from '@dxos/keys';
9
9
  import { faker } from '@dxos/random';
10
10
  import { withTheme } from '@dxos/react-ui/testing';
11
- import { createBasicExtensions, createThemeExtensions } from '@dxos/react-ui-editor';
12
- import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/react-ui-theme';
11
+ import { createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';
12
+ import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/ui-theme';
13
13
 
14
14
  import { MessageRoot, MessageTextbox } from '../Message';
15
15
  import { type MessageEntity, MessageStoryText } from '../testing';
@@ -85,7 +85,7 @@ const meta = {
85
85
  title: 'ui/react-ui-thread/Thread',
86
86
  component: Thread.Root,
87
87
  render: DefaultStory,
88
- decorators: [withTheme],
88
+ decorators: [withTheme()],
89
89
  parameters: {
90
90
  layout: 'fullscreen',
91
91
  translations,
@@ -5,12 +5,12 @@
5
5
  import React, { type ComponentPropsWithRef, forwardRef } from 'react';
6
6
 
7
7
  import { Icon, type ThemedClassName, useTranslation } from '@dxos/react-ui';
8
- import { hoverableControlItem, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
8
+ import { hoverableControlItem, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';
9
9
 
10
10
  import { translationKey } from '../translations';
11
11
  import type { ThreadEntity } from '../types';
12
12
 
13
- // TODO(burdon): Why is this exported?
13
+ // TODO(burdon): Avoid exporting fragments.
14
14
  export const threadLayout = 'is-full place-self-start grid grid-cols-[var(--rail-size)_1fr]';
15
15
 
16
16
  //
package/src/testing.tsx CHANGED
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { IconButton } from '@dxos/react-ui';
8
- import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
8
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';
9
9
 
10
10
  import { MessageBody, MessageHeading } from './Message';
11
11
  import { type MessageMetadata } from './types';
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { type Resource } from '@dxos/react-ui';
6
6
 
7
- export const translationKey = 'react-ui-thread';
7
+ export const translationKey = '@dxos/react-ui-thread';
8
8
 
9
9
  export const translations = [
10
10
  {