From 28f5c22bf224dfdbba52cc85a443d4dfc04d8bf1 Mon Sep 17 00:00:00 2001 From: KaasKop- Date: Sat, 15 Apr 2023 15:35:17 +0200 Subject: [PATCH] Added savedStateHandle to the viewmodel Updated the thuisserver reflecting what does what. --- app/build.gradle | 1 + .../com/mitchelbv/thuis_c/MainActivity.kt | 10 ++++++-- .../thuis_c/network/thuis/ThuisService.kt | 6 ++--- .../freezer/item_list/FreezerItemListView.kt | 11 +++----- .../item_list/FreezerItemListViewModel.kt | 25 +++++++++++-------- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7e73c67..b2abf39 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' 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 442d05a..72f0483 100644 --- a/app/src/main/java/com/mitchelbv/thuis_c/MainActivity.kt +++ b/app/src/main/java/com/mitchelbv/thuis_c/MainActivity.kt @@ -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... }) 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 5894826..8b1afb0 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 @@ -49,13 +49,13 @@ interface ThuisService { @GET("api/FreezerItem/InFreezer/{id}") suspend fun getFreezerItemsInFreezer(@Path("id") id: Int): List - // 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 + suspend fun putFreezerItem(@Path("id") id: Int, @Body freezerItem: FreezerItem): List // Delete @DELETE("api/FreezerItem/{id}") 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 bb019c9..9623544 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 @@ -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) } 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 d21fa0d..05baefe 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,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 = listOf(), +// val items: MutableLiveData> = MutableLiveData>(), var error: String = "" ) -class FreezerItemListViewModel : ViewModel() { +class FreezerItemListViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val _uiState = MutableStateFlow(FreezerItemListUiState()) val uiState: StateFlow = _uiState.asStateFlow() -// init { -// fillItemList() -// } + init { + savedStateHandle.get("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") }