make DateTimeAdded optional
Trying to make amount dynamic Fix in route
This commit is contained in:
@@ -90,7 +90,7 @@ class MainActivity : ComponentActivity() {
|
|||||||
FreezerItemListScreen(
|
FreezerItemListScreen(
|
||||||
freezer_id = backStackEntry.arguments?.getString("freezer_id")!!.toInt(),
|
freezer_id = backStackEntry.arguments?.getString("freezer_id")!!.toInt(),
|
||||||
onEditItem = {
|
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...
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ object FreezerListDestination : ThuisDestination {
|
|||||||
object FreezerItemListDestination : ThuisDestination {
|
object FreezerItemListDestination : ThuisDestination {
|
||||||
override val icon = Icons.Default.DateRange
|
override val icon = Icons.Default.DateRange
|
||||||
override val destinationName = R.string.home_card_freezer
|
override val destinationName = R.string.home_card_freezer
|
||||||
override val route = "freezer_item_list/"
|
override val route = "freezer_item_list"
|
||||||
}
|
}
|
||||||
|
|
||||||
object FreezerItemDetail : ThuisDestination {
|
object FreezerItemDetail : ThuisDestination {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.mitchelbv.thuis_c.network.thuis
|
package com.mitchelbv.thuis_c.network.thuis
|
||||||
|
|
||||||
import com.mitchelbv.thuis_c.network.thuis.responses.*
|
import com.mitchelbv.thuis_c.network.thuis.responses.*
|
||||||
|
import retrofit2.Response
|
||||||
import retrofit2.http.*
|
import retrofit2.http.*
|
||||||
|
|
||||||
interface ThuisService {
|
interface ThuisService {
|
||||||
@@ -54,7 +55,7 @@ interface ThuisService {
|
|||||||
|
|
||||||
// Put
|
// Put
|
||||||
@PUT("api/FreezerItem/{id}")
|
@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<Unit>
|
||||||
|
|
||||||
// Delete
|
// Delete
|
||||||
@DELETE("api/FreezerItem/{id}")
|
@DELETE("api/FreezerItem/{id}")
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ data class FreezerItem(
|
|||||||
@SerializedName("item") var item: String? = null,
|
@SerializedName("item") var item: String? = null,
|
||||||
@SerializedName("amount") var amount: Int? = null,
|
@SerializedName("amount") var amount: Int? = null,
|
||||||
@SerializedName("drawer") var drawer: 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
|
@SerializedName("freezerId") var freezerId: Int? = null
|
||||||
|
|
||||||
)
|
)
|
||||||
@@ -4,15 +4,15 @@ import androidx.compose.foundation.layout.*
|
|||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.*
|
import androidx.compose.material.icons.filled.*
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
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.ui.theme.ThuisTypography
|
import com.mitchelbv.thuis_c.ui.theme.ThuisTypography
|
||||||
|
import okhttp3.internal.notifyAll
|
||||||
|
|
||||||
// Is the destination of FreezerItemListDestination
|
// Is the destination of FreezerItemListDestination
|
||||||
@Composable
|
@Composable
|
||||||
@@ -23,7 +23,24 @@ fun FreezerItemListScreen(
|
|||||||
) {
|
) {
|
||||||
val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState()
|
val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState()
|
||||||
freezerItemListViewModel.fillItemList(freezer_id)
|
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
|
@Composable
|
||||||
@@ -45,18 +62,28 @@ fun FreezerItemElement(
|
|||||||
onEditItem: (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 = {
|
||||||
Row(
|
Row(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
horizontalArrangement = Arrangement.SpaceEvenly
|
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")
|
Icon(Icons.Default.KeyboardArrowDown, contentDescription = "Minus one")
|
||||||
}
|
}
|
||||||
Text("${freezerItem.amount}", style = ThuisTypography.bodyLarge)
|
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")
|
Icon(Icons.Default.KeyboardArrowUp, contentDescription = "Plus one")
|
||||||
}
|
}
|
||||||
TextButton(onClick = { onEditItem(freezerItem.freezerItemId!!) }) {
|
TextButton(onClick = { onEditItem(freezerItem.freezerItemId!!) }) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.mitchelbv.thuis_c.views.freezer.item_list
|
package com.mitchelbv.thuis_c.views.freezer.item_list
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.mitchelbv.thuis_c.network.thuis.ThuisRetrofitHelper
|
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.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import kotlinx.coroutines.flow.update
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import retrofit2.HttpException
|
||||||
import java.net.ConnectException
|
import java.net.ConnectException
|
||||||
|
import java.net.SocketTimeoutException
|
||||||
|
|
||||||
data class FreezerItemListUiState(var items: List<FreezerItem> = mutableListOf())
|
data class FreezerItemListUiState(
|
||||||
|
var items: List<FreezerItem> = listOf(),
|
||||||
|
var error: String = ""
|
||||||
|
)
|
||||||
|
|
||||||
class FreezerItemListViewModel : ViewModel() {
|
class FreezerItemListViewModel : ViewModel() {
|
||||||
private val _uiState = MutableStateFlow(FreezerItemListUiState())
|
private val _uiState = MutableStateFlow(FreezerItemListUiState())
|
||||||
@@ -34,19 +41,30 @@ class FreezerItemListViewModel : ViewModel() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// new model instead of this?
|
// new model instead of this?
|
||||||
fun UpdateItemAmount(item_id: Int, operation: Int) {
|
fun UpdateItemAmount(item_id: Int, newAmount: Int) {
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
|
val itemList = _uiState.value.items
|
||||||
val indexFreezerItem =
|
val indexFreezerItem =
|
||||||
uiState.value.items.indexOf(uiState.value.items.find { a -> a.freezerItemId == item_id })
|
itemList.indexOf(uiState.value.items.find { a -> a.freezerItemId == item_id })
|
||||||
val freezerItemToUpdate = uiState.value.items[indexFreezerItem]
|
val freezerItemToUpdate = itemList[indexFreezerItem]
|
||||||
freezerItemToUpdate.amount?.plus(operation)
|
freezerItemToUpdate.amount = newAmount
|
||||||
val apiResponse =
|
val apiResponse =
|
||||||
ThuisRetrofitHelper.thuis.putFreezerItem(item_id, freezerItemToUpdate)
|
ThuisRetrofitHelper.thuis.putFreezerItem(item_id, freezerItemToUpdate)
|
||||||
} catch (e: ConnectException) {
|
_uiState.update { currentState ->
|
||||||
// Nothing to do really?
|
currentState.copy(items = itemList)
|
||||||
// Maybe a snackbar...
|
}
|
||||||
|
} 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")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user