fixed warning, fixed pullrefresh items

This commit is contained in:
Zyzf 2023-12-04 22:53:03 +04:00
parent 702d8972bd
commit 638b9d6aaf
10 changed files with 68 additions and 90 deletions

View File

@ -75,16 +75,16 @@ dependencies {
implementation("androidx.compose.ui:ui-graphics:1.6.0-beta02") implementation("androidx.compose.ui:ui-graphics:1.6.0-beta02")
implementation("androidx.compose.ui:ui-tooling-preview:1.6.0-beta02") implementation("androidx.compose.ui:ui-tooling-preview:1.6.0-beta02")
implementation("androidx.compose.material3:material3:1.1.2") implementation("androidx.compose.material3:material3:1.1.2")
implementation("androidx.compose.material:material:1.5.4")
implementation("androidx.paging:paging-compose:3.2.1") implementation("androidx.paging:paging-compose:3.2.1")
implementation("eu.bambooapps:compose-material3-pullrefresh:1.0.0")
// Room // Room
val room_version = "2.6.1" val roomVersion = "2.6.1"
implementation("androidx.room:room-runtime:$room_version") implementation("androidx.room:room-runtime:$roomVersion")
annotationProcessor("androidx.room:room-compiler:$room_version") annotationProcessor("androidx.room:room-compiler:$roomVersion")
ksp("androidx.room:room-compiler:$room_version") ksp("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$room_version") implementation("androidx.room:room-ktx:$roomVersion")
implementation("androidx.room:room-paging:$room_version") implementation("androidx.room:room-paging:$roomVersion")
// Tests // Tests
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")

View File

@ -6,7 +6,6 @@ import androidx.room.Delete
import androidx.room.Query import androidx.room.Query
import com.zyzf.coffeepreorder.database.model.Coffee import com.zyzf.coffeepreorder.database.model.Coffee
import com.zyzf.coffeepreorder.database.model.CoffeeWithCart import com.zyzf.coffeepreorder.database.model.CoffeeWithCart
import kotlinx.coroutines.flow.Flow
@Dao @Dao
interface CoffeeDao { interface CoffeeDao {

View File

@ -59,6 +59,6 @@ data class Coffee(
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return uid ?: -1 return uid
} }
} }

View File

