Skip to content

Commit d91e0bf

Browse files
authored
Feature/add catalog home tablet UI (#32)
* feat(mobile-app): Updated catalog item picture url * feat(mobile-app): Updated catalog home tablet ui
1 parent dc3c6df commit d91e0bf

File tree

4 files changed

+151
-14
lines changed

4 files changed

+151
-14
lines changed

apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListContent.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple
1313
import dev.marlonlom.apps.cappajv.features.catalog_list.screens.CompactTableTopCatalogListScreen
1414
import dev.marlonlom.apps.cappajv.features.catalog_list.screens.DefaultPortraitCatalogListScreen
1515
import dev.marlonlom.apps.cappajv.features.catalog_list.screens.LandscapeCompactCatalogListScreen
16+
import dev.marlonlom.apps.cappajv.features.catalog_list.screens.TwoPaneCatalogListScreen
1617
import dev.marlonlom.apps.cappajv.ui.layout.DevicePosture
1718
import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState
1819
import dev.marlonlom.apps.cappajv.ui.main.scaffold.ScaffoldContentType
20+
import dev.marlonlom.apps.cappajv.ui.navigation.NavigationType
1921

2022
/**
2123
* Catalog list content composable ui, conditioned by application ui state.
@@ -44,6 +46,19 @@ fun CatalogListContent(
4446
) {
4547
when {
4648

49+
appState.isLandscape.and(appState.devicePosture == DevicePosture.Normal)
50+
.and(appState.navigationType == NavigationType.EXPANDED_NAV) -> {
51+
TwoPaneCatalogListScreen(
52+
appState = appState,
53+
catalogItemsListState = catalogItemsListState,
54+
catalogItems = catalogItems,
55+
categories = categories,
56+
selectedCategory = selectedCategory,
57+
onSelectedCategoryChanged = onSelectedCategoryChanged,
58+
onCatalogItemSelected = onCatalogItemSelected,
59+
)
60+
}
61+
4762
(appState.devicePosture is DevicePosture.Separating.Book).and(appState.isCompactHeight.not())
4863
.and(appState.isLandscape.not()) -> {
4964

@@ -101,3 +116,4 @@ fun CatalogListContent(
101116
}
102117
}
103118
}
119+

apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogTupleRow.kt

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ import androidx.compose.ui.text.style.TextOverflow
3232
import androidx.compose.ui.text.withStyle
3333
import androidx.compose.ui.unit.DpSize
3434
import androidx.compose.ui.unit.dp
35-
import androidx.core.text.trimmedLength
3635
import coil.compose.AsyncImage
3736
import coil.request.ImageRequest
3837
import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple
3938
import dev.marlonlom.apps.cappajv.ui.layout.DevicePosture
4039
import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState
40+
import dev.marlonlom.apps.cappajv.ui.navigation.NavigationType
4141

4242
/**
4343
* Catalog tuple row composable ui.
@@ -65,9 +65,13 @@ internal fun CatalogTupleRow(
6565
onCatalogItemTupleClicked(tuple.id)
6666
},
6767
) {
68+
val verticalAlignment = when {
69+
appState.navigationType == NavigationType.EXPANDED_NAV -> Alignment.Bottom
70+
else -> Alignment.CenterVertically
71+
}
6872
Row(
6973
modifier = modifier.padding(vertical = 10.dp),
70-
verticalAlignment = Alignment.CenterVertically,
74+
verticalAlignment = verticalAlignment,
7175
horizontalArrangement = Arrangement.spacedBy(16.dp)
7276
) {
7377
CatalogTuplePosterImage(tuple, appState)
@@ -77,7 +81,7 @@ internal fun CatalogTupleRow(
7781
.padding(end = 10.dp)
7882
) {
7983
CatalogTupleTitle(tuple, appState)
80-
CatalogTupleSamplePunctuationText(tuple)
84+
CatalogTupleSamplePunctuationText(tuple, appState)
8185
}
8286
}
8387
}
@@ -88,11 +92,13 @@ internal fun CatalogTupleRow(
8892
*
8993
* @author marlonlom
9094
*
91-
* @param tuple Catalog item.
95+
* @param tuple Catalog item tuple data.
96+
* @param appState Application ui state.
9297
*/
9398
@Composable
9499
private fun CatalogTupleSamplePunctuationText(
95-
tuple: CatalogItemTuple
100+
tuple: CatalogItemTuple,
101+
appState: CappajvAppState,
96102
) {
97103
val samplePunctuationTxt = buildAnnotatedString {
98104
val textParts = tuple.samplePunctuation.split(":")
@@ -102,11 +108,7 @@ private fun CatalogTupleSamplePunctuationText(
102108
color = MaterialTheme.colorScheme.secondary,
103109
)
104110
) {
105-
val punctuationTitle = when {
106-
textParts[0].trimmedLength() > 10 -> textParts[0].split(" ")[0].plus(" ...")
107-
else -> textParts[0]
108-
}
109-
append(punctuationTitle)
111+
append(textParts[0])
110112
}
111113
append(": ")
112114
append(textParts[1].trim())
@@ -122,9 +124,21 @@ private fun CatalogTupleSamplePunctuationText(
122124
}
123125
}
124126
}
127+
128+
val textStyle = when {
129+
appState.navigationType == NavigationType.EXPANDED_NAV -> MaterialTheme.typography.bodyLarge
130+
else -> MaterialTheme.typography.labelMedium
131+
}
132+
133+
val bottomPadding = when {
134+
appState.navigationType == NavigationType.EXPANDED_NAV -> 10.dp
135+
else -> 0.dp
136+
}
137+
125138
Text(
139+
modifier = Modifier.padding(bottom = bottomPadding),
126140
text = samplePunctuationTxt,
127-
style = MaterialTheme.typography.labelMedium,
141+
style = textStyle,
128142
)
129143
}
130144

