@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.
- package/dist/lib/browser/index.mjs +74 -99
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
- package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/amToCodemirror.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/codeMirrorToAm.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/handle.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/index.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/plugin.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +0 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextModel.d.ts +3 -4
- package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
- package/dist/types/src/testing/replicator.d.ts.map +1 -1
- package/package.json +19 -19
- package/src/components/TextEditor/TextEditor.tsx +7 -10
- package/src/{automerge → hooks/automerge}/automerge.stories.tsx +2 -1
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useTextModel.ts +47 -42
- package/src/testing/replicator.ts +2 -3
- package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/amToCodemirror.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/handle.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/index.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/plugin.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge.stories.d.ts.map +0 -1
- package/dist/types/src/hooks/useCollaboration.d.ts +0 -9
- package/dist/types/src/hooks/useCollaboration.d.ts.map +0 -1
- package/src/hooks/useCollaboration.ts +0 -45
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/amToCodemirror.d.ts +0 -0
- /package/dist/types/src/{automerge → hooks/automerge}/automerge.stories.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/codeMirrorToAm.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/handle.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/index.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/plugin.d.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/amToCodemirror.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/codeMirrorToAm.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/handle.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/index.ts +0 -0
- /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
|
|
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 {
|
|
707
|
+
const { awareness, peer } = model;
|
|
709
708
|
useEffect(() => {
|
|
710
|
-
if (
|
|
711
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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/
|
|
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
|
|
850
|
-
import {
|
|
851
|
-
import {
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1244
|
+
const [model, setModel] = useState2(() => createModel({
|
|
1245
|
+
identity,
|
|
1246
|
+
space,
|
|
1247
|
+
text
|
|
1248
|
+
}));
|
|
1249
|
+
useEffect2(() => {
|
|
1250
|
+
setModel(createModel({
|
|
1251
|
+
identity,
|
|
1292
1252
|
space,
|
|
1293
|
-
|
|
1294
|
-
|
|
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
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1260
|
+
return model;
|
|
1261
|
+
};
|
|
1262
|
+
var createModel = (options) => {
|
|
1263
|
+
const { space, text } = options;
|
|
1317
1264
|
if (isActualAutomergeObject(text)) {
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
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
|
-
|
|
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
|