diff --git a/app/src/main/java/com/kdn/stack_knowledge/MainActivity.kt b/app/src/main/java/com/kdn/stack_knowledge/MainActivity.kt index 7633a287..637484aa 100644 --- a/app/src/main/java/com/kdn/stack_knowledge/MainActivity.kt +++ b/app/src/main/java/com/kdn/stack_knowledge/MainActivity.kt @@ -1,5 +1,6 @@ package com.kdn.stack_knowledge +import android.content.Intent import android.os.Bundle import android.util.Log import android.widget.Toast @@ -25,6 +26,7 @@ import com.stackknowledge.login.viewmodel.AuthViewModel import com.kdn.stack_knowledge.ui.StackKnowledgeApp import com.stackknowledge.user.R import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.runBlocking import remote.request.auth.LoginRequestModel import javax.inject.Inject import javax.inject.Named @@ -72,7 +74,8 @@ class MainActivity : ComponentActivity() { windowSizeClass = calculateWindowSizeClass(this@MainActivity), onLoginButtonClick = { googleSocialLogin() - } + }, + onLogout = { logout() } ) } } @@ -118,4 +121,14 @@ class MainActivity : ComponentActivity() { } } } + + private fun logout() { + runBlocking { + viewModel.deleteToken() + } + finish() + + val intent = Intent(this, MainActivity::class.java) + startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/kdn/stack_knowledge/navigation/StackKnowledgeNavHost.kt b/app/src/main/java/com/kdn/stack_knowledge/navigation/StackKnowledgeNavHost.kt index 85ef2c28..52dc6827 100644 --- a/app/src/main/java/com/kdn/stack_knowledge/navigation/StackKnowledgeNavHost.kt +++ b/app/src/main/java/com/kdn/stack_knowledge/navigation/StackKnowledgeNavHost.kt @@ -24,6 +24,7 @@ import com.stackknowledge.shop.navigation.shopScreen import com.stackknowledge.shop.navigation.teacherShopRoute import com.stackknowledge.shop.navigation.teacherShopScreen import com.kdn.stack_knowledge.ui.StackKnowledgeAppState +import com.stackknowledge.main.navigation.mainPageRoute import com.stackkowledge.mission.navigation.createMissionScreen import com.stackkowledge.mission.navigation.entireMissionScreen import com.stackkowledge.mission.navigation.navigateToEntireMission @@ -37,6 +38,7 @@ fun StackKnowledgeNavHost( startDestination: String = roleCheckRoute, modifier: Modifier = Modifier, onLoginButtonClick: () -> Unit = {}, + onLogout: () -> Unit, ) { val navController = appState.navController @@ -46,8 +48,10 @@ fun StackKnowledgeNavHost( modifier = modifier ) { loginScreen( - onSuccess = navController::navigateToMain, - onLoginButtonClick = onLoginButtonClick + onSuccess = { + appState.navigateToTopLevelDestination(TopLevelDestination.MAIN) + }, + onLoginButtonClick = onLoginButtonClick, ) roleCheckScreen( onRoleButtonClick = navController::navigateToLogin @@ -64,13 +68,29 @@ fun StackKnowledgeNavHost( } } else bottomNavigationNavigate(role, navController, navType) }, + logoutSuccess = { + onLogout() + appState.navigateToTopLevelDestination(TopLevelDestination.ROLE_CHECK) + }, ) createMissionScreen( - onNavigate = { role, navType -> bottomNavigationNavigate(role, navController, navType) }, + onNavigate = { role, navType -> + bottomNavigationNavigate( + role, + navController, + navType + ) + }, createMissionSuccess = navController::navigateToMain ) entireMissionScreen( - onNavigate = { role, navType -> bottomNavigationNavigate(role, navController, navType) }, + onNavigate = { role, navType -> + bottomNavigationNavigate( + role, + navController, + navType + ) + }, onItemClick = navController::navigateToResolveMission ) rankingScreen( @@ -80,16 +100,34 @@ fun StackKnowledgeNavHost( onNavigate = { role, navType -> bottomNavigationNavigate(role, navController, navType) } ) resolveMissionScreen( - onNavigate = { role, navType -> bottomNavigationNavigate(role, navController, navType) }, + onNavigate = { role, navType -> + bottomNavigationNavigate( + role, + navController, + navType + ) + }, onBackClick = navController::popBackStack, solveMissionSuccess = navController::navigateToMain, ) gradingAnswerScreen( - onNavigate = { role, navType -> bottomNavigationNavigate(role, navController, navType) }, + onNavigate = { role, navType -> + bottomNavigationNavigate( + role, + navController, + navType + ) + }, scoreMissionSuccess = navController::navigateToMain, ) solvedMissionScreen( - onNavigate = { role, navType -> bottomNavigationNavigate(role, navController, navType) }, + onNavigate = { role, navType -> + bottomNavigationNavigate( + role, + navController, + navType + ) + }, onItemClick = navController::navigateToGradingAnswer ) shopScreen( diff --git a/app/src/main/java/com/kdn/stack_knowledge/navigation/TopLevelDestination.kt b/app/src/main/java/com/kdn/stack_knowledge/navigation/TopLevelDestination.kt index 03b87dc0..2bfd5245 100644 --- a/app/src/main/java/com/kdn/stack_knowledge/navigation/TopLevelDestination.kt +++ b/app/src/main/java/com/kdn/stack_knowledge/navigation/TopLevelDestination.kt @@ -2,4 +2,5 @@ package com.kdn.stack_knowledge.navigation enum class TopLevelDestination { ROLE_CHECK, + MAIN } \ No newline at end of file diff --git a/app/src/main/java/com/kdn/stack_knowledge/navigation/util/BottomNavigationNavigate.kt b/app/src/main/java/com/kdn/stack_knowledge/navigation/util/BottomNavigationNavigate.kt index cf47d712..95f6f87d 100644 --- a/app/src/main/java/com/kdn/stack_knowledge/navigation/util/BottomNavigationNavigate.kt +++ b/app/src/main/java/com/kdn/stack_knowledge/navigation/util/BottomNavigationNavigate.kt @@ -4,6 +4,7 @@ import androidx.navigation.NavController import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.navOptions import com.minstone.ui.navigation.NavigateType +import com.stackknowledge.main.navigation.mainPageRoute import com.stackknowledge.main.navigation.navigateToMain import com.stackknowledge.ranking.navigation.navigateToRanking import com.stackknowledge.ranking.navigation.navigateToTeacherRanking @@ -20,7 +21,7 @@ fun bottomNavigationNavigate( navType: String ) { val topLevelNavOptions = navOptions { - popUpTo(navController.graph.findStartDestination().id) { + popUpTo(mainPageRoute) { inclusive = false } launchSingleTop = true diff --git a/app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeApp.kt b/app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeApp.kt index ee988f04..4d83c85a 100644 --- a/app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeApp.kt +++ b/app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeApp.kt @@ -12,11 +12,13 @@ fun StackKnowledgeApp( windowSizeClass = windowSizeClass ), onLoginButtonClick: () -> Unit = {}, + onLogout: () -> Unit, ) { StackKnowledgeAndroidTheme { _, _ -> StackKnowledgeNavHost( appState = appState, - onLoginButtonClick = onLoginButtonClick + onLoginButtonClick = onLoginButtonClick, + onLogout = onLogout ) } } \ No newline at end of file diff --git a/app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeAppState.kt b/app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeAppState.kt index 59fe2488..f115348e 100644 --- a/app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeAppState.kt +++ b/app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeAppState.kt @@ -6,12 +6,18 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.util.trace import androidx.navigation.NavDestination +import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import androidx.navigation.navOptions import com.kdn.stack_knowledge.navigation.TopLevelDestination +import com.stackknowledge.login.navigation.navigateToLogin +import com.stackknowledge.login.navigation.navigateToRoleCheck import com.stackknowledge.login.navigation.roleCheckRoute +import com.stackknowledge.main.navigation.navigateToMain import kotlinx.coroutines.CoroutineScope @Composable @@ -53,4 +59,19 @@ class StackKnowledgeAppState( get() = windowSizeClass.widthSizeClass == WindowWidthSizeClass.Compact val topLevelDestinations: List = TopLevelDestination.values().asList() + + fun navigateToTopLevelDestination(topLevelDestination: TopLevelDestination) { + trace("Navigation: ${topLevelDestination.name}") { + val topLevelNavOptions = navOptions { + popUpTo(navController.graph.findStartDestination().id) { + inclusive = true + } + } + + when (topLevelDestination) { + TopLevelDestination.ROLE_CHECK -> navController.navigateToRoleCheck(topLevelNavOptions) + TopLevelDestination.MAIN -> navController.navigateToMain(topLevelNavOptions) + } + } + } } \ No newline at end of file diff --git a/core/data/src/main/kotlin/com/stackknowledge/repository/auth/AuthRepository.kt b/core/data/src/main/kotlin/com/stackknowledge/repository/auth/AuthRepository.kt index 760c3c03..d8b7aa29 100644 --- a/core/data/src/main/kotlin/com/stackknowledge/repository/auth/AuthRepository.kt +++ b/core/data/src/main/kotlin/com/stackknowledge/repository/auth/AuthRepository.kt @@ -11,6 +11,8 @@ interface AuthRepository { suspend fun saveToken(token: LoginResponseModel) + suspend fun deleteToken() + fun getRole(): Flow fun logout(): Flow diff --git a/core/data/src/main/kotlin/com/stackknowledge/repository/auth/AuthRepositoryImpl.kt b/core/data/src/main/kotlin/com/stackknowledge/repository/auth/AuthRepositoryImpl.kt index c83cd5a0..27743e88 100644 --- a/core/data/src/main/kotlin/com/stackknowledge/repository/auth/AuthRepositoryImpl.kt +++ b/core/data/src/main/kotlin/com/stackknowledge/repository/auth/AuthRepositoryImpl.kt @@ -24,11 +24,23 @@ class AuthRepositoryImpl @Inject constructor( override suspend fun saveToken(token: LoginResponseModel) { token.let { - localDataSource.setAccessToken(it.accessToken) - localDataSource.setAccessTime(it.expiredAt) - localDataSource.setRefreshToken(it.refreshToken) - localDataSource.setRefreshTime(it.expiredAt) - localDataSource.setAuthorityInfo(it.authority.toString()) + with(localDataSource) { + setAccessToken(it.accessToken) + setAccessTime(it.expiredAt) + setRefreshToken(it.refreshToken) + setRefreshTime(it.expiredAt) + setAuthorityInfo(it.authority.toString()) + } + } + } + + override suspend fun deleteToken() { + with(localDataSource) { + removeAccessToken() + removeRefreshToken() + removeAccessTime() + removeRefreshTime() + removeAuthorityInfo() } } diff --git a/core/datastore/src/main/java/com/stackknowledge/datastore/LocalAuthDataSource.kt b/core/datastore/src/main/java/com/stackknowledge/datastore/LocalAuthDataSource.kt index 457a5147..f6f5b016 100644 --- a/core/datastore/src/main/java/com/stackknowledge/datastore/LocalAuthDataSource.kt +++ b/core/datastore/src/main/java/com/stackknowledge/datastore/LocalAuthDataSource.kt @@ -35,4 +35,6 @@ interface LocalAuthDataSource { suspend fun setAuthorityInfo(authority: String) fun getAuthorityInfo(): Flow + + suspend fun removeAuthorityInfo() } \ No newline at end of file diff --git a/core/datastore/src/main/java/com/stackknowledge/datastore/LocalAuthDataSourceImpl.kt b/core/datastore/src/main/java/com/stackknowledge/datastore/LocalAuthDataSourceImpl.kt index 86922801..a63db5f1 100644 --- a/core/datastore/src/main/java/com/stackknowledge/datastore/LocalAuthDataSourceImpl.kt +++ b/core/datastore/src/main/java/com/stackknowledge/datastore/LocalAuthDataSourceImpl.kt @@ -84,4 +84,10 @@ class LocalAuthDataSourceImpl @Inject constructor( it[AuthPreferenceKey.AUTHORITY] = authority } } + + override suspend fun removeAuthorityInfo() { + dataStore.edit { + it.remove(AuthPreferenceKey.AUTHORITY) + } + } } \ No newline at end of file diff --git a/core/design-system/src/main/res/values/strings.xml b/core/design-system/src/main/res/values/strings.xml index 93721909..f50157d6 100644 --- a/core/design-system/src/main/res/values/strings.xml +++ b/core/design-system/src/main/res/values/strings.xml @@ -45,4 +45,6 @@ 문제 채점이 끝나셨습니까? 문제 채점이 완료되었습니다! 상품을 차감하시겠습니까? + 로그아웃이 완료되었습니다. + 로그아웃이 실패했습니다. \ No newline at end of file diff --git a/core/network/src/main/kotlin/com/stackknowledge/util/AuthInterceptor.kt b/core/network/src/main/kotlin/com/stackknowledge/util/AuthInterceptor.kt index 0911f817..547a10de 100644 --- a/core/network/src/main/kotlin/com/stackknowledge/util/AuthInterceptor.kt +++ b/core/network/src/main/kotlin/com/stackknowledge/util/AuthInterceptor.kt @@ -45,6 +45,8 @@ class AuthInterceptor @Inject constructor( runBlocking { val refreshTime = dataSource.getRefreshTime().first().replace("\"", "") val accessTime = dataSource.getAccessTime().first().replace("\"", "") + val refreshToken = dataSource.getRefreshToken().first().replace("\"", "") + val accessToken = dataSource.getAccessToken().first().replace("\"", "") if (refreshTime == "") { return@runBlocking @@ -82,9 +84,15 @@ class AuthInterceptor @Inject constructor( } else throw NeedLoginException() } } - val accessToken = dataSource.getAccessToken().first().replace("\"", "") + if (method == "DELETE") { + builder.addHeader("RefreshToken", refreshToken) + } builder.addHeader("Authorization", "Bearer $accessToken") } - return chain.proceed(builder.build()) + val response = chain.proceed(builder.build()) + return when (response.code) { + 204 -> response.newBuilder().code(200).build() + else -> response + } } } diff --git a/feature/login/src/main/java/com/stackknowledge/login/LoginScreen.kt b/feature/login/src/main/java/com/stackknowledge/login/LoginScreen.kt index 6e18116d..e888a30f 100644 --- a/feature/login/src/main/java/com/stackknowledge/login/LoginScreen.kt +++ b/feature/login/src/main/java/com/stackknowledge/login/LoginScreen.kt @@ -43,7 +43,7 @@ internal fun LoginRoute( onGoogleLoginButtonClicked = onGoogleLoginButtonClicked, loginUiState = loginUiState, viewModel = viewModel, - onLoginSuccess = onSuccess + onLoginSuccess = onSuccess, ) } @@ -129,6 +129,6 @@ private fun LoginScreen( fun LoginScreenPre() { LoginScreen( onGoogleLoginButtonClicked = {}, - loginUiState = LoginUiState.Loading + loginUiState = LoginUiState.Loading, ) } \ No newline at end of file diff --git a/feature/login/src/main/java/com/stackknowledge/login/navigation/LoginNavigation.kt b/feature/login/src/main/java/com/stackknowledge/login/navigation/LoginNavigation.kt index 6e1ece0c..a9e35a25 100644 --- a/feature/login/src/main/java/com/stackknowledge/login/navigation/LoginNavigation.kt +++ b/feature/login/src/main/java/com/stackknowledge/login/navigation/LoginNavigation.kt @@ -21,7 +21,7 @@ fun NavGraphBuilder.loginScreen( composable(route = loginRoute) { LoginRoute( onSuccess = onSuccess, - onGoogleLoginButtonClicked = onLoginButtonClick + onGoogleLoginButtonClicked = onLoginButtonClick, ) } } diff --git a/feature/login/src/main/java/com/stackknowledge/login/viewmodel/AuthViewModel.kt b/feature/login/src/main/java/com/stackknowledge/login/viewmodel/AuthViewModel.kt index dc86fa6e..275e0350 100644 --- a/feature/login/src/main/java/com/stackknowledge/login/viewmodel/AuthViewModel.kt +++ b/feature/login/src/main/java/com/stackknowledge/login/viewmodel/AuthViewModel.kt @@ -8,6 +8,7 @@ import com.example.common.result.asResult import com.example.common.util.Event import com.example.common.util.errorHandling import com.stackknowledge.login.viewmodel.uistate.LoginUiState +import com.stackknowledge.repository.auth.AuthRepository import com.stackknowledge.usecase.auth.SaveTokenUseCase import com.stackknowledge.usecase.auth.LoginStudentUseCase import com.stackknowledge.usecase.auth.LoginTeacherUseCase @@ -25,6 +26,7 @@ class AuthViewModel @Inject constructor( private val loginStudentUseCase: LoginStudentUseCase, private val loginTeacherUseCase: LoginTeacherUseCase, private val saveTokenUseCase: SaveTokenUseCase, + private val authRepository: AuthRepository, ) : ViewModel() { private val _saveTokenRequest = MutableStateFlow>(Event.Loading) internal val saveTokenRequest = _saveTokenRequest.asStateFlow() @@ -72,4 +74,8 @@ class AuthViewModel @Inject constructor( _saveTokenRequest.value = it.errorHandling() } } + + fun deleteToken() = viewModelScope.launch{ + authRepository.deleteToken() + } } \ No newline at end of file diff --git a/feature/main/src/main/java/com/stackknowledge/main/MainPageScreen.kt b/feature/main/src/main/java/com/stackknowledge/main/MainPageScreen.kt index 90c211d8..1d038302 100644 --- a/feature/main/src/main/java/com/stackknowledge/main/MainPageScreen.kt +++ b/feature/main/src/main/java/com/stackknowledge/main/MainPageScreen.kt @@ -1,7 +1,6 @@ package com.stackknowledge.main import androidx.compose.foundation.background -import androidx.compose.foundation.gestures.scrollable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -18,9 +17,13 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.example.common.toast.makeToast +import com.example.common.util.Event import com.minstone.ui.navigation.NavigateType import com.minstone.ui.navigation.StackKnowledgeBottomNavigation import com.stackknowledge.design_system.component.dialog.JoinWaitingDialog @@ -35,27 +38,33 @@ import com.stackknowledge.main.viewModel.MainViewModel import com.stackknowledge.main.viewModel.uistate.GetMissionUiState import com.stackknowledge.main.viewModel.uistate.GetRankingUiState import enumdata.Authority +import com.stackknowledge.design_system.R @Composable internal fun MainPageRoute( onNavigate: (Authority, String, Int?) -> Unit, + logoutSuccess: () -> Unit, viewModel: MainViewModel = hiltViewModel() ) { val role by viewModel.role.collectAsStateWithLifecycle(initialValue = "") val getMissionUiState by viewModel.getMissionUiState.collectAsStateWithLifecycle() val getRankingUiState by viewModel.getRankingUiState.collectAsStateWithLifecycle() + val logoutRequest by viewModel.logoutRequest.collectAsStateWithLifecycle() MainPageScreen( role = if (role.isNotBlank()) Authority.valueOf(role) else Authority.ROLE_TEACHER, getMissionUiState = getMissionUiState, getRankingUiState = getRankingUiState, + logoutRequest = logoutRequest, onNavigate = { navType, index -> onNavigate(Authority.valueOf(role), navType, index) }, initMain = { with(viewModel) { getMission() getRanking() } - } + }, + logout = viewModel::logout, + onSuccess = logoutSuccess, ) } @@ -65,10 +74,14 @@ private fun MainPageScreen( role: Authority, getMissionUiState: GetMissionUiState, getRankingUiState: GetRankingUiState, + logoutRequest: Event, onNavigate: (String, Int?) -> Unit, initMain: () -> Unit, + logout: () -> Unit, + onSuccess: () -> Unit, ) { val scrollState = rememberScrollState() + val context = LocalContext.current var openDialog by remember { mutableStateOf(false) } var openLogoutDialog by remember { mutableStateOf(false) } @@ -122,7 +135,10 @@ private fun MainPageScreen( if (openLogoutDialog) { StackKnowledgeDialog( content = "로그아웃 하시겠습니까?", - onConfirm = { openLogoutDialog = false }, + onConfirm = { + openLogoutDialog = false + logout() + }, onDismiss = { openLogoutDialog = false }, onStateChange = { openLogoutDialog = it }, openDialog = openLogoutDialog, @@ -136,5 +152,16 @@ private fun MainPageScreen( onRefuse = {} ) } + + when (logoutRequest) { + is Event.Loading -> Unit + is Event.Success -> { + onSuccess() + makeToast(context = context, message = stringResource(id = R.string.success_logout)) + } + else -> { + makeToast(context = context, message = stringResource(id = R.string.failure_logout)) + } + } } } \ No newline at end of file diff --git a/feature/main/src/main/java/com/stackknowledge/main/navigation/MainNavigation.kt b/feature/main/src/main/java/com/stackknowledge/main/navigation/MainNavigation.kt index 53326e28..d93ed4ac 100644 --- a/feature/main/src/main/java/com/stackknowledge/main/navigation/MainNavigation.kt +++ b/feature/main/src/main/java/com/stackknowledge/main/navigation/MainNavigation.kt @@ -15,10 +15,12 @@ fun NavController.navigateToMain(navOptions: NavOptions? = null) { fun NavGraphBuilder.mainScreen( onNavigate: (Authority, String, Int?) -> Unit, + logoutSuccess: () -> Unit, ) { composable(route = mainPageRoute) { MainPageRoute( onNavigate = onNavigate, + logoutSuccess = logoutSuccess, ) } } \ No newline at end of file diff --git a/feature/main/src/main/java/com/stackknowledge/main/viewModel/MainViewModel.kt b/feature/main/src/main/java/com/stackknowledge/main/viewModel/MainViewModel.kt index 7647409d..77db1559 100644 --- a/feature/main/src/main/java/com/stackknowledge/main/viewModel/MainViewModel.kt +++ b/feature/main/src/main/java/com/stackknowledge/main/viewModel/MainViewModel.kt @@ -5,14 +5,18 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.common.result.Result import com.example.common.result.asResult +import com.example.common.util.Event +import com.example.common.util.errorHandling import com.stackknowledge.main.viewModel.uistate.GetMissionUiState import com.stackknowledge.main.viewModel.uistate.GetRankingUiState import com.stackknowledge.repository.auth.AuthRepository +import com.stackknowledge.usecase.auth.LogoutUseCase import com.stackknowledge.usecase.mission.GetMissionUseCase import com.stackknowledge.usecase.student.GetStudentPointRankingUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import javax.inject.Inject @@ -21,6 +25,7 @@ import javax.inject.Inject class MainViewModel @Inject constructor( private val getMissionUseCase: GetMissionUseCase, private val getStudentPointRankingUseCase: GetStudentPointRankingUseCase, + private val logoutUseCase: LogoutUseCase, private val authRepository: AuthRepository ): ViewModel() { private val _getMissionUiState = MutableStateFlow(GetMissionUiState.Loading) @@ -29,6 +34,9 @@ class MainViewModel @Inject constructor( private val _getRankingUiState = MutableStateFlow(GetRankingUiState.Loading) internal val getRankingUiState = _getRankingUiState.asStateFlow() + private val _logoutRequest = MutableStateFlow>(Event.Loading) + internal val logoutRequest = _logoutRequest.asStateFlow() + internal val role = authRepository.getRole() internal fun getMission() = viewModelScope.launch { getMissionUseCase() @@ -53,4 +61,18 @@ class MainViewModel @Inject constructor( } } } + + internal fun logout() = viewModelScope.launch { + logoutUseCase() + .onSuccess { + it.catch { remoteError -> + _logoutRequest.value = remoteError.errorHandling() + }.collect { + _logoutRequest.value = Event.Success() + } + } + .onFailure { + _logoutRequest.value = it.errorHandling() + } + } } \ No newline at end of file