diff --git a/app/src/main/java/com/into/websoso/data/mapper/UserMapper.kt b/app/src/main/java/com/into/websoso/data/mapper/UserMapper.kt index 27372d6e8..93b676b87 100644 --- a/app/src/main/java/com/into/websoso/data/mapper/UserMapper.kt +++ b/app/src/main/java/com/into/websoso/data/mapper/UserMapper.kt @@ -12,7 +12,6 @@ import com.into.websoso.data.model.UserFeedsEntity.UserFeedEntity import com.into.websoso.data.model.UserInfoDetailEntity import com.into.websoso.data.model.UserInfoEntity import com.into.websoso.data.model.UserNovelStatsEntity -import com.into.websoso.data.model.UserProfileStatusEntity import com.into.websoso.data.model.UserStorageEntity import com.into.websoso.data.model.UserStorageEntity.StorageNovelEntity import com.into.websoso.data.remote.response.BlockedUsersResponseDto @@ -26,7 +25,6 @@ import com.into.websoso.data.remote.response.UserFeedsResponseDto.UserFeedRespon import com.into.websoso.data.remote.response.UserInfoDetailResponseDto import com.into.websoso.data.remote.response.UserInfoResponseDto import com.into.websoso.data.remote.response.UserNovelStatsResponseDto -import com.into.websoso.data.remote.response.UserProfileStatusResponseDto import com.into.websoso.data.remote.response.UserStorageResponseDto import com.into.websoso.data.remote.response.UserStorageResponseDto.StorageNovelDto import com.into.websoso.ui.main.myPage.myActivity.model.Genres @@ -65,11 +63,6 @@ fun UserNovelStatsResponseDto.toData(): UserNovelStatsEntity = quitNovelCount = quitNovelCount, ) -fun UserProfileStatusResponseDto.toData(): UserProfileStatusEntity = - UserProfileStatusEntity( - isProfilePublic = isProfilePublic, - ) - fun MyProfileResponseDto.toData(): MyProfileEntity = MyProfileEntity( nickname = this.nickname, diff --git a/app/src/main/java/com/into/websoso/data/model/UserProfileStatusEntity.kt b/app/src/main/java/com/into/websoso/data/model/UserProfileStatusEntity.kt deleted file mode 100644 index d04aa0347..000000000 --- a/app/src/main/java/com/into/websoso/data/model/UserProfileStatusEntity.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.into.websoso.data.model - -data class UserProfileStatusEntity( - val isProfilePublic: Boolean, -) diff --git a/app/src/main/java/com/into/websoso/data/repository/UserRepository.kt b/app/src/main/java/com/into/websoso/data/repository/UserRepository.kt index fec22e6f1..8e6d41d14 100644 --- a/app/src/main/java/com/into/websoso/data/repository/UserRepository.kt +++ b/app/src/main/java/com/into/websoso/data/repository/UserRepository.kt @@ -16,7 +16,6 @@ import com.into.websoso.data.model.UserFeedsEntity import com.into.websoso.data.model.UserInfoDetailEntity import com.into.websoso.data.model.UserInfoEntity import com.into.websoso.data.model.UserNovelStatsEntity -import com.into.websoso.data.model.UserProfileStatusEntity import com.into.websoso.data.model.UserStorageEntity import com.into.websoso.data.remote.api.UserApi import com.into.websoso.data.remote.request.TermsAgreementRequestDto @@ -69,7 +68,7 @@ class UserRepository suspend fun fetchUserNovelStats(userId: Long): UserNovelStatsEntity = userApi.getUserNovelStats(userId).toData() - suspend fun fetchUserProfileStatus(): UserProfileStatusEntity = userApi.getProfileStatus().toData() + suspend fun fetchUserProfileStatus(): Boolean = userApi.getProfileStatus().isProfilePublic suspend fun saveUserProfileStatus(isProfilePublic: Boolean) { userApi.patchProfileStatus(UserProfileStatusRequestDto(isProfilePublic)) diff --git a/app/src/main/java/com/into/websoso/ui/profileDisclosure/ProfileDisclosureActivity.kt b/app/src/main/java/com/into/websoso/ui/profileDisclosure/ProfileDisclosureActivity.kt index 1bc6ee647..9a122ea04 100644 --- a/app/src/main/java/com/into/websoso/ui/profileDisclosure/ProfileDisclosureActivity.kt +++ b/app/src/main/java/com/into/websoso/ui/profileDisclosure/ProfileDisclosureActivity.kt @@ -4,100 +4,58 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope import com.into.websoso.R import com.into.websoso.core.common.ui.base.BaseActivity import com.into.websoso.core.common.ui.model.ResultFrom.ChangeProfileDisclosure +import com.into.websoso.core.common.util.SingleEventHandler import com.into.websoso.databinding.ActivityProfileDisclosureBinding import com.into.websoso.ui.setting.SettingActivity import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class ProfileDisclosureActivity : - BaseActivity(R.layout.activity_profile_disclosure) { +class ProfileDisclosureActivity : BaseActivity(R.layout.activity_profile_disclosure) { private val profileDisclosureViewModel: ProfileDisclosureViewModel by viewModels() + private val singleEventHandler: SingleEventHandler by lazy { SingleEventHandler.from() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) bindViewModel() onBackButtonClick() - onProfileDisclosureButtonClick() - onCompleteButtonClick() - setupObserver() } private fun bindViewModel() { binding.profileDisclosureViewModel = profileDisclosureViewModel binding.lifecycleOwner = this + binding.onToggleClick = ::updateProfileDisclosureStatus } private fun onBackButtonClick() { binding.ivProfileDisclosureBackButton.setOnClickListener { - finish() - } - } - - private fun onProfileDisclosureButtonClick() { - binding.clProfileDisclosureButton.setOnClickListener { - profileDisclosureViewModel.updateProfileStatus() - } - } - - private fun onCompleteButtonClick() { - binding.tvProfileDisclosureCompleteButton.setOnClickListener { - profileDisclosureViewModel.saveProfileDisclosureStatus() - } - } - - private fun setupObserver() { - profileDisclosureViewModel.uiState.observe(this) { uiState -> - when { - uiState.loading -> { - binding.wllProfileDisclosure.setWebsosoLoadingVisibility(true) - binding.wllProfileDisclosure.setErrorLayoutVisibility(false) - } - - uiState.error -> { - binding.wllProfileDisclosure.setWebsosoLoadingVisibility(false) - binding.wllProfileDisclosure.setErrorLayoutVisibility(true) - } - - else -> { - binding.wllProfileDisclosure.setWebsosoLoadingVisibility(false) - binding.wllProfileDisclosure.setErrorLayoutVisibility(false) - } - } - } - - profileDisclosureViewModel.isProfilePublic.observe(this) { isProfilePublic -> - updateProfileDisclosureStatusButton(isProfilePublic) - } - - profileDisclosureViewModel.isSaveStatusComplete.observe(this) { isSaveStatus -> - if (isSaveStatus) { + if (profileDisclosureViewModel.isChangedStatus.value == true) { val intent = SettingActivity.getIntent( this, - profileDisclosureViewModel.isProfilePublic.value ?: true, + profileDisclosureViewModel.isProfilePrivate.value?.not() ?: true, ) setResult(ChangeProfileDisclosure.RESULT_OK, intent) - finish() } + finish() } } - private fun updateProfileDisclosureStatusButton(isProfilePublic: Boolean) { - val buttonImage = when (isProfilePublic) { - true -> R.drawable.img_account_info_check_unselected - false -> R.drawable.img_account_info_check_selected + private fun updateProfileDisclosureStatus() { + val newCheckedState: Boolean = !binding.scProfileDisclosureToggle.isChecked + binding.scProfileDisclosureToggle.isChecked = newCheckedState + + singleEventHandler.debounce(coroutineScope = lifecycleScope) { + profileDisclosureViewModel.updateProfileStatus(newCheckedState) } - binding.ivProfileDisclosureStatusButton.setImageResource(buttonImage) } companion object { const val IS_PROFILE_PUBLIC = "isProfilePublic" - fun getIntent(context: Context): Intent { - return Intent(context, ProfileDisclosureActivity::class.java) - } + fun getIntent(context: Context): Intent = Intent(context, ProfileDisclosureActivity::class.java) } } diff --git a/app/src/main/java/com/into/websoso/ui/profileDisclosure/ProfileDisclosureViewModel.kt b/app/src/main/java/com/into/websoso/ui/profileDisclosure/ProfileDisclosureViewModel.kt index 2ba834a4a..e80316794 100644 --- a/app/src/main/java/com/into/websoso/ui/profileDisclosure/ProfileDisclosureViewModel.kt +++ b/app/src/main/java/com/into/websoso/ui/profileDisclosure/ProfileDisclosureViewModel.kt @@ -5,86 +5,46 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.into.websoso.data.repository.UserRepository -import com.into.websoso.ui.profileDisclosure.model.ProfileDisclosureUiState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class ProfileDisclosureViewModel @Inject constructor( - private val userRepository: UserRepository, -) : ViewModel() { - private val _uiState: MutableLiveData = - MutableLiveData(ProfileDisclosureUiState()) - val uiState: LiveData get() = _uiState +class ProfileDisclosureViewModel + @Inject + constructor( + private val userRepository: UserRepository, + ) : ViewModel() { + private var isInitializeOfProfilePrivate: Boolean = false - private val _isProfilePublic: MutableLiveData = MutableLiveData() - val isProfilePublic: LiveData get() = _isProfilePublic + private var _isChangedStatus: MutableLiveData = MutableLiveData(false) + val isChangedStatus: LiveData get() = _isChangedStatus - private val _isCompleteButtonEnabled: MutableLiveData = MutableLiveData(false) - val isCompleteButtonEnabled: LiveData get() = _isCompleteButtonEnabled + val isProfilePrivate: MutableLiveData = MutableLiveData() - private var isInitializeOfProfilePublic: Boolean = false - - private val _isSaveStatusComplete: MutableLiveData = MutableLiveData(false) - val isSaveStatusComplete: LiveData get() = _isSaveStatusComplete - - init { - updateProfileDisclosureStatus() - } - - private fun updateProfileDisclosureStatus() { - viewModelScope.launch { - runCatching { - userRepository.fetchUserProfileStatus() - }.onSuccess { userProfileStatusEntity -> - _uiState.value = uiState.value?.copy( - loading = false, - ) - _isProfilePublic.value = userProfileStatusEntity.isProfilePublic - isInitializeOfProfilePublic = userProfileStatusEntity.isProfilePublic - updateIsCompleteButtonEnabled() - }.onFailure { - _uiState.value = uiState.value?.copy( - loading = false, - error = true, - ) - } + init { + updateInitialProfileStatus() } - } - private fun updateIsCompleteButtonEnabled() { - when (isInitializeOfProfilePublic == isProfilePublic.value) { - true -> _isCompleteButtonEnabled.value = false - false -> _isCompleteButtonEnabled.value = true + private fun updateInitialProfileStatus() { + viewModelScope.launch { + runCatching { + userRepository.fetchUserProfileStatus() + }.onSuccess { isPublic -> + isProfilePrivate.value = !isPublic + isInitializeOfProfilePrivate = !isPublic + } + } } - } - - fun updateProfileStatus() { - _isProfilePublic.value = _isProfilePublic.value?.not() - updateIsCompleteButtonEnabled() - } - fun saveProfileDisclosureStatus() { - _uiState.value = uiState.value?.copy( - loading = true, - ) - viewModelScope.launch { - runCatching { - val isProfilePublicValue = - isProfilePublic.value ?: isInitializeOfProfilePublic.not() - userRepository.saveUserProfileStatus(isProfilePublicValue) - }.onSuccess { - _uiState.value = uiState.value?.copy( - loading = false, - ) - _isSaveStatusComplete.value = true - }.onFailure { - _uiState.value = uiState.value?.copy( - loading = false, - error = true, - ) + fun updateProfileStatus(isPrivate: Boolean) { + viewModelScope.launch { + runCatching { + userRepository.saveUserProfileStatus(isPrivate.not()) + }.onSuccess { + _isChangedStatus.value = isInitializeOfProfilePrivate == !isPrivate + isProfilePrivate.value = isPrivate + } } } } -} diff --git a/app/src/main/java/com/into/websoso/ui/profileDisclosure/model/ProfileDisclosureUiState.kt b/app/src/main/java/com/into/websoso/ui/profileDisclosure/model/ProfileDisclosureUiState.kt deleted file mode 100644 index 58c07a861..000000000 --- a/app/src/main/java/com/into/websoso/ui/profileDisclosure/model/ProfileDisclosureUiState.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.into.websoso.ui.profileDisclosure.model - -data class ProfileDisclosureUiState( - val loading: Boolean = true, - val error: Boolean = false, -) diff --git a/app/src/main/res/layout/activity_profile_disclosure.xml b/app/src/main/res/layout/activity_profile_disclosure.xml index ee4ebcb89..45fdcb606 100644 --- a/app/src/main/res/layout/activity_profile_disclosure.xml +++ b/app/src/main/res/layout/activity_profile_disclosure.xml @@ -1,13 +1,16 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + + - - - + app:layout_constraintTop_toTopOf="parent" + app:track="@drawable/bg_notification_setting_toggle" /> - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7fd59ab7f..9ba2a233b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -284,7 +284,6 @@ 프로필 공개 설정 - 완료 비공개 전체 공개 프로필이 %s로 전환되었어요