Skip to content

Commit e430286

Browse files
authored
Merge pull request #93 from Nexters/feature/add-history
내기록 화면 구현
2 parents f3fed2f + f70ba8d commit e430286

File tree

13 files changed

+961
-15
lines changed

13 files changed

+961
-15
lines changed

core/data/history/src/main/java/com/goalpanzi/mission_mate/core/data/history/repository/HistoryRepositoryImpl.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,15 @@ import javax.inject.Inject
1212
class HistoryRepositoryImpl @Inject constructor(
1313
private val historyService: HistoryService
1414
) : HistoryRepository {
15-
override suspend fun getMissionHistories(page: Int): DomainResult<MissionHistories> =
15+
override suspend fun getMissionHistories(
16+
page: Int,
17+
pageSize: Int
18+
): DomainResult<MissionHistories> =
1619
handleResult {
17-
historyService.getMyMissionHistories(page)
20+
historyService.getMyMissionHistories(
21+
page = page,
22+
pageSize = pageSize
23+
)
1824
}.convert {
1925
it.toModel()
2026
}
4.15 KB
Loading

core/domain/history/src/main/java/com/goalpanzi/mission_mate/core/domain/history/repository/HistoryRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ import com.goalpanzi.mission_mate.core.domain.common.DomainResult
44
import com.goalpanzi.mission_mate.core.domain.history.model.MissionHistories
55

66
interface HistoryRepository {
7-
suspend fun getMissionHistories(page: Int) : DomainResult<MissionHistories>
7+
suspend fun getMissionHistories(page: Int, pageSize: Int) : DomainResult<MissionHistories>
88
}

core/domain/history/src/main/java/com/goalpanzi/mission_mate/core/domain/history/usecase/GetMissionHistoriesUseCase.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@ import javax.inject.Inject
1010
class GetMissionHistoriesUseCase @Inject constructor(
1111
private val historyRepository: HistoryRepository
1212
) {
13-
operator fun invoke(page: Int) : Flow<DomainResult<MissionHistories>> = flow {
14-
emit(historyRepository.getMissionHistories(page))
13+
operator fun invoke(
14+
page: Int,
15+
pageSize: Int
16+
): Flow<DomainResult<MissionHistories>> = flow {
17+
emit(
18+
historyRepository.getMissionHistories(
19+
page = page,
20+
pageSize = pageSize
21+
)
22+
)
1523
}
1624
}
1725

feature/history/src/main/java/com/goalpanzi/mission_mate/feature/history/HistoryNavigation.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ fun NavController.navigateToHistory(
2020

2121
fun NavGraphBuilder.historyNavGraph() {
2222
composable<HistoryRouteModel.History> {
23-
HistoryRoute()
23+
HistoryRoute(
24+
onHistoryClick = { history ->
25+
26+
}
27+
)
2428
}
2529
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.goalpanzi.mission_mate.feature.history
2+
3+
import com.goalpanzi.mission_mate.feature.history.model.Histories
4+
5+
sealed interface HistoryUiState {
6+
data object Loading : HistoryUiState
7+
data object Refreshing : HistoryUiState
8+
data class Success(val histories: Histories) : HistoryUiState
9+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.goalpanzi.mission_mate.feature.history
2+
3+
import androidx.lifecycle.ViewModel
4+
import androidx.lifecycle.viewModelScope
5+
import com.goalpanzi.mission_mate.core.domain.common.DomainResult
6+
import com.goalpanzi.mission_mate.core.domain.history.usecase.GetMissionHistoriesUseCase
7+
import com.goalpanzi.mission_mate.feature.history.model.History
8+
import com.goalpanzi.mission_mate.feature.history.model.toUiModel
9+
import dagger.hilt.android.lifecycle.HiltViewModel
10+
import kotlinx.coroutines.flow.MutableStateFlow
11+
import kotlinx.coroutines.flow.StateFlow
12+
import kotlinx.coroutines.flow.asStateFlow
13+
import kotlinx.coroutines.launch
14+
import javax.inject.Inject
15+
16+
@HiltViewModel
17+
class HistoryViewModel @Inject constructor(
18+
private val getMissionHistoriesUseCase: GetMissionHistoriesUseCase
19+
) : ViewModel() {
20+
21+
private val _historyState = MutableStateFlow<HistoryUiState>(HistoryUiState.Loading)
22+
val historyState: StateFlow<HistoryUiState> = _historyState.asStateFlow()
23+
24+
fun initHistories() {
25+
viewModelScope.launch {
26+
_historyState.emit(HistoryUiState.Loading)
27+
getHistories()
28+
}
29+
}
30+
31+
fun refresh() {
32+
viewModelScope.launch {
33+
_historyState.emit(HistoryUiState.Refreshing)
34+
getHistories()
35+
}
36+
}
37+
38+
fun fetchHistories() {
39+
viewModelScope.launch {
40+
getHistories(getNextPage())
41+
}
42+
}
43+
44+
private suspend fun getHistories(page: Int = 0) {
45+
getMissionHistoriesUseCase(
46+
page = page,
47+
pageSize = HISTORIES_PAGE_SIZE
48+
).collect { result ->
49+
val uiState = when (result) {
50+
is DomainResult.Success -> {
51+
val data = result.data.toUiModel()
52+
53+
if(page == 0) HistoryUiState.Success(data)
54+
else HistoryUiState.Success(
55+
data.copy(resultList = getCurrentList(historyState.value) + data.resultList)
56+
)
57+
}
58+
59+
is DomainResult.Error -> {
60+
HistoryUiState.Loading
61+
}
62+
63+
is DomainResult.Exception -> {
64+
HistoryUiState.Loading
65+
}
66+
}
67+
_historyState.emit(uiState)
68+
}
69+
}
70+
71+
private fun getCurrentList(
72+
historyUiState: HistoryUiState
73+
): List<History> {
74+
return if (historyUiState is HistoryUiState.Success) historyUiState.histories.resultList
75+
else emptyList()
76+
}
77+
78+
private fun getNextPage() : Int {
79+
return when(val state = historyState.value) {
80+
is HistoryUiState.Success -> {
81+
(state.histories.resultList.size % HISTORIES_PAGE_SIZE) + 1
82+
}
83+
else -> 0
84+
}
85+
}
86+
87+
companion object {
88+
private const val HISTORIES_PAGE_SIZE = 30
89+
}
90+
}

0 commit comments

Comments
 (0)