diff --git a/app/src/main/java/com/example/login_v3/data/repository/basic/Token_Manager.kt b/app/src/main/java/com/example/login_v3/data/repository/basic/Token_Manager.kt index b47ce8e..c44b16f 100644 --- a/app/src/main/java/com/example/login_v3/data/repository/basic/Token_Manager.kt +++ b/app/src/main/java/com/example/login_v3/data/repository/basic/Token_Manager.kt @@ -80,4 +80,8 @@ class TokenManager @Inject constructor( } } } + + suspend fun switchAccount(userId: String) { + // 目前暫不實作 + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/login_v3/navigation/MainViewModel.kt b/app/src/main/java/com/example/login_v3/navigation/MainViewModel.kt index df9e4d5..4526321 100644 --- a/app/src/main/java/com/example/login_v3/navigation/MainViewModel.kt +++ b/app/src/main/java/com/example/login_v3/navigation/MainViewModel.kt @@ -43,26 +43,38 @@ class AppViewModel @Inject constructor( private val _currentScreen = MutableStateFlow(AppScreen.Loading) val currentScreen: StateFlow = _currentScreen.asStateFlow() - // 修改:監聽當前活躍帳號的 Token + // 監聽當前活躍帳號的 Token val userToken: StateFlow = tokenManager.currentAccessToken .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), null) - // 修改:監聽「是否至少有一個帳號登入中」 + // 監聽「是否至少有一個帳號登入中」 private val hasAccountLoggedIn: Flow = tokenManager.allUserIds.map { it.isNotEmpty() } init { + // 1. App 啟動時先檢查一次狀態,決定落腳點 checkLoginStatus() + // 2. 額外監聽:處理在 App 使用過程中,因為過期被強制登出的狀況 + observeGlobalLogout() } private fun checkLoginStatus() { viewModelScope.launch { - // 修改:根據「帳號清單是否為空」來決定初始頁面 + // 🌟 改用 first():只在 App 剛打開時決定是要去主頁 (ScreensTab) 還是歡迎頁 (PreReg) + val hasAccount = hasAccountLoggedIn.first() + if (hasAccount) { + _currentScreen.value = AppScreen.ScreensTab + } else { + _currentScreen.value = AppScreen.PreReg + } + } + } + + private fun observeGlobalLogout() { + viewModelScope.launch { + // 監聽全域狀態。如果使用者在操作過程中(例如 TokenAuthenticator 刷新失敗觸發 logout), + // 導致帳號清單變空了,就把畫面強制踢回歡迎頁。 hasAccountLoggedIn.collect { hasAccount -> - if (hasAccount) { - // 只要清單不為空,就進入主頁面 - _currentScreen.value = AppScreen.ScreensTab - } else { - // 如果清單空了(所有人都登出了),回首頁/註冊頁 + if (!hasAccount && _currentScreen.value == AppScreen.ScreensTab) { _currentScreen.value = AppScreen.PreReg } } @@ -75,7 +87,7 @@ class AppViewModel @Inject constructor( Log.d("NavTest", "Current state value: ${_currentScreen.value}") } - // 修改:登出當前帳號 + // 登出當前帳號 fun onLogout() { viewModelScope.launch { // 先獲取目前的 ID @@ -83,7 +95,9 @@ class AppViewModel @Inject constructor( currentId?.let { tokenManager.logout(it) } - // logout 完後,hasAccountLoggedIn 的 collect 會自動觸發頁面跳轉邏輯 + + // 🌟 登出成功後,主動導回起點頁面 + _currentScreen.value = AppScreen.PreReg } } -} +} \ No newline at end of file