/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import VisibilityIntersector from "./visibilityIntersector"; import findAndSpliceAll from "../helpers/array/findAndSpliceAll"; import findAndSplice from "../helpers/array/findAndSplice"; import LazyLoadQueueIntersector, { LazyLoadElement } from "./lazyLoadQueueIntersector"; export default class LazyLoadQueue extends LazyLoadQueueIntersector { constructor(parallelLimit?: number) { super(parallelLimit); this.intersector = new VisibilityIntersector(this.onVisibilityChange); } private onVisibilityChange = (target: HTMLElement, visible: boolean) => { if(visible) { /* if(DEBUG) { this.log('isIntersecting', target); } */ // need for set element first if scrolled findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => { item.wasSeen = true; this.queue.unshift(item); //this.processQueue(item); }); this.setProcessQueueTimeout(); } }; protected getItem() { return findAndSplice(this.queue, item => item.wasSeen); } public async processItem(item: LazyLoadElement) { await super.processItem(item); this.intersector.unobserve(item.div); } protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) { const inserted = super.addElement(method, el); if(!inserted) return false; this.intersector.observe(el.div); /* if(el.wasSeen) { this.processQueue(el); } else */if(!el.hasOwnProperty('wasSeen')) { el.wasSeen = false; } return true; } }