Skip to content
Open
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
Expand Up @@ -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
Expand Down Expand Up @@ -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())
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -73,7 +74,7 @@ fun SearchScreen(
CategoriesChips(
onChangeCategory = viewModel::onChangeCategory,
selectedType = state.selectedMediaType,
categories = state.getCategories,
categories = state.categories,
title = "Categories"
)
SearchContent(state)
Expand All @@ -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())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
Original file line number Diff line number Diff line change
@@ -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()

}
Original file line number Diff line number Diff line change
Expand Up @@ -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<PagingData<SearchCardUiState>> = flow { },
val isEmpty: Boolean = true,
val getCategories : List<CategoryUiState> = listOf(
CategoryUiState(text = "All", type = SearchMedia.ALL),
val categories : List<CategoryUiState> = 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

Expand All @@ -33,5 +32,5 @@ data class SearchCardUiState(

data class CategoryUiState(
val text: String = "",
val type: SearchMedia = SearchMedia.ALL
val type: SearchMedia = SearchMedia.MOVIE
)
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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)
Expand All @@ -74,24 +67,8 @@ class SearchViewModel @Inject constructor(
SearchMedia.TV -> fetchTvShowResults {
getSearchTvShowUseCase(query)
}
}
}

private fun fetchResults(fetchFunction: suspend () -> Flow<PagingData<SearchResult>>) {
tryToExecutePaging(
call = fetchFunction,
onSuccess = ::onSuccessSearchResults,
onError = ::onError
)
}

private fun onSuccessSearchResults(pagingData: PagingData<SearchResult>) {
_state.update {
it.copy(
searchResult = flowOf(pagingData.map { it.toSearchCardUiState() }),
isLoading = false,
isEmpty = false
)
else -> {}
}
}

Expand Down Expand Up @@ -146,26 +123,22 @@ 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
_state.update { it.copy(selectedMediaType = type) }
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)
}
Expand All @@ -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
}