prescreen;slider;auth

This commit is contained in:
Your Name 2025-02-18 23:42:49 +03:00
parent d26e08476b
commit 42e0bc865c
11 changed files with 674 additions and 133 deletions

View File

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings" defaultProject="true" /> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project> </project>

View File

@ -50,6 +50,7 @@ dependencies {
implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3) implementation(libs.androidx.material3)
implementation(libs.androidx.navigation.compose)
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
@ -66,4 +67,22 @@ dependencies {
// Kotlinx serialization dependencies // Kotlinx serialization dependencies
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0")
// implementation("libs.androidx.navigation.compose")
val voyagerVersion = "1.1.0-beta02"
implementation("cafe.adriel.voyager:voyager-navigator:$voyagerVersion")
implementation("cafe.adriel.voyager:voyager-screenmodel:$voyagerVersion")
testImplementation("junit:junit:4.13.2")
testImplementation ("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")
implementation(platform("io.github.jan-tennert.supabase:bom:3.0.3"))
implementation("io.github.jan-tennert.supabase:postgrest-kt")
implementation("io.ktor:ktor-client-android:3.0.3")
} }

View File

@ -51,68 +51,6 @@
// } // }
//} //}
// //
//@Composable
//fun UserScreen(modifier: Modifier = Modifier, client: HttpClient) {
// var user by remember { mutableStateOf<User?>(null) }
// var isLoading by remember { mutableStateOf(true) }
// var errorMessage by remember { mutableStateOf<String?>(null) }
//
// val scope = rememberCoroutineScope()
//
// LaunchedEffect(Unit) {
// try {
// val fetchedUser = getUser(client) // Получаем одного пользователя
// user = fetchedUser
// } catch (e: Exception) {
// errorMessage = "Error fetching user: ${e.localizedMessage}"
// Log.e("UserScreen", "Error: ${e.localizedMessage}", e)
// }
// isLoading = false
// }
//
// if (isLoading) {
// CircularProgressIndicator()
// }
//
// errorMessage?.let {
// Text(text = it)
// }
//
// user?.let {
// Text(text = "User: ${it.name}, ID: ${it.id}") // Отображаем имя пользователя
// } ?: run {
// Text(text = "No user found or failed to load.")
// }
//}
//
//suspend fun getUser(client: HttpClient): User {
// val response: HttpResponse = client.get("http://10.0.2.2:8080/user") {
// contentType(ContentType.Application.Json)
// }
// val responseBody = response.bodyAsText()
// Log.d("getUser", "Response: $responseBody") // Логируем ответ сервера
//
// val json = Json { ignoreUnknownKeys = true }
//
// val buba = json.decodeFromString<User>(responseBody) // Десериализуем в объект User
// Log.d("json", buba.name)
//
// return try {
// json.decodeFromString<User>(responseBody) // Десериализуем в объект User
// } catch (e: Exception) {
// Log.e("getUser", "Error deserializing response", e)
// throw e // Повторно выбрасываем ошибку, чтобы она была обработана в UserScreen
// }
//}
//
//@Preview(showBackground = true)
//@Composable
//fun UserScreenPreview() {
// TestKtorTheme {
// UserScreen(client = HttpClient(Android))
// }
//}
package com.example.testktor package com.example.testktor
@ -129,6 +67,14 @@ import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.matuletest.ui.auth.FirstScreen
import com.example.matuletest.ui.auth.SliderScreen
import com.example.testktor.auth.AuthScreen
//import com.example.testktor.auth.AuthScreen
//import com.example.testktor.auth.RegistrationScreen
import com.example.testktor.ui.theme.TestKtorTheme import com.example.testktor.ui.theme.TestKtorTheme
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.request.* import io.ktor.client.request.*
@ -144,86 +90,54 @@ import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
@Serializable //class MainActivity : ComponentActivity() {
data class User(val id: Int, val name: String) // private val client = HttpClient(Android) {
// install(ContentNegotiation) {
// json(Json { prettyPrint = true })
// }
// }
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// enableEdgeToEdge()
// setContent {
// TestKtorTheme {
// Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
// UserScreen(modifier = Modifier.padding(innerPadding), client = client)
// }
// }
// }
// }
//}
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private val client = HttpClient(Android) {
install(ContentNegotiation) {
json(Json { prettyPrint = true })
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
TestKtorTheme { TestKtorTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> val navController = rememberNavController()
UserScreen(modifier = Modifier.padding(innerPadding), client = client)
NavHost(navController = navController, startDestination = "first_screen") {
composable("first_screen") {
FirstScreen(onNavigateToSliderScreen = {
navController.navigate("slider_screen")
})
}
composable("slider_screen") {
SliderScreen(onNavigateToAuthScreen = {
navController.navigate("auth_screen")
})
}
composable("auth_screen") {
AuthScreen(navController)
}
// composable("registration_screen") {
// RegistrationScreen()
// }
} }
} }
} }
} }
} }
@Composable
fun UserScreen(modifier: Modifier = Modifier, client: HttpClient) {
var users by remember { mutableStateOf<List<User>?>(null) }
var isLoading by remember { mutableStateOf(true) }
var errorMessage by remember { mutableStateOf<String?>(null) }
val scope = rememberCoroutineScope()
LaunchedEffect(Unit) {
try {
val fetchedUsers = getUsers(client)
users = fetchedUsers
} catch (e: Exception) {
errorMessage = "Error fetching users: ${e.localizedMessage}"
Log.e("UserScreen", "Error: ${e.localizedMessage}", e)
}
isLoading = false
}
if (isLoading) {
CircularProgressIndicator()
}
errorMessage?.let {
Text(text = it)
}
users?.let {
it.forEach { user ->
Text(text = "User: ${user.name}, ID: ${user.id}")
}
} ?: run {
Text(text = "No users found or failed to load.")
}
}
suspend fun getUsers(client: HttpClient): List<User> {
val response: HttpResponse = client.get("http://212.67.10.54:8080/users") {
contentType(ContentType.Application.Json)
}
val responseBody = response.bodyAsText()
Log.d("getUsers", "Response: $responseBody") // Логируем ответ сервера
val json = Json { ignoreUnknownKeys = true }
return try {
json.decodeFromString<List<User>>(responseBody) // Десериализуем в List<User>
} catch (e: Exception) {
Log.e("getUsers", "Error deserializing response", e)
throw e // Повторно выбрасываем ошибку, чтобы она была обработана в UserScreen
}
}
@Preview(showBackground = true)
@Composable
fun UserScreenPreview() {
TestKtorTheme {
UserScreen(client = HttpClient(Android))
}
}

