From ac8df1cfff74487711ae70e0d366cb631c179601 Mon Sep 17 00:00:00 2001 From: Irwan Fario Subastian Date: Wed, 1 Nov 2017 12:02:22 +1100 Subject: [PATCH] fix backward selection always changed to forward (#1354) --- .../slate-react/src/components/content.js | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/packages/slate-react/src/components/content.js b/packages/slate-react/src/components/content.js index 7aa0e4a6f..19671a73d 100644 --- a/packages/slate-react/src/components/content.js +++ b/packages/slate-react/src/components/content.js @@ -131,6 +131,7 @@ class Content extends React.Component { const { editor } = this.props const { value } = editor const { selection } = value + const { isBackward } = selection const window = getWindow(this.element) const native = window.getSelection() const { rangeCount } = native @@ -161,20 +162,33 @@ class Content extends React.Component { } // If the new range matches the current selection, do nothing. - if ( - current && - range.startContainer == current.startContainer && - range.startOffset == current.startOffset && - range.endContainer == current.endContainer && - range.endOffset == current.endOffset - ) { - return + if (current) { + if ( + range.startContainer == current.startContainer && + range.startOffset == current.startOffset && + range.endContainer == current.endContainer && + range.endOffset == current.endOffset + ) { + return + } + if ( + range.startContainer == current.endContainer && + range.startOffset == current.endOffset && + range.endContainer == current.startContainer && + range.endOffset == current.startOffset + ) { + return + } } // Otherwise, set the `isUpdatingSelection` flag and update the selection. this.tmp.isUpdatingSelection = true native.removeAllRanges() - native.addRange(range) + if (isBackward) { + native.setBaseAndExtent(range.endContainer, range.endOffset, range.startContainer, range.startOffset) + } else { + native.setBaseAndExtent(range.startContainer, range.startOffset, range.endContainer, range.endOffset) + } scrollToSelection(native) // Then unset the `isUpdatingSelection` flag after a delay.