Skip to content

Commit 6930059

Browse files
fix my page ui events
1 parent 464baa5 commit 6930059

5 files changed

Lines changed: 76 additions & 82 deletions

File tree

ui/view/src/main/java/jp/dosukoi/ui/view/myPage/MyPageScreen.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,31 @@ package jp.dosukoi.ui.view.myPage
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.collectAsState
55
import androidx.compose.runtime.getValue
6+
import androidx.compose.ui.platform.LocalContext
67
import jp.dosukoi.data.entity.myPage.UserStatus
78
import jp.dosukoi.ui.view.common.LoadingAndErrorScreen
9+
import jp.dosukoi.ui.view.common.showErrorToast
810
import jp.dosukoi.ui.viewmodel.myPage.MyPageViewModel
911

1012
@Composable
1113
fun MyPageScreen(
1214
viewModel: MyPageViewModel,
1315
) {
1416
val myPageUiState by viewModel.myPageState.collectAsState()
17+
if (myPageUiState.errors.isNotEmpty()) {
18+
val context = LocalContext.current
19+
val throwable = myPageUiState.errors.first()
20+
context.showErrorToast(throwable)
21+
viewModel.onConsumeErrors(throwable)
22+
}
1523
LoadingAndErrorScreen(
16-
state = myPageUiState,
24+
state = myPageUiState.screenState,
1725
loadedContent = { data ->
1826
when (val state = data.userStatus) {
1927
is UserStatus.Authenticated -> MyPageComponent(
2028
state.user,
2129
data.repositoryList,
22-
data.isRefreshing,
30+
myPageUiState.isRefreshing,
2331
viewModel::onRefresh
2432
)
2533
UserStatus.UnAuthenticated -> UnAuthenticatedUserComponent()

ui/view/src/main/java/jp/dosukoi/ui/view/top/MainActivity.kt

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,16 @@ import coil.compose.LocalImageLoader
1111
import dagger.hilt.android.AndroidEntryPoint
1212
import jp.dosukoi.ui.view.common.CompositionLocalProvider
1313
import jp.dosukoi.ui.view.common.appColors
14-
import jp.dosukoi.ui.view.common.produceViewModels
1514
import jp.dosukoi.ui.view.common.showErrorToast
1615
import jp.dosukoi.ui.viewmodel.myPage.MyPageViewModel
1716
import jp.dosukoi.ui.viewmodel.search.SearchViewModel
18-
import jp.dosukoi.ui.viewmodel.top.MainViewModel
1917
import javax.inject.Inject
2018

2119
@AndroidEntryPoint
2220
class MainActivity : AppCompatActivity() {
2321

24-
private val viewModel: MainViewModel by viewModels()
22+
private val myPageViewModel: MyPageViewModel by viewModels()
2523

26-
@Inject
27-
lateinit var myPageViewModelFactory: MyPageViewModel.Factory
28-
private val myPageViewModel: MyPageViewModel by produceViewModels {
29-
myPageViewModelFactory.create(viewModel)
30-
}
31-
3224
private val searchViewModel: SearchViewModel by viewModels()
3325

3426
@Inject
@@ -53,7 +45,6 @@ class MainActivity : AppCompatActivity() {
5345
}
5446

5547
myPageViewModel.init()
56-
viewModel.onEvent.observe(this, ::handleEvent)
5748
}
5849

5950
private fun handleEvent(event: MainViewModel.Event) {
@@ -75,6 +66,6 @@ class MainActivity : AppCompatActivity() {
7566
}
7667
val uri = intent.data ?: return
7768
val code = uri.getQueryParameter("code")
78-
viewModel.onGetCode(code)
69+
myPageViewModel.onGetCode(code)
7970
}
8071
}

ui/viewModel/src/main/java/jp/dosukoi/ui/viewmodel/myPage/MyPageUiState.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@ package jp.dosukoi.ui.viewmodel.myPage
22

33
import jp.dosukoi.data.entity.myPage.Repository
44
import jp.dosukoi.data.entity.myPage.UserStatus
5+
import jp.dosukoi.ui.viewmodel.common.LoadState
56

67
data class MyPageUiState(
8+
val screenState: LoadState<MyPageScreenState> = LoadState.Loading,
9+
val isRefreshing: Boolean = false,
10+
val errors: List<Throwable> = emptyList()
11+
)
12+
13+
data class MyPageScreenState(
714
val userStatus: UserStatus,
8-
val repositoryList: List<Repository>,
9-
val isRefreshing: Boolean
15+
val repositoryList: List<Repository>
1016
)

ui/viewModel/src/main/java/jp/dosukoi/ui/viewmodel/myPage/MyPageViewModel.kt

Lines changed: 56 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,29 @@ package jp.dosukoi.ui.viewmodel.myPage
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
5-
import dagger.assisted.Assisted
6-
import dagger.assisted.AssistedFactory
7-
import dagger.assisted.AssistedInject
5+
import dagger.hilt.android.lifecycle.HiltViewModel
86
import jp.dosukoi.data.entity.common.UnAuthorizeException
97
import jp.dosukoi.data.entity.myPage.UserStatus
8+
import jp.dosukoi.data.usecase.auth.GetAccessTokenUseCase
109
import jp.dosukoi.data.usecase.myPage.GetRepositoriesUseCase
1110
import jp.dosukoi.data.usecase.myPage.GetUserStatusUseCase
1211
import jp.dosukoi.ui.viewmodel.common.LoadState
1312
import kotlinx.coroutines.flow.MutableStateFlow
1413
import kotlinx.coroutines.flow.StateFlow
1514
import kotlinx.coroutines.flow.update
1615
import kotlinx.coroutines.launch
16+
import javax.inject.Inject
1717

18-
interface MyPageListener {
19-
fun onGetCode(code: String?)
20-
}
21-
22-
class MyPageViewModel @AssistedInject constructor(
18+
@HiltViewModel
19+
class MyPageViewModel @Inject constructor(
2320
private val getUserStatusUseCase: GetUserStatusUseCase,
2421
private val getRepositoriesUseCase: GetRepositoriesUseCase,
25-
@Assisted private val myPageListener: MyPageListener
26-
) : ViewModel(), MyPageListener by myPageListener {
27-
28-
@AssistedFactory
29-
interface Factory {
30-
fun create(myPageListener: MyPageListener): MyPageViewModel
31-
}
22+
private val getAccessTokenUseCase: GetAccessTokenUseCase,
23+
) : ViewModel() {
3224

33-
private val _myPageState: MutableStateFlow<LoadState<MyPageUiState>> =
34-
MutableStateFlow(LoadState.Loading)
35-
val myPageState: StateFlow<LoadState<MyPageUiState>> = _myPageState
25+
private val _myPageState: MutableStateFlow<MyPageUiState> =
26+
MutableStateFlow(MyPageUiState())
27+
val myPageState: StateFlow<MyPageUiState> = _myPageState
3628

3729
fun init() {
3830
refresh()
@@ -41,44 +33,77 @@ class MyPageViewModel @AssistedInject constructor(
4133
private fun refresh() {
4234
viewModelScope.launch {
4335
runCatching {
44-
MyPageUiState(
36+
MyPageScreenState(
4537
getUserStatusUseCase.execute(),
4638
getRepositoriesUseCase.execute(),
47-
false
4839
)
49-
}.onSuccess {
50-
_myPageState.value = LoadState.Loaded(it)
40+
}.onSuccess { screenState ->
41+
_myPageState.update {
42+
it.copy(screenState = LoadState.Loaded(screenState))
43+
}
5144
}.onFailure {
5245
when (it) {
5346
is UnAuthorizeException -> {
54-
_myPageState.value = LoadState.Loaded(
55-
MyPageUiState(
56-
UserStatus.UnAuthenticated,
57-
emptyList(),
47+
_myPageState.update {
48+
it.copy(
49+
screenState = LoadState.Loaded(
50+
MyPageScreenState(
51+
UserStatus.UnAuthenticated,
52+
emptyList()
53+
)
54+
),
5855
isRefreshing = false
5956
)
60-
)
57+
}
6158
}
6259
else -> {
63-
_myPageState.value = LoadState.Error("error")
60+
_myPageState.update {
61+
it.copy(screenState = LoadState.Error("Error"))
62+
}
6463
}
6564
}
6665
}
6766
}
6867
}
6968

7069
fun onRetryClick() {
71-
_myPageState.value = LoadState.Loading
70+
_myPageState.update {
71+
it.copy(screenState = LoadState.Loading)
72+
}
7273
refresh()
7374
}
7475

7576
fun onRefresh() {
7677
_myPageState.update {
77-
when (it) {
78-
is LoadState.Loaded -> it.copy(data = it.data.copy(isRefreshing = true))
78+
when (it.screenState) {
79+
is LoadState.Loaded -> it.copy(isRefreshing = true)
7980
else -> it
8081
}
8182
}
8283
refresh()
8384
}
85+
86+
fun onGetCode(code: String?) {
87+
code ?: return
88+
viewModelScope.launch {
89+
runCatching {
90+
getAccessTokenUseCase.execute(code)
91+
}.onSuccess {
92+
_myPageState.update {
93+
it.copy(screenState = LoadState.Loading)
94+
}
95+
refresh()
96+
}.onFailure { throwable ->
97+
_myPageState.update {
98+
it.copy(errors = it.errors.plus(throwable))
99+
}
100+
}
101+
}
102+
}
103+
104+
fun onConsumeErrors(throwable: Throwable) {
105+
_myPageState.update {
106+
it.copy(errors = it.errors.minus(throwable))
107+
}
108+
}
84109
}

ui/viewModel/src/main/java/jp/dosukoi/ui/viewmodel/top/MainViewModel.kt

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)