1
0
Fork 0
mirror of https://github.com/TryGhost/Ghost-Admin.git synced 2023-12-14 02:33:04 +01:00
Ghost-Admin/app/components/gh-scroll-trigger.js
Kevin Ansfield 4ac3f3643f Update dependency ember-in-viewport to v3.8.0
no issue

- now that we no longer have the `ember-sticky-element` dependency we're free to upgrade `ember-in-viewport`
- remove package.json resolution so latest version gets installed
- remove ember-in-viewport from renovate ignore config
- update `<GhScrollTrigger>` to match latest `ember-in-viewport` usage and convert to a glimmer component
  - ensure `scrollableArea` is always set so that the trigger doesn't stop working after the first trigger
2020-10-01 10:06:53 +01:00

66 lines
1.8 KiB
JavaScript

import Component from '@glimmer/component';
import {action} from '@ember/object';
import {inject as service} from '@ember/service';
// TODO: move to a util - duplicated in koenig-editor/koenig-link-input
function getScrollParent(node) {
const isElement = node instanceof HTMLElement;
const overflowY = isElement && window.getComputedStyle(node).overflowY;
const isScrollable = overflowY !== 'visible' && overflowY !== 'hidden';
if (!node) {
return null;
} else if (isScrollable && node.scrollHeight >= node.clientHeight) {
return node;
}
return getScrollParent(node.parentNode) || document.body;
}
export default class GhScrollTrigger extends Component {
@service inViewport;
@action
setupInViewport(element) {
this.loaderElement = element;
let viewportTolerance = this.args.triggerOffset || {};
// if triggerOffset is a number we use it for all dimensions
if (typeof viewportTolerance === 'number') {
viewportTolerance = {
top: viewportTolerance,
bottom: viewportTolerance,
left: viewportTolerance,
right: viewportTolerance
};
}
let options = {
viewportSpy: true,
viewportTolerance,
scrollableArea: this.args.scrollable || getScrollParent(element)
};
let {onEnter, onExit} = this.inViewport.watchElement(element, options);
onEnter(this.didEnterViewport.bind(this));
onExit(this.didExitViewport.bind(this));
this.args.registerElement?.(element);
}
didEnterViewport() {
this.args.enter?.();
}
didExitViewport() {
this.args.exit?.();
}
@action
teardownInViewport(element) {
this.inViewport.stopWatching(element);
}
}