@@ -138,7 +152,8 @@ private fun CatalogTupleSamplePunctuationText(
138152
*/
139153
@Composable
140154
private fun CatalogTupleTitle(
141-
tuple: CatalogItemTuple, appState: CappajvAppState
155+
tuple: CatalogItemTuple,
156+
appState: CappajvAppState,
142157
) {
143158
Text(
144159
text = tuple.title,
@@ -160,7 +175,8 @@ private fun CatalogTupleTitle(
160175
*/
161176
@Composable
162177
private fun CatalogTuplePosterImage(
163-
tuple: CatalogItemTuple, appState: CappajvAppState
178+
tuple: CatalogItemTuple,
179+
appState: CappajvAppState,
164180
) {
165181
val imageRequest = ImageRequest.Builder(LocalContext.current).data(tuple.picture).crossfade(true).build()
166182

@@ -180,17 +196,31 @@ private fun CatalogTuplePosterImage(
180196
)
181197
}
182198

199+
/**
200+
* returns catalog tuple card image size.
201+
*
202+
* @param appState Application ui state.
203+
*/
183204
@Composable
184205
private fun getCatalogTupleImageSizeDp(appState: CappajvAppState): DpSize = when {
206+
appState.navigationType == NavigationType.EXPANDED_NAV -> DpSize(88.dp, 104.dp)
207+
185208
appState.isCompactWidth.and(appState.isLandscape.not())
186209
.and(appState.devicePosture is DevicePosture.Separating.TableTop) -> DpSize(48.dp, 56.dp)
187210

188211
else -> DpSize(56.dp, 64.dp)
189212
}
190213

191214

215+
/**
216+
* returns catalog tuple card title text style.
217+
*
218+
* @param appState Application ui state.
219+
*/
192220
@Composable
193221
private fun getCatalogTupleTitleStyle(appState: CappajvAppState) = when {
222+
appState.navigationType == NavigationType.EXPANDED_NAV -> MaterialTheme.typography.titleLarge
223+
194224
appState.isCompactWidth.and(appState.isLandscape.not())
195225
.and(appState.devicePosture is DevicePosture.Separating.TableTop) -> MaterialTheme.typography.bodyMedium
196226

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright 2024 Marlonlom
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package dev.marlonlom.apps.cappajv.features.catalog_list.screens
7+
8+
import androidx.compose.foundation.ExperimentalFoundationApi
9+
import androidx.compose.foundation.background
10+
import androidx.compose.foundation.layout.Arrangement
11+
import androidx.compose.foundation.layout.Column
12+
import androidx.compose.foundation.layout.ExperimentalLayoutApi
13+
import androidx.compose.foundation.layout.Row
14+
import androidx.compose.foundation.layout.fillMaxSize
15+
import androidx.compose.foundation.layout.fillMaxWidth
16+
import androidx.compose.foundation.layout.safeContentPadding
17+
import androidx.compose.foundation.lazy.LazyListState
18+
import androidx.compose.material3.MaterialTheme
19+
import androidx.compose.runtime.Composable
20+
import androidx.compose.ui.Alignment
21+
import androidx.compose.ui.Modifier
22+
import androidx.compose.ui.unit.dp
23+
import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple
24+
import dev.marlonlom.apps.cappajv.features.catalog_list.parts.CatalogListHeadline
25+
import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogCategoriesChipGroup
26+
import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogListBanner
27+
import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogListTuplesSlot
28+
import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState
29+
30+
31+
/**
32+
* Landscape Two pane catalog list screen composable ui.
33+
*
34+
* @author marlonlom
35+
*
36+
* @param appState Application ui state.
37+
* @param catalogItemsListState Catalog items lazy list state.
38+
* @param catalogItems Catalog items list.
39+
* @param categories Categories list.
40+
* @param selectedCategory Selected category name.
41+
* @param onSelectedCategoryChanged Action for category selected.
42+
* @param onCatalogItemSelected Action for catalog item selected.
43+
* @param modifier Modifier for this composable.
44+
*/
45+
@ExperimentalLayoutApi
46+
@ExperimentalFoundationApi
47+
@Composable
48+
fun TwoPaneCatalogListScreen(
49+
appState: CappajvAppState,
50+
catalogItemsListState: LazyListState,
51+
catalogItems: List<CatalogItemTuple>,
52+
categories: List<String>,
53+
selectedCategory: String,
54+
onSelectedCategoryChanged: (String) -> Unit,
55+
onCatalogItemSelected: (Long) -> Unit,
56+
modifier: Modifier = Modifier,
57+
) {
58+
Row(
59+
modifier = modifier.fillMaxWidth(),
60+
verticalAlignment = Alignment.CenterVertically,
61+
horizontalArrangement = Arrangement.spacedBy(20.dp)
62+
) {
63+
Column(
64+
modifier = modifier.fillMaxWidth(0.33f)
65+
) {
66+
CatalogListHeadline(appState)
67+
CatalogListBanner(appState)
68+
CatalogCategoriesChipGroup(
69+
categories = categories,
70+
selectedCategory = selectedCategory,
71+
onCategoryChipSelected = { onSelectedCategoryChanged(it) },
72+
)
73+
CatalogListTuplesSlot(
74+
appState = appState,
75+
catalogItemsListState = catalogItemsListState,
76+
catalogTuples = catalogItems,
77+
onCatalogItemTupleClicked = { onCatalogItemSelected(it) },
78+
)
79+
}
80+
Column(
81+
modifier = modifier
82+
.fillMaxSize()
83+
.safeContentPadding()
84+
.background(
85+
MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.25f)
86+
),
87+
) {
88+
89+
}
90+
}
91+
}

features/core/catalog-source/src/main/resources/en/catalog.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@
376376
"title": "Nevado café reducido en azucar",
377377
"category": "Cold drinks",
378378
"detail": "It is a creamy cold coffee-based drink, reduced in sugar decorated with Chantilly.",
379-
"picture": "https://juanvaldez.com/wp-content/uploads/2023/02/nevado_rejado_en_azucar_300ml_700x700px.jpg",
379+
"picture": "https://juanvaldez.com/wp-content/uploads/2023/02/nevado_reducido_en_azucar_300ml_700x700px.jpg",
380380
"punctuations": [
381381
{
382382
"label": "Medium",

0 commit comments

Comments
 (0)