-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathGithubViewModel.kt
74 lines (65 loc) · 2.79 KB
/
GithubViewModel.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package nextstep.github
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import nextstep.github.core.data.GithubRepository
import nextstep.github.core.data.GithubRepositoryInfo
import nextstep.github.core.network.ApiResult
import nextstep.github.ui.screen.github.list.GithubRepositoryUiState
class GithubViewModel(
private val githubRepository: GithubRepository
) : ViewModel() {
private val _uiState =
MutableStateFlow<GithubRepositoryUiState>(GithubRepositoryUiState.Loading)
val uiState: StateFlow<GithubRepositoryUiState> = _uiState
fun getRepositories(organization: String) {
_uiState.value = GithubRepositoryUiState.Loading
viewModelScope.launch(Dispatchers.IO) {
try {
when (val result = githubRepository.getRepositories(organization)) {
is ApiResult.Success -> {
val githubRepositories = result.value.map {
GithubRepositoryInfo(
fullName = it.fullName ?: "",
description = it.description ?: ""
)
}
if (githubRepositories.isEmpty()) {
_uiState.value = GithubRepositoryUiState.Empty
} else {
_uiState.value =
GithubRepositoryUiState.Success(
githubRepositories = githubRepositories
)
}
}
is ApiResult.Error -> {
_uiState.value = GithubRepositoryUiState.Error
Log.e("GithubViewModel", "Error: ${result.code} ${result.exception}")
}
}
} catch (e: Exception) {
_uiState.value = GithubRepositoryUiState.Error
Log.e("GithubViewModel", "Error: ${e.message}")
}
}
}
companion object {
val Factory: ViewModelProvider.Factory = viewModelFactory {
initializer {
val githubRepository = (this[APPLICATION_KEY] as MainApplication)
.appContainer
.githubRepository
GithubViewModel(githubRepository)
}
}
}
}