View File

@ -0,0 +1,153 @@
package com.example.testktor.auth
import androidx.compose.foundation.hoverable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.ClickableText
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
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.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import com.example.testktor.authUser
import com.example.testktor.getUser
import io.ktor.client.HttpClient
import io.ktor.client.engine.android.Android
@Composable
fun AuthScreen(navController: NavController) {
var authSuccess by remember { mutableStateOf<String?>(null) }
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
val client = HttpClient(Android)
LaunchedEffect(email, password) {
if (email.isNotEmpty() && password.isNotEmpty()) {
val result = authUser(client, email, password)
authSuccess = if (result) "Success" else "Failed"
}
}
AuthContent(navController, authSuccess, email, password) { newEmail, newPassword ->
email = newEmail
password = newPassword
}
}
@Composable
fun AuthContent(
navController: NavController,
authSuccess: String?,
email: String,
password: String,
onAuth: (String, String) -> Unit
) {
var emailIn by remember { mutableStateOf(email) }
var passwordIn by remember { mutableStateOf(password) }
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
// Отображение текста "Success" в левом верхнем углу
if (authSuccess == "Success") {
Text(
text = "Success",
modifier = Modifier
.padding(start = 16.dp, top = 16.dp)
.align(Alignment.Start),
color = Color.Green,
style = TextStyle(fontSize = 18.sp, fontWeight = FontWeight.Bold)
)
}
Text(
text = "Привет!",
style = TextStyle(fontSize = 32.sp, fontWeight = FontWeight.Bold),
modifier = Modifier.height(60.dp).padding(bottom = 20.dp)
)
Text(
text = "Заполните Свои данные или продолжите через социальные медиа",
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 20.dp),
style = TextStyle(fontSize = 16.sp),
textAlign = TextAlign.Center,
maxLines = 2
)
Text(text = "Email", modifier = Modifier.padding(end = 255.dp))
TextField(
modifier = Modifier.width(300.dp).height(70.dp).padding(bottom = 16.dp),
value = emailIn,
onValueChange = { emailIn = it }
)
Text(text = "Password", modifier = Modifier.padding(end = 225.dp))
TextField(
modifier = Modifier.width(300.dp).height(70.dp).padding(bottom = 16.dp),
value = passwordIn,
onValueChange = { passwordIn = it },
visualTransformation = PasswordVisualTransformation()
)
Button(
modifier = Modifier.width(350.dp).height(50.dp),
colors = androidx.compose.material3.ButtonDefaults.buttonColors(
containerColor = Color(0xFF48B2E7),
contentColor = Color.White
),
onClick = { onAuth(emailIn, passwordIn) }
) {
Text("Войти")
}
Row(
modifier = Modifier
.padding(top = 16.dp)
.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
Text(
text = "Вы впервые? ",
style = TextStyle(fontSize = 16.sp, color = Color.Black)
)
ClickableText(
text = buildAnnotatedString { append("Создать пользователя") },
onClick = {
navController.navigate("registration_screen")
},
style = TextStyle(
fontSize = 16.sp,
color = Color.Black
),
)
}
}
}

