From da2c98ce838de46c51397bb0ab63be3869deba90 Mon Sep 17 00:00:00 2001 From: Mitchel Date: Mon, 10 Apr 2023 15:28:29 +0200 Subject: [PATCH] Updated item list view --- app/build.gradle | 2 +- .../com/mitchelbv/thuis_c/MainActivity.kt | 9 ++- .../thuis_c/network/thuis/ThuisService.kt | 2 +- .../thuis_c/views/freezer/FreezerView.kt | 2 +- .../freezer/item_list/FreezerItemListView.kt | 64 +++++++++++++++---- .../item_list/FreezerItemListViewModel.kt | 28 ++++++-- build.gradle | 2 +- temp.txt | 4 ++ 8 files changed, 88 insertions(+), 25 deletions(-) create mode 100644 temp.txt diff --git a/app/build.gradle b/app/build.gradle index 2baab5f..7e73c67 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,7 +65,7 @@ dependencies { // ViewModel 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.activity:activity-compose:1.7.0' implementation "androidx.compose.ui:ui:$compose_version" diff --git a/app/src/main/java/com/mitchelbv/thuis_c/MainActivity.kt b/app/src/main/java/com/mitchelbv/thuis_c/MainActivity.kt index 2bf02ab..8fbabba 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/MainActivity.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/MainActivity.kt @@ -1,7 +1,6 @@ package com.mitchelbv.thuis_c import android.os.Bundle -import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.padding @@ -81,14 +80,18 @@ class MainActivity : ComponentActivity() { // Freezer screens composable(route = FreezerListDestination.route) { FreezerScreen( - onClickToFreezer = {freezer_id -> + onClickToFreezer = { freezer_id -> navController.navigate("${FreezerItemListDestination.route}/${freezer_id}") } ) } 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... + }) } } } diff --git a/app/src/main/java/com/mitchelbv/thuis_c/network/thuis/ThuisService.kt b/app/src/main/java/com/mitchelbv/thuis_c/network/thuis/ThuisService.kt index 5599066..9abd964 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/network/thuis/ThuisService.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/network/thuis/ThuisService.kt @@ -54,7 +54,7 @@ interface ThuisService { // Put @PUT("api/FreezerItem/{id}") - suspend fun putFreezerItem(@Body freezerItem: FreezerItem): FreezerItem + suspend fun putFreezerItem(@Path("id") id: Int, @Body freezerItem: FreezerItem): FreezerItem // Delete @DELETE("api/FreezerItem/{id}") diff --git a/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/FreezerView.kt b/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/FreezerView.kt index 6887ce3..e886805 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/FreezerView.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/FreezerView.kt @@ -48,7 +48,7 @@ fun FreezerList( CircularProgressIndicator() } } - if (freezerUiState.value.freezers.isNotEmpty()) { + if (freezerUiState.value.freezers.isNotEmpty() && !freezerUiState.value.loading) { LazyColumn { items(freezerUiState.value.freezers) { freezer -> FreezerListItem( diff --git a/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/item_list/FreezerItemListView.kt b/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/item_list/FreezerItemListView.kt index bbdbea6..7a8eff1 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/item_list/FreezerItemListView.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/item_list/FreezerItemListView.kt @@ -1,46 +1,84 @@ package com.mitchelbv.thuis_c.views.freezer.item_list -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ListItem -import androidx.compose.material3.Text +import androidx.compose.foundation.layout.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.* +import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment import androidx.compose.ui.res.stringResource -import androidx.lifecycle.viewmodel.CreationExtras import androidx.lifecycle.viewmodel.compose.viewModel import com.mitchelbv.thuis_c.R 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 @Composable fun FreezerItemListScreen( freezer_id: Int, freezerItemListViewModel: FreezerItemListViewModel = viewModel(), - onClickItem: (item_id: Int) -> Unit + onEditItem: (Int) -> Unit ) { val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState() freezerItemListViewModel.fillItemList(freezer_id) - FreezerItemList(freezerItemListUiState.items) + FreezerItemList(freezerItemListUiState.items, arrowPressed = { kaas: Int, baas: Int -> freezerItemListViewModel.UpdateItemAmount(kaas, baas) }, onEditItem = onEditItem) } @Composable -fun FreezerItemList(freezerItems: List) { +fun FreezerItemList( + freezerItems: List, + arrowPressed: (Int, Int) -> Unit, + onEditItem: (Int) -> Unit +) { freezerItems.forEach { freezerItem -> - FreezerItemElement(freezerItem) + FreezerItemElement(freezerItem, arrowPressed = arrowPressed, onEditItem = onEditItem) } } @OptIn(ExperimentalMaterial3Api::class) @Composable -fun FreezerItemElement(freezerItem: FreezerItem) { +fun FreezerItemElement( + freezerItem: FreezerItem, + arrowPressed: (Int, Int) -> Unit, + onEditItem: (Int) -> Unit +) { ListItem( headlineText = { Text(freezerItem.item!!) }, supportingText = { Text("${stringResource(R.string.freezer_item_drawer_partial)} ${freezerItem.drawer!!}") }, 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}") + } + } } ) -} \ No newline at end of file +} + +//@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) +//} \ No newline at end of file diff --git a/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/item_list/FreezerItemListViewModel.kt b/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/item_list/FreezerItemListViewModel.kt index 2529dd6..33e2dca 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/item_list/FreezerItemListViewModel.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/views/freezer/item_list/FreezerItemListViewModel.kt @@ -11,24 +11,42 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import java.net.ConnectException -data class FreezerItemListUiState(val items: List = listOf()) +data class FreezerItemListUiState(var items: List = mutableListOf()) class FreezerItemListViewModel : ViewModel() { - private val _uiState = MutableStateFlow(FreezerItemListUiState()) + private val _uiState = MutableStateFlow(FreezerItemListUiState()) val uiState: StateFlow = _uiState.asStateFlow() // init { // fillItemList() // } - fun fillItemList(freezer_id: Int) { + fun fillItemList(freezer_id: Int) { viewModelScope.launch(Dispatchers.IO) { try { - val apiResponse = ThuisRetrofitHelper.thuis.getFreezerItemsInFreezer(id = freezer_id) + val apiResponse = + ThuisRetrofitHelper.thuis.getFreezerItemsInFreezer(id = freezer_id) _uiState.value = FreezerItemListUiState(apiResponse) - } catch (e: ConnectException) { + } catch (e: ConnectException) { _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... + } + } + } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index e3009a5..55316c8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { 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. plugins { diff --git a/temp.txt b/temp.txt new file mode 100644 index 0000000..fb9cf64 --- /dev/null +++ b/temp.txt @@ -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) \ No newline at end of file