-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Block List: Extract scroll preservation as non-visual component (#5085)
* Block List: Extract scroll preservation as non-visual component * Editor: Replace ad hoc block query selects
- Loading branch information
Showing
7 changed files
with
128 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
/** | ||
* WordPress dependencies | ||
*/ | ||
import { Component } from '@wordpress/element'; | ||
import { withSelect } from '@wordpress/data'; | ||
import { getScrollContainer } from '@wordpress/utils'; | ||
|
||
/** | ||
* Internal dependencies | ||
*/ | ||
import { getBlockDOMNode } from '../../utils/dom'; | ||
|
||
/** | ||
* Non-visual component which preserves offset of selected block within nearest | ||
* scrollable container while reordering. | ||
* | ||
* @example | ||
* | ||
* ```jsx | ||
* <PreserveScrollInReorder /> | ||
* ``` | ||
*/ | ||
class PreserveScrollInReorder extends Component { | ||
componentWillUpdate( nextProps ) { | ||
const { blockOrder, selectionStart } = nextProps; | ||
if ( blockOrder !== this.props.blockOrder && selectionStart ) { | ||
this.setPreviousOffset( selectionStart ); | ||
} | ||
} | ||
|
||
componentDidUpdate() { | ||
if ( this.previousOffset ) { | ||
this.restorePreviousOffset(); | ||
} | ||
} | ||
|
||
/** | ||
* Given the block UID of the start of the selection, saves the block's | ||
* top offset as an instance property before a reorder is to occur. | ||
* | ||
* @param {string} selectionStart UID of selected block. | ||
*/ | ||
setPreviousOffset( selectionStart ) { | ||
const blockNode = getBlockDOMNode( selectionStart ); | ||
if ( ! blockNode ) { | ||
return; | ||
} | ||
|
||
this.previousOffset = blockNode.getBoundingClientRect().top; | ||
} | ||
|
||
/** | ||
* After a block reordering, restores the previous viewport top offset. | ||
*/ | ||
restorePreviousOffset() { | ||
const { selectionStart } = this.props; | ||
const blockNode = getBlockDOMNode( selectionStart ); | ||
if ( blockNode ) { | ||
const scrollContainer = getScrollContainer( blockNode ); | ||
if ( scrollContainer ) { | ||
scrollContainer.scrollTop = scrollContainer.scrollTop + | ||
blockNode.getBoundingClientRect().top - | ||
this.previousOffset; | ||
} | ||
} | ||
|
||
delete this.previousOffset; | ||
} | ||
|
||
render() { | ||
return null; | ||
} | ||
} | ||
|
||
export default withSelect( ( select ) => { | ||
return { | ||
blockOrder: select( 'core/editor' ).getBlockOrder(), | ||
selectionStart: select( 'core/editor' ).getBlockSelectionStart(), | ||
}; | ||
} )( PreserveScrollInReorder ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
/** | ||
* Given a block UID, returns the corresponding DOM node for the block, if | ||
* exists. As much as possible, this helper should be avoided, and used only | ||
* in cases where isolated behaviors need remote access to a block node. | ||
* | ||
* @param {string} uid Block UID. | ||
* | ||
* @return {Element} Block DOM node. | ||
*/ | ||
export function getBlockDOMNode( uid ) { | ||
return document.querySelector( '[data-block="' + uid + '"]' ); | ||
} |