Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,15 @@ import javax.inject.Inject
class HistoryRepositoryImpl @Inject constructor(
private val historyService: HistoryService
) : HistoryRepository {
override suspend fun getMissionHistories(page: Int): DomainResult<MissionHistories> =
override suspend fun getMissionHistories(
page: Int,
pageSize: Int
): DomainResult<MissionHistories> =
handleResult {
historyService.getMyMissionHistories(page)
historyService.getMyMissionHistories(
page = page,
pageSize = pageSize
)
}.convert {
it.toModel()
}
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ import com.goalpanzi.mission_mate.core.domain.common.DomainResult
import com.goalpanzi.mission_mate.core.domain.history.model.MissionHistories

interface HistoryRepository {
suspend fun getMissionHistories(page: Int) : DomainResult<MissionHistories>
suspend fun getMissionHistories(page: Int, pageSize: Int) : DomainResult<MissionHistories>
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,16 @@ import javax.inject.Inject
class GetMissionHistoriesUseCase @Inject constructor(
private val historyRepository: HistoryRepository
) {
operator fun invoke(page: Int) : Flow<DomainResult<MissionHistories>> = flow {
emit(historyRepository.getMissionHistories(page))
operator fun invoke(
page: Int,
pageSize: Int
): Flow<DomainResult<MissionHistories>> = flow {
emit(
historyRepository.getMissionHistories(
page = page,
pageSize = pageSize
)
)
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ fun NavController.navigateToHistory(

fun NavGraphBuilder.historyNavGraph() {
composable<HistoryRouteModel.History> {
HistoryRoute()
HistoryRoute(
onHistoryClick = { history ->

}
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.goalpanzi.mission_mate.feature.history

import com.goalpanzi.mission_mate.feature.history.model.Histories

sealed interface HistoryUiState {
data object Loading : HistoryUiState
data object Refreshing : HistoryUiState
data class Success(val histories: Histories) : HistoryUiState
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.goalpanzi.mission_mate.feature.history

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.goalpanzi.mission_mate.core.domain.common.DomainResult
import com.goalpanzi.mission_mate.core.domain.history.usecase.GetMissionHistoriesUseCase
import com.goalpanzi.mission_mate.feature.history.model.History
import com.goalpanzi.mission_mate.feature.history.model.toUiModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class HistoryViewModel @Inject constructor(
private val getMissionHistoriesUseCase: GetMissionHistoriesUseCase
) : ViewModel() {

private val _historyState = MutableStateFlow<HistoryUiState>(HistoryUiState.Loading)
val historyState: StateFlow<HistoryUiState> = _historyState.asStateFlow()

fun initHistories() {
viewModelScope.launch {
_historyState.emit(HistoryUiState.Loading)
getHistories()
}
}

fun refresh() {
viewModelScope.launch {
_historyState.emit(HistoryUiState.Refreshing)
getHistories()
}
}

fun fetchHistories() {
viewModelScope.launch {
getHistories(getNextPage())
}
}

private suspend fun getHistories(page: Int = 0) {
getMissionHistoriesUseCase(
page = page,
pageSize = HISTORIES_PAGE_SIZE
).collect { result ->
val uiState = when (result) {
is DomainResult.Success -> {
val data = result.data.toUiModel()

if(page == 0) HistoryUiState.Success(data)
else HistoryUiState.Success(
data.copy(resultList = getCurrentList(historyState.value) + data.resultList)
)
}

is DomainResult.Error -> {
HistoryUiState.Loading
}

is DomainResult.Exception -> {
HistoryUiState.Loading
}
}
_historyState.emit(uiState)
}
}

private fun getCurrentList(
historyUiState: HistoryUiState
): List<History> {
return if (historyUiState is HistoryUiState.Success) historyUiState.histories.resultList
else emptyList()
}

private fun getNextPage() : Int {
return when(val state = historyState.value) {
is HistoryUiState.Success -> {
(state.histories.resultList.size % HISTORIES_PAGE_SIZE) + 1
}
else -> 0
}
}

companion object {
private const val HISTORIES_PAGE_SIZE = 30
}
}
Loading