mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2024-11-22 08:13:49 +00:00
js visibility of objects extensions
This commit is contained in:
parent
d87a3a039f
commit
86e70c0961
@ -2,6 +2,12 @@
|
|||||||
|
|
||||||
## 0.9.17
|
## 0.9.17
|
||||||
|
|
||||||
|
* `Common`:
|
||||||
|
* New extensions `Element#onVisibilityChanged`, `Element#onVisible` and `Element#onInvisible`
|
||||||
|
* `Coroutines`:
|
||||||
|
* New extension `Element.visibilityFlow()`
|
||||||
|
|
||||||
|
|
||||||
## 0.9.16
|
## 0.9.16
|
||||||
|
|
||||||
* `Common`:
|
* `Common`:
|
||||||
|
@ -3,7 +3,7 @@ package dev.inmo.micro_utils.common
|
|||||||
import kotlinx.browser.document
|
import kotlinx.browser.document
|
||||||
import org.w3c.dom.*
|
import org.w3c.dom.*
|
||||||
|
|
||||||
fun Node.onRemoved(block: () -> Unit) {
|
fun Node.onRemoved(block: () -> Unit): MutationObserver {
|
||||||
lateinit var observer: MutationObserver
|
lateinit var observer: MutationObserver
|
||||||
|
|
||||||
observer = MutationObserver { _, _ ->
|
observer = MutationObserver { _, _ ->
|
||||||
@ -18,4 +18,44 @@ fun Node.onRemoved(block: () -> Unit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
observer.observe(document, MutationObserverInit(childList = true, subtree = true))
|
observer.observe(document, MutationObserverInit(childList = true, subtree = true))
|
||||||
|
return observer
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Element.onVisibilityChanged(block: IntersectionObserverEntry.(Float, IntersectionObserver) -> Unit): IntersectionObserver {
|
||||||
|
var previousIntersectionRatio = -1f
|
||||||
|
val observer = IntersectionObserver { entries, observer ->
|
||||||
|
entries.forEach {
|
||||||
|
if (previousIntersectionRatio != it.intersectionRatio) {
|
||||||
|
previousIntersectionRatio = it.intersectionRatio.toFloat()
|
||||||
|
it.block(previousIntersectionRatio, observer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
observer.observe(this)
|
||||||
|
return observer
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Element.onVisible(block: Element.(IntersectionObserver) -> Unit) {
|
||||||
|
var previous = -1f
|
||||||
|
onVisibilityChanged { intersectionRatio, observer ->
|
||||||
|
if (previous != intersectionRatio) {
|
||||||
|
if (intersectionRatio > 0 && previous == 0f) {
|
||||||
|
block(observer)
|
||||||
|
}
|
||||||
|
previous = intersectionRatio
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Element.onInvisible(block: Element.(IntersectionObserver) -> Unit): IntersectionObserver {
|
||||||
|
var previous = -1f
|
||||||
|
return onVisibilityChanged { intersectionRatio, observer ->
|
||||||
|
if (previous != intersectionRatio) {
|
||||||
|
if (intersectionRatio == 0f && previous != 0f) {
|
||||||
|
block(observer)
|
||||||
|
}
|
||||||
|
previous = intersectionRatio
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
package dev.inmo.micro_utils.coroutines
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.onRemoved
|
||||||
|
import dev.inmo.micro_utils.common.onVisibilityChanged
|
||||||
|
import kotlinx.coroutines.flow.*
|
||||||
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
|
fun Element.visibilityFlow(): Flow<Boolean> = channelFlow {
|
||||||
|
var previousData: Boolean? = null
|
||||||
|
|
||||||
|
val observer = onVisibilityChanged { intersectionRatio, _ ->
|
||||||
|
val currentData = intersectionRatio > 0
|
||||||
|
if (currentData != previousData) {
|
||||||
|
trySend(currentData)
|
||||||
|
}
|
||||||
|
previousData = currentData
|
||||||
|
}
|
||||||
|
|
||||||
|
val removeObserver = onRemoved {
|
||||||
|
observer.disconnect()
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeOnClose {
|
||||||
|
observer.disconnect()
|
||||||
|
removeObserver.disconnect()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user