mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-08-31 02:49:56 +02:00
update the scroll position on content changes
This commit is contained in:
@@ -2,8 +2,10 @@
|
|||||||
import Base64 from '../serializers/base-64'
|
import Base64 from '../serializers/base-64'
|
||||||
import Debug from 'debug'
|
import Debug from 'debug'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
import ReactDOM from 'react-dom'
|
||||||
import TYPES from '../utils/types'
|
import TYPES from '../utils/types'
|
||||||
import Text from './text'
|
import Text from './text'
|
||||||
|
import scrollTo from 'element-scroll-to'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Debugger.
|
* Debugger.
|
||||||
@@ -63,6 +65,50 @@ class Node extends React.Component {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On mount, update the scroll position.
|
||||||
|
*/
|
||||||
|
|
||||||
|
componentDidMount = () => {
|
||||||
|
this.updateScroll()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After update, update the scroll position if the node's content changed.
|
||||||
|
*
|
||||||
|
* @param {Object} prevProps
|
||||||
|
* @param {Object} prevState
|
||||||
|
*/
|
||||||
|
|
||||||
|
componentDidUpdate = (prevProps, prevState) => {
|
||||||
|
if (this.props.node != prevProps.node) this.updateScroll()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the scroll position after a change as occured if this is a leaf
|
||||||
|
* block and it has the selection's ending edge. This ensures that scrolling
|
||||||
|
* matches native `contenteditable` behavior even for cases where the edit is
|
||||||
|
* not applied natively, like when enter is pressed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
updateScroll = () => {
|
||||||
|
const { node, state } = this.props
|
||||||
|
const { selection } = state
|
||||||
|
|
||||||
|
// If this isn't a block, or it's a wrapping block, abort.
|
||||||
|
if (node.kind != 'block') return
|
||||||
|
if (node.nodes.first().kind == 'block') return
|
||||||
|
|
||||||
|
// If the selection is blurred, or this block doesn't contain it, abort.
|
||||||
|
if (selection.isBlurred) return
|
||||||
|
if (!selection.hasEndIn(node)) return
|
||||||
|
|
||||||
|
const el = ReactDOM.findDOMNode(this)
|
||||||
|
scrollTo(el)
|
||||||
|
|
||||||
|
this.debug('updateScroll', el)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On drag start, add a serialized representation of the node to the data.
|
* On drag start, add a serialized representation of the node to the data.
|
||||||
*
|
*
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
"debug": "^2.2.0",
|
"debug": "^2.2.0",
|
||||||
"detect-browser": "^1.3.3",
|
"detect-browser": "^1.3.3",
|
||||||
"direction": "^0.1.5",
|
"direction": "^0.1.5",
|
||||||
|
"element-scroll-to": "^1.1.0",
|
||||||
"esrever": "^0.2.0",
|
"esrever": "^0.2.0",
|
||||||
"immutable": "^3.8.1",
|
"immutable": "^3.8.1",
|
||||||
"is-empty": "^1.0.0",
|
"is-empty": "^1.0.0",
|
||||||
|
Reference in New Issue
Block a user