Skip to content

Commit b9f819b

Browse files
committed
Merge branch 'main' into refactor/align-package-with-artifact-id
2 parents 4f8897e + 5a46c00 commit b9f819b

4 files changed

Lines changed: 41 additions & 11 deletions

File tree

nubrick/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ plugins {
88
}
99

1010
group = "io.nubrick"
11-
version = "0.7.0"
11+
version = "0.7.1"
1212

1313
android {
1414
namespace = "io.nubrick.nubrick"

nubrick/src/main/kotlin/io/nubrick/nubrick/component/modal.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import androidx.compose.runtime.setValue
99
import io.nubrick.nubrick.component.provider.pageblock.PageBlockData
1010
import io.nubrick.nubrick.schema.ModalPresentationStyle
1111
import io.nubrick.nubrick.schema.ModalScreenSize
12+
import io.nubrick.nubrick.schema.UIBlockEventDispatcher
1213
import kotlinx.coroutines.CoroutineScope
1314
import kotlinx.coroutines.launch
15+
import kotlinx.serialization.json.JsonElement
1416

1517
internal data class ModalState(
1618
val modalStack: List<PageBlockData> = emptyList(),
@@ -27,6 +29,7 @@ internal class ModalViewModel(
2729
private val largeSheetState: SheetState,
2830
private val scope: CoroutineScope,
2931
private val onDismiss: () -> Unit,
32+
private var onTrigger: ((trigger: UIBlockEventDispatcher, data: JsonElement) -> Unit) = { _, _ -> },
3033
) {
3134
var modalState by mutableStateOf(ModalState())
3235
private set
@@ -52,7 +55,13 @@ internal class ModalViewModel(
5255
modalState = modalState.copy(displayedModalIndex = index)
5356
}
5457

55-
fun back() {
58+
fun back(data: JsonElement) {
59+
val currentPageBlock = modalState.modalStack[modalState.displayedModalIndex]
60+
if (currentPageBlock.block.data?.triggerSetting?.onTrigger != null) {
61+
currentPageBlock.block.data.triggerSetting.onTrigger.let { onTrigger(it, data) }
62+
return
63+
}
64+
5665
val index = modalState.displayedModalIndex
5766
if (index <= 0) {
5867
close()
@@ -80,4 +89,8 @@ internal class ModalViewModel(
8089
}
8190
}
8291
}
92+
93+
fun setOnTrigger(onTrigger: ((trigger: UIBlockEventDispatcher, data: JsonElement) -> Unit)) {
94+
this.onTrigger = onTrigger
95+
}
8396
}

nubrick/src/main/kotlin/io/nubrick/nubrick/component/root.kt

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import io.nubrick.nubrick.schema.UIRootBlock
6363
import io.nubrick.nubrick.template.compile
6464
import kotlinx.coroutines.DelicateCoroutinesApi
6565
import kotlinx.serialization.json.JsonElement
66+
import kotlinx.serialization.json.JsonNull
6667

6768
private fun parseUIEventToEvent(event: UIBlockEventDispatcher): Event {
6869
return Event(
@@ -83,6 +84,11 @@ private fun parseUIEventToEvent(event: UIBlockEventDispatcher): Event {
8384
)
8485
}
8586

87+
internal data class WebviewData(
88+
val url: String,
89+
val trigger: UIBlockEventDispatcher?,
90+
) {}
91+
8692
internal class RootViewModel(
8793
private val root: UIRootBlock,
8894
private val modalViewModel: ModalViewModel,
@@ -93,7 +99,7 @@ internal class RootViewModel(
9399
) : ViewModel() {
94100
private val pages: List<UIPageBlock> = root.data?.pages ?: emptyList()
95101
val displayedPageBlock = mutableStateOf<PageBlockData?>(null)
96-
val webviewUrl = mutableStateOf("")
102+
val webviewData = mutableStateOf<WebviewData?>(null)
97103

98104
// We use them for sdk bridge between flutter <-> android.
99105
val currentPageBlock = mutableStateOf<UIPageBlock?>(null)
@@ -150,7 +156,10 @@ internal class RootViewModel(
150156
}
151157

152158
if (destBlock.data?.kind == PageKind.WEBVIEW_MODAL) {
153-
this.webviewUrl.value = destBlock.data.webviewUrl ?: ""
159+
this.webviewData.value = WebviewData(
160+
url = destBlock.data.webviewUrl ?: "",
161+
trigger = destBlock.data.triggerSetting?.onTrigger
162+
)
154163
return
155164
}
156165

@@ -190,7 +199,7 @@ internal class RootViewModel(
190199
}
191200

192201
fun handleWebviewDismiss() {
193-
this.webviewUrl.value = ""
202+
this.webviewData.value = null
194203
}
195204
}
196205

@@ -287,6 +296,11 @@ internal fun Root(
287296
container.handleEvent(e)
288297
}
289298
}
299+
LaunchedEffect(Unit) {
300+
modalViewModel.setOnTrigger { trigger, data ->
301+
listener(trigger, data)
302+
}
303+
}
290304

291305
val currentPageBlock = viewModel.currentPageBlock.value
292306
val displayedPageBlock = viewModel.displayedPageBlock.value
@@ -321,7 +335,7 @@ internal fun Root(
321335

322336
if (modalState.modalVisibility) {
323337
BackHandler(true) {
324-
modalViewModel.back()
338+
modalViewModel.back(JsonNull)
325339
}
326340
val isLarge =
327341
modalState.modalPresentationStyle == ModalPresentationStyle.DEPENDS_ON_CONTEXT_OR_FULL_SCREEN
@@ -340,7 +354,7 @@ internal fun Root(
340354
shape = RoundedCornerShape(topStart = 10.dp, topEnd = 10.dp),
341355
) {
342356
ModalBottomSheetBackHandler {
343-
modalViewModel.back()
357+
modalViewModel.back(JsonNull)
344358
}
345359
Column(
346360
modifier = if (modalState.modalPresentationStyle == ModalPresentationStyle.DEPENDS_ON_CONTEXT_OR_FULL_SCREEN) {
@@ -373,7 +387,7 @@ internal fun Root(
373387
it,
374388
stack.block,
375389
onClose = { modalViewModel.close() },
376-
onBack = { modalViewModel.back() },
390+
onBack = { modalViewModel.back(JsonNull) },
377391
isFullscreen,
378392
)
379393
ModalPage(
@@ -388,7 +402,7 @@ internal fun Root(
388402
}
389403
}
390404

391-
if (viewModel.webviewUrl.value.isNotEmpty()) {
405+
if (viewModel.webviewData.value != null) {
392406
Dialog(
393407
properties = DialogProperties(
394408
usePlatformDefaultWidth = true,
@@ -406,8 +420,11 @@ internal fun Root(
406420
.background(Color.LightGray)
407421
) {
408422
WebViewPage(
409-
url = viewModel.webviewUrl.value,
423+
url = viewModel.webviewData.value?.url ?: "",
410424
onDismiss = {
425+
viewModel.webviewData.value?.trigger?.let { trigger ->
426+
listener(trigger, JsonNull)
427+
}
411428
viewModel.handleWebviewDismiss()
412429
},
413430
modifier = Modifier

nubrick/src/main/kotlin/io/nubrick/nubrick/sdk.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import kotlin.time.Duration
3434
import kotlin.time.DurationUnit
3535
import kotlin.time.toDuration
3636

37-
const val VERSION = "0.7.0"
37+
const val VERSION = "0.7.1"
3838

3939
data class Endpoint(
4040
val cdn: String = "https://cdn.nativebrik.com",

0 commit comments

Comments
 (0)