@atlaskit/editor-plugin-find-replace
Version:
find replace plugin for @atlaskit/editor-core
50 lines (47 loc) • 2.11 kB
JavaScript
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
export var withScrollIntoView = function withScrollIntoView(command) {
return function (state, dispatch, view) {
return command(state, function (tr) {
if (expValEquals('platform_editor_editor_centre_content_on_find', 'isEnabled', true) && view) {
var targetPos = tr.selection.anchor;
var coords = view.coordsAtPos(targetPos);
// If element is not visible (coords are invalid), try parent nodes
if (coords.top === coords.bottom || coords.top === 0) {
var $pos = tr.selection.$anchor;
var depth = $pos.depth;
while (depth > 0 && (coords.top === coords.bottom || coords.top === 0)) {
targetPos = $pos.before(depth);
coords = view.coordsAtPos(targetPos);
depth--;
}
}
// Find the closest scrollable parent element
var scrollParent = view.dom;
while (scrollParent && scrollParent !== document.documentElement) {
var style = window.getComputedStyle(scrollParent);
var overflowY = style.overflowY;
var overflowX = style.overflowX;
var isScrollable = (overflowY === 'auto' || overflowY === 'scroll' || overflowX === 'auto' || overflowX === 'scroll') && (scrollParent.scrollHeight > scrollParent.clientHeight || scrollParent.scrollWidth > scrollParent.clientWidth);
if (isScrollable) {
break;
}
scrollParent = scrollParent.parentElement;
}
// Scroll to center the content
if (scrollParent && scrollParent !== document.documentElement) {
var parentRect = scrollParent.getBoundingClientRect();
var scrollTop = scrollParent.scrollTop + coords.top - parentRect.top - parentRect.height / 2 + (coords.bottom - coords.top) / 2;
scrollParent.scrollTo({
top: scrollTop,
behavior: 'smooth'
});
}
} else {
tr.scrollIntoView();
}
if (dispatch) {
dispatch(tr);
}
}, view);
};
};