@ -1,6 +1,5 @@
package com.zyzf.coffeepreorder.ui.cart package com.zyzf.coffeepreorder.ui.cart
import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@ -13,32 +12,25 @@ import androidx.compose.foundation.layout.heightIn
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.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
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.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi
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
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExtendedFloatingActionButton import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface 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.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue 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.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -62,20 +54,17 @@ import androidx.paging.compose.itemKey
import coil.compose.AsyncImage import coil.compose.AsyncImage
import coil.request.ImageRequest import coil.request.ImageRequest
import com.zyzf.coffeepreorder.R import com.zyzf.coffeepreorder.R
import com.zyzf.coffeepreorder.database.AppDatabase
import com.zyzf.coffeepreorder.database.model.Coffee import com.zyzf.coffeepreorder.database.model.Coffee
import com.zyzf.coffeepreorder.ui.AppViewModelProvider import com.zyzf.coffeepreorder.ui.AppViewModelProvider
import com.zyzf.coffeepreorder.ui.coffee.CoffeeList
import com.zyzf.coffeepreorder.ui.coffee.CoffeeListViewModel
import com.zyzf.coffeepreorder.ui.navigation.Screen import com.zyzf.coffeepreorder.ui.navigation.Screen
import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme
import kotlinx.coroutines.DelicateCoroutinesApi import eu.bambooapps.material3.pullrefresh.PullRefreshIndicator
import kotlinx.coroutines.Dispatchers import eu.bambooapps.material3.pullrefresh.pullRefresh
import kotlinx.coroutines.GlobalScope import eu.bambooapps.material3.pullrefresh.rememberPullRefreshState
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@OptIn(DelicateCoroutinesApi::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun Cart( fun Cart(
navController: NavController?, navController: NavController?,
@ -106,21 +95,21 @@ fun Cart(
) )
} }
) { innerPadding -> ) { innerPadding ->
PullRefreshIndicator( Box (modifier = Modifier.padding(0.dp).pullRefresh(state)) {
refreshing, state, PullRefreshIndicator(refreshing = refreshing, state = state,
Modifier modifier = Modifier.zIndex(100f).align(Alignment.TopCenter)
.zIndex(100f) )
) CartList(
CartList( modifier = Modifier
modifier = Modifier .padding(innerPadding).pullRefresh(state)
.padding(innerPadding) .fillMaxSize(),
.fillMaxSize(), coffeeList = coffeeListUiState,
coffeeList = coffeeListUiState, onDeleteFromCartClick = {currentCoffee: Coffee ->
onDeleteFromCartClick = {currentCoffee: Coffee -> coffee.value = currentCoffee
coffee.value = currentCoffee openDialog.value = true
openDialog.value = true }
} )
) }
} }
DeleteFromCartAlertDialog( DeleteFromCartAlertDialog(
openDialog = openDialog, openDialog = openDialog,

View File

@ -11,6 +11,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
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
@ -20,18 +21,12 @@ import androidx.compose.foundation.layout.heightIn
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.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ExperimentalMaterialApi
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.outlined.Create import androidx.compose.material.icons.outlined.Create
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
@ -48,7 +43,6 @@ import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableDoubleStateOf import androidx.compose.runtime.mutableDoubleStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -56,7 +50,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment.Companion.CenterHorizontally
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
@ -80,10 +73,13 @@ import com.zyzf.coffeepreorder.R
import com.zyzf.coffeepreorder.database.model.Coffee import com.zyzf.coffeepreorder.database.model.Coffee
import com.zyzf.coffeepreorder.ui.AppViewModelProvider import com.zyzf.coffeepreorder.ui.AppViewModelProvider
import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme
import eu.bambooapps.material3.pullrefresh.PullRefreshIndicator
import eu.bambooapps.material3.pullrefresh.pullRefresh
import eu.bambooapps.material3.pullrefresh.rememberPullRefreshState
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun CoffeeList( fun CoffeeList(
viewModel: CoffeeListViewModel = viewModel(factory = AppViewModelProvider.Factory) viewModel: CoffeeListViewModel = viewModel(factory = AppViewModelProvider.Factory)
@ -132,46 +128,46 @@ fun CoffeeList(
} }
} }
) { innerPadding -> ) { innerPadding ->
PullRefreshIndicator( Box (modifier = Modifier.padding(0.dp).pullRefresh(state)) {
refreshing, state, PullRefreshIndicator(refreshing = refreshing, state = state,
Modifier modifier = Modifier.zIndex(100f).align(Alignment.TopCenter)
.zIndex(100f) )
) CoffeeList(
CoffeeList( modifier = Modifier
modifier = Modifier .padding(innerPadding)
.padding(innerPadding) .fillMaxSize(),
.fillMaxSize(), coffeeList = coffeeListUiState,
coffeeList = coffeeListUiState, onAddToCartClick = { coffeeUid: Int ->
onAddToCartClick = { coffeeUid: Int -> coroutineScope.launch {
coroutineScope.launch { viewModel.addCoffeeToCart(coffeeUid = coffeeUid)
viewModel.addCoffeeToCart(coffeeUid = coffeeUid) }
},
onEditClick = { currentCoffee: Coffee ->
coroutineScope.launch {
coffee.value = currentCoffee
openDialog.value = true
}
} }
}, )
onEditClick = { curcoffee: Coffee -> }
coroutineScope.launch {
coffee.value = curcoffee
openDialog.value = true
}
}
)
} }
AddEditModalBottomSheet( AddEditModalBottomSheet(
coffee = coffee, coffee = coffee,
sheetState = sheetState, sheetState = sheetState,
openDialog = openDialog, openDialog = openDialog,
onAddClick = { coffee: Coffee, context: Context -> onAddClick = { currentCoffee: Coffee, context: Context ->
coroutineScope.launch { coroutineScope.launch {
viewModel.createCoffee(coffee, imageUri as Uri, context) viewModel.createCoffee(currentCoffee, imageUri as Uri, context)
} }
}, },
onEditClick = { coffee: Coffee, context: Context -> onEditClick = { currentCoffee: Coffee, context: Context ->
coroutineScope.launch { coroutineScope.launch {
viewModel.editCoffee(coffee, imageUri as Uri, context) viewModel.editCoffee(currentCoffee, imageUri as Uri, context)
} }
}, },
onDeleteClick = { coffee: Coffee -> onDeleteClick = { currentCoffee: Coffee ->
coroutineScope.launch { coroutineScope.launch {
viewModel.deleteCoffee(coffee) viewModel.deleteCoffee(currentCoffee)
} }
}, },
photoPicker = photoPicker, photoPicker = photoPicker,
@ -189,8 +185,7 @@ private fun AddEditModalBottomSheet(
onEditClick: (coffee: Coffee, context: Context) -> Unit, onEditClick: (coffee: Coffee, context: Context) -> Unit,
onDeleteClick: (coffee: Coffee) -> Unit, onDeleteClick: (coffee: Coffee) -> Unit,
photoPicker: ManagedActivityResultLauncher<PickVisualMediaRequest, Uri?>, photoPicker: ManagedActivityResultLauncher<PickVisualMediaRequest, Uri?>,
imageUri: Any?, imageUri: Any?
modifier: Modifier = Modifier
) { ) {
var name: String by remember { mutableStateOf("")} var name: String by remember { mutableStateOf("")}
var cost: Double by remember { mutableDoubleStateOf(0.0) } var cost: Double by remember { mutableDoubleStateOf(0.0) }
@ -350,7 +345,7 @@ private fun CoffeeListItem(
.padding(top = 5.dp)) { .padding(top = 5.dp)) {
Button( Button(
onClick = { onClick = {
coffee.uid.let { onAddToCartClick(it) } onAddToCartClick(coffee.uid)
}, },
shape = CircleShape, shape = CircleShape,
modifier = Modifier.fillMaxWidth(fraction = 0.75f) modifier = Modifier.fillMaxWidth(fraction = 0.75f)

View File

@ -55,7 +55,7 @@ class CoffeeListViewModel(
copyFileToSftp(f, "/mnt/nextcloud/data/Zyzf/files/Images") copyFileToSftp(f, "/mnt/nextcloud/data/Zyzf/files/Images")
} }
suspend fun editCoffee(coffee: Coffee, imageUri: Uri, context: Context) { suspend fun editCoffee(coffee: Coffee, imageUri: Uri, context: Context) {
val editedCoffee: Int = coffeeRepository.update(coffee.uid!!, coffee.name, coffee.cost, coffee.ingredients, coffee.cartId, coffee.count)!! val editedCoffee: Int = coffeeRepository.update(coffee.uid, coffee.name, coffee.cost, coffee.ingredients, coffee.cartId, coffee.count)!!
val inputStream = context.contentResolver.openInputStream(imageUri) val inputStream = context.contentResolver.openInputStream(imageUri)
val bitmap = BitmapFactory.decodeStream(inputStream) val bitmap = BitmapFactory.decodeStream(inputStream)

View File

@ -1,4 +1,4 @@
package com.zyzf.coffeepreorder.composeui package com.zyzf.coffeepreorder.ui.login
import android.content.res.Configuration import android.content.res.Configuration
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column

View File

@ -1,6 +1,5 @@
package com.zyzf.coffeepreorder.ui.navigation package com.zyzf.coffeepreorder.ui.navigation
import android.content.res.Configuration
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@ -12,7 +11,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
@ -20,7 +18,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.NavDestination import androidx.navigation.NavDestination
import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavGraph.Companion.findStartDestination
@ -30,13 +27,12 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.zyzf.coffeepreorder.R import com.zyzf.coffeepreorder.R
import com.zyzf.coffeepreorder.composeui.Login
import com.zyzf.coffeepreorder.ui.cart.Cart import com.zyzf.coffeepreorder.ui.cart.Cart
import com.zyzf.coffeepreorder.ui.coffee.CoffeeList import com.zyzf.coffeepreorder.ui.coffee.CoffeeList
import com.zyzf.coffeepreorder.ui.login.Login
import com.zyzf.coffeepreorder.ui.order.Order import com.zyzf.coffeepreorder.ui.order.Order
import com.zyzf.coffeepreorder.ui.profile.Profile import com.zyzf.coffeepreorder.ui.profile.Profile
import com.zyzf.coffeepreorder.ui.register.Register import com.zyzf.coffeepreorder.ui.register.Register
import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@ -115,7 +111,6 @@ fun Navhost(
} }
} }
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun MainNavbar() { fun MainNavbar() {
val navController = rememberNavController() val navController = rememberNavController()

View File

@ -43,7 +43,7 @@ enum class Screen(
fun getItem(route: String): Screen? { fun getItem(route: String): Screen? {
val findRoute = route.split("/").first() val findRoute = route.split("/").first()
return values().find { value -> value.route.startsWith(findRoute) } return entries.find { value -> value.route.startsWith(findRoute) }
} }
} }
} }

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector>
</selector> </selector>