Telegram Web K with changes to work inside I2P https://web.telegram.i2p/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

75 lines
2.1 KiB

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
import VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';
import findAndSpliceAll from '../helpers/array/findAndSpliceAll';
import findAndSplice from '../helpers/array/findAndSplice';
import LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';
import useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';
export default class LazyLoadQueue extends LazyLoadQueueIntersector {
constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {
super(parallelLimit);
this.intersector = new VisibilityIntersector(this.onVisibilityChange);
!ignoreHeavyAnimation && useHeavyAnimationCheck(() => {
this.lock();
}, () => {
this.unlockAndRefresh();
});
}
private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {
// if(DEBUG) {
// this.log('isIntersecting', target, visible);
// }
// if visible - will move to the end of visible arary
findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {
if(visible) {
item.wasSeen = true;
}
item.visible = visible;
const index = this.queue.findIndex((item) => !item.visible);
this.queue.splice(Math.max(0, index), 0, 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.observe(el);
/* if(el.wasSeen) {
this.processQueue(el);
} else */
el.wasSeen ??= false;
return true;
}
public setAllSeen() {
this.queue.forEach((item) => {
item.wasSeen = true;
});
this.setProcessQueueTimeout();
}
}