@dxos/react-ui-editor 0.3.10-main.3645708 → 0.3.10-main.375af01

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 (45) hide show
  1. package/dist/lib/browser/index.mjs +74 -99
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  5. package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +1 -0
  6. package/dist/types/src/hooks/automerge/amToCodemirror.d.ts.map +1 -0
  7. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -0
  8. package/dist/types/src/hooks/automerge/codeMirrorToAm.d.ts.map +1 -0
  9. package/dist/types/src/hooks/automerge/handle.d.ts.map +1 -0
  10. package/dist/types/src/hooks/automerge/index.d.ts.map +1 -0
  11. package/dist/types/src/hooks/automerge/plugin.d.ts.map +1 -0
  12. package/dist/types/src/hooks/index.d.ts +0 -1
  13. package/dist/types/src/hooks/index.d.ts.map +1 -1
  14. package/dist/types/src/hooks/useTextModel.d.ts +3 -4
  15. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  16. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  17. package/package.json +19 -19
  18. package/src/components/TextEditor/TextEditor.tsx +7 -10
  19. package/src/{automerge → hooks/automerge}/automerge.stories.tsx +2 -1
  20. package/src/hooks/index.ts +0 -1
  21. package/src/hooks/useTextModel.ts +47 -42
  22. package/src/testing/replicator.ts +2 -3
  23. package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts.map +0 -1
  24. package/dist/types/src/automerge/automerge-plugin/amToCodemirror.d.ts.map +0 -1
  25. package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts.map +0 -1
  26. package/dist/types/src/automerge/automerge-plugin/handle.d.ts.map +0 -1
  27. package/dist/types/src/automerge/automerge-plugin/index.d.ts.map +0 -1
  28. package/dist/types/src/automerge/automerge-plugin/plugin.d.ts.map +0 -1
  29. package/dist/types/src/automerge/automerge.stories.d.ts.map +0 -1
  30. package/dist/types/src/hooks/useCollaboration.d.ts +0 -9
  31. package/dist/types/src/hooks/useCollaboration.d.ts.map +0 -1
  32. package/src/hooks/useCollaboration.ts +0 -45
  33. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.d.ts +0 -0
  34. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/amToCodemirror.d.ts +0 -0
  35. /package/dist/types/src/{automerge → hooks/automerge}/automerge.stories.d.ts +0 -0
  36. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/codeMirrorToAm.d.ts +0 -0
  37. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/handle.d.ts +0 -0
  38. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/index.d.ts +0 -0
  39. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/plugin.d.ts +0 -0
  40. /package/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.ts +0 -0
  41. /package/src/{automerge/automerge-plugin → hooks/automerge}/amToCodemirror.ts +0 -0
  42. /package/src/{automerge/automerge-plugin → hooks/automerge}/codeMirrorToAm.ts +0 -0
  43. /package/src/{automerge/automerge-plugin → hooks/automerge}/handle.ts +0 -0
  44. /package/src/{automerge/automerge-plugin → hooks/automerge}/index.ts +0 -0
  45. /package/src/{automerge/automerge-plugin → hooks/automerge}/plugin.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  // packages/ui/react-ui-editor/src/index.ts
2
2
  import { TextKind } from "@dxos/protocols/proto/dxos/echo/model/text";
3
- import { Doc, YText as YText2, YXmlFragment } from "@dxos/text-model";
3
+ import { Doc, YText, YXmlFragment } from "@dxos/text-model";
4
4
 
5
5
  // packages/ui/react-ui-editor/src/components/TextEditor/index.ts
6
6
  import { tags as tags2 } from "@lezer/highlight";
@@ -692,7 +692,6 @@ import { useFocusableGroup } from "@fluentui/react-tabster";
692
692
  import { vim } from "@replit/codemirror-vim";
693
693
  import defaultsDeep from "lodash.defaultsdeep";
694
694
  import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useState } from "react";
