From b2e1fd800da7da2069600ccc0dfceadc418b79d4 Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Fri, 1 May 2026 14:36:30 +0800 Subject: [PATCH] auth to server-V25 --- .../example/login_v3/auth/login/Login_Page.kt | 8 +-- .../login_v3/navigation/MainViewModel.kt | 50 +++++++++++++++---- .../login_v3/navigation/nav_controller.kt | 19 +++++-- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/example/login_v3/auth/login/Login_Page.kt b/app/src/main/java/com/example/login_v3/auth/login/Login_Page.kt index 7b98c13..17c8ad5 100644 --- a/app/src/main/java/com/example/login_v3/auth/login/Login_Page.kt +++ b/app/src/main/java/com/example/login_v3/auth/login/Login_Page.kt @@ -63,8 +63,7 @@ import kotlin.text.ifEmpty @Composable fun LoginScreen( paddingValues: PaddingValues, - viewModel: AuthViewModel = hiltViewModel(), - onLoginSuccess: () -> Unit + viewModel: AuthViewModel = hiltViewModel() ){ val uiState by viewModel.loginState.collectAsStateWithLifecycle() @@ -265,11 +264,6 @@ fun LoginScreen( } } - LaunchedEffect(uiState) { - if (uiState is LoginUiState.Success) { - onLoginSuccess() // 觸發跳轉邏輯 - } - } Spacer(modifier = Modifier.height(16.dp)) 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 275e92e..b6eea7d 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 @@ -4,8 +4,16 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.login_v3.data.repository.basic.TokenManager +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import javax.inject.Inject class MainViewModel : ViewModel() { @@ -20,22 +28,46 @@ class MainViewModel : ViewModel() { //init navigation enum class AppScreen { - PreReg, Login, Register, Home, ScreensTab + PreReg, Login, Register, Home, ScreensTab, Loading } -class AppViewModel : ViewModel() { - private val _currentScreen = MutableStateFlow(AppScreen.PreReg) - val currentScreen: StateFlow = _currentScreen +@HiltViewModel +class AppViewModel @Inject constructor( + private val tokenManager: TokenManager +) : ViewModel() { + + private val _currentScreen = MutableStateFlow(AppScreen.Loading) // 增加一個 Loading 狀態 + val currentScreen: StateFlow = _currentScreen.asStateFlow() + + // 暴露 Token 給其他需要的 Screen 使用 + val userToken: StateFlow = tokenManager.accessToken + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), null) + + init { + checkLoginStatus() + } + + private fun checkLoginStatus() { + viewModelScope.launch { + // 讀取 DataStore 中的 isLogin 狀態 + tokenManager.isLogin.collect { loggedIn -> + if (loggedIn) { + _currentScreen.value = AppScreen.ScreensTab + } else { + _currentScreen.value = AppScreen.PreReg // 或 AppScreen.Register + } + } + } + } fun goTo(screen: AppScreen) { _currentScreen.value = screen } - fun onLoginSuccess() { - _currentScreen.value = AppScreen.Home - } - fun onLogout() { - _currentScreen.value = AppScreen.PreReg + viewModelScope.launch { + tokenManager.clearAuthData() + // 清除後,checkLoginStatus 的 collect 會自動觸發切換回 PreReg + } } } diff --git a/app/src/main/java/com/example/login_v3/navigation/nav_controller.kt b/app/src/main/java/com/example/login_v3/navigation/nav_controller.kt index 9e98da8..fbe9537 100644 --- a/app/src/main/java/com/example/login_v3/navigation/nav_controller.kt +++ b/app/src/main/java/com/example/login_v3/navigation/nav_controller.kt @@ -1,10 +1,16 @@ package com.example.login_v3.navigation import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.viewmodel.compose.viewModel import com.example.login_v3.auth.login.LoginScreen import com.example.login_v3.auth.Login_or_Reg_page @@ -15,11 +21,19 @@ import com.example.login_v3.home.HomeScreen @Composable fun AppNavGraph( paddingValues: PaddingValues, - appViewModel: AppViewModel = viewModel() + appViewModel: AppViewModel = hiltViewModel() ) { val currentScreen by appViewModel.currentScreen.collectAsState() when (currentScreen) { + + AppScreen.Loading -> { + // 顯示一個簡單的載入圈圈 + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + CircularProgressIndicator() + } + } + AppScreen.PreReg -> Login_or_Reg_page( paddingValues = paddingValues, onLoginClick = { appViewModel.goTo(AppScreen.Login) }, @@ -27,8 +41,7 @@ fun AppNavGraph( ) AppScreen.Login -> LoginScreen( - paddingValues = paddingValues, - onLoginSuccess = { appViewModel.goTo(AppScreen.ScreensTab) } + paddingValues = paddingValues ) AppScreen.Register -> {