diff --git a/app/src/main/java/com/example/login_v3/auth/reg/Register_ViewModel.kt b/app/src/main/java/com/example/login_v3/auth/reg/Register_ViewModel.kt index 4bf0067..bf8c38d 100644 --- a/app/src/main/java/com/example/login_v3/auth/reg/Register_ViewModel.kt +++ b/app/src/main/java/com/example/login_v3/auth/reg/Register_ViewModel.kt @@ -5,37 +5,43 @@ import androidx.lifecycle.viewModelScope import com.example.login_v3.data.api.api_class.RegisterRequest import com.example.login_v3.data.repository.basic.AuthRepository import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import javax.inject.Inject +// 在 RegisterViewModel.kt 中修改 +data class RegisterUiState( + val isLoading: Boolean = false, + val isSuccess: Boolean = false, + val errorMessage: String? = null +) + @HiltViewModel class RegisterViewModel @Inject constructor( private val repository: AuthRepository ) : ViewModel() { - fun handleRegister() { - val request = RegisterRequest( - display_name = "測試員", - email = "test@example.com", - password = "password123", - username = "tester01" - ) + // 使用 StateFlow 管理 UI 狀態 + private val _uiState = MutableStateFlow(RegisterUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + fun handleRegister(displayName: String, email: String, pass: String, user: String) { + val request = RegisterRequest(displayName, email, pass, user) viewModelScope.launch { + _uiState.value = RegisterUiState(isLoading = true) // 開始載入 try { val response = repository.register(request) if (response.isSuccessful) { - // 註冊成功,處理 response.body() - val successMsg = response.body()?.message - println("註冊成功: $successMsg") + _uiState.value = RegisterUiState(isSuccess = true) } else { - // 註冊失敗,處理錯誤訊息 (例如 400 重複註冊) - val errorJson = response.errorBody()?.string() - println("註冊失敗: $errorJson") + val errorMsg = response.errorBody()?.string() ?: "註冊失敗" + _uiState.value = RegisterUiState(errorMessage = errorMsg) } } catch (e: Exception) { - // 處理網路連線異常 - println("網路錯誤: ${e.message}") + _uiState.value = RegisterUiState(errorMessage = "網路異常: ${e.message}") } } } diff --git a/app/src/main/java/com/example/login_v3/auth/reg/reg_test_page.kt b/app/src/main/java/com/example/login_v3/auth/reg/reg_test_page.kt new file mode 100644 index 0000000..5f6bd0b --- /dev/null +++ b/app/src/main/java/com/example/login_v3/auth/reg/reg_test_page.kt @@ -0,0 +1,87 @@ +package com.example.login_v3.auth.reg + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel + +@Composable +fun RegisterScreen(viewModel: RegisterViewModel = hiltViewModel()) { + // 監聽狀態 + val uiState by viewModel.uiState.collectAsState() + + // 這裡定義 TextField 的輸入狀態 + var displayName by remember { mutableStateOf("") } + var email by remember { mutableStateOf("") } + var username by remember { mutableStateOf("") } + var password by remember { mutableStateOf("") } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text(text = "創建新帳號", style = MaterialTheme.typography.headlineMedium) + + Spacer(modifier = Modifier.height(16.dp)) + + OutlinedTextField(value = displayName, onValueChange = { displayName = it }, label = { Text("顯示名稱") }) + OutlinedTextField(value = email, onValueChange = { email = it }, label = { Text("電子信箱") }) + OutlinedTextField(value = username, onValueChange = { username = it }, label = { Text("帳號") }) + OutlinedTextField( + value = password, + onValueChange = { password = it }, + label = { Text("密碼") }, + visualTransformation = PasswordVisualTransformation() // 密碼隱碼 + ) + + Spacer(modifier = Modifier.height(24.dp)) + + if (uiState.isLoading) { + CircularProgressIndicator() // 顯示載入圈圈 + } else { + Button( + onClick = { viewModel.handleRegister(displayName, email, password, username) }, + modifier = Modifier.fillMaxWidth() + ) { + Text("註冊") + } + } + + // 顯示錯誤訊息 + uiState.errorMessage?.let { + Text(text = it, color = Color.Red, modifier = Modifier.padding(top = 8.dp)) + } + + // 註冊成功跳轉邏輯 + LaunchedEffect(uiState.isSuccess) { + if (uiState.isSuccess) { + // 這裡執行導向登入頁面或是主頁面的動作 + println("導航至登入頁面") + } + } + } +} \ No newline at end of file