695
- import { yCollab } from "y-codemirror.next";
696
695
  import { generateName } from "@dxos/display-name";
697
696
  import { useThemeContext } from "@dxos/react-ui";
698
697
  import { getColorForValue, inputSurface, mx as mx2 } from "@dxos/react-ui-theme";
@@ -705,10 +704,10 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, extensions = [], slots
705
704
  const tabsterDOMAttribute = useFocusableGroup({
706
705
  tabBehavior: "limited"
707
706
  });
708
- const { provider, peer } = model;
707
+ const { awareness, peer } = model;
709
708
  useEffect(() => {
710
- if (provider && peer) {
711
- provider.awareness.setLocalStateField("user", {
709
+ if (awareness && peer) {
710
+ awareness.setLocalStateField("user", {
712
711
  name: peer.name ?? generateName(peer.id),
713
712
  color: getColorForValue({
714
713
  value: peer.id,
@@ -722,7 +721,7 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, extensions = [], slots
722
721
  });
723
722
  }
724
723
  }, [
725
- provider,
724
+ awareness,
726
725
  peer,
727
726
  themeMode
728
727
  ]);
@@ -753,7 +752,7 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, extensions = [], slots
753
752
  // TODO(burdon): themeMode doesn't change in storybooks.
754
753
  EditorView5.darkTheme.of(themeMode === "dark"),
755
754
  // Storage and replication.
756
- yCollab(model.content, model.provider?.awareness),
755
+ model.extension,
757
756
  // Custom.
758
757
  ...extensions
759
758
  ].filter(Boolean)
@@ -771,7 +770,7 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, extensions = [], slots
771
770
  };
772
771
  }, [
773
772
  root,
774
- model.content,
773
+ model,
775
774
  themeMode,
776
775
  editorMode
777
776
  ]);
@@ -844,23 +843,22 @@ var defaultTextSlots = {
844
843
  }
845
844
  };
846
845
 
847
- // packages/ui/react-ui-editor/src/hooks/useCollaboration.ts
846
+ // packages/ui/react-ui-editor/src/hooks/useTextModel.ts
847
+ import get3 from "lodash.get";
848
848
  import { useEffect as useEffect2, useState as useState2 } from "react";
849
- import { yCollab as yCollab2 } from "y-codemirror.next";
850
- import { generateName as generateName2 } from "@dxos/display-name";
851
- import { isDocAccessor } from "@dxos/echo-schema";
852
- import { getColorForValue as getColorForValue2 } from "@dxos/react-ui-theme";
853
- import { YText } from "@dxos/text-model";
849
+ import { yCollab } from "y-codemirror.next";
850
+ import { invariant } from "@dxos/invariant";
851
+ import { getRawDoc, isActualAutomergeObject } from "@dxos/react-client/echo";
854
852
 
855
- // packages/ui/react-ui-editor/src/automerge/automerge-plugin/plugin.ts
853
+ // packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts
856
854
  import { Annotation, Facet, StateEffect, StateField as StateField4 } from "@codemirror/state";
857
855
  import { ViewPlugin } from "@codemirror/view";
858
856
  import * as automerge2 from "@dxos/automerge/automerge";
859
857
 
860
- // packages/ui/react-ui-editor/src/automerge/automerge-plugin/PatchSemaphore.ts
858
+ // packages/ui/react-ui-editor/src/hooks/automerge/PatchSemaphore.ts
861
859
  import { next as automerge } from "@dxos/automerge/automerge";
862
860
 
863
- // packages/ui/react-ui-editor/src/automerge/automerge-plugin/amToCodemirror.ts
861
+ // packages/ui/react-ui-editor/src/hooks/automerge/amToCodemirror.ts
864
862
  import { ChangeSet } from "@codemirror/state";
