@shopgate/pwa-common
Version:
Common library for the Shopgate Connect PWA.
12 lines • 1.44 kB
JavaScript
import{Observable}from'rxjs/Observable';import{Subject}from'rxjs/Subject';import{async as asyncScheduler}from'rxjs/scheduler/async';import'rxjs/add/observable/from';import'rxjs/add/observable/fromEvent';import'rxjs/add/operator/do';import'rxjs/add/operator/throttleTime';export var eventsSubject=new Subject();/**
* Cold observable for View scroll events
* @type {Observable}
*/export var viewScroll$=Observable.from(eventsSubject);/**
* @param {HTMLElement} element .
* @param {number} throttleTime .
* @returns {Observable}
*/export var emitScrollEvents=function emitScrollEvents(element){var throttleTime=arguments.length>1&&arguments[1]!==undefined?arguments[1]:250;// In rare situation during unmounting a react dom ref might
// be null due to the execution order of events in fiber nodes.
if(!element){return undefined;}var previousScrollTop=0;var scroll$=Observable.fromEvent(element,'scroll').throttleTime(throttleTime,asyncScheduler,{leading:false,trailing:true}).map(function(event){var scrollTop=element.scrollY||element.scrollTop||0;return{event:event,scrollTop:scrollTop,previousScrollTop:previousScrollTop,scrolled:previousScrollTop!==scrollTop,scrollOut:previousScrollTop<scrollTop,scrollIn:previousScrollTop>=scrollTop};})["do"](function(event){// Remember scroll position for next event
previousScrollTop=event.scrollTop;});// Copy all events to viewScroll$ stream
scroll$.subscribe(viewScroll$);return scroll$;};