final
This commit is contained in:
parent
534babe2ea
commit
e3e4d1cacb
@ -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 {
|
||||||
|
|
||||||
|
@ -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("Да")
|
||||||
|
@ -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",
|
||||||
|
@ -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(
|
||||||
|
@ -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("Да")
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user