Skip to content

Instantly share code, notes, and snippets.

View catalinghita8's full-sized avatar

Catalin Ghita catalinghita8

View GitHub Profile
@Composable
private fun CategoryDetailsCollapsingToolbar(category: FoodItem?) {
Row {
Image(modifier = Modifier.size(128.dp), ...)
Column {
Text(text = category?.name)
Text(
text = category.description,
maxLines = 6
)
@Composable
fun FoodCategoryDetailsScreen(state: FoodCategoryDetailsContract.State) {
Column {
CategoryDetailsCollapsingToolbar(state.category)
Spacer(modifier = Modifier.height(2.dp))
LazyColumn {
items(state.categoryFoodItems) { item ->
FoodItemRow(item = item)
}
}
@Composable
private fun FoodApp() {
val viewModel: FoodCategoriesViewModel = viewModel()
val state = viewModel.viewState.value
FoodCategoriesScreen(
state = state,
effectFlow = viewModel.effect,
onEventSent = { event -> viewModel.setEvent(event) },
onNavigationRequested = { navigationEffect ->
if (navigationEffect is FoodCategoriesContract.Effect.Navigation.ToCategoryDetails) {
@Composable
fun FoodCategoriesScreen(
state: FoodCategoriesContract.State,
effectFlow: Flow<FoodCategoriesContract.Effect>?,
onEventSent: (event: FoodCategoriesContract.Event) -> Unit,
onNavigationRequested: (navigationEffect: FoodCategoriesContract.Effect.Navigation) -> Unit
) {
// Listen for side effects from the VM
LaunchedEffect(LAUNCH_LISTEN_FOR_EFFECTS) {
effectFlow?.onEach { effect ->
class FoodCategoriesViewModel constructor(private val repository: FoodMenuRepository) :
BaseViewModel<
FoodCategoriesContract.Event,
FoodCategoriesContract.State,
FoodCategoriesContract.Effect>() {
init {
viewModelScope.launch { getFoodCategories() }
}
class FoodCategoriesContract {
sealed class Event : ViewEvent {
data class CategorySelection(val categoryName: String) : Event()
}
data class State(val categories: List<FoodItem> = listOf(), val isLoading: Boolean = false) : ViewState
sealed class Effect : ViewSideEffect {
object ToastDataWasLoaded : Effect()
abstract class BaseViewModel
<Event : ViewEvent,
UiState : ViewState,
Effect : ViewSideEffect> : ViewModel() {
private val initialState: UiState by lazy { setInitialState() }
abstract fun setInitialState(): UiState
private val _viewState: MutableState<UiState> = mutableStateOf(initialState)
val viewState: State<UiState> = _viewState
interface ViewState
interface ViewEvent
interface ViewSideEffect
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape