TryGhost/Ghost

View on GitHub
ghost/admin/app/modifiers/on-scroll.js

Summary

Maintainability
A
0 mins
Test Coverage
import Modifier from 'ember-modifier';
import {action} from '@ember/object';
import {registerDestructor} from '@ember/destroyable';

export default class OnScrollModifier extends Modifier {
    constructor(owner, args) {
        super(owner, args);
        registerDestructor(this, this.cleanup);
    }

    modify(element, [callback], named) {
        this.elem = element;
        this.callback = callback;
        this.scrollContainer = element;

        if (named.scrollContainer) {
            this.scrollContainer = element.closest(named.scrollContainer);
        }

        this.scrollContainer?.addEventListener('scroll', this.onScroll, {passive: true});
    }

    cleanup = () => {
        this.scrollContainer?.removeEventListener('scroll', this.onScroll, {passive: true});
    };

    @action
    onScroll(event) {
        this.callback(this.elem, this.scrollContainer, event);
    }
}