View File

@ -0,0 +1,146 @@
package com.example.matuletest.ui.auth
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
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.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Button
import androidx.compose.material3.Slider
import androidx.compose.material3.Text
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.Alignment
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.LineHeightStyle
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.testktor.R
import io.ktor.websocket.Frame
import java.lang.reflect.Modifier
@Composable
fun FirstScreen(onNavigateToSliderScreen: () -> Unit) {
LaunchedEffect(Unit) {
kotlinx.coroutines.delay(3000)
onNavigateToSliderScreen()
}
Box(
modifier = androidx.compose.ui.Modifier
.fillMaxSize()
.background(Brush.horizontalGradient(listOf(Color(0xFF48B2E7), Color(0xFF0076B1)))),
) {
Text(
text = "MATULEme",
fontSize = 32.sp,
color = Color.White,
modifier = androidx.compose.ui.Modifier.align(Alignment.Center)
)
}
}
@Composable
fun SliderScreen(onNavigateToAuthScreen: () -> Unit) {
var sliderValue by remember { mutableStateOf(0f) }
val textList = listOf("ДОБРО ПОЖАЛОВАТЬ", "Начнем путешествие", "У вас есть сила, чтобы")
val textList2 = listOf("", "Умная, великолепная и модная коллекция Изучите сейчас", "В вашей комнате много красивых и привлекательных растений")
val maxIndex = textList.size - 1
val currentIndex = sliderValue.toInt()
val imageId = when (currentIndex) {
0 -> R.drawable.kros1
1 -> R.drawable.kros2
2 -> R.drawable.kros3
else -> return
}
Column(
modifier = androidx.compose.ui.Modifier
.fillMaxSize()
.background(Brush.horizontalGradient(listOf(Color(0xFF48B2E7), Color(0xFF0076B1)))),
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(id = imageId),
contentDescription = "Изображение",
modifier = androidx.compose.ui.Modifier.width(670.dp).height(600.dp).padding(start = 20.dp)
)
Text(
color = Color.White,
fontStyle = FontStyle.Italic,
text = textList[currentIndex],
fontSize = 24.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
modifier = androidx.compose.ui.Modifier
.fillMaxWidth()
.padding(top = 40.dp)
.width(700.dp).height(30.dp)
)
Text(
color = Color.White,
fontStyle = FontStyle.Italic,
text = textList2[currentIndex],
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
modifier = androidx.compose.ui.Modifier
.fillMaxWidth()
.padding(top = 40.dp)
)
Spacer(modifier = androidx.compose.ui.Modifier.weight(1f))
Slider(
value = sliderValue,
onValueChange = { newValue -> sliderValue = newValue },
valueRange = 0f..maxIndex.toFloat(),
steps = maxIndex - 1,
colors = androidx.compose.material3.SliderDefaults.colors(
thumbColor = Color.White,
activeTrackColor = Color(0xFF0076B1),
inactiveTrackColor = Color(0xFFB0B0B0)
),
modifier = androidx.compose.ui.Modifier.fillMaxWidth()
)
// Spacer(modifier = androidx.compose.ui.Modifier.height(20.dp))
Button(
onClick = {
if (sliderValue < maxIndex) {
sliderValue++
} else {
onNavigateToAuthScreen()
}},
colors = androidx.compose.material3.ButtonDefaults.buttonColors(
containerColor = Color.White,
contentColor = Color.Black
),
modifier = androidx.compose.ui.Modifier
.fillMaxWidth()
.padding(bottom = 40.dp)
) {
Text(text = "Далее", color = Color.Black)
}
}
}

View File

