Updated item list view

This commit is contained in:
Mitchel
2023-04-10 15:28:29 +02:00
parent 79ed64760c
commit da2c98ce83
8 changed files with 88 additions and 25 deletions

View File

@@ -65,7 +65,7 @@ dependencies {
// ViewModel // ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1" implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1"
implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.core:core-ktx:1.10.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.activity:activity-compose:1.7.0' implementation 'androidx.activity:activity-compose:1.7.0'
implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.ui:ui:$compose_version"

View File

@@ -1,7 +1,6 @@
package com.mitchelbv.thuis_c package com.mitchelbv.thuis_c
import android.os.Bundle import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -81,14 +80,18 @@ class MainActivity : ComponentActivity() {
// Freezer screens // Freezer screens
composable(route = FreezerListDestination.route) { composable(route = FreezerListDestination.route) {
FreezerScreen( FreezerScreen(
onClickToFreezer = {freezer_id -> onClickToFreezer = { freezer_id ->
navController.navigate("${FreezerItemListDestination.route}/${freezer_id}") navController.navigate("${FreezerItemListDestination.route}/${freezer_id}")
} }
) )
} }
composable(route = "${FreezerItemListDestination.route}/{freezer_id}") { backStackEntry -> composable(route = "${FreezerItemListDestination.route}/{freezer_id}") { backStackEntry ->
FreezerItemListScreen(freezer_id = backStackEntry.arguments?.getString("freezer_id")!!.toInt(), onClickItem = {}) FreezerItemListScreen(
freezer_id = backStackEntry.arguments?.getString("freezer_id")!!.toInt(),
onEditItem = {
// I want onClickItem to open a modal dialog, so not sure if this is needed here...
})
} }
} }
} }

View File