865
863
  var amToCodemirror_default = (view, selection, target, patches) => {
866
864
  for (const patch of patches) {
@@ -967,7 +965,7 @@ var charPath = (textPath, candidatePath) => {
967
965
  return null;
968
966
  };
969
967
 
970
- // packages/ui/react-ui-editor/src/automerge/automerge-plugin/codeMirrorToAm.ts
968
+ // packages/ui/react-ui-editor/src/hooks/automerge/codeMirrorToAm.ts
971
969
  import { next as am } from "@dxos/automerge/automerge";
972
970
  var codeMirrorToAm_default = (field, handle, transactions, state) => {
973
971
  const { lastHeads, path } = state.field(field);
@@ -990,7 +988,7 @@ var codeMirrorToAm_default = (field, handle, transactions, state) => {
990
988
  return newHeads ?? void 0;
991
989
  };
992
990
 
993
- // packages/ui/react-ui-editor/src/automerge/automerge-plugin/PatchSemaphore.ts
991
+ // packages/ui/react-ui-editor/src/hooks/automerge/PatchSemaphore.ts
994
992
  var PatchSemaphore = class {
995
993
  constructor(field) {
996
994
  this._inReconcile = false;
@@ -1031,7 +1029,7 @@ var PatchSemaphore = class {
1031
1029
  }
1032
1030
  };
1033
1031
 
1034
- // packages/ui/react-ui-editor/src/automerge/automerge-plugin/plugin.ts
1032
+ // packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts
1035
1033
  var effectType = StateEffect.define({});
1036
1034
  var updateHeads = (newHeads) => effectType.of({
1037
1035
  newHeads
@@ -1102,45 +1100,6 @@ var automergePlugin = (handle, path) => {
1102
1100
  var reconcileAnnotationType = Annotation.define();
1103
1101
  var isReconcileTx = (tr) => !!tr.annotation(reconcileAnnotationType);
1104
1102
 
1105
- // packages/ui/react-ui-editor/src/hooks/useCollaboration.ts
1106
- var useCollaboration = (model, themeMode) => {
1107
- const { content, provider, peer } = model;
1108
- const [extension] = useState2(() => {
1109
- if (content instanceof YText) {
1110
- return yCollab2(content, provider?.awareness);
1111
- } else if (isDocAccessor(content)) {
1112
- return automergePlugin(content.handle, content.path);
1113
- } else {
1114
- return void 0;
1115
- }
1116
- });
1117
- useEffect2(() => {
1118
- if (provider && peer) {
1119
- provider.awareness.setLocalStateField("user", {
1120
- name: peer.name ?? generateName2(peer.id),
1121
- color: getColorForValue2({
1122
- value: peer.id,
1123
- type: "color"
1124
- }),
1125
- colorLight: getColorForValue2({
1126
- value: peer.id,
1127
- themeMode,
1128
- type: "highlight"
1129
- })
1130
- });
1131
- }
1132
- }, [
1133
- provider,
1134
- peer,
1135
- themeMode
1136
- ]);
1137
- return extension;
1138
- };
1139
-
1140
- // packages/ui/react-ui-editor/src/hooks/useTextModel.ts
1141
- import { useMemo } from "react";
1142
- import { getRawDoc, isActualAutomergeObject } from "@dxos/react-client/echo";
1143
-
1144
1103
  // packages/ui/react-ui-editor/src/hooks/yjs/cursors.ts
1145
1104
  import * as random from "lib0/random";
1146
1105
  var cursorColors = [
@@ -1280,57 +1239,74 @@ var SpaceAwarenessProvider = class extends Observable {
1280
1239
  };
1281
1240
 
1282
1241
  // packages/ui/react-ui-editor/src/hooks/useTextModel.ts
1242
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextModel.ts";
1283
1243
  var useTextModel = ({ identity, space, text }) => {
1284
- const provider = useMemo(() => {
1285
- if (isActualAutomergeObject(text)) {
1286
- return void 0;
1287
- }
1288
- if (!space || !text?.doc) {
1289
- return void 0;
1290
- }
1291
- return new SpaceAwarenessProvider({
1244
+ const [model, setModel] = useState2(() => createModel({
1245
+ identity,
1246
+ space,
1247
+ text
1248
+ }));
1249
+ useEffect2(() => {
1250
+ setModel(createModel({
1251
+ identity,
1292
1252
  space,
1293
- doc: text.doc,
1294
- channel: `yjs.awareness.${text.id}`
1295
- });
1253
+ text
1254
+ }));
1296
1255
  }, [
1297
1256
  identity,
1298
1257
  space,
1299
- text,
1300
- text?.doc
1301
- ]);
1302
- const content = useMemo(() => {
1303
- if (isActualAutomergeObject(text)) {
1304
- const obj = text;
1305
- return getRawDoc(obj, [
1306
- obj.field
1307
- ]);
1308
- } else {
1309
- return text?.content;
1310
- }
1311
- }, [
1312
1258
  text
1313
1259
  ]);
1314
- if (!text?.doc || !text?.content) {
1315
- return void 0;
1316
- }
1260
+ return model;
1261
+ };
1262
+ var createModel = (options) => {
1263
+ const { space, text } = options;
1317
1264
  if (isActualAutomergeObject(text)) {
1318
- const obj = text;
1319
- return {
1320
- id: obj.id,
1321
- content,
1322
- text: () => content.toString(),
1323
- provider: void 0,
1324
- peer: identity ? {
1325
- id: identity.identityKey.toHex(),
1326
- name: identity.profile?.displayName
1327
- } : void 0
1328
- };
1265
+ return createAutomergeModel(options);
1266
+ } else {
1267
+ if (!space || !text?.doc || !text?.content) {
1268
+ return void 0;
1269
+ }
1270
+ return createYjsModel(options);
1329
1271
  }
1272
+ };
1273
+ var createYjsModel = ({ identity, space, text }) => {
1274
+ invariant(space && text?.doc && text?.content, void 0, {
1275
+ F: __dxlog_file2,
1276
+ L: 73,
1277
+ S: void 0,
1278
+ A: [
1279
+ "space && text?.doc && text?.content",
1280
+ ""
1281
+ ]
1282
+ });
1283
+ const provider = new SpaceAwarenessProvider({
1284
+ space,
1285
+ doc: text.doc,
1286
+ channel: `yjs.awareness.${text.id}`
1287
+ });
1330
1288
  return {
1331
1289
  id: text.doc.guid,
1332
1290
  content: text.content,
1333
1291
  text: () => text.content.toString(),
1292
+ extension: yCollab(text.content, provider.awareness),
1293
+ awareness: provider.awareness,
1294
+ peer: identity ? {
1295
+ id: identity.identityKey.toHex(),
1296
+ name: identity.profile?.displayName
1297
+ } : void 0
1298
+ };
1299
+ };
1300
+ var createAutomergeModel = ({ identity, space, text }) => {
1301
+ const obj = text;
1302
+ const doc = getRawDoc(obj, [
1303
+ obj.field
1304
+ ]);
1305
+ return {
1306
+ id: obj.id,
1307
+ content: doc,
1308
+ text: () => get3(doc.handle.docSync(), doc.path),
1309
+ extension: automergePlugin(doc.handle, doc.path),
1334
1310
  peer: identity ? {
1335
1311
  id: identity.identityKey.toHex(),
1336
1312
  name: identity.profile?.displayName
@@ -1345,7 +1321,7 @@ export {
1345
1321
  SpaceAwarenessProvider,
1346
1322
  TextEditor,
1347
1323
  TextKind,
1348
- YText2 as YText,
1324
+ YText,
1349
1325
  YXmlFragment,
1350
1326
  autocomplete,
1351
1327
  basicBundle,
@@ -1366,7 +1342,6 @@ export {
1366
1342
  tasklist,
1367
1343
  textTheme,
1368
1344
  tooltip,
1369
- useCollaboration,
1370
1345
  useTextModel
1371
1346
  };
1372
1347
  //# sourceMappingURL=index.mjs.map