Skip to content

Commit

Permalink
#219 AccountSessionRepository에서 현재 연결된 계정 정보와 세션을 StateFlow로 관리하도록 함
Browse files Browse the repository at this point in the history
  • Loading branch information
pknujsp committed Mar 11, 2024
1 parent 5a92d9a commit 52e07cb
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 50 deletions.
Original file line number Diff line number Diff line change
@@ -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<String>
val session: CognitoUserSession?
val userOnCurrentSession: StateFlow<UserEntity?>
val session: StateFlow<CognitoUserSession?>

val signedIn: Boolean
suspend fun updateSession(session: CognitoUserSession?)
suspend fun updateAccount(email: String, nickName: String = "")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,35 @@ 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(
private val appDataStore: AppDataStore,
) : AccountSessionRepository {
override val lastSavedEmail = appDataStore.userEmail.distinctUntilChanged()

private var mutableSession: CognitoUserSession? = null
override val session: CognitoUserSession? get() = mutableSession
private val mutableUserOnCurrentSession = MutableStateFlow<UserEntity?>(null)
override val userOnCurrentSession = mutableUserOnCurrentSession.asStateFlow()

private var mutableSession = MutableStateFlow<CognitoUserSession?>(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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<MyPageEvent>()
val eventFlow get() = _eventFlow.asEventFlow()
val eventFlow = _eventFlow.asEventFlow()

private val _myCommentsList = MutableStateFlow<UiState<List<MyCommentsListResponse.Comment>>>(UiState.Initial)
val myCommentsList = _myCommentsList.asStateFlow()

fun event(event: MyPageEvent) = viewModelScope.launch { _eventFlow.emit(event) }

Expand All @@ -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<TokenState<CurrentTokens>>(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<UserEntity>>(UiState.Initial)
val user get() = _userEntity.asStateFlow()

fun setUserUiState(uiState: UiState<UserEntity>) {
_userEntity.value = uiState
}

fun loadUser() = viewModelScope.launch(ioDispatcher) {
setUserUiState(UiState.Initial)
getUserUseCase().collectLatest {
setUserUiState(UiState.Success(it))
}
}

private val _myCommentsList = MutableStateFlow<UiState<List<MyCommentsListResponse.Comment>>>(UiState.Initial)
val myCommentsList get() = _myCommentsList.asStateFlow()

fun setMyCommentsListUiState(uiState: UiState<List<MyCommentsListResponse.Comment>>) {
_myCommentsList.value = uiState
Expand All @@ -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
}

0 comments on commit 52e07cb

Please sign in to comment.