Jan
10/09/2023, 7:30 AMJan
10/09/2023, 7:30 AMJan
10/09/2023, 7:32 AMJan
10/09/2023, 7:34 AMJan
10/09/2023, 7:34 AMJan
10/09/2023, 7:35 AMJan
10/09/2023, 7:35 AMJan
10/09/2023, 7:37 AMJan
10/09/2023, 7:39 AMclass RootComponent(
private val componentContext: ComponentContext,
private val getRootState: GetRootStateUsecase
) : ComponentContext by componentContext, KoinComponent {
private val slotNavigation = SlotNavigation<SlotConfig>()
private val _slot = childSlot(
source = slotNavigation,
initialConfiguration = { SlotConfig.Home }
) { config, childComponentContext ->
when (config) {
else ->
HomeComponent(
componentContext = childComponentContext,
componentViewModel = childComponentContext.instanceKeeper.getOrCreate {
getKoin().get()
},
headerViewModel = childComponentContext.instanceKeeper.getOrCreate {
getKoin().get()
}
)
}
}
val slot: Value<ChildSlot<*, *>> = _slot
private val componentScope = coroutineScope(Dispatchers.Main + SupervisorJob())
init {
lifecycle.doOnDestroy {
//slotNavigation.dismiss()
}
componentScope.launch {
getRootState().collect { config ->
println("RootComponent received new state config: $config")
}
}
}
}
Jan
10/09/2023, 7:42 AMArkadii Ivanov
10/09/2023, 8:54 AMJan
10/09/2023, 8:55 AMArkadii Ivanov
10/09/2023, 8:56 AMJan
10/09/2023, 8:57 AMclass GetRootStateUsecase(
private val rootStateRepository: RootStateRepository
) {
suspend operator fun invoke(): Flow<RootComponent.SlotConfig> = rootStateRepository.getState()
}
interface RootStateRepository {
suspend fun getState(): Flow<RootComponent.SlotConfig>
}
class RootStateRepositoryImpl(
private val ioDispatcher: CoroutineDispatcher,
private val venueRepository: VenueRepository,
private val userRepository: UserRepository
) : RootStateRepository {
override suspend fun getState(): Flow<RootComponent.SlotConfig> = flow {
val selectedVenueFlow = venueRepository.getSelectedVenue()
val selectedUserFlow = userRepository.getSelectedUser()
selectedVenueFlow.combine(selectedUserFlow) { selectedVenue, selectedUser ->
State(
venue = selectedVenue,
user = selectedUser
)
}.distinctUntilChanged().collect {
if (it.venue == null) {
emit(RootComponent.SlotConfig.Inventory)
} else if (it.user == null) {
emit(RootComponent.SlotConfig.Login)
} else {
emit(RootComponent.SlotConfig.Dashboard)
}
}
}.flowOn(ioDispatcher)
}
private data class State(
val venue: Venue?,
val user: User?
)
Jan
10/09/2023, 8:59 AMArkadii Ivanov
10/09/2023, 9:00 AMJan
10/09/2023, 9:01 AMArkadii Ivanov
10/09/2023, 9:03 AMJan
10/09/2023, 9:03 AMArkadii Ivanov
10/09/2023, 9:05 AMArkadii Ivanov
10/09/2023, 9:06 AMJan
10/09/2023, 9:06 AMJan
10/09/2023, 9:06 AMJan
10/09/2023, 9:45 AMJan
10/09/2023, 9:45 AMArkadii Ivanov
10/09/2023, 9:46 AMJan
10/09/2023, 10:59 AMJan
10/09/2023, 10:59 AMArkadii Ivanov
10/09/2023, 11:00 AM