This commit is contained in:
Zyzf 2023-11-19 16:31:28 +04:00
parent 534babe2ea
commit e3e4d1cacb
11 changed files with 197 additions and 67 deletions

View File

@ -94,7 +94,7 @@ import java.util.Properties
fun CoffeeList(navController: NavController?) { fun CoffeeList(navController: NavController?) {
val openDialog = remember { mutableStateOf(false) } val openDialog = remember { mutableStateOf(false) }
val add = remember { mutableStateOf(false) } val add = remember { mutableStateOf(false) }
val coffee = remember { mutableStateOf(Coffee("", 0.0, "", null,0)) } val coffee = remember { mutableStateOf(Coffee("", 0.0, "", null, 0)) }
val context = LocalContext.current val context = LocalContext.current
val itemsList = remember { mutableStateListOf<Coffee>() } val itemsList = remember { mutableStateListOf<Coffee>() }
@ -163,12 +163,15 @@ fun CoffeeList(navController: NavController?) {
) )
} }
} }
AppDatabase.getInstance(context).coffeeDao().getAll().collect { data ->
itemsList.clear()
itemsList.addAll(data)
}
} }
}, },
shape = CircleShape, shape = CircleShape,
modifier = Modifier.fillMaxWidth(fraction = 0.75f) modifier = Modifier.fillMaxWidth(fraction = 0.75f)
) { ) {
// Inner content including an icon and a text label
Icon( Icon(
imageVector = Icons.Default.Add, imageVector = Icons.Default.Add,
contentDescription = "Favorite", contentDescription = "Favorite",
@ -177,7 +180,12 @@ fun CoffeeList(navController: NavController?) {
Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text(text = "В корзину") Text(text = "В корзину")
} }
OutlinedIconButton(onClick = { coffee.value = currentCoffee; add.value = false; openDialog.value = true }, OutlinedIconButton(
onClick = {
coffee.value = currentCoffee
add.value = false
openDialog.value = true
},
Modifier Modifier
.padding(start = 10.dp) .padding(start = 10.dp)
.clip(CircleShape)) { .clip(CircleShape)) {
@ -277,15 +285,13 @@ fun CoffeeList(navController: NavController?) {
fos.close() fos.close()
} }
copyFileToSftp(f, "/mnt/nextcloud/data/Zyzf/files/Images") copyFileToSftp(f, "/mnt/nextcloud/data/Zyzf/files/Images")
AppDatabase.getInstance(context).coffeeDao().getAll().collect { data -> AppDatabase.getInstance(context).coffeeDao().getAll().collect { data ->
itemsList.clear() itemsList.clear()
itemsList.addAll(data) itemsList.addAll(data)
} }
openDialog.value = false
} }
}, modifier = Modifier.padding(0.dp, 10.dp, 0.dp, 30.dp)) { }, modifier = Modifier.padding(0.dp, 10.dp, 0.dp, 30.dp)) {
Text("Добавить") Text("Добавить")
@ -315,6 +321,7 @@ fun CoffeeList(navController: NavController?) {
itemsList.clear() itemsList.clear()
itemsList.addAll(data) itemsList.addAll(data)
} }
openDialog.value = false
} }
}, modifier = Modifier.padding(0.dp, 10.dp, 0.dp, 30.dp)) { }, modifier = Modifier.padding(0.dp, 10.dp, 0.dp, 30.dp)) {
@ -327,10 +334,10 @@ fun CoffeeList(navController: NavController?) {
} }
} }
val REMOTE_HOST = "109.197.199.134" const val REMOTE_HOST = "109.197.199.134"
val USERNAME = "zyzf" const val USERNAME = "zyzf"
val PASSWORD = "250303Zyzf-d-grad" const val PASSWORD = "250303Zyzf-d-grad"
val REMOTE_PORT = 2223 const val REMOTE_PORT = 2223
fun copyFileToSftp(srcFile: File, ftpPath: String): Boolean { fun copyFileToSftp(srcFile: File, ftpPath: String): Boolean {

View File

@ -1,13 +1,11 @@
package com.zyzf.coffeepreorder.composeui package com.zyzf.coffeepreorder.composeui
import android.content.res.Configuration import android.content.res.Configuration
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.heightIn
@ -16,6 +14,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Clear import androidx.compose.material.icons.filled.Clear
@ -30,25 +29,50 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.imageResource import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.navigation.NavController import androidx.navigation.NavController
import com.zyzf.coffeepreorder.coffee.model.getCoffee import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.zyzf.coffeepreorder.R
import com.zyzf.coffeepreorder.composeui.navigation.Screen import com.zyzf.coffeepreorder.composeui.navigation.Screen
import com.zyzf.coffeepreorder.database.AppDatabase
import com.zyzf.coffeepreorder.database.model.Coffee
import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class, DelicateCoroutinesApi::class)
@Composable @Composable
fun Cart(navController: NavController?) { fun Cart(navController: NavController?) {
val openDialog = remember { mutableStateOf(false) } val openDialog = remember { mutableStateOf(false) }
val itemsList = getCoffee().toList() var coffee by remember { mutableStateOf(Coffee("", 0.0, "", null, 0)) }
val context = LocalContext.current
val itemsList = remember { mutableStateListOf<Coffee>() }
LaunchedEffect(Unit) {
withContext(Dispatchers.IO) {
AppDatabase.getInstance(context).coffeeDao().getAllInCart().collect { data ->
itemsList.clear()
itemsList.addAll(data)
}
}
}
LazyColumn( LazyColumn(
horizontalAlignment = Alignment.CenterHorizontally) { horizontalAlignment = Alignment.CenterHorizontally) {
items(itemsList) { currentCoffee -> items(itemsList) { currentCoffee ->
@ -57,15 +81,27 @@ fun Cart(navController: NavController?) {
.heightIn(max = 140.dp) .heightIn(max = 140.dp)
.padding(bottom = 10.dp, top = 10.dp), .padding(bottom = 10.dp, top = 10.dp),
horizontalArrangement = Arrangement.SpaceAround) { horizontalArrangement = Arrangement.SpaceAround) {
Image(bitmap = ImageBitmap.imageResource(currentCoffee.image), AsyncImage(
contentDescription = "Кофе", modifier = Modifier model = ImageRequest.Builder(context = LocalContext.current).data("https://zyzf.space/s/zXgFRTmbR4KMxMH/download?path=&files=coffee_image_" + currentCoffee.uid +".png")
.fillMaxHeight() .crossfade(true).build(),
.weight(1f)) error = painterResource(R.drawable.ic_broken_image),
placeholder = painterResource(R.drawable.loading_img),
contentDescription = "Кофе",
contentScale = ContentScale.Crop,
modifier = Modifier
.size(100.dp)
.clip(RoundedCornerShape(50.dp))
)
Column( Column(
Modifier Modifier
.weight(2f) .weight(2f)
.padding(start = 20.dp)) { .padding(start = 20.dp)) {
Text(text = currentCoffee.name, fontSize = 25.sp) val currentCoffeeName: String = if (currentCoffee.count > 1) {
currentCoffee.name + " x" + currentCoffee.count.toString()
} else {
currentCoffee.name
}
Text(text = currentCoffeeName, fontSize = 25.sp)
Text(text = String.format("%.2f", currentCoffee.cost), fontSize = 20.sp) Text(text = String.format("%.2f", currentCoffee.cost), fontSize = 20.sp)
Text(text = currentCoffee.ingredients, fontSize = 15.sp) Text(text = currentCoffee.ingredients, fontSize = 15.sp)
Row( Row(
@ -73,7 +109,7 @@ fun Cart(navController: NavController?) {
.fillMaxWidth() .fillMaxWidth()
.padding(top = 5.dp)) { .padding(top = 5.dp)) {
Button( Button(
onClick = { openDialog.value = true }, onClick = { coffee = currentCoffee; openDialog.value = true },
shape = CircleShape, shape = CircleShape,
modifier = Modifier.padding(start = 10.dp, end = 10.dp), modifier = Modifier.padding(start = 10.dp, end = 10.dp),
colors = ButtonDefaults.buttonColors( colors = ButtonDefaults.buttonColors(
@ -81,7 +117,6 @@ fun Cart(navController: NavController?) {
contentColor = MaterialTheme.colorScheme.error contentColor = MaterialTheme.colorScheme.error
) )
) { ) {
// Inner content including an icon and a text label
Icon( Icon(
imageVector = Icons.Default.Clear, imageVector = Icons.Default.Clear,
contentDescription = "Favorite", contentDescription = "Favorite",
@ -122,8 +157,13 @@ fun Cart(navController: NavController?) {
confirmButton = { confirmButton = {
TextButton( TextButton(
onClick = { onClick = {
GlobalScope.launch (Dispatchers.Main) {
coffee.uid?.let {
AppDatabase.getInstance(context).cartDao().deleteCoffee(it, 1)
}
}
openDialog.value = false openDialog.value = false
/* TODO */
} }
) { ) {
Text("Да") Text("Да")

View File

@ -67,7 +67,7 @@ fun Login(navController: NavController?) {
placeholder = painterResource(R.drawable.loading_img), placeholder = painterResource(R.drawable.loading_img),
contentDescription = "Кофе", contentDescription = "Кофе",
contentScale = ContentScale.Crop, contentScale = ContentScale.Crop,
modifier = Modifier.size(100.dp) modifier = Modifier.size(150.dp)
) )
Spacer(modifier = Modifier.padding(all = 20.dp)) Spacer(modifier = Modifier.padding(all = 20.dp))
@ -93,6 +93,7 @@ fun Login(navController: NavController?) {
GlobalScope.launch (Dispatchers.Main) { GlobalScope.launch (Dispatchers.Main) {
user = AppDatabase.getInstance(context).userDao().tryLogin(login, password) user = AppDatabase.getInstance(context).userDao().tryLogin(login, password)
if (user != null) { if (user != null) {
AppDatabase.getInstance(context).userDao().logout()
AppDatabase.getInstance(context).userDao().setLogined(user!!.uid!!) AppDatabase.getInstance(context).userDao().setLogined(user!!.uid!!)
navController?.navigate(Screen.CoffeeList.route) navController?.navigate(Screen.CoffeeList.route)
} else { } else {
@ -100,7 +101,6 @@ fun Login(navController: NavController?) {
login = "Неверный логин или пароль" login = "Неверный логин или пароль"
} }
} }
}, },
shape = CircleShape, shape = CircleShape,
modifier = Modifier.fillMaxWidth(fraction = 0.75f), modifier = Modifier.fillMaxWidth(fraction = 0.75f),
@ -109,7 +109,6 @@ fun Login(navController: NavController?) {
contentColor = MaterialTheme.colorScheme.primary contentColor = MaterialTheme.colorScheme.primary
) )
) { ) {
// Inner content including an icon and a text label
Icon( Icon(
imageVector = Icons.Default.Check, imageVector = Icons.Default.Check,
contentDescription = "Favorite", contentDescription = "Favorite",

View File

@ -30,17 +30,22 @@ import androidx.compose.material3.TimePicker
import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberDatePickerState
import androidx.compose.material3.rememberTimePickerState import androidx.compose.material3.rememberTimePickerState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import androidx.navigation.NavController import androidx.navigation.NavController
import com.zyzf.coffeepreorder.composeui.navigation.Screen import com.zyzf.coffeepreorder.composeui.navigation.Screen
import com.zyzf.coffeepreorder.database.AppDatabase
import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Calendar import java.util.Calendar
import java.util.Date import java.util.Date
@ -55,6 +60,13 @@ fun Order(navController: NavController?) {
val datePickerState = rememberDatePickerState(initialSelectedDateMillis = calendar.timeInMillis) val datePickerState = rememberDatePickerState(initialSelectedDateMillis = calendar.timeInMillis)
val timePickerState = rememberTimePickerState(is24Hour = true, initialHour = calendar.get(Calendar.HOUR_OF_DAY), initialMinute = calendar.get(Calendar.MINUTE)) val timePickerState = rememberTimePickerState(is24Hour = true, initialHour = calendar.get(Calendar.HOUR_OF_DAY), initialMinute = calendar.get(Calendar.MINUTE))
val formatter = SimpleDateFormat("dd.MM.yyyy", Locale.ROOT) val formatter = SimpleDateFormat("dd.MM.yyyy", Locale.ROOT)
val context = LocalContext.current
val sum = remember { mutableStateOf(0.0) }
LaunchedEffect(Unit) {
withContext(Dispatchers.IO) {
sum.value = AppDatabase.getInstance(context).coffeeDao().getSumInCart()
}
}
Column(Modifier.padding(all = 10.dp), horizontalAlignment = Alignment.CenterHorizontally) { Column(Modifier.padding(all = 10.dp), horizontalAlignment = Alignment.CenterHorizontally) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center, Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically) { verticalAlignment = Alignment.CenterVertically) {
@ -91,7 +103,7 @@ fun Order(navController: NavController?) {
} }
} }
Spacer(modifier = Modifier.padding(all = 20.dp)) Spacer(modifier = Modifier.padding(all = 20.dp))
Text(text = "Сумма: xxx") Text(text = "Сумма: ${sum.value}")
} }
Box(modifier = Modifier.fillMaxSize()) { Box(modifier = Modifier.fillMaxSize()) {
ExtendedFloatingActionButton( ExtendedFloatingActionButton(

View File

@ -26,8 +26,10 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -43,41 +45,51 @@ import com.zyzf.coffeepreorder.composeui.navigation.Screen
import com.zyzf.coffeepreorder.database.AppDatabase import com.zyzf.coffeepreorder.database.AppDatabase
import com.zyzf.coffeepreorder.database.model.User import com.zyzf.coffeepreorder.database.model.User
import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@OptIn(DelicateCoroutinesApi::class)
@Composable @Composable
fun Profile(navController: NavController?) { fun Profile(navController: NavController?) {
val openDialogEdit = remember { mutableStateOf(false) } val openDialogEdit = remember { mutableStateOf(false) }
val openDialogExit = remember { mutableStateOf(false) } val openDialogExit = remember { mutableStateOf(false) }
val openDialogDelete = remember { mutableStateOf(false) } val openDialogDelete = remember { mutableStateOf(false) }
val context = LocalContext.current val context = LocalContext.current
val user = remember { mutableStateOf<User>(User("", "", "", "")) } var user: User by remember { mutableStateOf(User("", "", "", "")) }
var userLogin by remember { mutableStateOf("") }
var userFIO by remember { mutableStateOf("") }
var userPhone by remember { mutableStateOf("") }
val userOldPsswd = remember { mutableStateOf("") } val userOldPsswd = remember { mutableStateOf("") }
val userNewPsswd = remember { mutableStateOf("") } val userNewPsswd = remember { mutableStateOf("") }
val userNewPsswdConf = remember { mutableStateOf("") } val userNewPsswdConf = remember { mutableStateOf("") }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
user.value = AppDatabase.getInstance(context).userDao().getLogined() user = AppDatabase.getInstance(context).userDao().getLogined()
userLogin = user.login
userFIO = user.fio
userPhone = user.phone
} }
} }
Column(Modifier.padding(all = 10.dp), horizontalAlignment = Alignment.CenterHorizontally) { Column(Modifier.padding(all = 10.dp), horizontalAlignment = Alignment.CenterHorizontally) {
OutlinedTextField(modifier = Modifier.fillMaxWidth(), OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = user.value.login, onValueChange = {user.value.login = it}, value = userLogin, onValueChange = {userLogin = it},
label = { label = {
Text(stringResource(id = R.string.profile_login_label)) Text(stringResource(id = R.string.profile_login_label))
}, },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
OutlinedTextField(modifier = Modifier.fillMaxWidth(), OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = user.value.fio, onValueChange = {user.value.fio = it}, value = userFIO, onValueChange = {userFIO = it},
label = { label = {
Text(stringResource(id = R.string.profile_fio_label)) Text(stringResource(id = R.string.profile_fio_label))
}, },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
OutlinedTextField(modifier = Modifier.fillMaxWidth(), OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = user.value.phone, onValueChange = {user.value.phone = it}, value = userPhone, onValueChange = {userPhone = it},
label = { label = {
Text(stringResource(id = R.string.profile_phone_label)) Text(stringResource(id = R.string.profile_phone_label))
} }
@ -180,8 +192,13 @@ fun Profile(navController: NavController?) {
confirmButton = { confirmButton = {
TextButton( TextButton(
onClick = { onClick = {
GlobalScope.launch (Dispatchers.Main) {
if (userOldPsswd.value == user.password && userNewPsswd.value == userNewPsswdConf.value) {
AppDatabase.getInstance(context).userDao().update(user.uid!!, userLogin, userFIO, userPhone, userNewPsswd.value)
user = AppDatabase.getInstance(context).userDao().getLogined()
}
}
openDialogEdit.value = false openDialogEdit.value = false
/* TODO */
} }
) { ) {
Text("Да") Text("Да")
@ -215,6 +232,9 @@ fun Profile(navController: NavController?) {
confirmButton = { confirmButton = {
TextButton( TextButton(
onClick = { onClick = {
GlobalScope.launch (Dispatchers.Main) {
AppDatabase.getInstance(context).userDao().logout()
}
openDialogExit.value = false openDialogExit.value = false
navController?.navigate(Screen.Login.route) navController?.navigate(Screen.Login.route)
} }
@ -250,8 +270,12 @@ fun Profile(navController: NavController?) {
confirmButton = { confirmButton = {
TextButton( TextButton(
onClick = { onClick = {
GlobalScope.launch (Dispatchers.Main) {
AppDatabase.getInstance(context).userDao().logout()
AppDatabase.getInstance(context).userDao().delete(user.uid!!)
}
openDialogDelete.value = false openDialogDelete.value = false
/* TODO */ navController?.navigate(Screen.Login.route)
} }
) { ) {
Text("Да") Text("Да")

View File

@ -2,13 +2,13 @@ package com.zyzf.coffeepreorder.composeui
import android.content.res.Configuration import android.content.res.Configuration
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.Button import androidx.compose.material3.Button
@ -19,65 +19,110 @@ import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController import androidx.navigation.NavController
import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.zyzf.coffeepreorder.R import com.zyzf.coffeepreorder.R
import com.zyzf.coffeepreorder.composeui.navigation.Screen import com.zyzf.coffeepreorder.composeui.navigation.Screen
import com.zyzf.coffeepreorder.database.AppDatabase
import com.zyzf.coffeepreorder.database.model.User
import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
@OptIn(DelicateCoroutinesApi::class)
@Composable @Composable
fun Register(navController: NavController?) { fun Register(navController: NavController?) {
val context = LocalContext.current
var login: String by remember { mutableStateOf("") }
var fio: String by remember { mutableStateOf("") }
var phone: String by remember { mutableStateOf("") }
var password: String by remember { mutableStateOf("") }
var confPassword: String by remember { mutableStateOf("") }
Column(Modifier.padding(all = 10.dp), horizontalAlignment = Alignment.CenterHorizontally) { Column(Modifier.padding(all = 10.dp), horizontalAlignment = Alignment.CenterHorizontally) {
Image( AsyncImage(
painter = painterResource(id = R.drawable.coffee_image), model = ImageRequest.Builder(context = LocalContext.current).data("https://zyzf.space/s/YsHjPo3NDmoptSk/download/coffee_image.png")
contentDescription = "Logo", .crossfade(true).build(),
error = painterResource(R.drawable.ic_broken_image),
placeholder = painterResource(R.drawable.loading_img),
contentDescription = "Кофе",
contentScale = ContentScale.Crop,
modifier = Modifier.size(150.dp) modifier = Modifier.size(150.dp)
) )
Spacer(modifier = Modifier.padding(all = 20.dp)) Spacer(modifier = Modifier.padding(all = 20.dp))
OutlinedTextField(modifier = Modifier.fillMaxWidth(), OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = "", onValueChange = {}, readOnly = true, value = login, onValueChange = {login = it},
label = { label = {
Text(stringResource(id = R.string.profile_login_label)) Text(stringResource(id = R.string.profile_login_label))
} }
) )
OutlinedTextField(modifier = Modifier.fillMaxWidth(), OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = "", onValueChange = {}, readOnly = true, value = fio, onValueChange = {fio = it},
label = { label = {
Text(stringResource(id = R.string.profile_fio_label)) Text(stringResource(id = R.string.profile_fio_label))
} }
) )
OutlinedTextField(modifier = Modifier.fillMaxWidth(), OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = "", onValueChange = {}, readOnly = true, value = phone, onValueChange = {phone = it},
label = { label = {
Text(stringResource(id = R.string.profile_phone_label)) Text(stringResource(id = R.string.profile_phone_label))
} }
) )
OutlinedTextField(modifier = Modifier.fillMaxWidth(), OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = "", onValueChange = {}, readOnly = true, value = password, onValueChange = {password = it},
label = { label = {
Text(stringResource(id = R.string.profile_oldpassw_label)) Text(stringResource(id = R.string.profile_passw_label))
} },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
visualTransformation = PasswordVisualTransformation()
) )
OutlinedTextField(modifier = Modifier.fillMaxWidth(), OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = "", onValueChange = {}, readOnly = true, value = confPassword, onValueChange = {confPassword = it},
label = {
Text(stringResource(id = R.string.profile_newpassw_label))
}
)
OutlinedTextField(modifier = Modifier.fillMaxWidth(),
value = "", onValueChange = {}, readOnly = true,
label = { label = {
Text(stringResource(id = R.string.profile_confpassw_label)) Text(stringResource(id = R.string.profile_confpassw_label))
} },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
visualTransformation = PasswordVisualTransformation()
) )
Spacer(modifier = Modifier.padding(all = 20.dp)) Spacer(modifier = Modifier.padding(all = 20.dp))
Button( Button(
onClick = { navController?.navigate(Screen.CoffeeList.route) }, onClick = {
var user: User?
GlobalScope.launch (Dispatchers.Main) {
if (password == confPassword) {
AppDatabase.getInstance(context).userDao().insert(User(login, fio, phone, password))
user = AppDatabase.getInstance(context).userDao().tryLogin(login, password)
if (user != null) {
AppDatabase.getInstance(context).userDao().logout()
AppDatabase.getInstance(context).userDao().setLogined(user!!.uid!!)
navController?.navigate(Screen.CoffeeList.route)
} else {
password = ""
login = "Неверный логин или пароль"
}
} else {
password = ""
confPassword = ""
login = "Пароль не совпадает с подтверждением пароля"
}
}
},
shape = CircleShape, shape = CircleShape,
modifier = Modifier.fillMaxWidth(fraction = 0.75f), modifier = Modifier.fillMaxWidth(fraction = 0.75f),
colors = ButtonDefaults.buttonColors( colors = ButtonDefaults.buttonColors(
@ -85,7 +130,6 @@ fun Register(navController: NavController?) {
contentColor = MaterialTheme.colorScheme.primary contentColor = MaterialTheme.colorScheme.primary
) )
) { ) {
// Inner content including an icon and a text label
Icon( Icon(
imageVector = Icons.Default.Add, imageVector = Icons.Default.Add,
contentDescription = "Favorite", contentDescription = "Favorite",

View File

@ -13,6 +13,12 @@ interface CoffeeDao {
@Query("select * from coffee order by name collate nocase asc") @Query("select * from coffee order by name collate nocase asc")
fun getAll(): Flow<List<Coffee>> fun getAll(): Flow<List<Coffee>>
@Query("select * from coffee where cart_id is not null and count > 0 order by name collate nocase asc")
fun getAllInCart(): Flow<List<Coffee>>
@Query("select sum(cost) from coffee where cart_id is not null and count > 0")
fun getSumInCart(): Double
@Query("select coffee.uid, name, cost, ingredients, cart_id, count, cart.uid as cart_uid from coffee left join cart on coffee.cart_id = cart.uid where coffee.uid = :uid") @Query("select coffee.uid, name, cost, ingredients, cart_id, count, cart.uid as cart_uid from coffee left join cart on coffee.cart_id = cart.uid where coffee.uid = :uid")
suspend fun getByUid(uid: Int): CoffeeWithCart suspend fun getByUid(uid: Int): CoffeeWithCart

View File

@ -1,10 +1,8 @@
package com.zyzf.coffeepreorder.database.dao package com.zyzf.coffeepreorder.database.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.Query import androidx.room.Query
import androidx.room.Update
import com.zyzf.coffeepreorder.database.model.User import com.zyzf.coffeepreorder.database.model.User
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -19,7 +17,7 @@ interface UserDao {
@Query("select * from user where uid = :uid") @Query("select * from user where uid = :uid")
suspend fun getByUid(uid: Int): User suspend fun getByUid(uid: Int): User
@Query("select * from user left join user_logined on user_logined.user_id = user.uid limit 1") @Query("select user.uid, login, fio, phone, password from user join user_logined on user_logined.user_id = user.uid limit 1")
suspend fun getLogined(): User suspend fun getLogined(): User
@Query("insert into user_logined (user_id) values (:userId)") @Query("insert into user_logined (user_id) values (:userId)")
@ -30,9 +28,9 @@ interface UserDao {
@Insert @Insert
suspend fun insert(user: User) suspend fun insert(user: User)
@Update @Query("update user set login = :login, fio = :fio, phone = :phone, password = :password where uid = :uid")
suspend fun update(user: User) suspend fun update(uid: Int, login: String, fio: String, phone: String, password: String) : Int
@Delete @Query("delete from user where uid = :uid")
suspend fun delete(user: User) suspend fun delete(uid: Int)
} }

View File

@ -7,7 +7,7 @@ import androidx.room.PrimaryKey
@Entity(tableName = "cart") @Entity(tableName = "cart")
data class Cart( data class Cart(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
val uid: Int? val uid: Int?,
) { ) {
@Ignore @Ignore
constructor() : this(null) constructor() : this(null)
@ -15,7 +15,7 @@ data class Cart(
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (javaClass != other?.javaClass) return false if (javaClass != other?.javaClass) return false
other as User other as Cart
if (uid != other.uid) return false if (uid != other.uid) return false
return true return true
} }

View File

@ -29,7 +29,7 @@ data class UserLogined(
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (javaClass != other?.javaClass) return false if (javaClass != other?.javaClass) return false
other as User other as UserLogined
if (uid != other.uid) return false if (uid != other.uid) return false
return true return true
} }

View File

@ -1,6 +1,6 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins { plugins {
id("com.android.application") version "8.1.3" apply false id("com.android.application") version "8.1.4" apply false
id("org.jetbrains.kotlin.android") version "1.9.10" apply false id("org.jetbrains.kotlin.android") version "1.9.10" apply false
id("com.google.devtools.ksp") version "1.9.10-1.0.13" apply false id("com.google.devtools.ksp") version "1.9.10-1.0.13" apply false
} }