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..72ef95a1 100644 --- a/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt +++ b/ui/src/main/java/com/redvelvet/ui/composable/CustomLazyGrid.kt @@ -17,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,8 +61,8 @@ fun CustomLazyGrid( .height(MaterialTheme.dimens.dimens176) .clickable { when (mediaItem.type) { - "movie" -> navController.navigateToMovieDetails(mediaItem.id.toString()) - "tv" -> navController.navigateToTvShowDetails(mediaItem.id.toString()) + "Movie" -> navController.navigateToMovieDetails(mediaItem.id.toString()) + "TvShow" -> navController.navigateToTvShowDetails(mediaItem.id.toString()) "person" -> navController.navigateToActorDetails(mediaItem.id.toString()) } }, 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..480f78bc 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), + val categories : List = listOf( CategoryUiState(text = "Movie", type = SearchMedia.MOVIE), - CategoryUiState(text = "Person", type = SearchMedia.PEOPLE), CategoryUiState(text = "Tv show", type = SearchMedia.TV), + CategoryUiState(text = "Person", type = SearchMedia.PEOPLE), ) ) : BaseUiState @@ -33,5 +32,5 @@ data class SearchCardUiState( data class CategoryUiState( val text: String = "", - val type: SearchMedia = SearchMedia.ALL + 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