Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import jq from '../../../jquery';
  2.  
  3. import { MODULE_NAME, DEFAULT_OPTIONS, EVENTS, EVENT_ACTIONS } from './constants';
  4. import { KEY_CODES } from '../../../../constants';
  5.  
  6.  
  7.  
  8. export default class LoadMoreHelper {
  9.   constructor(options) {
  10.     Object.assign(this, DEFAULT_OPTIONS, options);
  11.     this.eventHandlers = {
  12.       [EVENTS.WHEEL.name]: this.onWheelHandler.bind(this, EVENTS.WHEEL),
  13.       [EVENTS.KEY_DOWN.name]: this.onKeyDownHandler.bind(this, EVENTS.KEY_DOWN),
  14.       [EVENTS.TOUCH_START.name]: this.onTouchStartHandler.bind(this, EVENTS.TOUCH_START),
  15.       [EVENTS.TOUCH_MOVE.name]: this.onTouchMoveHandler.bind(this, EVENTS.TOUCH_MOVE),
  16.       [EVENTS.TOUCH_END.name]: this.onTouchEndHandler.bind(this, EVENTS.TOUCH_END),
  17.       [EVENTS.TOUCH_CANCEL.name]: this.onTouchCancelHandler.bind(this, EVENTS.TOUCH_CANCEL),
  18.     };
  19.     Object.keys(EVENTS).forEach(key => this.handleEvent(key, EVENT_ACTIONS.ADD));
  20.   }
  21.  
  22.   onWheelHandler(event, e) {
  23.     if (!this.doWork) return this.continueHandling(event, e);
  24.     if (!this.isNeedToLoadMore(event)) return;
  25.     this.continueHandling(event, e);
  26.   }
  27.  
  28.   onKeyDownHandler(event, e) {
  29.     if (!this.doWork) return this.continueHandling(event, e);
  30.     if ((e.keyCode !== KEY_CODES.PAGE_DOWN && e.keyCode !== KEY_CODES.DOWN_ARROW) || !this.isNeedToLoadMore(event)) return;
  31.     const target = jq.wrap(e.target);
  32.     const isForSearch = target.hasClass('navbar-search-box-container') || target.hasParents('.navbar-search-box-container');
  33.     const isModalTarget = target.hasClass('modal');
  34.     if (/*isModalTarget || */isForSearch) return;
  35.     this.continueHandling(event, e);
  36.   }
  37.  
  38.   onTouchStartHandler(event, e) {
  39.     this.continueHandling(event, e);
  40.   }
  41.  
  42.   onTouchMoveHandler(event, e) {
  43.     if (!this.doWork) return this.continueHandling(event, e);
  44.     if (!this.isNeedToLoadMore(event)) return;
  45.     this.continueHandling(event, e);
  46.   }
  47.  
  48.   onTouchEndHandler(event, e) {
  49.     this.continueHandling(event, e);
  50.   }
  51.  
  52.   onTouchCancelHandler(event, e) {
  53.     this.continueHandling(event, e);
  54.   }
  55.  
  56.   isNeedToLoadMore() {
  57.     const container = this.container;
  58.     if (!container) return;
  59.     const fullHeight = container.scrollHeight;
  60.     const currentScrollHeight = container.scrollTop + container.clientHeight;
  61.     return fullHeight - currentScrollHeight <= this.bottomOffset;
  62.   }
  63.  
  64.   continueHandling(event, e) {
  65.     if (this.handlers && this.handlers[event.name]) this.handlers[event.name](e, event);
  66.   }
  67.  
  68.   dispose() {
  69.     Object.keys(EVENTS).forEach(key => this.handleEvent(key, EVENT_ACTIONS.REMOVE));
  70.  
  71.     this.container = null;
  72.     this.keyContainer = null;
  73.     this.eventHandlers = null;
  74.   }
  75.  
  76.   handleEvent(key, action) {
  77.     const event = EVENTS[key];
  78.     if (!event) return this.printError(`event not found for key '${key}'`);
  79.     if (!this.eventHandlers[event.name]) return this.printError(`event listener not found for '${event.name}'`);
  80.     const container = this.getContainer(EVENTS[key]);
  81.     if (!container || !container[action]) return this.printError(`container or action not found. Expected action: '${action}'`);
  82.     container[action](event.name, this.eventHandlers[event.name]);
  83.   }
  84.  
  85.   getContainer(event) {
  86.     const containerKey = event.container;
  87.     return this[containerKey];
  88.   }
  89.  
  90.   printError(text) {
  91.     console.error(`${MODULE_NAME}: ${text}`);
  92.   }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement