diff --git a/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepository.kt index 0895663e..438b0bcf 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepository.kt @@ -1,11 +1,15 @@ package com.android.mediproject.core.data.session import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession +import com.android.mediproject.core.model.user.UserEntity import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow interface AccountSessionRepository { val lastSavedEmail: Flow - val session: CognitoUserSession? + val userOnCurrentSession: StateFlow + val session: StateFlow + val signedIn: Boolean suspend fun updateSession(session: CognitoUserSession?) suspend fun updateAccount(email: String, nickName: String = "") diff --git a/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepositoryImpl.kt index 3666cc5c..e2dc5b3d 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepositoryImpl.kt @@ -2,6 +2,9 @@ package com.android.mediproject.core.data.session import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession import com.android.mediproject.core.datastore.AppDataStore +import com.android.mediproject.core.model.user.UserEntity +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.distinctUntilChanged class AccountSessionRepositoryImpl( @@ -9,20 +12,25 @@ class AccountSessionRepositoryImpl( ) : AccountSessionRepository { override val lastSavedEmail = appDataStore.userEmail.distinctUntilChanged() - private var mutableSession: CognitoUserSession? = null - override val session: CognitoUserSession? get() = mutableSession + private val mutableUserOnCurrentSession = MutableStateFlow(null) + override val userOnCurrentSession = mutableUserOnCurrentSession.asStateFlow() + + private var mutableSession = MutableStateFlow(null) + override val session = mutableSession.asStateFlow() override val signedIn: Boolean - get() = session != null + get() = session.value != null override suspend fun updateSession(session: CognitoUserSession?) { - mutableSession = session + mutableSession.value = session + if (session == null) { appDataStore.clearMyAccountInfo() } } override suspend fun updateAccount(email: String, nickName: String) { + mutableUserOnCurrentSession.value = UserEntity(email, nickName) appDataStore.saveMyAccountInfo(email, nickName) } } diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt index 18fbe762..1b3143af 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt @@ -6,35 +6,33 @@ import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.viewmodel.MutableEventFlow import com.android.mediproject.core.common.viewmodel.UiState import com.android.mediproject.core.common.viewmodel.asEventFlow +import com.android.mediproject.core.data.session.AccountSessionRepository import com.android.mediproject.core.data.sign.SignRepository import com.android.mediproject.core.domain.GetCommentsUseCase -import com.android.mediproject.core.domain.GetUserUseCase import com.android.mediproject.core.model.comments.MyCommentsListResponse -import com.android.mediproject.core.model.token.CurrentTokens -import com.android.mediproject.core.model.token.TokenState -import com.android.mediproject.core.model.user.UserEntity import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.channels.BufferOverflow -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject @HiltViewModel class MyPageViewModel @Inject constructor( - private val getUserUseCase: GetUserUseCase, private val getCommentsUseCase: GetCommentsUseCase, - private val signUseCase: SignRepository, + private val accountSessionRepository: AccountSessionRepository, + private val signRepository: SignRepository, @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, ) : BaseViewModel() { - + private val _eventFlow = MutableEventFlow() - val eventFlow get() = _eventFlow.asEventFlow() + val eventFlow = _eventFlow.asEventFlow() + + private val _myCommentsList = MutableStateFlow>>(UiState.Initial) + val myCommentsList = _myCommentsList.asStateFlow() fun event(event: MyPageEvent) = viewModelScope.launch { _eventFlow.emit(event) } @@ -43,46 +41,15 @@ class MyPageViewModel @Inject constructor( fun signUp() = event(MyPageEvent.SignUp) fun signOut() = viewModelScope.launch { - signUseCase.logout() - loadTokens() + withContext(ioDispatcher) { + signRepository.logout() + } } fun navigateToMyPageMore() = event(MyPageEvent.NavigateToMyPageMore) fun navigateToMyCommentList() = event(MyPageEvent.NavigateToMyCommentList) - sealed class MyPageEvent { - object Login : MyPageEvent() - object SignUp : MyPageEvent() - object NavigateToMyPageMore : MyPageEvent() - object NavigateToMyCommentList : MyPageEvent() - } - - private val _token = MutableSharedFlow>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) - val token get() = _token.asSharedFlow() - - fun loadTokens() = viewModelScope.launch { - /* getTokenUseCase().collect { - _token.emit(it) - }*/ - } - - private val _userEntity = MutableStateFlow>(UiState.Initial) - val user get() = _userEntity.asStateFlow() - - fun setUserUiState(uiState: UiState) { - _userEntity.value = uiState - } - - fun loadUser() = viewModelScope.launch(ioDispatcher) { - setUserUiState(UiState.Initial) - getUserUseCase().collectLatest { - setUserUiState(UiState.Success(it)) - } - } - - private val _myCommentsList = MutableStateFlow>>(UiState.Initial) - val myCommentsList get() = _myCommentsList.asStateFlow() fun setMyCommentsListUiState(uiState: UiState>) { _myCommentsList.value = uiState @@ -98,3 +65,10 @@ class MyPageViewModel @Inject constructor( } } } + +sealed interface MyPageEvent { + data object Login : MyPageEvent + data object SignUp : MyPageEvent + data object NavigateToMyPageMore : MyPageEvent + data object NavigateToMyCommentList : MyPageEvent +}