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 8fbabba..442d05a 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/MainActivity.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/MainActivity.kt @@ -90,7 +90,7 @@ class MainActivity : ComponentActivity() { 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... + // I want onEditItem to open a modal dialog, so not sure if this is needed here... }) } } diff --git a/app/src/main/java/com/mitchelbv/thuis_c/ThuisDestination.kt b/app/src/main/java/com/mitchelbv/thuis_c/ThuisDestination.kt index ed52e31..815df60 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/ThuisDestination.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/ThuisDestination.kt @@ -38,7 +38,7 @@ object FreezerListDestination : ThuisDestination { object FreezerItemListDestination : ThuisDestination { override val icon = Icons.Default.DateRange override val destinationName = R.string.home_card_freezer - override val route = "freezer_item_list/" + override val route = "freezer_item_list" } object FreezerItemDetail : ThuisDestination { 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 9abd964..5894826 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 @@ -1,6 +1,7 @@ package com.mitchelbv.thuis_c.network.thuis import com.mitchelbv.thuis_c.network.thuis.responses.* +import retrofit2.Response import retrofit2.http.* interface ThuisService { @@ -54,7 +55,7 @@ interface ThuisService { // Put @PUT("api/FreezerItem/{id}") - suspend fun putFreezerItem(@Path("id") id: Int, @Body freezerItem: FreezerItem): FreezerItem + suspend fun putFreezerItem(@Path("id") id: Int, @Body freezerItem: FreezerItem): Response // Delete @DELETE("api/FreezerItem/{id}") diff --git a/app/src/main/java/com/mitchelbv/thuis_c/network/thuis/responses/FreezerItem.kt b/app/src/main/java/com/mitchelbv/thuis_c/network/thuis/responses/FreezerItem.kt index ad92036..3a1578c 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/network/thuis/responses/FreezerItem.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/network/thuis/responses/FreezerItem.kt @@ -8,7 +8,7 @@ data class FreezerItem( @SerializedName("item") var item: String? = null, @SerializedName("amount") var amount: Int? = null, @SerializedName("drawer") var drawer: Int? = null, - @SerializedName("dateTimeAdded") var dateTimeAdded: String? = null, + @SerializedName("dateTimeAdded") var dateTimeAdded: String? = "", @SerializedName("freezerId") var freezerId: Int? = null ) \ No newline at end of file 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 7a8eff1..bb019c9 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 @@ -4,15 +4,15 @@ 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.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.res.stringResource +import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.ui.theme.ThuisTypography +import okhttp3.internal.notifyAll // Is the destination of FreezerItemListDestination @Composable @@ -23,7 +23,24 @@ fun FreezerItemListScreen( ) { val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState() freezerItemListViewModel.fillItemList(freezer_id) - FreezerItemList(freezerItemListUiState.items, arrowPressed = { kaas: Int, baas: Int -> freezerItemListViewModel.UpdateItemAmount(kaas, baas) }, onEditItem = onEditItem) + freezerItemListUiState.items.forEach { freezerItem -> + FreezerItemElement(freezerItem = freezerItem, arrowPressed = { kaas: Int, baas: Int -> + freezerItemListViewModel.UpdateItemAmount( + kaas, + baas + ) + }, onEditItem = onEditItem) + } +// FreezerItemList( +// freezerItemListUiState.items, +// arrowPressed = { kaas: Int, baas: Int -> +// freezerItemListViewModel.UpdateItemAmount( +// kaas, +// baas +// ) +// }, +// onEditItem = onEditItem +// ) } @Composable @@ -45,18 +62,28 @@ fun FreezerItemElement( onEditItem: (Int) -> Unit ) { ListItem( - headlineText = { Text(freezerItem.item!!) }, - supportingText = { Text("${stringResource(R.string.freezer_item_drawer_partial)} ${freezerItem.drawer!!}") }, + headlineText = { Text("${freezerItem.item}") }, + supportingText = { Text("${stringResource(R.string.freezer_item_drawer_partial)} ${freezerItem.drawer}") }, trailingContent = { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceEvenly ) { - TextButton(onClick = { arrowPressed(freezerItem.freezerItemId!!, 1) }) { + TextButton(onClick = { + arrowPressed( + freezerItem.freezerItemId!!, + freezerItem.amount!!.minus(1) + ) + }) { Icon(Icons.Default.KeyboardArrowDown, contentDescription = "Minus one") } Text("${freezerItem.amount}", style = ThuisTypography.bodyLarge) - TextButton(onClick = { arrowPressed(freezerItem.freezerItemId!!, -1) }) { + TextButton(onClick = { + arrowPressed( + freezerItem.freezerItemId!!, + freezerItem.amount!!.plus(1) + ) + }) { Icon(Icons.Default.KeyboardArrowUp, contentDescription = "Plus one") } TextButton(onClick = { onEditItem(freezerItem.freezerItemId!!) }) { 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 33e2dca..d21fa0d 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 @@ -1,5 +1,6 @@ package com.mitchelbv.thuis_c.views.freezer.item_list +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.mitchelbv.thuis_c.network.thuis.ThuisRetrofitHelper @@ -8,10 +9,16 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import retrofit2.HttpException import java.net.ConnectException +import java.net.SocketTimeoutException -data class FreezerItemListUiState(var items: List = mutableListOf()) +data class FreezerItemListUiState( + var items: List = listOf(), + var error: String = "" +) class FreezerItemListViewModel : ViewModel() { private val _uiState = MutableStateFlow(FreezerItemListUiState()) @@ -34,19 +41,30 @@ class FreezerItemListViewModel : ViewModel() { } // new model instead of this? - fun UpdateItemAmount(item_id: Int, operation: Int) { + fun UpdateItemAmount(item_id: Int, newAmount: Int) { viewModelScope.launch(Dispatchers.IO) { try { + val itemList = _uiState.value.items 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) + itemList.indexOf(uiState.value.items.find { a -> a.freezerItemId == item_id }) + val freezerItemToUpdate = itemList[indexFreezerItem] + freezerItemToUpdate.amount = newAmount val apiResponse = ThuisRetrofitHelper.thuis.putFreezerItem(item_id, freezerItemToUpdate) - } catch (e: ConnectException) { - // Nothing to do really? - // Maybe a snackbar... + _uiState.update { currentState -> + currentState.copy(items = itemList) + } + } catch (e: HttpException) { + // Display a snackbar... + Log.d( + this.javaClass.name.toString(), + "HttpException: ${e.code()} ${e.response()!!.errorBody()!!.string()}" + ) + } catch (e: SocketTimeoutException) { + // Also display a snackbar + Log.d(this.javaClass.name.toString(), "Timeout") } + } } } \ No newline at end of file