UNPKG

@atlaskit/editor-plugin-find-replace

Version:

find replace plugin for @atlaskit/editor-core

50 lines (47 loc) 2.11 kB
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); }; };