Added savedStateHandle to the viewmodel

Updated the thuisserver reflecting what does what.
This commit is contained in:
KaasKop-
2023-04-15 15:35:17 +02:00
parent 5a00cd8f32
commit 28f5c22bf2
5 changed files with 30 additions and 23 deletions

View File

@@ -64,6 +64,7 @@ dependencies {
// ViewModel // ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1" 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.core:core-ktx:1.10.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'

View File

@@ -8,9 +8,11 @@ import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.mitchelbv.thuis_c.ui.theme.ThuisTheme import com.mitchelbv.thuis_c.ui.theme.ThuisTheme
import com.mitchelbv.thuis_c.views.feyenoord.MatchesScreen import com.mitchelbv.thuis_c.views.feyenoord.MatchesScreen
import com.mitchelbv.thuis_c.views.freezer.FreezerScreen 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( FreezerItemListScreen(
freezer_id = backStackEntry.arguments?.getString("freezer_id")!!.toInt(),
onEditItem = { onEditItem = {
// I want onEditItem 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...
}) })

View File

@@ -49,13 +49,13 @@ interface ThuisService {
@GET("api/FreezerItem/InFreezer/{id}") @GET("api/FreezerItem/InFreezer/{id}")
suspend fun getFreezerItemsInFreezer(@Path("id") id: Int): List<FreezerItem> suspend fun getFreezerItemsInFreezer(@Path("id") id: Int): List<FreezerItem>
// Post // Post (used to create a new item)
@POST("api/FreezerItem") @POST("api/FreezerItem")
suspend fun postFreezerItem(@Body freezerItem: FreezerItem): FreezerItem suspend fun postFreezerItem(@Body freezerItem: FreezerItem): FreezerItem
// Put // Put (used to update an item)
@PUT("api/FreezerItem/{id}") @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
@DELETE("api/FreezerItem/{id}") @DELETE("api/FreezerItem/{id}")

View File

@@ -12,22 +12,19 @@ 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
fun FreezerItemListScreen( fun FreezerItemListScreen(
freezer_id: Int,
freezerItemListViewModel: FreezerItemListViewModel = viewModel(), freezerItemListViewModel: FreezerItemListViewModel = viewModel(),
onEditItem: (Int) -> Unit onEditItem: (Int) -> Unit
) { ) {
val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState() val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsStateWithLifecycle()
freezerItemListViewModel.fillItemList(freezer_id)
freezerItemListUiState.items.forEach { freezerItem -> freezerItemListUiState.items.forEach { freezerItem ->
FreezerItemElement(freezerItem = freezerItem, arrowPressed = { kaas: Int, baas: Int -> FreezerItemElement(freezerItem = freezerItem, arrowPressed = { item_id: Int, newAmount: Int ->
freezerItemListViewModel.UpdateItemAmount( freezerItemListViewModel.UpdateItemAmount(
kaas, item_id,
baas newAmount
) )
}, onEditItem = onEditItem) }, onEditItem = onEditItem)
} }

View File

@@ -1,8 +1,7 @@
package com.mitchelbv.thuis_c.views.freezer.item_list package com.mitchelbv.thuis_c.views.freezer.item_list
import android.util.Log import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.*
import androidx.lifecycle.viewModelScope
import com.mitchelbv.thuis_c.network.thuis.ThuisRetrofitHelper import com.mitchelbv.thuis_c.network.thuis.ThuisRetrofitHelper
import com.mitchelbv.thuis_c.network.thuis.responses.FreezerItem import com.mitchelbv.thuis_c.network.thuis.responses.FreezerItem
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -17,16 +16,17 @@ import java.net.SocketTimeoutException
data class FreezerItemListUiState( data class FreezerItemListUiState(
var items: List<FreezerItem> = listOf(), var items: List<FreezerItem> = listOf(),
// val items: MutableLiveData<List<FreezerItem>> = MutableLiveData<List<FreezerItem>>(),
var error: String = "" var error: String = ""
) )
class FreezerItemListViewModel : ViewModel() { class FreezerItemListViewModel(savedStateHandle: SavedStateHandle) : 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() savedStateHandle.get<Int>("freezer_id")?.let { fillItemList(it) }
// } }
fun fillItemList(freezer_id: Int) { fun fillItemList(freezer_id: Int) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
@@ -34,8 +34,10 @@ class FreezerItemListViewModel : ViewModel() {
val apiResponse = val apiResponse =
ThuisRetrofitHelper.thuis.getFreezerItemsInFreezer(id = freezer_id) 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 = )))
_uiState.value = FreezerItemListUiState()
} }
} }
} }
@@ -44,24 +46,25 @@ class FreezerItemListViewModel : ViewModel() {
fun UpdateItemAmount(item_id: Int, newAmount: Int) { fun UpdateItemAmount(item_id: Int, newAmount: Int) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
try { try {
val itemList = _uiState.value.items val itemList = _uiState.value.items.toMutableList()
val indexFreezerItem = val indexFreezerItem =
itemList.indexOf(uiState.value.items.find { a -> a.freezerItemId == item_id }) itemList.indexOf(uiState.value.items.find { a -> a.freezerItemId == item_id })
val freezerItemToUpdate = itemList[indexFreezerItem] val freezerItemToUpdate = itemList[indexFreezerItem]
freezerItemToUpdate.amount = newAmount freezerItemToUpdate.amount = newAmount
// itemList[indexFreezerItem] = freezerItemToUpdate
val apiResponse = val apiResponse =
ThuisRetrofitHelper.thuis.putFreezerItem(item_id, freezerItemToUpdate) ThuisRetrofitHelper.thuis.putFreezerItem(item_id, freezerItemToUpdate)
_uiState.update { currentState -> _uiState.update { currentState ->
currentState.copy(items = itemList) currentState.copy(items = apiResponse)
} }
} catch (e: HttpException) { } catch (e: HttpException) {
// Display a snackbar... // TODO Display a snackbar...
Log.d( Log.d(
this.javaClass.name.toString(), this.javaClass.name.toString(),
"HttpException: ${e.code()} ${e.response()!!.errorBody()!!.string()}" "HttpException: ${e.code()} ${e.response()!!.errorBody()!!.string()}"
) )
} catch (e: SocketTimeoutException) { } catch (e: SocketTimeoutException) {
// Also display a snackbar // TODO Also display a snackbar
Log.d(this.javaClass.name.toString(), "Timeout") Log.d(this.javaClass.name.toString(), "Timeout")
} }