From 4e64e6b9eab529be14721fc294d9dac6e8e4846f Mon Sep 17 00:00:00 2001 From: BrianHung Date: Wed, 11 Aug 2021 17:41:57 -0700 Subject: [PATCH] fix y-prosemirror autofocus --- src/lib.js | 7 ++++--- src/plugins/cursor-plugin.js | 4 ++-- src/plugins/sync-plugin.js | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/lib.js b/src/lib.js index 812d09a9..7ef9b511 100644 --- a/src/lib.js +++ b/src/lib.js @@ -2,6 +2,7 @@ import { updateYFragment} from './plugins/sync-plugin.js' // eslint-disable-line import * as Y from 'yjs' import { EditorView } from 'prosemirror-view' // eslint-disable-line import { Node, Schema } from 'prosemirror-model' // eslint-disable-line +import { Selection } from 'prosemirror-state' // eslint-disable-line import * as error from 'lib0/error.js' import * as map from 'lib0/map.js' import * as eventloop from 'lib0/eventloop.js' @@ -47,9 +48,9 @@ export const setMeta = (view, key, value) => { * @param {ProsemirrorMapping} mapping * @return {any} relative position */ -export const absolutePositionToRelativePosition = (pos, type, mapping) => { - if (pos === 0) { - return Y.createRelativePositionFromTypeIndex(type, 0) +export const absolutePositionToRelativePosition = (doc, pos, type, mapping) => { + if (pos <= Selection.atStart(doc).from) { + return Y.createRelativePositionFromTypeIndex(type, 0, -1) } let n = type._first === null ? null : /** @type {Y.ContentType} */ (type._first.content).type while (n !== null && type !== n) { diff --git a/src/plugins/cursor-plugin.js b/src/plugins/cursor-plugin.js index ce7bb39e..3a719556 100644 --- a/src/plugins/cursor-plugin.js +++ b/src/plugins/cursor-plugin.js @@ -114,11 +114,11 @@ export const yCursorPlugin = (awareness, { cursorBuilder = defaultCursorBuilder, /** * @type {Y.RelativePosition} */ - const anchor = absolutePositionToRelativePosition(selection.anchor, ystate.type, ystate.binding.mapping) + const anchor = absolutePositionToRelativePosition(view.state.doc, selection.anchor, ystate.type, ystate.binding.mapping) /** * @type {Y.RelativePosition} */ - const head = absolutePositionToRelativePosition(selection.head, ystate.type, ystate.binding.mapping) + const head = absolutePositionToRelativePosition(view.state.doc, selection.head, ystate.type, ystate.binding.mapping) if (current.cursor == null || !Y.compareRelativePositions(Y.createRelativePositionFromJSON(current.cursor.anchor), anchor) || !Y.compareRelativePositions(Y.createRelativePositionFromJSON(current.cursor.head), head)) { awareness.setLocalStateField(cursorStateField, { anchor, head diff --git a/src/plugins/sync-plugin.js b/src/plugins/sync-plugin.js index 7051bbd5..0a995839 100644 --- a/src/plugins/sync-plugin.js +++ b/src/plugins/sync-plugin.js @@ -169,8 +169,8 @@ const restoreRelativeSelection = (tr, relSel, binding) => { } export const getRelativeSelection = (pmbinding, state) => ({ - anchor: absolutePositionToRelativePosition(state.selection.anchor, pmbinding.type, pmbinding.mapping), - head: absolutePositionToRelativePosition(state.selection.head, pmbinding.type, pmbinding.mapping) + anchor: absolutePositionToRelativePosition(state.doc, state.selection.anchor, pmbinding.type, pmbinding.mapping), + head: absolutePositionToRelativePosition(state.doc, state.selection.head, pmbinding.type, pmbinding.mapping) }) /**