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.
128 lines
3.0 KiB
128 lines
3.0 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
type TargetType = HTMLElement; |
|
export type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number}; |
|
export type OnVisibilityChange = (item: OnVisibilityChangeItem) => void; |
|
|
|
export default class VisibilityIntersector { |
|
private observer: IntersectionObserver; |
|
private items: Map<TargetType, boolean> = new Map(); |
|
private locked = false; |
|
|
|
constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) { |
|
this.observer = new IntersectionObserver((entries) => { |
|
if(this.locked) { |
|
return; |
|
} |
|
|
|
const changed: OnVisibilityChangeItem[] = []; |
|
|
|
entries.forEach((entry, index) => { |
|
const target = entry.target as TargetType; |
|
|
|
if(this.items.get(target) === entry.isIntersecting) { |
|
return; |
|
} else { |
|
this.items.set(target, entry.isIntersecting); |
|
} |
|
|
|
/* if(entry.isIntersecting) { |
|
console.log('ooo', entry); |
|
} */ |
|
|
|
/* if(this.locked) { |
|
return; |
|
} */ |
|
|
|
const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index}; |
|
|
|
// ! order will be incorrect so can't use it |
|
// changed[entry.isIntersecting ? 'unshift' : 'push'](change); |
|
changed.push(change); |
|
|
|
// onVisibilityChange(target, entry.isIntersecting); |
|
}); |
|
|
|
changed.forEach((item) => { |
|
onVisibilityChange(item); |
|
}); |
|
}, options); |
|
} |
|
|
|
public getVisible() { |
|
const items: TargetType[] = []; |
|
this.items.forEach((value, key) => { |
|
if(value) { |
|
items.push(key); |
|
} |
|
}); |
|
|
|
return items; |
|
} |
|
|
|
public clearVisible() { |
|
const visible = this.getVisible(); |
|
for(const target of visible) { |
|
this.items.set(target, false); |
|
} |
|
} |
|
|
|
public isVisible(target: TargetType) { |
|
return this.items.get(target); |
|
} |
|
|
|
public disconnect() { |
|
this.observer.disconnect(); |
|
this.items.clear(); |
|
} |
|
|
|
public refresh() { |
|
this.observer.disconnect(); |
|
|
|
// window.requestAnimationFrame(() => { |
|
const targets = [...this.items.keys()]; |
|
for(const target of targets) { |
|
// this.items.set(target, false); |
|
this.observer.observe(target); |
|
} |
|
// }); |
|
} |
|
|
|
public refreshVisible() { |
|
const visible = this.getVisible(); |
|
for(const target of visible) { |
|
this.observer.unobserve(target); |
|
} |
|
|
|
for(const target of visible) { |
|
this.observer.observe(target); |
|
} |
|
} |
|
|
|
public observe(target: TargetType) { |
|
this.items.set(target, false); |
|
this.observer.observe(target); |
|
} |
|
|
|
public unobserve(target: TargetType) { |
|
this.observer.unobserve(target); |
|
this.items.delete(target); |
|
} |
|
|
|
public unlock() { |
|
this.locked = false; |
|
} |
|
|
|
public unlockAndRefresh() { |
|
this.unlock(); |
|
this.refresh(); |
|
} |
|
|
|
public lock() { |
|
this.locked = true; |
|
} |
|
}
|
|
|