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.Json
|
||||||
import com.squareup.moshi.JsonClass
|
import com.squareup.moshi.JsonClass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//login data
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class LoginRequest(
|
data class LoginRequest(
|
||||||
val username: String,
|
val username: String,
|
||||||
|
|
@ -9,10 +13,30 @@ data class LoginRequest(
|
||||||
)
|
)
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class LoginResponse(
|
data class LoginResponse(
|
||||||
|
val access_token: String,
|
||||||
|
val expires_in: Int,
|
||||||
|
val refresh_token: String,
|
||||||
val 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)
|
@JsonClass(generateAdapter = true)
|
||||||
data class RegisterRequest(
|
data class RegisterRequest(
|
||||||
val display_name: String,
|
val display_name: String,
|
||||||
|
|
@ -20,7 +44,6 @@ data class RegisterRequest(
|
||||||
val password: String,
|
val password: String,
|
||||||
val username: String
|
val username: String
|
||||||
)
|
)
|
||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
data class RegisterResponse(
|
data class RegisterResponse(
|
||||||
@field:Json(name = "id") val id: String,
|
@field:Json(name = "id") val id: String,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue