Untitled
unknown
kotlin
9 months ago
5.2 kB
8
Indexable
package com.example.cocktailmenu.presentation.ui.screen.home
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.FabPosition
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.example.cocktailmenu.R
import com.example.cocktailmenu.domain.model.Cocktail
import com.example.cocktailmenu.presentation.ui.components.LoadingLayout
import com.example.cocktailmenu.presentation.ui.components.TopBarWithSearch
import com.example.cocktailmenu.presentation.ui.screen.home.components.CocktailsList
import com.example.cocktailmenu.presentation.ui.screen.home.components.ErrorLayout
import com.example.cocktailmenu.presentation.ui.screen.home.components.FloatingButton
import com.example.cocktailmenu.presentation.ui.theme.CocktailMenuTheme
import com.example.cocktailmenu.presentation.ui.util.preview.SimplePreview
import com.example.cocktailmenu.presentation.viewmodel.home.CocktailListViewState
import com.example.cocktailmenu.presentation.viewmodel.home.CocktailsInteraction
import com.example.cocktailmenu.presentation.viewmodel.home.CocktailsViewModel
import org.koin.androidx.compose.koinViewModel
@Composable
internal fun HomeScreen(
navController: NavController,
viewModel: CocktailsViewModel = koinViewModel<CocktailsViewModel>()
) {
val cocktailsViewState by viewModel.viewState.collectAsStateWithLifecycle()
HomeLayout(
cocktailsViewState = cocktailsViewState,
onCocktailSelected = {
it.idDrink?.let {
//TODO add navigation to the details screen
}
},
onFilterButtonClick = {
//TODO add navigation when user clicks on the filter button
},
onFloatingButtonClick = {
//TODO add navigation when user clicks on the floating button
},
onInteraction = viewModel::onInteraction
)
}
@Composable
private fun HomeLayout(
cocktailsViewState: CocktailListViewState,
onCocktailSelected: (Cocktail) -> Unit,
onFilterButtonClick: () -> Unit,
onFloatingButtonClick: () -> Unit,
onInteraction: (CocktailsInteraction) -> Unit
) {
Scaffold(
topBar = {
TopBarWithSearch(
query = cocktailsViewState.searchInput,
onQueryChange = { onInteraction(CocktailsInteraction.Query(it)) },
onFilterButtonClick = {
onFilterButtonClick()
onInteraction.invoke(CocktailsInteraction.FilterButton)
}
)
},
floatingActionButtonPosition = FabPosition.Center,
floatingActionButton = {
FloatingButton(
modifier = Modifier.width(240.dp),
text = R.string.feeling_lucky,
onClick = {
onFloatingButtonClick()
onInteraction.invoke(CocktailsInteraction.FloatingButton)
}
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues),
) {
when (cocktailsViewState) {
is CocktailListViewState.Available -> {
CocktailsList(
cocktails = cocktailsViewState.cocktails,
onCocktailSelected = {
onCocktailSelected(it)
onInteraction.invoke(CocktailsInteraction.CocktailItem(it))
}
)
}
is CocktailListViewState.Error -> {
ErrorLayout(message = cocktailsViewState.message)
}
is CocktailListViewState.Loading -> {
LoadingLayout()
}
}
}
}
}
@SimplePreview
@Composable
private fun HomeScreenPreview() {
CocktailMenuTheme {
HomeLayout(
cocktailsViewState = CocktailListViewState.Available(
searchInput = "",
cocktails = listOf(
Cocktail(
idDrink = "1",
strDrink = "Margarita",
strImageSource = null,
strIngredients = listOf("Alcohol", "Juice")
),
Cocktail(
idDrink = "12",
strDrink = "Margarita ultra long",
strImageSource = null,
strIngredients = listOf("Juice1", "Juice2")
)
)
),
onCocktailSelected = {},
onFilterButtonClick = {},
onFloatingButtonClick = {},
onInteraction = {},
)
}
}Editor is loading...
Leave a Comment