@@ -54,7 +54,7 @@ interface ThuisService {
// Put // Put
@PUT("api/FreezerItem/{id}") @PUT("api/FreezerItem/{id}")
suspend fun putFreezerItem(@Body freezerItem: FreezerItem): FreezerItem suspend fun putFreezerItem(@Path("id") id: Int, @Body freezerItem: FreezerItem): FreezerItem
// Delete // Delete
@DELETE("api/FreezerItem/{id}") @DELETE("api/FreezerItem/{id}")

View File

@@ -48,7 +48,7 @@ fun FreezerList(
CircularProgressIndicator() CircularProgressIndicator()
} }
} }
if (freezerUiState.value.freezers.isNotEmpty()) { if (freezerUiState.value.freezers.isNotEmpty() && !freezerUiState.value.loading) {
LazyColumn { LazyColumn {
items(freezerUiState.value.freezers) { freezer -> items(freezerUiState.value.freezers) { freezer ->
FreezerListItem( FreezerListItem(

View File

@@ -1,46 +1,84 @@
package com.mitchelbv.thuis_c.views.freezer.item_list package com.mitchelbv.thuis_c.views.freezer.item_list
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.foundation.layout.*
import androidx.compose.material3.ListItem import androidx.compose.material.icons.Icons
import androidx.compose.material3.Text import androidx.compose.material.icons.filled.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.CreationExtras
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.mitchelbv.thuis_c.R import com.mitchelbv.thuis_c.R
import com.mitchelbv.thuis_c.network.thuis.responses.FreezerItem import com.mitchelbv.thuis_c.network.thuis.responses.FreezerItem
import com.mitchelbv.thuis_c.views.freezer.FreezerListItem import com.mitchelbv.thuis_c.ui.theme.ThuisTypography
// Is the destination of FreezerItemListDestination // Is the destination of FreezerItemListDestination
@Composable @Composable
fun FreezerItemListScreen( fun FreezerItemListScreen(
freezer_id: Int, freezer_id: Int,
freezerItemListViewModel: FreezerItemListViewModel = viewModel(), freezerItemListViewModel: FreezerItemListViewModel = viewModel(),
onClickItem: (item_id: Int) -> Unit onEditItem: (Int) -> Unit
) { ) {
val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState() val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState()
freezerItemListViewModel.fillItemList(freezer_id) freezerItemListViewModel.fillItemList(freezer_id)
FreezerItemList(freezerItemListUiState.items) FreezerItemList(freezerItemListUiState.items, arrowPressed = { kaas: Int, baas: Int -> freezerItemListViewModel.UpdateItemAmount(kaas, baas) }, onEditItem = onEditItem)
} }
@Composable @Composable
fun FreezerItemList(freezerItems: List<FreezerItem>) { fun FreezerItemList(
freezerItems: List<FreezerItem>,
arrowPressed: (Int, Int) -> Unit,
onEditItem: (Int) -> Unit
) {
freezerItems.forEach { freezerItem -> freezerItems.forEach { freezerItem ->
FreezerItemElement(freezerItem) FreezerItemElement(freezerItem, arrowPressed = arrowPressed, onEditItem = onEditItem)
} }
} }
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun FreezerItemElement(freezerItem: FreezerItem) { fun FreezerItemElement(
freezerItem: FreezerItem,
arrowPressed: (Int, Int) -> Unit,
onEditItem: (Int) -> Unit
) {
ListItem( ListItem(
headlineText = { Text(freezerItem.item!!) }, headlineText = { Text(freezerItem.item!!) },
supportingText = { Text("${stringResource(R.string.freezer_item_drawer_partial)} ${freezerItem.drawer!!}") }, supportingText = { Text("${stringResource(R.string.freezer_item_drawer_partial)} ${freezerItem.drawer!!}") },
trailingContent = { trailingContent = {
// - 5 + with calls to api and such... Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceEvenly
) {
TextButton(onClick = { arrowPressed(freezerItem.freezerItemId!!, 1) }) {
Icon(Icons.Default.KeyboardArrowDown, contentDescription = "Minus one")
}
Text("${freezerItem.amount}", style = ThuisTypography.bodyLarge)
TextButton(onClick = { arrowPressed(freezerItem.freezerItemId!!, -1) }) {
Icon(Icons.Default.KeyboardArrowUp, contentDescription = "Plus one")
}
TextButton(onClick = { onEditItem(freezerItem.freezerItemId!!) }) {
Icon(Icons.Default.Edit, contentDescription = "Edit ${freezerItem.item}")
}
}
} }
) )
} }
//@Preview
//@Composable
//fun FreezerItemElementPreview() {
// val freezerItem = FreezerItem(
// freezerItemId = 1,
// item = "Kip",
// amount = 5,
// drawer = 1,
// dateTimeAdded = "now",
// freezerId = 1
// )
// FreezerItemElement(freezerItem = freezerItem)
// FreezerItemElement(freezerItem = freezerItem)
// FreezerItemElement(freezerItem = freezerItem)
//}

View File

@@ -11,24 +11,42 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.net.ConnectException import java.net.ConnectException
data class FreezerItemListUiState(val items: List<FreezerItem> = listOf()) data class FreezerItemListUiState(var items: List<FreezerItem> = mutableListOf())
class FreezerItemListViewModel : ViewModel() { class FreezerItemListViewModel : ViewModel() {
private val _uiState = MutableStateFlow(FreezerItemListUiState()) private val _uiState = MutableStateFlow(FreezerItemListUiState())
val uiState: StateFlow<FreezerItemListUiState> = _uiState.asStateFlow() val uiState: StateFlow<FreezerItemListUiState> = _uiState.asStateFlow()
// init { // init {
// fillItemList() // fillItemList()
// } // }
fun fillItemList(freezer_id: Int) { fun fillItemList(freezer_id: Int) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
try { try {
val apiResponse = ThuisRetrofitHelper.thuis.getFreezerItemsInFreezer(id = freezer_id) val apiResponse =
ThuisRetrofitHelper.thuis.getFreezerItemsInFreezer(id = freezer_id)
_uiState.value = FreezerItemListUiState(apiResponse) _uiState.value = FreezerItemListUiState(apiResponse)
} catch (e: ConnectException) { } catch (e: ConnectException) {
_uiState.value = FreezerItemListUiState(listOf(FreezerItem(item = "error"))) _uiState.value = FreezerItemListUiState(listOf(FreezerItem(item = "error")))
} }
} }
} }
// new model instead of this?
fun UpdateItemAmount(item_id: Int, operation: Int) {
viewModelScope.launch(Dispatchers.IO) {
try {
val indexFreezerItem =
uiState.value.items.indexOf(uiState.value.items.find { a -> a.freezerItemId == item_id })
val freezerItemToUpdate = uiState.value.items[indexFreezerItem]
freezerItemToUpdate.amount?.plus(operation)
val apiResponse =
ThuisRetrofitHelper.thuis.putFreezerItem(item_id, freezerItemToUpdate)
} catch (e: ConnectException) {
// Nothing to do really?
// Maybe a snackbar...
}
}
}
} }

View File

@@ -1,6 +1,6 @@
buildscript { buildscript {
ext { ext {
compose_version = '1.4.0' compose_version = '1.4.1'
} }
}// 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 {

4
temp.txt Normal file
View File

@@ -0,0 +1,4 @@
https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#NavigationBar(androidx.compose.ui.Modifier,androidx.compose.ui.graphics.Color,androidx.compose.ui.graphics.Color,androidx.compose.ui.unit.Dp,androidx.compose.foundation.layout.WindowInsets,kotlin.Function1)
https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#Scaffold(androidx.compose.ui.Modifier,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Function0,androidx.compose.material3.FabPosition,androidx.compose.ui.graphics.Color,androidx.compose.ui.graphics.Color,androidx.compose.foundation.layout.WindowInsets,kotlin.Function1)