Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.arkivanov.decompose.router.stack.navigate
import com.arkivanov.decompose.router.stack.pop
import com.arkivanov.decompose.value.Value
import com.stslex.atten.core.ui.navigation.Config
import com.stslex.atten.core.ui.navigation.Router
import com.stslex.atten.feature.details.ui.mvi.DetailsComponent
import com.stslex.atten.feature.home.ui.mvi.HomeComponent
import com.stslex.atten.host.RootComponent.Child
Expand Down Expand Up @@ -37,21 +38,8 @@ class DefaultRootComponent(
config: Config,
context: ComponentContext
): Child = when (config) {
is Config.Home -> Child.Home(
HomeComponent.create(
popBack = ::popBack,
navTo = ::navigateTo,
componentContext = context
)
)

is Config.Detail -> Child.Details(
DetailsComponent.create(
popBack = ::popBack,
componentContext = context,
uuid = config.uuid
)
)
is Config.Home -> Child.Home(HomeComponent.create(context.router))
is Config.Detail -> Child.Details(DetailsComponent.create(context.router, config.uuid))
}

@OptIn(DelicateDecomposeApi::class)
Expand All @@ -68,4 +56,16 @@ class DefaultRootComponent(
private fun popBack() {
navigation.pop()
}

private val ComponentContext.router: Router
get() = object : Router, ComponentContext by this {

override fun navTo(config: Config) {
navigateTo(config)
}

override fun popBack() {
this@DefaultRootComponent.popBack()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ interface RootComponent {
data class Details(val component: DetailsComponent) : Child
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ sealed interface Config {
val isBackAllow: Boolean
get() = true

@Serializable
data object Home : Config {

override val isBackAllow: Boolean = false
}

@Serializable
data class Detail(
val uuid: String
) : Config
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.stslex.atten.core.ui.navigation

import com.arkivanov.decompose.ComponentContext

interface Router : ComponentContext {

fun navTo(config: Config)

fun popBack()

}
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package com.stslex.wizard.core.navigation
package com.stslex.atten.core.ui.navigation

interface Target
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.stslex.atten.feature.details.ui.mvi

import com.arkivanov.decompose.ComponentContext
import com.stslex.atten.core.ui.mvi.handler.Handler
import com.stslex.atten.core.ui.navigation.Component
import com.stslex.atten.core.ui.navigation.Router
import com.stslex.atten.feature.details.ui.mvi.DetailsStore.Action
import com.stslex.atten.feature.details.ui.mvi.handlers.DetailsComponentImpl
import com.stslex.atten.core.ui.mvi.handler.Handler

interface DetailsComponent : Component, Handler<Action.Navigation, DetailsHandlerStore> {

Expand All @@ -13,13 +13,8 @@ interface DetailsComponent : Component, Handler<Action.Navigation, DetailsHandle
companion object {

fun create(
popBack: () -> Unit,
router: Router,
uuid: String,
componentContext: ComponentContext
): DetailsComponent = DetailsComponentImpl(
componentContext = componentContext,
popBack = popBack,
uuid = uuid
)
): DetailsComponent = DetailsComponentImpl(router, uuid)
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package com.stslex.atten.feature.details.ui.mvi.handlers

import com.arkivanov.decompose.ComponentContext
import com.stslex.atten.core.ui.navigation.Router
import com.stslex.atten.feature.details.ui.mvi.DetailsComponent
import com.stslex.atten.feature.details.ui.mvi.DetailsHandlerStore
import com.stslex.atten.feature.details.ui.mvi.DetailsStore
import com.stslex.atten.feature.details.ui.mvi.DetailsStore.Action

internal class DetailsComponentImpl(
componentContext: ComponentContext,
private val popBack: () -> Unit,
private val router: Router,
override val uuid: String
) : DetailsComponent, ComponentContext by componentContext {
) : DetailsComponent, ComponentContext by router {

override fun DetailsHandlerStore.invoke(action: DetailsStore.Action.Navigation) {
override fun DetailsHandlerStore.invoke(action: Action.Navigation) {
when (action) {
DetailsStore.Action.Navigation.Back -> popBack()
Action.Navigation.Back -> router.popBack()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.stslex.atten.feature.home.ui

import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback
Expand All @@ -13,12 +14,12 @@ import com.stslex.atten.feature.home.ui.mvi.HomeStore.Action
fun HomeScreen(component: HomeComponent) {
NavComponentScreen(HomeFeature, component) { processor ->
val hapticFeedback = LocalHapticFeedback.current

val lazyListState = rememberLazyListState()
processor.handle { event ->
when (event) {
is HomeStore.Event.Snackbar -> {
is HomeStore.Event.Snackbar -> Unit

}
is HomeStore.Event.List.ScrollTop -> lazyListState.requestScrollToItem(0)

HomeStore.Event.Haptic.Click -> {
hapticFeedback.performHapticFeedback(HapticFeedbackType.TextHandleMove)
Expand All @@ -40,6 +41,7 @@ fun HomeScreen(component: HomeComponent) {

HomeWidget(
state = processor.state.value,
lazyListState = lazyListState,
onItemClicked = { id ->
processor.consume(Action.Click.OnItemClicked(id))
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Create
import androidx.compose.material.icons.filled.Delete
Expand Down Expand Up @@ -45,6 +47,7 @@ import org.jetbrains.compose.ui.tooling.preview.Preview
@Composable
internal fun HomeWidget(
state: State,
lazyListState: LazyListState = rememberLazyListState(),
onItemLongCLick: (id: String) -> Unit,
onItemClicked: (id: String) -> Unit,
onLoadNext: () -> Unit,
Expand All @@ -64,6 +67,7 @@ internal fun HomeWidget(
.padding(
horizontal = AppDimension.Padding.medium,
),
state = lazyListState,
pagingState = state.paging,
onLoadNext = onLoadNext
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,15 @@
package com.stslex.atten.feature.home.ui.mvi

import com.arkivanov.decompose.ComponentContext
import com.stslex.atten.core.ui.mvi.handler.Handler
import com.stslex.atten.core.ui.navigation.Component
import com.stslex.atten.core.ui.navigation.Config
import com.stslex.atten.core.ui.navigation.Router
import com.stslex.atten.feature.home.ui.mvi.HomeStore.Action
import com.stslex.atten.feature.home.ui.mvi.handlers.HomeComponentImpl
import com.stslex.atten.core.ui.mvi.handler.Handler

interface HomeComponent : Component, Handler<Action.Navigation, HomeHandlerStore> {

companion object {

fun create(
popBack: () -> Unit,
navTo: (config: Config) -> Unit,
componentContext: ComponentContext
): HomeComponent = HomeComponentImpl(
popBack = popBack,
navTo = navTo,
componentContext = componentContext
)
fun create(router: Router): HomeComponent = HomeComponentImpl(router)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ interface HomeStore : Store<State, Action, Event> {
val snackbar: CommonEvents.Snackbar
) : Event

@Stable
sealed interface List : Event {

data object ScrollTop : List
}

sealed interface Haptic : Event {

data object Click : Haptic
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,19 @@ package com.stslex.atten.feature.home.ui.mvi.handlers

import com.arkivanov.decompose.ComponentContext
import com.stslex.atten.core.ui.navigation.Config
import com.stslex.atten.core.ui.navigation.Router
import com.stslex.atten.feature.home.ui.mvi.HomeComponent
import com.stslex.atten.feature.home.ui.mvi.HomeHandlerStore
import com.stslex.atten.feature.home.ui.mvi.HomeStore.Action

internal class HomeComponentImpl(
private val popBack: () -> Unit,
private val navTo: (config: Config) -> Unit,
componentContext: ComponentContext
) : HomeComponent, ComponentContext by componentContext {
private val router: Router,
) : HomeComponent, ComponentContext by router {

override fun HomeHandlerStore.invoke(action: Action.Navigation) {
when (action) {
is Action.Navigation.Back -> popBack()
is Action.Navigation.NavigateToDetail -> navTo(Config.Detail(action.id))
is Action.Navigation.Back -> router.popBack()
is Action.Navigation.NavigateToDetail -> router.navTo(Config.Detail(action.id))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import com.stslex.atten.core.paging.states.PagerLoadState
import com.stslex.atten.core.paging.states.pagingMap
import com.stslex.atten.core.paging.states.toUi
import com.stslex.atten.core.ui.mvi.CommonEvents
import com.stslex.atten.core.ui.mvi.handler.Handler
import com.stslex.atten.feature.home.di.HomeScope
import com.stslex.atten.feature.home.domain.interactor.HomeScreenInteractor
import com.stslex.atten.feature.home.ui.model.toUi
import com.stslex.atten.feature.home.ui.mvi.HomeHandlerStore
import com.stslex.atten.feature.home.ui.mvi.HomeStore.Action
import com.stslex.atten.feature.home.ui.mvi.HomeStore.Event
import com.stslex.atten.feature.home.ui.mvi.toUi
import com.stslex.atten.core.ui.mvi.handler.Handler
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
Expand All @@ -37,6 +37,7 @@ internal class PagingHandler(
}

private fun HomeHandlerStore.actionInit() {
sendEvent(Event.List.ScrollTop)
interactor.pagingState
.map { pagingState ->
pagingState.pagingMap { it.toUi() }
Expand Down