Refactor DateDifferenceViewModel

This commit is contained in:
sadellie 2023-08-01 23:07:13 +03:00
parent 79269dcea5
commit 9815484706

View File

@ -20,15 +20,12 @@ package com.sadellie.unitto.feature.datedifference.difference
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.sadellie.unitto.feature.datedifference.ZonedDateTimeDifference
import com.sadellie.unitto.feature.datedifference.minus import com.sadellie.unitto.feature.datedifference.minus
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -37,27 +34,19 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
internal class DateDifferenceViewModel @Inject constructor() : ViewModel() { internal class DateDifferenceViewModel @Inject constructor() : ViewModel() {
private val _start = MutableStateFlow(ZonedDateTime.now()) private val _uiState = MutableStateFlow(DifferenceUIState())
private val _end = MutableStateFlow(ZonedDateTime.now())
private val _result = MutableStateFlow<ZonedDateTimeDifference>(ZonedDateTimeDifference.Zero)
val uiState = combine(_start, _end, _result) { start, end, result -> val uiState = _uiState
return@combine DifferenceUIState(start, end, result) .onEach { updateResult() }
}
.stateIn( .stateIn(
viewModelScope, SharingStarted.WhileSubscribed(5000L), DifferenceUIState() viewModelScope, SharingStarted.WhileSubscribed(5000L), DifferenceUIState()
) )
fun setStartDate(dateTime: ZonedDateTime) = _start.update { dateTime } fun setStartDate(newValue: ZonedDateTime) = _uiState.update { it.copy(start = newValue) }
fun setEndDate(dateTime: ZonedDateTime) = _end.update { dateTime } fun setEndDate(newValue: ZonedDateTime) = _uiState.update { it.copy(end = newValue) }
init { private fun updateResult() = viewModelScope.launch(Dispatchers.Default) {
viewModelScope.launch(Dispatchers.Default) { _uiState.update { ui -> ui.copy(result = ui.start - ui.end) }
merge(_start, _end).collectLatest {
val difference = _start.value - _end.value
_result.update { difference }
}
}
} }
} }