2018-01-18 03:16:04 +00:00
|
|
|
// Use intersection observer to calculate rects asynchronously
|
2018-01-24 01:25:56 +00:00
|
|
|
import { getRectFromEntry } from './getRectFromEntry'
|
|
|
|
|
2018-01-18 03:16:04 +00:00
|
|
|
class AsyncLayout {
|
|
|
|
constructor(generateKeyFromNode) {
|
|
|
|
this._onIntersectionCallbacks = {}
|
|
|
|
|
|
|
|
this._intersectionObserver = new IntersectionObserver(entries => {
|
|
|
|
entries.forEach(entry => {
|
|
|
|
let key = generateKeyFromNode(entry.target)
|
|
|
|
this._onIntersectionCallbacks[key](entry)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
observe(key, node, callback) {
|
2018-01-27 18:46:52 +00:00
|
|
|
if (!node) {
|
|
|
|
return
|
|
|
|
}
|
2018-01-24 05:02:51 +00:00
|
|
|
if (this._intersectionObserver) {
|
|
|
|
this._onIntersectionCallbacks[key] = (entry) => {
|
|
|
|
callback(getRectFromEntry(entry))
|
|
|
|
this.unobserve(key, node)
|
|
|
|
}
|
|
|
|
this._intersectionObserver.observe(node)
|
2018-01-18 03:16:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
unobserve(key, node) {
|
|
|
|
if (key in this._onIntersectionCallbacks) {
|
|
|
|
return
|
|
|
|
}
|
2018-01-27 18:46:52 +00:00
|
|
|
if (!node) {
|
|
|
|
return
|
|
|
|
}
|
2018-01-24 05:02:51 +00:00
|
|
|
if (this._intersectionObserver) {
|
|
|
|
this._intersectionObserver.unobserve(node)
|
|
|
|
}
|
2018-01-18 03:16:04 +00:00
|
|
|
delete this._onIntersectionCallbacks[key]
|
|
|
|
}
|
2018-01-21 18:32:18 +00:00
|
|
|
|
|
|
|
disconnect() {
|
2018-01-24 05:02:51 +00:00
|
|
|
if (this._intersectionObserver) {
|
|
|
|
this._intersectionObserver.disconnect()
|
|
|
|
this._intersectionObserver = null
|
|
|
|
}
|
2018-01-21 18:32:18 +00:00
|
|
|
}
|
2018-01-18 03:16:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export { AsyncLayout }
|