Untitled

 avatar
unknown
kotlin
a month ago
5.2 kB
5
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