@ -0,0 +1,127 @@
//package com.example.testktor.auth
//
//import androidx.compose.foundation.layout.Arrangement
//import androidx.compose.foundation.layout.Column
//import androidx.compose.foundation.layout.Row
//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.foundation.layout.width
//import androidx.compose.foundation.text.ClickableText
//import androidx.compose.material3.Button
//import androidx.compose.material3.Text
//import androidx.compose.material3.TextField
//import androidx.compose.runtime.Composable
//import androidx.compose.runtime.collectAsState
//import androidx.compose.ui.Alignment
//import androidx.compose.ui.Modifier
//import androidx.compose.ui.graphics.Color
//import androidx.compose.ui.text.TextStyle
//import androidx.compose.ui.text.buildAnnotatedString
//import androidx.compose.ui.text.font.FontWeight
//import androidx.compose.ui.text.input.PasswordVisualTransformation
//import androidx.compose.ui.text.style.TextAlign
//import androidx.compose.ui.unit.dp
//import androidx.compose.ui.unit.sp
//import androidx.lifecycle.viewmodel.compose.viewModel
//import androidx.navigation.NavController
//import com.example.matuletest.ui.auth.AuthScreenViewModel
//
//@Composable
//fun RegistrationScreen(navController: NavController) {
// val viewModel: AuthScreenViewModel = viewModel()
// RegistrationContent(viewModel, navController)
//}
//
//@Composable
//fun RegistrationContent(viewModel: AuthScreenViewModel, navController: NavController){
// val regState = viewModel.registrationScreenState.collectAsState()
//
// if (regState.value.isSignUp) {
// Text("Success Registration")
// }
//
// Column(
// modifier = Modifier.fillMaxSize(),
// horizontalAlignment = Alignment.CenterHorizontally,
// verticalArrangement = Arrangement.Center
// ) {
// Text(
// text = "Регистрация!",
// style = TextStyle(fontSize = 32.sp, fontWeight = FontWeight.Bold),
// modifier = Modifier.height(60.dp).padding(bottom = 20.dp)
// )
//
// Text(
// text = "Заполните Свои данные или продолжите через социальные медиа",
// modifier = Modifier
// .fillMaxWidth()
// .padding(bottom = 20.dp),
// style = TextStyle(fontSize = 16.sp),
// textAlign = TextAlign.Center,
// maxLines = 2
// )
//
//// Text(text = "Ваше имя", modifier = Modifier.padding(end = 255.dp))
//// TextField(
//// modifier = Modifier.width(300.dp).height(70.dp).padding(bottom = 16.dp),
//// value = regState.value.email,
//// onValueChange = {
//// viewModel.setEmail(it)
//// })
//
// Text(text = "Email", modifier = Modifier.padding(end = 255.dp))
// TextField(
// modifier = Modifier.width(300.dp).height(70.dp).padding(bottom = 16.dp),
// value = regState.value.email,
// onValueChange = {
// viewModel.setEmail(it, true)
// })
//
// Text(text = "Password", modifier = Modifier.padding(end = 225.dp))
// TextField(
// modifier = Modifier.width(300.dp).height(70.dp).padding(bottom = 16.dp),
// value = regState.value.password,
// onValueChange = {
// viewModel.setPassword(it, true)
// },
// visualTransformation = PasswordVisualTransformation()
// )
//
// Button(
// modifier = Modifier.width(350.dp).height(50.dp),
// colors = androidx.compose.material3.ButtonDefaults.buttonColors(
// containerColor = Color(0xFF48B2E7),
// contentColor = Color.White
// ),
// onClick = {
// viewModel.reg()
// }) {
// Text("Зарегестрироваться")
// }
//
// Row(
// modifier = Modifier
// .padding(top = 16.dp)
// .fillMaxWidth(),
// horizontalArrangement = Arrangement.Center
// ) {
// Text(
// text = "Есть аккаунт? ",
// style = TextStyle(fontSize = 16.sp, color = Color.Black)
// )
//
// ClickableText(
// text = buildAnnotatedString { append("Войти") },
// onClick = {
// navController.navigate("auth_screen")
// },
// style = TextStyle(
// fontSize = 16.sp,
// color = Color.Black
// ),
// )
// }
// }
//}

View File

