Skip to content

Commit

Permalink
feat: compose pop result support
Browse files Browse the repository at this point in the history
  • Loading branch information
programadorthi committed Jan 14, 2024
1 parent c4b097d commit 6d289e9
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,28 @@
package dev.programadorthi.routing.compose

import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.staticCompositionLocalOf
import dev.programadorthi.routing.core.Routing

public val LocalPopResult: ProvidableCompositionLocal<ComposeRoutingPopResult?> =
staticCompositionLocalOf { null }

public fun Routing.canPop(): Boolean = contentList.size > 1

public fun Routing.pop() {
public fun Routing.pop(result: Any? = null) {
contentList.removeLastOrNull()
// TODO: add support to send result
if (result == null) return

val lastIndex = contentList.lastIndex
if (lastIndex < 0) return

val lastContent = contentList[lastIndex]
val popResult = ComposeRoutingPopResult(content = result)

contentList[lastIndex] = {
CompositionLocalProvider(LocalPopResult provides popResult) {
lastContent()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.programadorthi.routing.compose

/**
* Add support to a previous [androidx.compose.runtime.Composable] get the popped result
*/
@Suppress("UNCHECKED_CAST")
public class ComposeRoutingPopResult internal constructor(
internal val content: Any? = null,
) {
public fun <T> result(): T? = content as? T
}
Original file line number Diff line number Diff line change
Expand Up @@ -320,4 +320,41 @@ internal class ComposeRoutingTest {
// THEN
assertEquals(3, composedCounter)
}

@Test
fun shouldPopAComposableWithResult() =
runComposeTest { coroutineContext, composition, clock ->
// GIVEN
var poppedMessage: String? = null

val routing =
routing(parentCoroutineContext = coroutineContext) {
composable(path = "/push") {
poppedMessage = LocalPopResult.current?.result<String>()
}
}

composition.setContent {
Routing(
routing = routing,
initial = {},
)
}

// WHEN
routing.push(path = "/push")
advanceTimeBy(99) // Ask for routing
clock.sendFrame(0L) // Ask for recomposition

routing.push(path = "/push")
advanceTimeBy(99) // Ask for routing
clock.sendFrame(0L) // Ask for recomposition

routing.pop(result = "This is the popped message")
advanceTimeBy(99) // Ask for routing
clock.sendFrame(0L) // Ask for recomposition

// THEN
assertEquals("This is the popped message", poppedMessage)
}
}

0 comments on commit 6d289e9

Please sign in to comment.