ananas/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt
2022-07-25 12:57:09 +02:00

78 lines
No EOL
2.6 KiB
Kotlin

package dev.jdtech.jellyfin.viewmodels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.jdtech.jellyfin.models.FavoriteSection
import dev.jdtech.jellyfin.repository.JellyfinRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jellyfin.sdk.model.api.BaseItemKind
import java.util.*
import javax.inject.Inject
@HiltViewModel
class SearchResultViewModel
@Inject
constructor(
private val jellyfinRepository: JellyfinRepository
) : ViewModel() {
private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
val uiState = _uiState.asStateFlow()
sealed class UiState {
data class Normal(val sections: List<FavoriteSection>) : UiState()
object Loading : UiState()
data class Error(val error: Exception) : UiState()
}
fun loadData(query: String) {
viewModelScope.launch {
_uiState.emit(UiState.Loading)
try {
val items = jellyfinRepository.getSearchItems(query)
if (items.isEmpty()) {
_uiState.emit(UiState.Normal(emptyList()))
return@launch
}
val sections = mutableListOf<FavoriteSection>()
withContext(Dispatchers.Default) {
FavoriteSection(
UUID.randomUUID(),
"Movies",
items.filter { it.type == BaseItemKind.MOVIE }).let {
if (it.items.isNotEmpty()) sections.add(
it
)
}
FavoriteSection(
UUID.randomUUID(),
"Shows",
items.filter { it.type == BaseItemKind.SERIES }).let {
if (it.items.isNotEmpty()) sections.add(
it
)
}
FavoriteSection(
UUID.randomUUID(),
"Episodes",
items.filter { it.type == BaseItemKind.EPISODE }).let {
if (it.items.isNotEmpty()) sections.add(
it
)
}
}
_uiState.emit(UiState.Normal(sections))
} catch (e: Exception) {
_uiState.emit(UiState.Error(e))
}
}
}
}