Freezer item listt working, updated path, updated navigation updated home
This commit is contained in:
17
.idea/deploymentTargetDropDown.xml
generated
17
.idea/deploymentTargetDropDown.xml
generated
@@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="deploymentTargetDropDown">
|
|
||||||
<runningDeviceTargetSelectedWithDropDown>
|
|
||||||
<Target>
|
|
||||||
<type value="RUNNING_DEVICE_TARGET" />
|
|
||||||
<deviceKey>
|
|
||||||
<Key>
|
|
||||||
<type value="VIRTUAL_DEVICE_PATH" />
|
|
||||||
<value value="$USER_HOME$/.android/avd/Pixel_5_API_31.avd" />
|
|
||||||
</Key>
|
|
||||||
</deviceKey>
|
|
||||||
</Target>
|
|
||||||
</runningDeviceTargetSelectedWithDropDown>
|
|
||||||
<timeTargetWasSelectedWithDropDown value="2023-04-06T12:30:08.110167Z" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.Thuis"
|
android:theme="@style/Theme.Thuis"
|
||||||
|
android:usesCleartextTraffic="true"
|
||||||
tools:targetApi="31">
|
tools:targetApi="31">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
|
|||||||
@@ -14,11 +14,13 @@ import androidx.navigation.compose.composable
|
|||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
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.item_list.FreezerItemListScreen
|
||||||
import com.mitchelbv.thuis_c.views.home.HomeScreen
|
import com.mitchelbv.thuis_c.views.home.HomeScreen
|
||||||
import com.mitchelbv.thuis_c.views.recipe.RecipeScreen
|
import com.mitchelbv.thuis_c.views.recipe.RecipeScreen
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
val navigationBarItems = listOf(Home, Recipes, Matches)
|
val navigationBarItems = listOf(HomeDestination, RecipesDestination, MatchesDestination)
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContent {
|
setContent {
|
||||||
@@ -62,18 +64,32 @@ class MainActivity : ComponentActivity() {
|
|||||||
) { innerPadding ->
|
) { innerPadding ->
|
||||||
NavHost(
|
NavHost(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
startDestination = Home.route,
|
startDestination = HomeDestination.route,
|
||||||
modifier = Modifier.padding(innerPadding)
|
modifier = Modifier.padding(innerPadding)
|
||||||
) {
|
) {
|
||||||
composable(route = Home.route) {
|
// Navigation items
|
||||||
|
composable(route = HomeDestination.route) {
|
||||||
HomeScreen(onClickFreezers = {
|
HomeScreen(onClickFreezers = {
|
||||||
navController.navigate(
|
navController.navigate(
|
||||||
Home.route
|
FreezerListDestination.route
|
||||||
)
|
)
|
||||||
})
|
}, onClickCards = { navController.navigate(CardsDestination.route) })
|
||||||
|
}
|
||||||
|
composable(route = RecipesDestination.route) { RecipeScreen() }
|
||||||
|
composable(route = MatchesDestination.route) { MatchesScreen() }
|
||||||
|
|
||||||
|
// Freezer screens
|
||||||
|
composable(route = FreezerListDestination.route) {
|
||||||
|
FreezerScreen(
|
||||||
|
onClickToFreezer = {freezer_id ->
|
||||||
|
navController.navigate("${FreezerItemListDestination.route}/${freezer_id}")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
composable(route = "${FreezerItemListDestination.route}/{freezer_id}") { backStackEntry ->
|
||||||
|
FreezerItemListScreen(freezer_id = backStackEntry.arguments?.getString("freezer_id")!!.toInt(), onClickItem = {})
|
||||||
}
|
}
|
||||||
composable(route = Recipes.route) { RecipeScreen() }
|
|
||||||
composable(route = Matches.route) { MatchesScreen() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,20 +10,46 @@ interface ThuisDestination {
|
|||||||
val route: String
|
val route: String
|
||||||
}
|
}
|
||||||
|
|
||||||
object Home : ThuisDestination {
|
object HomeDestination : ThuisDestination {
|
||||||
override val icon = Icons.Default.Home
|
override val icon = Icons.Default.Home
|
||||||
override val destinationName = R.string.nav_home
|
override val destinationName = R.string.nav_home
|
||||||
override val route = "home"
|
override val route = "home"
|
||||||
}
|
}
|
||||||
|
|
||||||
object Recipes : ThuisDestination {
|
object RecipesDestination : ThuisDestination {
|
||||||
override val icon = Icons.Default.List
|
override val icon = Icons.Default.List
|
||||||
override val destinationName = R.string.nav_recipes
|
override val destinationName = R.string.nav_recipes
|
||||||
override val route = "recipes"
|
override val route = "recipes"
|
||||||
}
|
}
|
||||||
|
|
||||||
object Matches : ThuisDestination {
|
object MatchesDestination : ThuisDestination {
|
||||||
override val icon = Icons.Default.DateRange
|
override val icon = Icons.Default.DateRange
|
||||||
override val destinationName = R.string.nav_matches
|
override val destinationName = R.string.nav_matches
|
||||||
override val route = "matches"
|
override val route = "matches"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Freezers
|
||||||
|
object FreezerListDestination : ThuisDestination {
|
||||||
|
override val icon = Icons.Default.DateRange
|
||||||
|
override val destinationName = R.string.home_card_freezer
|
||||||
|
override val route = "freezer_list"
|
||||||
|
}
|
||||||
|
|
||||||
|
object FreezerItemListDestination : ThuisDestination {
|
||||||
|
override val icon = Icons.Default.DateRange
|
||||||
|
override val destinationName = R.string.home_card_freezer
|
||||||
|
override val route = "freezer_item_list/"
|
||||||
|
}
|
||||||
|
|
||||||
|
object FreezerItemDetail : ThuisDestination {
|
||||||
|
override val icon = Icons.Default.DateRange
|
||||||
|
override val destinationName = R.string.home_card_freezer
|
||||||
|
override val route = "freezer_item_detail"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cards
|
||||||
|
object CardsDestination : ThuisDestination {
|
||||||
|
override val icon = Icons.Default.DateRange
|
||||||
|
override val destinationName = R.string.home_card_cards
|
||||||
|
override val route = "cards"
|
||||||
|
}
|
||||||
@@ -46,7 +46,7 @@ interface ThuisService {
|
|||||||
suspend fun getFreezerItem(id: Int): FreezerItem
|
suspend fun getFreezerItem(id: Int): FreezerItem
|
||||||
|
|
||||||
@GET("api/FreezerItem/InFreezer/{id}")
|
@GET("api/FreezerItem/InFreezer/{id}")
|
||||||
suspend fun getFreezerItemsInFreezer(id: Int): FreezerItemsInFreezer
|
suspend fun getFreezerItemsInFreezer(@Path("id") id: Int): List<FreezerItem>
|
||||||
|
|
||||||
// Post
|
// Post
|
||||||
@POST("api/FreezerItem")
|
@POST("api/FreezerItem")
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ import com.google.gson.annotations.SerializedName
|
|||||||
|
|
||||||
data class Freezer(
|
data class Freezer(
|
||||||
@SerializedName("freezerId") var freezerId: Int? = null,
|
@SerializedName("freezerId") var freezerId: Int? = null,
|
||||||
@SerializedName("location") var location: String? = null,
|
@SerializedName("name") var name: String? = null,
|
||||||
@SerializedName("amountInFreezer") var amountInFreezer: Int? = null
|
@SerializedName("amountInFreezer") var amountInFreezer: Int? = null
|
||||||
)
|
)
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
package com.mitchelbv.thuis_c.network.thuis.responses
|
|
||||||
|
|
||||||
import com.google.gson.annotations.SerializedName
|
|
||||||
|
|
||||||
|
|
||||||
data class FreezerItemsInFreezer(
|
|
||||||
@SerializedName("freezerItemId") var freezerItemId: Int? = null,
|
|
||||||
@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("freezerId") var freezerId: Int? = null
|
|
||||||
)
|
|
||||||
@@ -1,13 +1,16 @@
|
|||||||
package com.mitchelbv.thuis_c.views.freezer
|
package com.mitchelbv.thuis_c.views.freezer
|
||||||
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.ArrowForward
|
||||||
import androidx.compose.material.icons.filled.Edit
|
import androidx.compose.material.icons.filled.Edit
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.State
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
@@ -21,29 +24,38 @@ import androidx.lifecycle.viewmodel.compose.viewModel
|
|||||||
import androidx.navigation.NavHostController
|
import androidx.navigation.NavHostController
|
||||||
import com.mitchelbv.thuis_c.R
|
import com.mitchelbv.thuis_c.R
|
||||||
import com.mitchelbv.thuis_c.network.thuis.responses.Freezer
|
import com.mitchelbv.thuis_c.network.thuis.responses.Freezer
|
||||||
|
import com.mitchelbv.thuis_c.ui.theme.ThuisTypography
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
|
lateinit var freezerUiState: State<FreezerUiState>
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun FreezerScreen(
|
fun FreezerScreen(
|
||||||
navHostController: NavHostController,
|
freezerViewModel: FreezerViewModel = viewModel(),
|
||||||
freezerViewModel: FreezerViewModel = viewModel()
|
onClickToFreezer: (freezer_id: Int) -> Unit
|
||||||
) {
|
) {
|
||||||
val freezerUiState by freezerViewModel.uiState.collectAsState()
|
freezerUiState = freezerViewModel.uiState.collectAsState()
|
||||||
FreezerList(freezerUiState.freezers, navHostController, Modifier)
|
FreezerList(onClickToFreezer, Modifier)
|
||||||
FloatingActionButton(onClick = { navHostController.navigate("edit_freezer") }) {
|
|
||||||
Icon(Icons.Default.Edit, contentDescription = "Edit")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun FreezerList(freezers: List<Freezer>, navHostController: NavHostController, modifier: Modifier) {
|
fun FreezerList(
|
||||||
if (freezers.isNotEmpty()) {
|
onClickToFreezer: (freezer_id: Int) -> Unit,
|
||||||
|
modifier: Modifier
|
||||||
|
) {
|
||||||
|
if (freezerUiState.value.loading) {
|
||||||
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
CircularProgressIndicator()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (freezerUiState.value.freezers.isNotEmpty()) {
|
||||||
LazyColumn {
|
LazyColumn {
|
||||||
items(freezers) { freezer ->
|
items(freezerUiState.value.freezers) { freezer ->
|
||||||
// FreezerListItem(
|
FreezerListItem(
|
||||||
// freezer = freezer,
|
freezer = freezer,
|
||||||
// navigateTo = { navHostController.navigate("${Screen.FreezerDetails.route}/${freezer.freezerId}") },
|
navigateTo = { freezer.freezerId?.let { onClickToFreezer(it) } },
|
||||||
// modifier = modifier
|
modifier = modifier
|
||||||
// )
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,36 +66,18 @@ fun FreezerList(freezers: List<Freezer>, navHostController: NavHostController, m
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun FreezerListItem(freezer: Freezer, navigateTo: () -> Unit, modifier: Modifier) {
|
fun FreezerListItem(freezer: Freezer, navigateTo: () -> Unit, modifier: Modifier) {
|
||||||
Row(
|
Column {
|
||||||
modifier = modifier
|
ListItem(
|
||||||
.fillMaxWidth()
|
headlineText = { Text(freezer.name!!) },
|
||||||
.height(150.dp),
|
supportingText = { Text(" ${freezer.amountInFreezer} " + stringResource(id = R.string.freezer_item_count_partial)) },
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
trailingContent = { Icon(Icons.Default.ArrowForward, "")},
|
||||||
horizontalArrangement = Arrangement.SpaceBetween
|
modifier = modifier.clickable { navigateTo() }
|
||||||
) {
|
|
||||||
Text(freezer.location!!)
|
|
||||||
Column(
|
|
||||||
horizontalAlignment = Alignment.End,
|
|
||||||
verticalArrangement = Arrangement.Center,
|
|
||||||
modifier = modifier.fillMaxHeight()
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
painter = painterResource(id = R.drawable.arrow),
|
|
||||||
contentDescription = "arrow",
|
|
||||||
modifier = modifier.size(20.dp)
|
|
||||||
)
|
)
|
||||||
Text("${freezer.amountInFreezer} artikelen")
|
Divider()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
Spacer(
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.background(Color(0f, 0f, 0f, .5f))
|
|
||||||
.height(1.dp)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@@ -95,13 +89,17 @@ fun FreezerCard(freezer: Freezer, navigateTo: () -> Unit) {
|
|||||||
.height(100.dp)
|
.height(100.dp)
|
||||||
.padding(10.dp)
|
.padding(10.dp)
|
||||||
) {
|
) {
|
||||||
Text(freezer.location!!)
|
Text(freezer.name!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Preview(widthDp = 250, showBackground = true, heightDp = 300)
|
@Preview(widthDp = 250, showBackground = true, heightDp = 300)
|
||||||
@Composable
|
@Composable
|
||||||
fun FreezerListItemPreview() {
|
fun FreezerListItemPreview() {
|
||||||
val freezer = Freezer(freezerId = 1, location = "Keuken", amountInFreezer = 5)
|
val freezer = Freezer(freezerId = 1, name = "Keuken", amountInFreezer = 5)
|
||||||
|
Column {
|
||||||
|
FreezerListItem(freezer = freezer, modifier = Modifier, navigateTo = {})
|
||||||
|
FreezerListItem(freezer = freezer, modifier = Modifier, navigateTo = {})
|
||||||
FreezerListItem(freezer = freezer, modifier = Modifier, navigateTo = {})
|
FreezerListItem(freezer = freezer, modifier = Modifier, navigateTo = {})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@@ -13,7 +13,8 @@ import kotlinx.coroutines.launch
|
|||||||
import java.net.ConnectException
|
import java.net.ConnectException
|
||||||
|
|
||||||
data class FreezerUiState(
|
data class FreezerUiState(
|
||||||
val freezers: List<Freezer> = listOf()
|
val freezers: List<Freezer> = listOf(),
|
||||||
|
val loading: Boolean = true
|
||||||
)
|
)
|
||||||
|
|
||||||
class FreezerViewModel : ViewModel() {
|
class FreezerViewModel : ViewModel() {
|
||||||
@@ -28,9 +29,9 @@ class FreezerViewModel : ViewModel() {
|
|||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
val apiResponse = ThuisRetrofitHelper.thuis.getFreezers()
|
val apiResponse = ThuisRetrofitHelper.thuis.getFreezers()
|
||||||
_uiState.value = FreezerUiState(apiResponse)
|
_uiState.value = FreezerUiState(freezers = apiResponse, loading = false)
|
||||||
} catch (e: ConnectException) {
|
} catch (e: ConnectException) {
|
||||||
_uiState.value = FreezerUiState(listOf())
|
_uiState.value = FreezerUiState(listOf(), loading = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
package com.mitchelbv.thuis_c.views.freezer.detailed
|
|
||||||
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.navigation.NavHostController
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun FreezerDetailedScreen(navHostController: NavHostController, freezerId: String?) {
|
|
||||||
Text("Hi!, requesting for freezer $freezerId")
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
package com.mitchelbv.thuis_c.views.freezer.detailed
|
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.lifecycle.ViewModel
|
|
||||||
import androidx.lifecycle.viewModelScope
|
|
||||||
import com.mitchelbv.thuis_c.network.thuis.ThuisRetrofitHelper
|
|
||||||
import com.mitchelbv.thuis_c.network.thuis.responses.Freezer
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import java.net.ConnectException
|
|
||||||
|
|
||||||
data class FreezerEditUiState(
|
|
||||||
var freezerName: String = "",
|
|
||||||
)
|
|
||||||
|
|
||||||
class FreezerEditViewModel : ViewModel() {
|
|
||||||
private val _uiState = MutableStateFlow(FreezerEditUiState())
|
|
||||||
val uiState: StateFlow<FreezerEditUiState> = _uiState.asStateFlow()
|
|
||||||
|
|
||||||
init {
|
|
||||||
fillFreezerTextField()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun fillFreezerTextField() {
|
|
||||||
// Todo
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
package com.mitchelbv.thuis_c.views.freezer.edit
|
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.material3.Button
|
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.material3.TextField
|
|
||||||
import androidx.compose.runtime.*
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
||||||
import androidx.navigation.NavHostController
|
|
||||||
import com.mitchelbv.thuis_c.views.freezer.detailed.FreezerEditViewModel
|
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
@Composable
|
|
||||||
fun FreezerEditScreen(
|
|
||||||
navHostController: NavHostController,
|
|
||||||
freezerEditViewModel: FreezerEditViewModel = viewModel(),
|
|
||||||
freezerId: String?) {
|
|
||||||
val freezerUiState by freezerEditViewModel.uiState.collectAsState()
|
|
||||||
val freezerName by remember { mutableStateOf(freezerUiState.freezerName)}
|
|
||||||
|
|
||||||
Text("Hi!, editing (or creating) freezer. $freezerId")
|
|
||||||
Column {
|
|
||||||
TextField(value = freezerName, onValueChange = { freezerUiState.freezerName = it })
|
|
||||||
Button(onClick = { /* TODO */ }) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package com.mitchelbv.thuis_c.views.freezer.item_list
|
||||||
|
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.ListItem
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.collectAsState
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.lifecycle.viewmodel.CreationExtras
|
||||||
|
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.views.freezer.FreezerListItem
|
||||||
|
|
||||||
|
// Is the destination of FreezerItemListDestination
|
||||||
|
@Composable
|
||||||
|
fun FreezerItemListScreen(
|
||||||
|
freezer_id: Int,
|
||||||
|
freezerItemListViewModel: FreezerItemListViewModel = viewModel(),
|
||||||
|
onClickItem: (item_id: Int) -> Unit
|
||||||
|
) {
|
||||||
|
val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsState()
|
||||||
|
freezerItemListViewModel.fillItemList(freezer_id)
|
||||||
|
FreezerItemList(freezerItemListUiState.items)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun FreezerItemList(freezerItems: List<FreezerItem>) {
|
||||||
|
freezerItems.forEach { freezerItem ->
|
||||||
|
FreezerItemElement(freezerItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun FreezerItemElement(freezerItem: FreezerItem) {
|
||||||
|
ListItem(
|
||||||
|
headlineText = { Text(freezerItem.item!!) },
|
||||||
|
supportingText = { Text("${stringResource(R.string.freezer_item_drawer_partial)} ${freezerItem.drawer!!}") },
|
||||||
|
trailingContent = {
|
||||||
|
// - 5 + with calls to api and such...
|
||||||
|
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.mitchelbv.thuis_c.views.freezer.item_list
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import com.mitchelbv.thuis_c.network.thuis.ThuisRetrofitHelper
|
||||||
|
import com.mitchelbv.thuis_c.network.thuis.responses.FreezerItem
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import java.net.ConnectException
|
||||||
|
|
||||||
|
data class FreezerItemListUiState(val items: List<FreezerItem> = listOf())
|
||||||
|
|
||||||
|
class FreezerItemListViewModel : ViewModel() {
|
||||||
|
private val _uiState = MutableStateFlow(FreezerItemListUiState())
|
||||||
|
val uiState: StateFlow<FreezerItemListUiState> = _uiState.asStateFlow()
|
||||||
|
|
||||||
|
// init {
|
||||||
|
// fillItemList()
|
||||||
|
// }
|
||||||
|
|
||||||
|
fun fillItemList(freezer_id: Int) {
|
||||||
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
val apiResponse = ThuisRetrofitHelper.thuis.getFreezerItemsInFreezer(id = freezer_id)
|
||||||
|
_uiState.value = FreezerItemListUiState(apiResponse)
|
||||||
|
} catch (e: ConnectException) {
|
||||||
|
_uiState.value = FreezerItemListUiState(listOf(FreezerItem(item = "error")))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.mitchelbv.thuis_c.views.home
|
package com.mitchelbv.thuis_c.views.home
|
||||||
|
|
||||||
|
import androidx.compose.foundation.Image
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
@@ -13,43 +14,38 @@ import com.mitchelbv.thuis_c.ui.theme.ThuisTypography
|
|||||||
import com.mitchelbv.thuis_c.R
|
import com.mitchelbv.thuis_c.R
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HomeScreen(onClickFreezers: () -> Unit) {
|
fun HomeScreen(onClickFreezers: () -> Unit, onClickCards: () -> Unit) {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
verticalArrangement = Arrangement.Center
|
verticalArrangement = Arrangement.Center
|
||||||
) {
|
) {
|
||||||
Text(stringResource(id = R.string.app_name), style = ThuisTypography.bodySmall)
|
Text(stringResource(id = R.string.app_name), style = ThuisTypography.bodySmall)
|
||||||
// Row(modifier = Modifier.height(100.dp).width(180.dp)) {
|
// HomeButton(buttonText = R.string.home_card_freezer, onButtonClick = onClickFreezers)
|
||||||
// HomeCard(cardId = R.drawable.storefront, cardText = R.string.home_card_cards, routeTo = Screen.Cards.route, navController = navController)
|
HomeCard(
|
||||||
// HomeCard(cardId = R.drawable.feyenoord, cardText = R.string.home_card_freezer, routeTo = Screen.Freezer.route, navController = navController)
|
cardText = R.string.home_card_freezer,
|
||||||
// HomeButton(buttonText = R.string.home_card_cards, routeTo = Screen.Cards.route, navController = navController)
|
cardImage = "",
|
||||||
// HomeButton(buttonText = R.string.home_card_freezer, routeTo = Screen.Freezer.route, navController = navController)
|
navigateTo = onClickFreezers
|
||||||
// }
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun HomeButton(buttonText: Int, onButtonClick: () -> Unit) {
|
||||||
|
Button(onClick = { onButtonClick() }) {
|
||||||
|
Text(stringResource(id = buttonText))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun HomeCard(cardId: Int, cardText: Int, routeTo: String, navController: NavHostController) {
|
fun HomeCard(cardText: Int, cardImage: String, navigateTo: () -> Unit) {
|
||||||
Card(onClick = { navController.navigate(routeTo) }) {
|
Column {
|
||||||
Row(modifier = Modifier.fillMaxSize()) {
|
Card(onClick = { navigateTo() }, modifier = Modifier.size(width = 180.dp, height = 100.dp)) {
|
||||||
Icon(
|
Column {
|
||||||
painterResource(cardId), contentDescription = null, modifier = Modifier
|
// TODO Some sort of image here.
|
||||||
.padding(end = 10.dp)
|
Text(stringResource(id = cardText), style = ThuisTypography.displayMedium)
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = stringResource(id = cardText),
|
|
||||||
Modifier
|
|
||||||
.padding(10.dp)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun HomeButton(buttonText: Int, routeTo: String, navController: NavHostController) {
|
|
||||||
Button(onClick = { navController.navigate(routeTo) }) {
|
|
||||||
Text(stringResource(id = buttonText))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -6,8 +6,10 @@
|
|||||||
<string name="nav_home">Home</string>
|
<string name="nav_home">Home</string>
|
||||||
|
|
||||||
<string name="home_card_cards">Cards</string>
|
<string name="home_card_cards">Cards</string>
|
||||||
<string name="home_card_freezer">Freezer</string>
|
<string name="home_card_freezer">Freezers</string>
|
||||||
|
|
||||||
<string name="freezer_list_empty">No freezer(s)</string>
|
<string name="freezer_list_empty">No freezer(s)</string>
|
||||||
<string name="edit_freezer">Edit freezer</string>
|
<string name="edit_freezer">Edit freezer</string>
|
||||||
|
<string name="freezer_item_count_partial">items</string>
|
||||||
|
<string name="freezer_item_drawer_partial">Drawer</string>
|
||||||
</resources>
|
</resources>
|
||||||
Reference in New Issue
Block a user