auth to server-V20
This commit is contained in:
parent
372ade0809
commit
90b8b6da13
2 changed files with 78 additions and 3 deletions
|
|
@ -1 +1,53 @@
|
|||
package com.example.login_v3.auth.login
|
||||
package com.example.login_v3.auth.login
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.example.login_v3.data.api.api_class.LoginRequest
|
||||
import com.example.login_v3.data.api.api_class.UserInfo
|
||||
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
|
||||
|
||||
sealed class LoginUiState {
|
||||
object Idle : LoginUiState()
|
||||
object Loading : LoginUiState()
|
||||
data class Success(val user: UserInfo) : LoginUiState()
|
||||
data class Error(val message: String) : LoginUiState()
|
||||
}
|
||||
|
||||
@HiltViewModel
|
||||
class AuthViewModel @Inject constructor(
|
||||
private val repository: AuthRepository
|
||||
) : ViewModel() {
|
||||
|
||||
// 用於內部修改的私有狀態
|
||||
private val _loginState = MutableStateFlow<LoginUiState>(LoginUiState.Idle)
|
||||
// 暴露給 Compose 觀察的公開狀態
|
||||
val loginState: StateFlow<LoginUiState> = _loginState.asStateFlow()
|
||||
|
||||
fun login(username: String, password: String) {
|
||||
viewModelScope.launch {
|
||||
_loginState.value = LoginUiState.Loading
|
||||
|
||||
try {
|
||||
val request = LoginRequest(username = username, password = password)
|
||||
val response = repository.login(request)
|
||||
|
||||
if (response.isSuccessful && response.body() != null) {
|
||||
// 登入成功,儲存 User 資訊
|
||||
_loginState.value = LoginUiState.Success(response.body()!!.user)
|
||||
|
||||
// 提示:通常這裡還會處理 Token 持久化(儲存在 DataStore 或 EncryptedSharedPreferences)
|
||||
} else {
|
||||
_loginState.value = LoginUiState.Error("登入失敗:${response.code()}")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
_loginState.value = LoginUiState.Error("網路異常:${e.localizedMessage}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,10 @@ package com.example.login_v3.data.api.api_class
|
|||
|
||||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.JsonClass
|
||||
|
||||
|
||||
|
||||
//login data
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class LoginRequest(
|
||||
val username: String,
|
||||
|
|
@ -9,10 +13,30 @@ data class LoginRequest(
|
|||
)
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class LoginResponse(
|
||||
val access_token: String,
|
||||
val expires_in: Int,
|
||||
val refresh_token: String,
|
||||
val token: String,
|
||||
val userId: String
|
||||
val user: UserInfo
|
||||
)
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class UserInfo(
|
||||
val id: String,
|
||||
val username: String,
|
||||
val display_name: String,
|
||||
val email: String,
|
||||
val avatar_url: String,
|
||||
val banner_url: String,
|
||||
val bio: String,
|
||||
val status: String,
|
||||
val is_verified: Boolean,
|
||||
val created_at: String
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
//register data
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class RegisterRequest(
|
||||
val display_name: String,
|
||||
|
|
@ -20,7 +44,6 @@ data class RegisterRequest(
|
|||
val password: String,
|
||||
val username: String
|
||||
)
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class RegisterResponse(
|
||||
@field:Json(name = "id") val id: String,
|
||||
|
|
|
|||
Loading…
Reference in a new issue