diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt index e15a143..a46fb7c 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -13,4 +13,8 @@ data class Error(val msg: String) : State() data class Completed(val bookList: List) : State() } + + sealed class SideEffect { + data class ShowDetails(val bookId: String?): SideEffect() + } } \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt index e15a143..a46fb7c 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -13,4 +13,8 @@ data class Error(val msg: String) : State() data class Completed(val bookList: List) : State() } + + sealed class SideEffect { + data class ShowDetails(val bookId: String?): SideEffect() + } } \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt index 948757c..2c31861 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -1,24 +1,47 @@ package fr.tf1.player.atelierplayermvvm.ui.list +import android.content.Intent import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import com.google.android.material.internal.FlowLayout +import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailActivity +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.onEach + @Composable fun BookListScreen( viewState: State, + effectFlow: Flow, onUiEvent: (event: BookListContract.UIEvent) -> Unit ) { + val context = LocalContext.current + + LaunchedEffect(key1 = "BOOK_LIST_EFFECT_KEY") { + effectFlow.onEach { sideEffect -> + when (sideEffect) { + is BookListContract.SideEffect.ShowDetails -> { + val intent = Intent(context, BookDetailActivity::class.java) + intent.putExtra("BOOK_ID", sideEffect.bookId) + context.startActivity(intent) + } + } + }.collect() + } when (viewState.value) { is BookListContract.State.Loading -> { //show loader - Text(text = "Loading") + Text(text = "Loading") } is BookListContract.State.Completed -> { LazyColumn(modifier = Modifier.background(Color.White)) { diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt index e15a143..a46fb7c 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -13,4 +13,8 @@ data class Error(val msg: String) : State() data class Completed(val bookList: List) : State() } + + sealed class SideEffect { + data class ShowDetails(val bookId: String?): SideEffect() + } } \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt index 948757c..2c31861 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -1,24 +1,47 @@ package fr.tf1.player.atelierplayermvvm.ui.list +import android.content.Intent import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import com.google.android.material.internal.FlowLayout +import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailActivity +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.onEach + @Composable fun BookListScreen( viewState: State, + effectFlow: Flow, onUiEvent: (event: BookListContract.UIEvent) -> Unit ) { + val context = LocalContext.current + + LaunchedEffect(key1 = "BOOK_LIST_EFFECT_KEY") { + effectFlow.onEach { sideEffect -> + when (sideEffect) { + is BookListContract.SideEffect.ShowDetails -> { + val intent = Intent(context, BookDetailActivity::class.java) + intent.putExtra("BOOK_ID", sideEffect.bookId) + context.startActivity(intent) + } + } + }.collect() + } when (viewState.value) { is BookListContract.State.Loading -> { //show loader - Text(text = "Loading") + Text(text = "Loading") } is BookListContract.State.Completed -> { LazyColumn(modifier = Modifier.background(Color.White)) { diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt index b63d1c7..cca7814 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt @@ -23,7 +23,7 @@ super.onCreate(savedInstanceState) setContentView(ComposeView(this).apply { setContent { - BookListScreen(viewModel.viewState) { uiEvent -> + BookListScreen(viewModel.viewState, viewModel.effect) { uiEvent -> viewModel.handleEvent(uiEvent) } diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt index e15a143..a46fb7c 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -13,4 +13,8 @@ data class Error(val msg: String) : State() data class Completed(val bookList: List) : State() } + + sealed class SideEffect { + data class ShowDetails(val bookId: String?): SideEffect() + } } \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt index 948757c..2c31861 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -1,24 +1,47 @@ package fr.tf1.player.atelierplayermvvm.ui.list +import android.content.Intent import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import com.google.android.material.internal.FlowLayout +import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailActivity +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.onEach + @Composable fun BookListScreen( viewState: State, + effectFlow: Flow, onUiEvent: (event: BookListContract.UIEvent) -> Unit ) { + val context = LocalContext.current + + LaunchedEffect(key1 = "BOOK_LIST_EFFECT_KEY") { + effectFlow.onEach { sideEffect -> + when (sideEffect) { + is BookListContract.SideEffect.ShowDetails -> { + val intent = Intent(context, BookDetailActivity::class.java) + intent.putExtra("BOOK_ID", sideEffect.bookId) + context.startActivity(intent) + } + } + }.collect() + } when (viewState.value) { is BookListContract.State.Loading -> { //show loader - Text(text = "Loading") + Text(text = "Loading") } is BookListContract.State.Completed -> { LazyColumn(modifier = Modifier.background(Color.White)) { diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt index b63d1c7..cca7814 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt @@ -23,7 +23,7 @@ super.onCreate(savedInstanceState) setContentView(ComposeView(this).apply { setContent { - BookListScreen(viewModel.viewState) { uiEvent -> + BookListScreen(viewModel.viewState, viewModel.effect) { uiEvent -> viewModel.handleEvent(uiEvent) } diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt index f28bd4f..72ed120 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt @@ -7,6 +7,8 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import fr.tf1.player.atelierplayermvvm.data.usecases.FetchListUseCase +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -19,6 +21,9 @@ var viewState: State = _viewState + private val _effect: Channel = Channel() + val effect = _effect.receiveAsFlow() + init { fetchList() } @@ -31,7 +36,17 @@ } fun handleEvent(uiEvent: BookListContract.UIEvent) { - + when (uiEvent) { + is BookListContract.UIEvent.Click -> { + postShowDetailsEffect(uiEvent.bookId) + } + } + } + + private fun postShowDetailsEffect(bookId: String?) { + viewModelScope.launch { + _effect.send(BookListContract.SideEffect.ShowDetails(bookId)) + } } } \ No newline at end of file