diff --git a/app/src/main/java/com/eatssu/android/data/repository/UserRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/repository/UserRepositoryImpl.kt index 235527c6e..59b8370a0 100644 --- a/app/src/main/java/com/eatssu/android/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/repository/UserRepositoryImpl.kt @@ -38,10 +38,9 @@ class UserRepositoryImpl @Inject constructor(private val userService: UserServic emit(userService.getMyInfo()) } - override suspend fun signOut(): Flow> = - flow { - emit(userService.signOut()) - } + override suspend fun signOut(): Boolean { + return userService.signOut().result ?: false + } override suspend fun getTotalColleges(): List = userService.getCollegeList().result?.map { it.toDomain() }.orEmpty() diff --git a/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt index e87157ab2..17adc9649 100644 --- a/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt +++ b/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt @@ -20,7 +20,7 @@ interface UserRepository { suspend fun getUserReviews(): Flow> suspend fun getUserNickName(): Flow> - suspend fun signOut(): Flow> + suspend fun signOut(): Boolean // 모든 단과대 조회 suspend fun getTotalColleges(): List diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/auth/SignOutUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SignOutUseCase.kt index 744400590..b89621af5 100644 --- a/app/src/main/java/com/eatssu/android/domain/usecase/auth/SignOutUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SignOutUseCase.kt @@ -1,13 +1,11 @@ package com.eatssu.android.domain.usecase.auth -import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.domain.repository.UserRepository -import kotlinx.coroutines.flow.Flow import javax.inject.Inject class SignOutUseCase @Inject constructor( private val userRepository: UserRepository, ) { - suspend operator fun invoke(): Flow> = + suspend operator fun invoke(): Boolean = userRepository.signOut() } diff --git a/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutActivity.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutActivity.kt index 1b271b3c0..3ad6edfd1 100644 --- a/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutActivity.kt @@ -1,12 +1,15 @@ package com.eatssu.android.presentation.mypage +import android.content.Intent import android.os.Bundle -import android.text.Editable -import android.text.TextWatcher import androidx.activity.viewModels +import androidx.core.widget.doAfterTextChanged import androidx.lifecycle.lifecycleScope import com.eatssu.android.databinding.ActivitySignOutBinding +import com.eatssu.android.presentation.UiEvent +import com.eatssu.android.presentation.UiState import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.login.LoginActivity import com.eatssu.android.presentation.util.showToast import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest @@ -15,7 +18,6 @@ import kotlinx.coroutines.launch @AndroidEntryPoint class SignOutActivity : BaseActivity(ActivitySignOutBinding::inflate) { - //TODO 현재 dev서버 탈퇴하기 500 private val signOutViewModel: SignOutViewModel by viewModels() @@ -25,47 +27,64 @@ class SignOutActivity : super.onCreate(savedInstanceState) toolbarTitle.text = "탈퇴하기" // 툴바 제목 설정 - val nickname = intent.getStringExtra("nickname") + val nickname = intent.getStringExtra("nickname")?.trim() ?: "" binding.btnSignOut.isEnabled = false -// binding.etEnterNickname.hint = - binding.etEnterNickname.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + binding.etEnterNickname.hint = nickname + binding.etEnterNickname.doAfterTextChanged { + compareNickname(nickname) + } + + setOnClickListener() + + lifecycleScope.launch { + signOutViewModel.uiState.collectLatest { + when (it) { + is UiState.Init -> {} + + is UiState.Loading -> { + //로딩중 + } + + is UiState.Success -> { + if (it.data?.isSignOuted == true) { + val intent = Intent(this@SignOutActivity, LoginActivity::class.java) + intent.flags = + Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(intent) + finish() + } + } - //값 변경 시 실행되는 함수 - override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { - if (nickname != null) { - checkNickname(nickname) + is UiState.Error -> { + //에러 + } } } + } - override fun afterTextChanged(p0: Editable?) {} - }) - - setOnClickListener() + lifecycleScope.launch { + signOutViewModel.uiEvent.collectLatest { event -> + when (event) { + is UiEvent.ShowToast -> { + showToast(event.message) + } + } + } + } } private fun setOnClickListener() { binding.btnSignOut.setOnClickListener { signOutViewModel.signOut() - - lifecycleScope.launch { - signOutViewModel.uiState.collectLatest { - if (it.isSignOuted) { - showToast(it.toastMessage) //Todo 사용가능 토스트가 무슨 3번이나 나옴 - } else { - showToast(it.toastMessage) //Todo 사용가능 토스트가 무슨 3번이나 나옴 - } - } - } } } - fun checkNickname(nickname: String) { + private fun compareNickname(nickname: String) { //입력값 담기 - inputNickname = binding.etEnterNickname.text.trim().toString() + inputNickname = binding.etEnterNickname.text?.toString()?.trim() ?: "" // 값 유무에 따른 활성화 여부 if (inputNickname == nickname) { binding.btnSignOut.isEnabled = true diff --git a/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutViewModel.kt index 647ea879e..e4ab459e3 100644 --- a/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutViewModel.kt @@ -4,17 +4,15 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.eatssu.android.domain.usecase.auth.LogoutUseCase import com.eatssu.android.domain.usecase.auth.SignOutUseCase +import com.eatssu.android.presentation.UiEvent +import com.eatssu.android.presentation.UiState import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.onCompletion -import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -23,45 +21,33 @@ class SignOutViewModel @Inject constructor( private val signOutUseCase: SignOutUseCase, ) : ViewModel() { - private val _uiState: MutableStateFlow = MutableStateFlow(SignOutState()) - val uiState: StateFlow = _uiState.asStateFlow() + private val _uiState: MutableStateFlow> = MutableStateFlow(UiState.Init) + val uiState: StateFlow> = _uiState.asStateFlow() + + private val _uiEvent = MutableSharedFlow() + val uiEvent: SharedFlow = _uiEvent fun signOut() { viewModelScope.launch { - signOutUseCase().onStart { - _uiState.update { it.copy(loading = true) } - }.onCompletion { - _uiState.update { it.copy(loading = false, error = true) } - }.catch { e -> - _uiState.update { it.copy(error = true, toastMessage = "정보를 불러올 수 없습니다.") } - Timber.d(TAG, e.toString()) - }.collectLatest { result -> - Timber.d(TAG, result.toString()) - if (result.result == true) { - logoutUseCase() - _uiState.update { - it.copy( - isSignOuted = true, - toastMessage = "탈퇴가 완료되었습니다." - ) - } + _uiState.value = UiState.Loading + try { + val isSignOut = signOutUseCase() + if (isSignOut) { + _uiState.value = UiState.Success(SignOutState(isSignOuted = true)) + _uiEvent.emit(UiEvent.ShowToast("탈퇴가 완료되었습니다.")) + logoutUseCase() // 자동 로그인 정보 삭제 + } else { + _uiState.value = UiState.Error + _uiEvent.emit(UiEvent.ShowToast("탈퇴에 실패했습니다.")) } + } catch (e: Exception) { + _uiState.value = UiState.Error + _uiEvent.emit(UiEvent.ShowToast("오류가 발생했습니다. $e")) } } } - - companion object { - val TAG = "SignOutViewModel" - } } data class SignOutState( - var loading: Boolean = true, - var error: Boolean = false, - var toastMessage: String = "", - var nickname: String = "", - var platform: String = "", - var isNicknameNull: Boolean = false, - var isLoginOuted: Boolean = false, - var isSignOuted: Boolean = false, + val isSignOuted: Boolean = false, ) \ No newline at end of file