Skip to content

Commit

Permalink
Merge pull request #72 from open-amdocs/scrollable-performance-refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
yairEO committed Nov 8, 2021
2 parents 54e5b13 + 0655ac7 commit c65e5c8
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 22 deletions.
18 changes: 6 additions & 12 deletions src/components/Scrollable/Scrollable.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -113,15 +113,15 @@ export default class Scrollable extends React.PureComponent {
const nextEvent = this.event.next,
prevEvent = this.event.prev,
changed = nextEvent.scrollHeight !== prevEvent.scrollHeight ||
nextEvent.scrollWidth !== prevEvent.scrollWidth ||
nextEvent.top !== prevEvent.top ||
nextEvent.left !== prevEvent.left;
nextEvent.scrollWidth !== prevEvent.scrollWidth ||
nextEvent.top !== prevEvent.top ||
nextEvent.left !== prevEvent.left;

// Ensures that updates (which are a potentially expensive operation)
// are only executed if the applicable scroll properties have changed
if (changed) {
const el = this.container.current.parentElement;
this.props.onUpdate(nextEvent);
const el = this.container.current.parentElement;
const vRatio = nextEvent.clientHeight / nextEvent.scrollHeight;
const hRatio = nextEvent.clientWidth / nextEvent.scrollWidth;

Expand All @@ -132,14 +132,8 @@ export default class Scrollable extends React.PureComponent {
el.style.setProperty('--scrollable-vertical-ratio', vRatio);
el.style.setProperty('--scrollable-horizontal-ratio', hRatio);

if( this.props.cssVarsOnTracks ) {
this.vTrack.current.style.setProperty('--scrollable-scroll-top', nextEvent.top);
this.hTrack.current.style.setProperty('--scrollable-scroll-left', nextEvent.left);
}
else {
el.style.setProperty('--scrollable-scroll-top', nextEvent.top);
el.style.setProperty('--scrollable-scroll-left', nextEvent.left);
}
(this.props.cssVarsOnTracks ? this.vTrack.current : el).style.setProperty('--scrollable-scroll-top', nextEvent.top);
(this.props.cssVarsOnTracks ? this.hTrack.current : el).style.setProperty('--scrollable-scroll-left', nextEvent.left);
});
}

Expand Down
44 changes: 34 additions & 10 deletions src/components/Scrollable/Scrollable.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react';
import {mount} from 'enzyme';
import sinon from 'sinon';
import {noop} from 'utility/memory';
import Scrollable from './Scrollable';
import Scrollable from './';
import {normalizeScrollPosition} from './Scrollable.utils';
import {SCROLLING_CLASS_REMOVAL_DELAY} from './Scrollable.constants';

Expand All @@ -18,6 +18,19 @@ describe('<Scrollable/>', () => {
expect(wrapper.find('VerticalScrollbar')).toHaveLength(1);
expect(wrapper.find('HorizontalScrollbar')).toHaveLength(1);
});

it('should render a Scrollbar with custom vertical & horizontal scrollbars', () => {
const wrapper = mount(
<Scrollable>
<Scrollable.VerticalScrollbar><div className='vsb-child'></div></Scrollable.VerticalScrollbar>
<Scrollable.HorizontalScrollbar><div className='hsb-child'></div></Scrollable.HorizontalScrollbar>
</Scrollable>
);
expect(wrapper.find('.scrollbar')).toHaveLength(1);
expect(wrapper.find('ResizeObserver')).toHaveLength(1);
expect(wrapper.find('.vsb-child')).toHaveLength(1);
expect(wrapper.find('.hsb-child')).toHaveLength(1);
});
});

describe('Life Cycle', () => {
Expand All @@ -34,14 +47,26 @@ describe('<Scrollable/>', () => {
expect(s.getSnapshotBeforeUpdate()).toEqual(s.container.current);
});

it('componentDidUpdate()', () => {
const s = new Scrollable({scrollOnDOMChange: false});
s.container = {current: {scrollTop: 0}};
s.updateScrollbars = sinon.spy();
s.componentDidUpdate(null, null, {scrollTop: 50, scrollLeft: 50});
expect(s.container.current.scrollTop).toEqual(50);
expect(s.container.current.scrollLeft).toEqual(50);
expect(s.updateScrollbars.callCount).toEqual(1);
describe('componentDidUpdate', () => {
it('scrollOnDOMChange prop "true"', () => {
const s = new Scrollable({scrollOnDOMChange: true});
s.container = {current: {scrollTop: 0, scrollLeft: 0}};
s.updateScrollbars = sinon.spy();
s.componentDidUpdate(null, null, {scrollTop: 50, scrollLeft: 50});
expect(s.container.current.scrollTop).toEqual(0);
expect(s.container.current.scrollLeft).toEqual(0);
expect(s.updateScrollbars.callCount).toEqual(1);
});

it('scrollOnDOMChange prop "false"', () => {
const s = new Scrollable({scrollOnDOMChange: false});
s.container = {current: {scrollTop: 0}};
s.updateScrollbars = sinon.spy();
s.componentDidUpdate(null, null, {scrollTop: 50, scrollLeft: 50});
expect(s.container.current.scrollTop).toEqual(50);
expect(s.container.current.scrollLeft).toEqual(50);
expect(s.updateScrollbars.callCount).toEqual(1);
});
});
});

Expand Down Expand Up @@ -162,7 +187,6 @@ describe('<Scrollable/>', () => {
expect(global.window.requestAnimationFrame.callCount).toEqual(1);
global.window.requestAnimationFrame.args[0][0]();
expect(toggle.callCount).toEqual(2);

expect(containerSetProperty.callCount).toEqual(2);
expect(hTrackSetProperty.callCount).toEqual(1);
expect(vTrackSetProperty.callCount).toEqual(1);
Expand Down

0 comments on commit c65e5c8

Please sign in to comment.