package com.dadao.task import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import com.dadao.task.data.Api import com.dadao.task.data.TokenStore import com.dadao.task.data.Workspace import com.dadao.task.ui.DadaoTheme import com.dadao.task.ui.HomeScreen import com.dadao.task.ui.LoginScreen import com.dadao.task.ui.TaskListScreen class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { DadaoTheme { Surface(Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { AppRoot() } } } } } private enum class Screen { Splash, Login, Home, Tasks } @Composable private fun AppRoot() { val context = androidx.compose.ui.platform.LocalContext.current val tokens = remember { TokenStore(context) } val api = remember { Api(tokens) } var screen by remember { mutableStateOf(if (tokens.isLoggedIn) Screen.Splash else Screen.Login) } var current by remember { mutableStateOf(null) } // 有本地令牌就先静默校验一次:令牌过期/被吊销要退回登录页,而不是进了主页再崩。 LaunchedEffect(screen) { if (screen == Screen.Splash) { screen = try { api.me() Screen.Home } catch (e: Exception) { tokens.clear() Screen.Login } } } when (screen) { Screen.Splash -> Unit // 校验中,空白过渡即可 Screen.Login -> LoginScreen(api = api, onLoggedIn = { screen = Screen.Home }) Screen.Home -> HomeScreen( api = api, onLogout = { tokens.clear() screen = Screen.Login }, onOpenWorkspace = { ws -> current = ws screen = Screen.Tasks }, ) Screen.Tasks -> { val ws = current if (ws == null) { screen = Screen.Home } else { TaskListScreen(api = api, workspace = ws, onBack = { screen = Screen.Home }) } } } }