Added savedStateHandle to the viewmodel
Updated the thuisserver reflecting what does what.
This commit is contained in:
@@ -64,6 +64,7 @@ dependencies {
|
||||
|
||||
// ViewModel
|
||||
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1"
|
||||
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.1")
|
||||
|
||||
implementation 'androidx.core:core-ktx:1.10.0'
|
||||
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
|
||||
|
||||
@@ -8,9 +8,11 @@ import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.navigation.NavType
|
||||
import androidx.navigation.compose.NavHost
|
||||
import androidx.navigation.compose.composable
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import androidx.navigation.navArgument
|
||||
import com.mitchelbv.thuis_c.ui.theme.ThuisTheme
|
||||
import com.mitchelbv.thuis_c.views.feyenoord.MatchesScreen
|
||||
import com.mitchelbv.thuis_c.views.freezer.FreezerScreen
|
||||
@@ -86,9 +88,13 @@ class MainActivity : ComponentActivity() {
|
||||
)
|
||||
}
|
||||
|
||||
composable(route = "${FreezerItemListDestination.route}/{freezer_id}") { backStackEntry ->
|
||||
composable(route = "${FreezerItemListDestination.route}/{freezer_id}", arguments = listOf(
|
||||
navArgument("freezer_id") {
|
||||
this.type = NavType.IntType
|
||||
this.nullable = false
|
||||
})
|
||||
) {
|
||||
FreezerItemListScreen(
|
||||
freezer_id = backStackEntry.arguments?.getString("freezer_id")!!.toInt(),
|
||||
onEditItem = {
|
||||
// I want onEditItem to open a modal dialog, so not sure if this is needed here...
|
||||
})
|
||||
|
||||
@@ -49,13 +49,13 @@ interface ThuisService {
|
||||
@GET("api/FreezerItem/InFreezer/{id}")
|
||||
suspend fun getFreezerItemsInFreezer(@Path("id") id: Int): List<FreezerItem>
|
||||
|
||||
// Post
|
||||
// Post (used to create a new item)
|
||||
@POST("api/FreezerItem")
|
||||
suspend fun postFreezerItem(@Body freezerItem: FreezerItem): FreezerItem
|
||||
|
||||
// Put
|
||||
// Put (used to update an item)
|
||||
@PUT("api/FreezerItem/{id}")
|
||||
suspend fun putFreezerItem(@Path("id") id: Int, @Body freezerItem: FreezerItem): Response<Unit>
|
||||
suspend fun putFreezerItem(@Path("id") id: Int, @Body freezerItem: FreezerItem): List<FreezerItem>
|
||||
|
||||
// Delete
|
||||
@DELETE("api/FreezerItem/{id}")
|
||||
|
||||
@@ -12,22 +12,19 @@ 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
|
||||
fun FreezerItemListScreen(
|
||||
freezer_id: Int,
|
||||
freezerItemListViewModel: FreezerItemListViewModel = viewModel(),
|
||||
onEditItem: (Int) -> Unit
|
||||
) {
|
||||
val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState()
|
||||
freezerItemListViewModel.fillItemList(freezer_id)
|
||||
val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsStateWithLifecycle()
|
||||
freezerItemListUiState.items.forEach { freezerItem ->
|
||||
FreezerItemElement(freezerItem = freezerItem, arrowPressed = { kaas: Int, baas: Int ->
|
||||
FreezerItemElement(freezerItem = freezerItem, arrowPressed = { item_id: Int, newAmount: Int ->
|
||||
freezerItemListViewModel.UpdateItemAmount(
|
||||
kaas,
|
||||
baas
|
||||
item_id,
|
||||
newAmount
|
||||
)
|
||||
}, onEditItem = onEditItem)
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
package com.mitchelbv.thuis_c.views.freezer.item_list
|
||||
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import androidx.lifecycle.*
|
||||
import com.mitchelbv.thuis_c.network.thuis.ThuisRetrofitHelper
|
||||
import com.mitchelbv.thuis_c.network.thuis.responses.FreezerItem
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -17,16 +16,17 @@ import java.net.SocketTimeoutException
|
||||
|
||||
data class FreezerItemListUiState(
|
||||
var items: List<FreezerItem> = listOf(),
|
||||
// val items: MutableLiveData<List<FreezerItem>> = MutableLiveData<List<FreezerItem>>(),
|
||||
var error: String = ""
|
||||
)
|
||||
|
||||
class FreezerItemListViewModel : ViewModel() {
|
||||
class FreezerItemListViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {
|
||||
private val _uiState = MutableStateFlow(FreezerItemListUiState())
|
||||
val uiState: StateFlow<FreezerItemListUiState> = _uiState.asStateFlow()
|
||||
|
||||
// init {
|
||||
// fillItemList()
|
||||
// }
|
||||
init {
|
||||
savedStateHandle.get<Int>("freezer_id")?.let { fillItemList(it) }
|
||||
}
|
||||
|
||||
fun fillItemList(freezer_id: Int) {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
@@ -34,8 +34,10 @@ class FreezerItemListViewModel : ViewModel() {
|
||||
val apiResponse =
|
||||
ThuisRetrofitHelper.thuis.getFreezerItemsInFreezer(id = freezer_id)
|
||||
_uiState.value = FreezerItemListUiState(apiResponse)
|
||||
|
||||
} catch (e: ConnectException) {
|
||||
_uiState.value = FreezerItemListUiState(listOf(FreezerItem(item = "error")))
|
||||
// _uiState.value = FreezerItemListUiState(listOf(FreezerItem(item = )))
|
||||
_uiState.value = FreezerItemListUiState()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -44,24 +46,25 @@ class FreezerItemListViewModel : ViewModel() {
|
||||
fun UpdateItemAmount(item_id: Int, newAmount: Int) {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
try {
|
||||
val itemList = _uiState.value.items
|
||||
val itemList = _uiState.value.items.toMutableList()
|
||||
val indexFreezerItem =
|
||||
itemList.indexOf(uiState.value.items.find { a -> a.freezerItemId == item_id })
|
||||
val freezerItemToUpdate = itemList[indexFreezerItem]
|
||||
freezerItemToUpdate.amount = newAmount
|
||||
// itemList[indexFreezerItem] = freezerItemToUpdate
|
||||
val apiResponse =
|
||||
ThuisRetrofitHelper.thuis.putFreezerItem(item_id, freezerItemToUpdate)
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(items = itemList)
|
||||
currentState.copy(items = apiResponse)
|
||||
}
|
||||
} catch (e: HttpException) {
|
||||
// Display a snackbar...
|
||||
// TODO Display a snackbar...
|
||||
Log.d(
|
||||
this.javaClass.name.toString(),
|
||||
"HttpException: ${e.code()} ${e.response()!!.errorBody()!!.string()}"
|
||||
)
|
||||
} catch (e: SocketTimeoutException) {
|
||||
// Also display a snackbar
|
||||
// TODO Also display a snackbar
|
||||
Log.d(this.javaClass.name.toString(), "Timeout")
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user