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
@@ -1,6 +1,5 @@
package com.codandotv.streamplayerapp.feature_detail.presentation.navigation

import androidx.lifecycle.Lifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
Expand All @@ -10,16 +9,18 @@ import com.codandotv.streamplayerapp.core_navigation.routes.Routes.PARAM.ID
import com.codandotv.streamplayerapp.feature_detail.di.DetailStreamModule
import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamScreen
import org.koin.androidx.compose.koinViewModel
import org.koin.core.context.loadKoinModules
import org.koin.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.core.context.unloadKoinModules
import org.koin.core.parameter.parametersOf

internal const val DEFAULT_ID = "0"

@OptIn(KoinExperimentalAPI::class)
fun NavGraphBuilder.detailStreamNavGraph(navController: NavHostController) {
composable(DETAIL_COMPLETE) { nav ->
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
loadKoinModules(DetailStreamModule.module)
rememberKoinModules {
listOf(DetailStreamModule.module)
}
DetailStreamScreen(
viewModel = koinViewModel {
Expand All @@ -29,9 +30,6 @@ fun NavGraphBuilder.detailStreamNavGraph(navController: NavHostController) {
onNavigateSearchScreen = {
navController.navigate(Routes.SEARCH)
},
disposable = {
unloadKoinModules(DetailStreamModule.module)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,12 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em
Expand All @@ -54,23 +52,13 @@ import streamplayerapp_kmp.feature_detail.generated.resources.detail_watch_prima
fun DetailStreamScreen(
viewModel: DetailStreamViewModel = koinViewModel(),
navController: NavController,
disposable: () -> Unit = {},
onNavigateSearchScreen: () -> Unit = {},
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()

val lifecycleOwner = LocalLifecycleOwner.current

LifecycleEventEffect(Lifecycle.Event.ON_START) {
viewModel.loadDetail()
}

DisposableEffect(lifecycleOwner) {
onDispose {
disposable.invoke()
}
}

when (uiState) {
is DetailStreamsUIState.DetailStreamsLoadedUIState -> {
SetupDetailScreen(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,24 @@ import com.codandotv.streamplayerapp.core_navigation.routes.Routes.DETAIL
import com.codandotv.streamplayerapp.core_navigation.routes.Routes.PROFILE_PICKER
import com.codandotv.streamplayerapp.feature_list_streams.list.di.ListStreamModule
import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.screens.ListStreamsScreen
import org.koin.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules

internal const val DEFAULT_ID = ""

@OptIn(KoinExperimentalAPI::class)
fun NavGraphBuilder.listStreamsNavGraph(navController: NavHostController) {
composable(HOME_COMPLETE) { nav ->
BackHandler(true) {}
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
loadKoinModules(ListStreamModule.module)

rememberKoinModules {
listOf(ListStreamModule.module)
}
ListStreamsScreen(navController = navController,

ListStreamsScreen(
navController = navController,
onNavigateDetailList = { id ->
navController.navigate("${DETAIL}${id}")
},
Expand All @@ -33,9 +39,6 @@ fun NavGraphBuilder.listStreamsNavGraph(navController: NavHostController) {
onNavigateSearchScreen = {
navController.navigate(Routes.SEARCH)
},
disposable = {
unloadKoinModules(ListStreamModule.module)
},
profilePicture = nav.arguments?.getString(PROFILE_ID) ?: DEFAULT_ID
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,13 @@ fun ListStreamsScreen(
onNavigateDetailList: (String) -> Unit = {},
onNavigateProfilePicker: () -> Unit = {},
onNavigateSearchScreen: () -> Unit = {},
disposable: () -> Unit = {},
profilePicture: String
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val lifecycleOwner = LocalLifecycleOwner.current
val scrollBehavior =
TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())
val baseScrollState = rememberScrollState()

DisposableEffect(lifecycleOwner) {
onDispose {
disposable.invoke()
}
}

Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.codandotv.streamplayerapp.profile.presentation.navigation

import androidx.lifecycle.Lifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
Expand All @@ -9,20 +8,19 @@ import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes.PARA
import com.codandotv.streamplayerapp.core_navigation.routes.Routes
import com.codandotv.streamplayerapp.profile.di.ProfilePickerStreamModule
import com.codandotv.streamplayerapp.profile.presentation.screens.ProfilePickerStreamScreen
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
import org.koin.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI

@OptIn(KoinExperimentalAPI::class)
fun NavGraphBuilder.profilePickerStreamNavGraph(navController: NavHostController) {
composable(Routes.PROFILE_PICKER) { nav ->
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
loadKoinModules(ProfilePickerStreamModule.module)
composable(Routes.PROFILE_PICKER) {
rememberKoinModules {
listOf(ProfilePickerStreamModule.module)
}
ProfilePickerStreamScreen(
onNavigateListStreams = { profilePic ->
navController.navigate("$HOME?$PROFILE_ID=$profilePic")
}
) {
unloadKoinModules(ProfilePickerStreamModule.module)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreview
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews
import com.codandotv.streamplayerapp.feature.profile.R
import com.codandotv.streamplayerapp.profile.domain.ProfileStream
import com.codandotv.streamplayerapp.profile.presentation.widget.LoadScreen
Expand All @@ -40,11 +42,8 @@ import streamplayerapp_kmp.feature_profile.generated.resources.profile_animation
fun ProfilePickerStreamScreen(
viewModel: ProfilePickerStreamViewModel = koinViewModel(),
onNavigateListStreams: (String) -> Unit = {},
disposable: () -> Unit = {}
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val lifecycleOwner = LocalLifecycleOwner.current
Lifecycle(lifecycleOwner, viewModel, disposable)

if (uiState.isLoading) {
LoadScreen()
Expand Down Expand Up @@ -155,20 +154,4 @@ fun SetupProfilePickerScreen(
}
}
)
}

@Composable
private fun Lifecycle(
lifecycleOwner: LifecycleOwner, viewModel: ProfilePickerStreamViewModel, disposable: () -> Unit
) {
DisposableEffect(lifecycleOwner) {
val lifecycle = lifecycleOwner.lifecycle

lifecycle.addObserver(viewModel)

onDispose {
lifecycle.removeObserver(viewModel)
disposable.invoke()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.codandotv.streamplayerapp.profile.presentation.screens

import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure
Expand All @@ -16,7 +14,7 @@ import kotlinx.coroutines.launch

class ProfilePickerStreamViewModel(
private val useCase: ProfilePickerStreamUseCase,
) : ViewModel(), DefaultLifecycleObserver {
) : ViewModel() {

private val _uiState = MutableStateFlow(ProfilePickerStreamsUIState())
val uiState = _uiState.stateIn(
Expand All @@ -25,9 +23,7 @@ class ProfilePickerStreamViewModel(
initialValue = _uiState.value
)

override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)

init {
viewModelScope.launch {
useCase.getProfile()
.catchFailure {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,22 @@ import androidx.navigation.compose.composable
import com.codandotv.streamplayerapp.core_navigation.routes.Routes
import com.codandotv.streamplayerapp.feature_search.di.SearchModule
import com.codandotv.streamplayerapp.feature_search.presentation.screens.SearchScreen
import org.koin.compose.module.rememberKoinModules
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules

@OptIn(KoinExperimentalAPI::class)
fun NavGraphBuilder.searchStreamsNavGraph(navController: NavHostController) {
composable(Routes.SEARCH) { nav ->
composable(Routes.SEARCH) { _ ->
BackHandler(true) {}
if (nav.lifecycle.currentState == Lifecycle.State.STARTED) {
loadKoinModules(SearchModule.module)
rememberKoinModules {
listOf(SearchModule.module)
}
SearchScreen(
navController = navController,
onNavigateDetailList = { id ->
navController.navigate("${Routes.DETAIL}${id}")
},
disposable = {
unloadKoinModules(SearchModule.module)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,9 @@ fun SearchScreen(
viewModel: SearchViewModel = koinViewModel(),
onNavigateDetailList: (String) -> Unit = {},
navController: NavController,
disposable: () -> Unit = {}
) {

val uiState by viewModel.uiState.collectAsState()
Lifecycle(
lifecycleOwner = LocalLifecycleOwner.current,
viewModel = viewModel,
disposable = disposable
)

when (uiState) {
is SearchUIState.Success -> {
SetupSearchScreen(
Expand Down Expand Up @@ -152,20 +145,4 @@ private fun SetupSearchScreen(
navController.goBack()
}

}

@Composable
private fun Lifecycle(
lifecycleOwner: LifecycleOwner, viewModel: SearchViewModel, disposable: () -> Unit
) {
DisposableEffect(lifecycleOwner) {
val lifecycle = lifecycleOwner.lifecycle

lifecycle.addObserver(viewModel)

onDispose {
lifecycle.removeObserver(viewModel)
disposable.invoke()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.codandotv.streamplayerapp.feature_search.presentation.screens

import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure
Expand All @@ -18,7 +17,7 @@ import kotlinx.coroutines.launch
class SearchViewModel(
private val searchUseCase: SearchUseCase,
private val mostPopularMoviesUseCase: MostPopularMoviesUseCase
) : ViewModel(), DefaultLifecycleObserver {
) : ViewModel() {

private var tryAgain: () -> Unit = {}

Expand Down