Updated item list view
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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...
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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)
|
||||||
|
//}
|
||||||
@@ -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...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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
4
temp.txt
Normal 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)
|
||||||
Reference in New Issue
Block a user