Android/Study

[Android] 포스팅 업로드 구현 (2) - ViewModel

Tenacity_Dev 2024. 2. 26. 14:44
728x90

이번에는 PostCreateViewModel에 대해서 리뷰를 해보자.

전체 코드

class PostCreateViewModel : ViewModel() {
    private val _uiState = MutableStateFlow(PostCreateUiState())
    val uiState = _uiState.asStateFlow()

    fun selectImage(uri: Uri) {
        _uiState.update { it.copy(selectedImage = uri) }
    }

    fun changeToEditMode() {
        _uiState.update { it.copy(isCreating = false) }
    }

    @RequiresApi(Build.VERSION_CODES.O)
    fun uploadContent(content: String) {
        _uiState.update { it.copy(isLoading = true) }
        viewModelScope.launch {
            val result = PostRepository.uploadPost(content, uiState.value.selectedImage!!)
            if (result.isSuccess) {
                _uiState.update { it.copy(successToUpload = true, isLoading = false) }
            } else {
                _uiState.update {
                    it.copy(
                        userMessage = R.string.failed,
                        isLoading = false
                    )
                }
            }
        }
    }

    fun editContent(uuid: String, content: String) {
        _uiState.update { it.copy(isLoading = true) }
        viewModelScope.launch {
            val result: Result<Unit> = if (_uiState.value.selectedImage != null) {
                PostRepository.editPost(uuid, content, uiState.value.selectedImage!!)
            } else {
                PostRepository.editPostOnlyContent(uuid, content)
            }
            if (result.isSuccess) {
                _uiState.update { it.copy(successToUpload = true, isLoading = false) }
            } else {
                _uiState.update {
                    it.copy(
                        userMessage = R.string.failed,
                        isLoading = false
                    )
                }
            }
        }
    }

    fun userMessageShown() {
        _uiState.update { it.copy(userMessage = null) }
    }
}

 

부분 코드 설명

  1. MutableStateFlow 및 StateFlow:
    • _uiState는 MutableStateFlow로, 상태의 변경을 허용합니다. 초기값으로 PostCreateUiState()를 갖는다.
    • uiState는 _uiState를 asStateFlow()로 변환하여 외부로 불변의 StateFlow로 제공한다.
  2. selectImage 함수:
    • 이미지가 선택되면 해당 이미지의 Uri를 받아와서 _uiState를 업데이트한다.
  3. changeToEditMode 함수:
    • 편집 모드로 전환하는 함수로, _uiState의 isCreating 속성을 false로 변경한다.
    • 그리고 만약 변경된다면 이것은 포스팅 생성 화면이 아니라 포스팅 편집 화면이라는 것을 의미한다.
  4. uploadContent 함수:
    • 게시물을 업로드하는 함수로, PostRepository.uploadPost를 호출하여 게시물을 업로드한다.
    • 결과에 따라 _uiState를 업데이트하고, 업로드 성공 시 successToUpload를 true로, 실패 시 오류 메시지를 설정한다.
  5. editContent 함수:
    • 게시물을 편집하는 함수로, PostRepository.editPost 또는 PostRepository.editPostOnlyContent를 호출하여 게시물을 편집한다.
    • 결과에 따라 _uiState를 업데이트하고, 편집 성공 시 successToUpload를 true로, 실패 시 오류 메시지를 설정한다.
  6. userMessageShown 함수:
    • 사용자 메시지가 표시되었음을 나타내는 함수로, _uiState의 userMessage를 null로 설정한다.
728x90