From 3b62d432a9ef887cc59d744b4b77cc1391db3cff Mon Sep 17 00:00:00 2001 From: Abanoub Nagy <114380262+Abanoub-Nagy@users.noreply.github.com> Date: Wed, 27 Sep 2023 20:31:35 +0300 Subject: [PATCH 1/3] fixed search screen --- .../redvelvet/ui/composable/CustomLazyGrid.kt | 6 +-- .../ui/screen/search/SearchScreen.kt | 5 +- .../viewmodel/search/SearchListener.kt | 3 +- .../viewmodel/search/SearchUiEffect.kt | 4 +- .../viewmodel/search/SearchUiState.kt | 14 +++-- .../viewmodel/search/SearchViewModel.kt | 51 ++++++------------- 6 files changed, 33 insertions(+), 50 deletions(-) diff --git a/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt b/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt index 977bdb2b..0d74507d 100644 --- a/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt +++ b/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt @@ -62,9 +62,9 @@ fun CustomLazyGrid( .height(MaterialTheme.dimens.dimens176) .clickable { when (mediaItem.type) { - "movie" -> navController.navigateToMovieDetails(mediaItem.id.toString()) - "tv" -> navController.navigateToTvShowDetails(mediaItem.id.toString()) - "person" -> navController.navigateToActorDetails(mediaItem.id.toString()) + "Movie" -> navController.navigateToMovieDetails(mediaItem.id.toString()) + "TvShow" -> navController.navigateToTvShowDetails(mediaItem.id.toString()) + "People" -> navController.navigateToActorDetails(mediaItem.id.toString()) } }, hasName = true, diff --git a/ui/src/main/java/com/redvelvet/ui/screen/search/SearchScreen.kt b/ui/src/main/java/com/redvelvet/ui/screen/search/SearchScreen.kt index bcee46d8..83693a78 100644 --- a/ui/src/main/java/com/redvelvet/ui/screen/search/SearchScreen.kt +++ b/ui/src/main/java/com/redvelvet/ui/screen/search/SearchScreen.kt @@ -35,6 +35,7 @@ import com.redvelvet.ui.R import com.redvelvet.ui.composable.CategoriesChips import com.redvelvet.ui.composable.CustomLazyGrid import com.redvelvet.ui.composable.FlixMovieScaffold +import com.redvelvet.ui.composable.LoadingPage import com.redvelvet.ui.composable.SpacerVertical import com.redvelvet.ui.theme.BackgroundPrimary import com.redvelvet.ui.theme.FontAccent @@ -73,7 +74,7 @@ fun SearchScreen( CategoriesChips( onChangeCategory = viewModel::onChangeCategory, selectedType = state.selectedMediaType, - categories = state.getCategories, + categories = state.categories, title = "Categories" ) SearchContent(state) @@ -85,6 +86,8 @@ fun SearchScreen( fun SearchContent(state: SearchUiState) { if (state.inputText.isEmpty()) { EmptyContent() + } else if (state.isLoading) { + LoadingPage() } else { CustomLazyGrid(searchCardUiStates = state.searchResult.collectAsLazyPagingItems()) } diff --git a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchListener.kt b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchListener.kt index ec089ab3..57ade4a0 100644 --- a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchListener.kt +++ b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchListener.kt @@ -2,9 +2,8 @@ package com.redvelvet.viewmodel.search interface SearchListener { fun onClickClear() - fun onClickAllChip() fun onClickMovieChip() fun onClickTvShowChip() fun onClickActorChip() - fun onClickItem(id: Int) + fun onCLickRefresh() } \ No newline at end of file diff --git a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiEffect.kt b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiEffect.kt index 17ec0bee..88bb60c5 100644 --- a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiEffect.kt +++ b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiEffect.kt @@ -1,6 +1,8 @@ package com.redvelvet.viewmodel.search -sealed interface SearchUiEffect { +import com.redvelvet.viewmodel.base.BaseUiEffect +sealed class SearchUiEffect() : BaseUiEffect { + data object NavigateUp : SearchUiEffect() } \ No newline at end of file diff --git a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiState.kt b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiState.kt index 053e93c4..8e7a5058 100644 --- a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiState.kt +++ b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiState.kt @@ -10,15 +10,14 @@ import kotlinx.coroutines.flow.flow data class SearchUiState( val isLoading: Boolean = false, val error: ErrorUiState? = null, - val selectedMediaType: SearchMedia = SearchMedia.ALL, + val selectedMediaType: SearchMedia = SearchMedia.MOVIE, val inputText: String = "", val searchResult: Flow> = flow { }, val isEmpty: Boolean = true, - val getCategories : List = listOf( - CategoryUiState(text = "All", type = SearchMedia.ALL), - CategoryUiState(text = "Movie", type = SearchMedia.MOVIE), - CategoryUiState(text = "Person", type = SearchMedia.PEOPLE), - CategoryUiState(text = "Tv show", type = SearchMedia.TV), + val categories: List = listOf( + CategoryUiState("Movie", SearchMedia.MOVIE), + CategoryUiState("Tv show", SearchMedia.TV), + CategoryUiState("Person", SearchMedia.PEOPLE), ) ) : BaseUiState @@ -32,6 +31,5 @@ data class SearchCardUiState( ) data class CategoryUiState( - val text: String = "", - val type: SearchMedia = SearchMedia.ALL + val text: String = "", val type: SearchMedia = SearchMedia.MOVIE ) \ No newline at end of file diff --git a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchViewModel.kt b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchViewModel.kt index a40c11d9..3a4303bb 100644 --- a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchViewModel.kt +++ b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchViewModel.kt @@ -5,19 +5,16 @@ import androidx.paging.PagingData import androidx.paging.map import com.redvelvet.entities.actor.Actor import com.redvelvet.entities.movie.Movie -import com.redvelvet.entities.search.SearchResult import com.redvelvet.entities.tv.TvShow -import com.redvelvet.usecase.usecase.search.GetAllSearchResultUseCase import com.redvelvet.usecase.usecase.search.GetSearchMoviesUseCase import com.redvelvet.usecase.usecase.search.GetSearchPeopleUseCase import com.redvelvet.usecase.usecase.search.GetSearchTvShowUseCase import com.redvelvet.viewmodel.base.BaseViewModel import com.redvelvet.viewmodel.base.ErrorUiState -import com.redvelvet.viewmodel.search.uiStateMappers.* +import com.redvelvet.viewmodel.search.uiStateMappers.toSearchCardUiState import com.redvelvet.viewmodel.utils.SearchMedia import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.debounce @@ -31,7 +28,6 @@ import javax.inject.Inject @OptIn(FlowPreview::class) @HiltViewModel class SearchViewModel @Inject constructor( - private val getAllSearchResultUseCase: GetAllSearchResultUseCase, private val getSearchMoviesUseCase: GetSearchMoviesUseCase, private val getSearchPeopleUseCase: GetSearchPeopleUseCase, private val getSearchTvShowUseCase: GetSearchTvShowUseCase, @@ -59,9 +55,6 @@ class SearchViewModel @Inject constructor( private fun onGetData(query: String) { _state.update { it.copy(isLoading = true) } when (_state.value.selectedMediaType) { - SearchMedia.ALL -> fetchResults { - getAllSearchResultUseCase(query) - } SearchMedia.MOVIE -> fetchMoviesResults { getSearchMoviesUseCase(query) @@ -74,24 +67,8 @@ class SearchViewModel @Inject constructor( SearchMedia.TV -> fetchTvShowResults { getSearchTvShowUseCase(query) } - } - } - - private fun fetchResults(fetchFunction: suspend () -> Flow>) { - tryToExecutePaging( - call = fetchFunction, - onSuccess = ::onSuccessSearchResults, - onError = ::onError - ) - } - private fun onSuccessSearchResults(pagingData: PagingData) { - _state.update { - it.copy( - searchResult = flowOf(pagingData.map { it.toSearchCardUiState() }), - isLoading = false, - isEmpty = false - ) + else -> {} } } @@ -146,10 +123,6 @@ class SearchViewModel @Inject constructor( } } - private fun onError(errorUiState: ErrorUiState) { - _state.update { it.copy(error = errorUiState, isLoading = false) } - } - fun onChangeCategory(type: SearchMedia) { val currentState = _state.value if (currentState.selectedMediaType == type) return @@ -157,15 +130,15 @@ class SearchViewModel @Inject constructor( onGetData(_state.value.inputText) } + private fun onError(errorUiState: ErrorUiState) { + _state.update { it.copy(error = errorUiState, isLoading = false) } + } + /// region listeners override fun onClickClear() { _state.value = SearchUiState() } - override fun onClickAllChip() { - onChangeCategory(SearchMedia.ALL) - } - override fun onClickMovieChip() { onChangeCategory(SearchMedia.MOVIE) } @@ -178,8 +151,16 @@ class SearchViewModel @Inject constructor( onChangeCategory(SearchMedia.PEOPLE) } - override fun onClickItem(id: Int) { - TODO("Not yet implemented") + override fun onCLickRefresh() { + viewModelScope.launch { + _queryFlow + .debounce(1000) + .filter { it.isNotEmpty() } + .distinctUntilChanged() + .collect { query -> + onGetData(query) + } + } } ///endregion } \ No newline at end of file From 6726b5c15c8eb3d63a05425713a6b5657c8e206f Mon Sep 17 00:00:00 2001 From: Abanoub Nagy <114380262+Abanoub-Nagy@users.noreply.github.com> Date: Wed, 27 Sep 2023 20:50:09 +0300 Subject: [PATCH 2/3] fixed search screen bugs --- .../com/redvelvet/ui/composable/CustomLazyGrid.kt | 2 ++ .../com/redvelvet/viewmodel/search/SearchUiState.kt | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt b/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt index 0d74507d..f10d6ef8 100644 --- a/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt +++ b/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt @@ -1,5 +1,6 @@ package com.redvelvet.ui.composable +import android.util.Log import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues @@ -61,6 +62,7 @@ fun CustomLazyGrid( .width(MaterialTheme.dimens.dimens104) .height(MaterialTheme.dimens.dimens176) .clickable { + Log.d("AAA", mediaItem.type) when (mediaItem.type) { "Movie" -> navController.navigateToMovieDetails(mediaItem.id.toString()) "TvShow" -> navController.navigateToTvShowDetails(mediaItem.id.toString()) diff --git a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiState.kt b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiState.kt index 8e7a5058..480f78bc 100644 --- a/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiState.kt +++ b/viewmodels/src/main/java/com/redvelvet/viewmodel/search/SearchUiState.kt @@ -14,10 +14,10 @@ data class SearchUiState( val inputText: String = "", val searchResult: Flow> = flow { }, val isEmpty: Boolean = true, - val categories: List = listOf( - CategoryUiState("Movie", SearchMedia.MOVIE), - CategoryUiState("Tv show", SearchMedia.TV), - CategoryUiState("Person", SearchMedia.PEOPLE), + val categories : List = listOf( + CategoryUiState(text = "Movie", type = SearchMedia.MOVIE), + CategoryUiState(text = "Tv show", type = SearchMedia.TV), + CategoryUiState(text = "Person", type = SearchMedia.PEOPLE), ) ) : BaseUiState @@ -31,5 +31,6 @@ data class SearchCardUiState( ) data class CategoryUiState( - val text: String = "", val type: SearchMedia = SearchMedia.MOVIE + val text: String = "", + val type: SearchMedia = SearchMedia.MOVIE ) \ No newline at end of file From 7d48ac62629766562290fff8e14bf3adc915b115 Mon Sep 17 00:00:00 2001 From: Abanoub Nagy <114380262+Abanoub-Nagy@users.noreply.github.com> Date: Wed, 27 Sep 2023 21:28:29 +0300 Subject: [PATCH 3/3] fixed custom lazy grid --- .../main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt b/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt index f10d6ef8..72ef95a1 100644 --- a/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt +++ b/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt @@ -1,6 +1,5 @@ package com.redvelvet.ui.composable -import android.util.Log import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues @@ -18,7 +17,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems -import coil.compose.rememberAsyncImagePainter import com.redvelvet.ui.LocalNavController import com.redvelvet.ui.screen.actor_details.navigateToActorDetails import com.redvelvet.ui.screen.movieDetails.navigateToMovieDetails @@ -62,11 +60,10 @@ fun CustomLazyGrid( .width(MaterialTheme.dimens.dimens104) .height(MaterialTheme.dimens.dimens176) .clickable { - Log.d("AAA", mediaItem.type) when (mediaItem.type) { "Movie" -> navController.navigateToMovieDetails(mediaItem.id.toString()) "TvShow" -> navController.navigateToTvShowDetails(mediaItem.id.toString()) - "People" -> navController.navigateToActorDetails(mediaItem.id.toString()) + "person" -> navController.navigateToActorDetails(mediaItem.id.toString()) } }, hasName = true,