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.
100 lines
2.3 KiB
100 lines
2.3 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import findAndSpliceAll from '../helpers/array/findAndSpliceAll'; |
|
import LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase'; |
|
import VisibilityIntersector from './visibilityIntersector'; |
|
|
|
export type LazyLoadElement = Omit<LazyLoadElementBase, 'load'> & { |
|
load: (target?: HTMLElement) => Promise<any>, |
|
div: HTMLElement |
|
wasSeen?: boolean, |
|
visible?: boolean |
|
}; |
|
|
|
export default class LazyLoadQueueIntersector extends LazyLoadQueueBase { |
|
protected queue: Array<LazyLoadElement> = []; |
|
protected inProcess: Set<LazyLoadElement> = new Set(); |
|
|
|
public intersector: VisibilityIntersector; |
|
protected intersectorTimeout: number; |
|
|
|
constructor(parallelLimit?: number) { |
|
super(parallelLimit); |
|
} |
|
|
|
public lock() { |
|
super.lock(); |
|
this.intersector.lock(); |
|
} |
|
|
|
public unlock() { |
|
super.unlock(); |
|
this.intersector.unlock(); |
|
} |
|
|
|
public unlockAndRefresh() { |
|
super.unlock(); |
|
this.intersector.unlockAndRefresh(); |
|
} |
|
|
|
public clear() { |
|
super.clear(); |
|
this.intersector.disconnect(); |
|
} |
|
|
|
public refresh() { |
|
this.intersector.refresh(); |
|
} |
|
|
|
protected loadItem(item: LazyLoadElement) { |
|
return item.load(item.div); |
|
} |
|
|
|
protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) { |
|
const item = this.queue.find((i) => i.div === el.div && i.load === el.load); |
|
if(item) { |
|
return false; |
|
} else { |
|
for(const item of this.inProcess) { |
|
if(item.div === el.div && item.load === el.load) { |
|
return false; |
|
} |
|
} |
|
} |
|
|
|
this.queue[method](el); |
|
return true; |
|
} |
|
|
|
protected setProcessQueueTimeout() { |
|
this.intersectorTimeout ??= window.setTimeout(() => { |
|
this.intersectorTimeout = undefined; |
|
this.processQueue(); |
|
}, 0); |
|
} |
|
|
|
public push(el: LazyLoadElement) { |
|
super.push(el); |
|
} |
|
|
|
public unshift(el: LazyLoadElement) { |
|
super.unshift(el); |
|
} |
|
|
|
public delete(el: Omit<LazyLoadElement, 'load'>) { |
|
findAndSpliceAll(this.queue, (i) => i.div === el.div); |
|
this.unobserve(el); |
|
} |
|
|
|
public observe(el: LazyLoadElement) { |
|
this.intersector.observe(el.div); |
|
} |
|
|
|
public unobserve(el: Omit<LazyLoadElement, 'load'>) { |
|
this.intersector.unobserve(el.div); |
|
} |
|
}
|
|
|