|
|
|
/*
|
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
}
|