Merge pull request 'fix: 401 logout loop — sync state update, prevent re-navigation' (#53) from feat/push-monitoring-agent-v2 into master
Reviewed-on: #53
This commit was merged in pull request #53.
This commit is contained in:
@@ -12,8 +12,8 @@ android {
|
|||||||
applicationId = "com.devlab.app"
|
applicationId = "com.devlab.app"
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
targetSdk = 37
|
targetSdk = 37
|
||||||
versionCode = 9
|
versionCode = 10
|
||||||
versionName = "1.7.0"
|
versionName = "1.7.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
|||||||
@@ -158,7 +158,6 @@ fun AppRoot() {
|
|||||||
popUpTo(0) { inclusive = true }
|
popUpTo(0) { inclusive = true }
|
||||||
}
|
}
|
||||||
SessionManager.consumeLogoutRequest()
|
SessionManager.consumeLogoutRequest()
|
||||||
SessionManager.restoreSession()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ class AuthInterceptor(private val token: String) : Interceptor {
|
|||||||
.build()
|
.build()
|
||||||
val response = chain.proceed(request)
|
val response = chain.proceed(request)
|
||||||
|
|
||||||
if (response.code == 401 && token.isNotBlank()) {
|
if (response.code == 401 && token.isNotBlank() && SessionManager.isSessionValid.value) {
|
||||||
SessionManager.invalidateSession()
|
SessionManager.invalidateSession()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,15 +12,20 @@ object SessionManager {
|
|||||||
private val _onLogoutRequest = MutableStateFlow(false)
|
private val _onLogoutRequest = MutableStateFlow(false)
|
||||||
val onLogoutRequest: StateFlow<Boolean> = _onLogoutRequest.asStateFlow()
|
val onLogoutRequest: StateFlow<Boolean> = _onLogoutRequest.asStateFlow()
|
||||||
|
|
||||||
fun invalidateSession() {
|
private val _invalidating = MutableStateFlow(false)
|
||||||
|
|
||||||
|
fun invalidateSession(): Boolean {
|
||||||
|
if (_invalidating.value) return false
|
||||||
|
_invalidating.value = true
|
||||||
_isSessionValid.value = false
|
_isSessionValid.value = false
|
||||||
_onLogoutRequest.value = true
|
_onLogoutRequest.value = true
|
||||||
RetrofitClient.setToken("")
|
RetrofitClient.setToken("")
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun restoreSession() {
|
fun restoreSession() {
|
||||||
_isSessionValid.value = true
|
_isSessionValid.value = true
|
||||||
_onLogoutRequest.value = false
|
_invalidating.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
fun consumeLogoutRequest() {
|
fun consumeLogoutRequest() {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
|
|||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.devlab.app.ServerManagerApp
|
import com.devlab.app.ServerManagerApp
|
||||||
import com.devlab.app.data.api.RetrofitClient
|
import com.devlab.app.data.api.RetrofitClient
|
||||||
|
import com.devlab.app.data.api.SessionManager
|
||||||
import com.devlab.app.data.repository.AuthRepository
|
import com.devlab.app.data.repository.AuthRepository
|
||||||
import com.devlab.app.util.PreferencesManager
|
import com.devlab.app.util.PreferencesManager
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
@@ -70,6 +71,7 @@ class LoginViewModel : ViewModel() {
|
|||||||
loginResult.token, loginResult.userId,
|
loginResult.token, loginResult.userId,
|
||||||
loginResult.username, loginResult.email, loginResult.role
|
loginResult.username, loginResult.email, loginResult.role
|
||||||
)
|
)
|
||||||
|
SessionManager.restoreSession()
|
||||||
_uiState.value = _uiState.value.copy(
|
_uiState.value = _uiState.value.copy(
|
||||||
isLoading = false,
|
isLoading = false,
|
||||||
isConnected = true,
|
isConnected = true,
|
||||||
@@ -87,10 +89,10 @@ class LoginViewModel : ViewModel() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun logout() {
|
fun logout() {
|
||||||
|
_uiState.value = LoginUiState()
|
||||||
|
RetrofitClient.setToken("")
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
prefs.clear()
|
prefs.clear()
|
||||||
RetrofitClient.setToken("")
|
|
||||||
_uiState.value = LoginUiState()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user