@ -0,0 +1,178 @@
package com.example.testktor
import android.util.Log
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Text
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.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.testktor.ui.theme.TestKtorTheme
import io.ktor.client.HttpClient
import io.ktor.client.engine.android.Android
import io.ktor.client.request.get
import io.ktor.client.statement.HttpResponse
import io.ktor.client.statement.bodyAsText
import io.ktor.http.ContentType
import io.ktor.http.contentType
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
@Serializable
data class User(val id: Int, val email: String, val password: String)
//@Composable
//fun UserScreen(modifier: Modifier = Modifier, client: HttpClient) {
// var users by remember { mutableStateOf<List<User>?>(null) }
// var isLoading by remember { mutableStateOf(true) }
// var errorMessage by remember { mutableStateOf<String?>(null) }
//
// val scope = rememberCoroutineScope()
//
// LaunchedEffect(Unit) {
// try {
// val fetchedUsers = getUsers(client)
// users = fetchedUsers
// } catch (e: Exception) {
// errorMessage = "Error fetching users: ${e.localizedMessage}"
// Log.e("UserScreen", "Error: ${e.localizedMessage}", e)
// }
// isLoading = false
// }
//
// if (isLoading) {
// CircularProgressIndicator()
// }
//
// errorMessage?.let {
// Text(text = it)
// }
//
// users?.let {
// it.forEach { user ->
// Text(text = "User: ${user.name}, ID: ${user.id}")
// }
// } ?: run {
// Text(text = "No users found or failed to load.")
// }
//}
//
//suspend fun getUsers(client: HttpClient): List<User> {
// val response: HttpResponse = client.get("http://212.67.10.54:8080/users") {
// contentType(ContentType.Application.Json)
// }
// val responseBody = response.bodyAsText()
// Log.d("getUsers", "Response: $responseBody") // Логируем ответ сервера
//
// val json = Json { ignoreUnknownKeys = true }
//
// return try {
// json.decodeFromString<List<User>>(responseBody) // Десериализуем в List<User>
// } catch (e: Exception) {
// Log.e("getUsers", "Error deserializing response", e)
// throw e // Повторно выбрасываем ошибку, чтобы она была обработана в UserScreen
// }
//}
//
//@Preview(showBackground = true)
//@Composable
//fun UserScreenPreview() {
// TestKtorTheme {
// UserScreen(client = HttpClient(Android))
// }
//}
@Composable
fun UserScreen(modifier: Modifier = Modifier, client: HttpClient) {
var user by remember { mutableStateOf<User?>(null) }
var isLoading by remember { mutableStateOf(true) }
var errorMessage by remember { mutableStateOf<String?>(null) }
val scope = rememberCoroutineScope()
LaunchedEffect(Unit) {
try {
val fetchedUser = getUser(client) // Получаем одного пользователя
user = fetchedUser
} catch (e: Exception) {
errorMessage = "Error fetching user: ${e.localizedMessage}"
Log.e("UserScreen", "Error: ${e.localizedMessage}", e)
}
isLoading = false
}
if (isLoading) {
CircularProgressIndicator()
}
errorMessage?.let {
Text(text = it)
}
user?.let {
Text(text = "User: ${it.email}, ID: ${it.id}") // Отображаем имя пользователя
} ?: run {
Text(text = "No user found or failed to load.")
}
}
suspend fun getUser(client: HttpClient): User {
val response: HttpResponse = client.get("http://10.0.2.2:8080/user") {
contentType(ContentType.Application.Json)
}
val responseBody = response.bodyAsText()
Log.d("getUser", "Response: $responseBody") // Логируем ответ сервера
val json = Json { ignoreUnknownKeys = true }
val buba = json.decodeFromString<User>(responseBody) // Десериализуем в объект User
Log.d("json", buba.email)
return try {
json.decodeFromString<User>(responseBody) // Десериализуем в объект User
} catch (e: Exception) {
Log.e("getUser", "Error deserializing response", e)
throw e // Повторно выбрасываем ошибку, чтобы она была обработана в UserScreen
}
}
suspend fun authUser(client: HttpClient, email: String, password: String): Boolean {
val response: HttpResponse = client.get("http://10.0.2.2:8080/user2?email=$email") {
contentType(ContentType.Application.Json)
}
val responseBody = response.bodyAsText()
Log.d("authUser", "Response: $responseBody") // Логируем ответ сервера
val json = Json { ignoreUnknownKeys = true }
return try {
val user = json.decodeFromString<User>(responseBody) // Десериализуем в объект User
// Проверяем, совпадает ли пароль
if (user.password == password) {
true // Возвращаем true, если пароль совпадает
} else {
Log.e("authUser", "Incorrect password")
false // Возвращаем false, если пароль неверный
}
} catch (e: Exception) {
Log.e("authUser", "Error deserializing response", e)
false // Возвращаем false в случае ошибки
}
}
@Preview(showBackground = true)
@Composable
fun UserScreenPreview() {
TestKtorTheme {
UserScreen(client = HttpClient(Android))
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -8,6 +8,7 @@ espressoCore = "3.6.1"
lifecycleRuntimeKtx = "2.8.7" lifecycleRuntimeKtx = "2.8.7"
activityCompose = "1.10.0" activityCompose = "1.10.0"
composeBom = "2024.04.01" composeBom = "2024.04.01"
navigationCompose = "2.8.7"
[libraries] [libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@ -24,6 +25,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }