Transitioning to Unified State Management: Refactoring a Daynote ViewModel and Screen | by Murat Gunay | Dec, 2024

class ViewDaynoteViewModel : ViewModel() {
private val _uiState = MutableStateFlow<ViewDaynoteUiState>(ViewDaynoteUiState.Loading)
val uiState: StateFlow<ViewDaynoteUiState> = _uiState

var commentText = MutableStateFlow(“”)

fun loadDaynote(daynoteId: String) {
viewModelScope.launch {
_uiState.value = ViewDaynoteUiState.Loading
val result = daynoteRepository.getDaynoteById(daynoteId).flatMap { daynote ->
userRepository.getUserPreviewById(daynote.userId).map { userPreview ->
Triple(daynote, userPreview, daynote.userId == currentUserId)
}
}

result.onSuccess { (daynote, userPreview, isCurrentUser) ->
val isLiked = likeRepository.isDaynoteLikedByUser(daynoteId, currentUserId!!)
_uiState.value = ViewDaynoteUiState.Success(
daynote = daynote,
userPreview = userPreview,
isLiked = isLiked,
isCurrentUser = isCurrentUser,
)
loadComments(daynoteId)
}.onFailure {
_uiState.value = ViewDaynoteUiState.Error
}
}
}

fun toggleCommentSection() {
val currentState = _uiState.value
if (currentState is ViewDaynoteUiState.Success) {
_uiState.value = currentState.copy(
isCommentSectionVisible = !currentState.isCommentSectionVisible
)
}
}

fun deleteDaynote(daynoteId: String) {
viewModelScope.launch {
val result = daynoteRepository.deleteDaynote(daynoteId)
result.onSuccess {
_uiState.value = ViewDaynoteUiState.Deleted
}.onFailure {
_toastMessage.emit(ToastMessage.Error(“Failed to delete daynote”))
}
}
}

// Additional logic for comments, likes, etc.
}

Leave a Reply