Skip to content

Commit 12f437e

Browse files
author
Bořek Leikep
committed
Added the Coupon component.
1 parent feb3588 commit 12f437e

File tree

14 files changed

+415
-41
lines changed

14 files changed

+415
-41
lines changed

baselineprofile/src/main/kotlin/kiwi/orbit/baselineprofile/BaselineProfileGenerator.kt

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ internal class BaselineProfileGenerator {
7878
profileSubScreen(MainScreenSemantics.CheckboxItemTag)
7979
profileSubScreen(MainScreenSemantics.ChoiceTileItemTag)
8080
profileSubScreen(MainScreenSemantics.CollapseItemTag)
81+
profileSubScreen(MainScreenSemantics.CouponItemTag)
8182
profileSubScreen(MainScreenSemantics.DialogItemTag) {
8283
device.findObject(By.res(DialogScreenSemantics.OrbitDialogButtonTag))
8384
.clickAndWait(Until.newWindow(), TIMEOUT)

catalog/semantics/src/main/kotlin/kiwi/orbit/compose/catalog/semantics/MainScreenSemantics.kt

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ object MainScreenSemantics {
1616
const val CheckboxItemTag = "main_screen_checkbox_item"
1717
const val ChoiceTileItemTag = "main_screen_choice_tile_item"
1818
const val CollapseItemTag = "main_screen_collapse_item"
19+
const val CouponItemTag = "main_screen_coupon_item"
1920
const val DialogItemTag = "main_screen_dialog_item"
2021
const val EmptyStateItemTag = "main_screen_empty_state_item"
2122
const val KeyValueItemTag = "main_screen_key_value_item"

catalog/src/main/java/kiwi/orbit/compose/catalog/CatalogApplication.kt

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import kiwi.orbit.compose.catalog.screens.CheckboxScreen
4040
import kiwi.orbit.compose.catalog.screens.ChoiceTileScreen
4141
import kiwi.orbit.compose.catalog.screens.CollapseScreen
4242
import kiwi.orbit.compose.catalog.screens.ColorsScreen
43+
import kiwi.orbit.compose.catalog.screens.CouponScreen
4344
import kiwi.orbit.compose.catalog.screens.DialogMaterialDatePicker
4445
import kiwi.orbit.compose.catalog.screens.DialogMaterialTimePicker
4546
import kiwi.orbit.compose.catalog.screens.DialogsMaterialDialog
@@ -129,6 +130,7 @@ private fun NavGraph(
129130
composable<Destinations.Checkbox> { CheckboxScreen(navController::navigateUp) }
130131
composable<Destinations.ChoiceTile> { ChoiceTileScreen(navController::navigateUp) }
131132
composable<Destinations.Collapse> { CollapseScreen(navController::navigateUp) }
133+
composable<Destinations.Coupon> { CouponScreen(navController::navigateUp) }
132134
composable<Destinations.Dialog> { DialogsScreen(navController) }
133135
dialog<Destinations.DialogMaterialTimePicker> { DialogMaterialTimePicker(navController) }
134136
dialog<Destinations.DialogMaterialDatePicker> { DialogMaterialDatePicker(navController) }

catalog/src/main/java/kiwi/orbit/compose/catalog/Destinations.kt

+44-41
Original file line numberDiff line numberDiff line change
@@ -8,131 +8,134 @@ import kotlinx.serialization.Serializable
88

99
sealed interface Destinations : Destination {
1010
@Serializable
11-
object Main : Destinations
11+
data object Main : Destinations
1212

1313
@Serializable
14-
object Colors : Destinations
14+
data object Colors : Destinations
1515

1616
@Serializable
17-
object Icons : Destinations
17+
data object Icons : Destinations
1818

1919
@Serializable
20-
object Illustrations : Destinations
20+
data object Illustrations : Destinations
2121

2222
@Serializable
23-
object Typography : Destinations
23+
data object Typography : Destinations
2424

2525
@Serializable
26-
object Alert : Destinations
26+
data object Alert : Destinations
2727

2828
@Serializable
29-
object Badge : Destinations
29+
data object Badge : Destinations
3030

3131
@Serializable
32-
object BadgeList : Destinations
32+
data object BadgeList : Destinations
3333

3434
@Serializable
35-
object Button : Destinations
35+
data object Button : Destinations
3636

3737
@Serializable
38-
object Card : Destinations
38+
data object Card : Destinations
3939

4040
@Serializable
41-
object Checkbox : Destinations
41+
data object Checkbox : Destinations
4242

4343
@Serializable
44-
object ChoiceTile : Destinations
44+
data object ChoiceTile : Destinations
4545

4646
@Serializable
47-
object Collapse : Destinations
47+
data object Collapse : Destinations
4848

4949
@Serializable
50-
object Dialog : Destinations
50+
data object Coupon : Destinations
5151

5252
@Serializable
53-
object DialogMaterial : Destinations
53+
data object Dialog : Destinations
5454

5555
@Serializable
56-
object DialogMaterialTimePicker : Destinations, ResultDestination<DialogMaterialTimePicker.Result> {
56+
data object DialogMaterial : Destinations
57+
58+
@Serializable
59+
data object DialogMaterialTimePicker : Destinations, ResultDestination<DialogMaterialTimePicker.Result> {
5760
@Serializable
5861
data class Result(val time: LocalTime)
5962
}
6063

6164
@Serializable
62-
object DialogMaterialDatePicker : Destinations, ResultDestination<DialogMaterialDatePicker.Result> {
65+
data object DialogMaterialDatePicker : Destinations, ResultDestination<DialogMaterialDatePicker.Result> {
6366
@Serializable
6467
data class Result(val date: LocalDate)
6568
}
6669

6770
@Serializable
68-
object DialogOrbit : Destinations
71+
data object DialogOrbit : Destinations
6972

7073
@Serializable
71-
object EmptyState : Destinations
74+
data object EmptyState : Destinations
7275

7376
@Serializable
74-
object KeyValue : Destinations
77+
data object KeyValue : Destinations
7578

7679
@Serializable
77-
object LinearProgressIndicator : Destination
80+
data object LinearProgressIndicator : Destination
7881

7982
@Serializable
80-
object List : Destinations
83+
data object List : Destinations
8184

8285
@Serializable
83-
object ListChoice : Destinations
86+
data object ListChoice : Destinations
8487

8588
@Serializable
86-
object Loading : Destinations
89+
data object Loading : Destinations
8790

8891
@Serializable
89-
object Radio : Destinations
92+
data object Radio : Destinations
9093

9194
@Serializable
92-
object PillButton : Destinations
95+
data object PillButton : Destinations
9396

9497
@Serializable
95-
object Seat : Destinations
98+
data object Seat : Destinations
9699

97100
@Serializable
98-
object SegmentedSwitch : Destinations
101+
data object SegmentedSwitch : Destinations
99102

100103
@Serializable
101-
object SelectField : Destinations
104+
data object SelectField : Destinations
102105

103106
@Serializable
104-
object Slider : Destinations
107+
data object Slider : Destinations
105108

106109
@Serializable
107-
object Stepper : Destinations
110+
data object Stepper : Destinations
108111

109112
@Serializable
110-
object SurfaceCard : Destinations
113+
data object SurfaceCard : Destinations
111114

112115
@Serializable
113-
object Switch : Destinations
116+
data object Switch : Destinations
114117

115118
@Serializable
116-
object Tabs : Destinations
119+
data object Tabs : Destinations
117120

118121
@Serializable
119-
object Tag : Destinations
122+
data object Tag : Destinations
120123

121124
@Serializable
122-
object TextField : Destinations
125+
data object TextField : Destinations
123126

124127
@Serializable
125-
object Tile : Destinations
128+
data object Tile : Destinations
126129

127130
@Serializable
128-
object TileGroup : Destinations
131+
data object TileGroup : Destinations
129132

130133
@Serializable
131-
object Timeline : Destinations
134+
data object Timeline : Destinations
132135

133136
@Serializable
134-
object Toast : Destinations
137+
data object Toast : Destinations
135138

136139
@Serializable
137-
object TopAppBar : Destinations
140+
data object TopAppBar : Destinations
138141
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package kiwi.orbit.compose.catalog.screens
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.Row
7+
import androidx.compose.foundation.layout.fillMaxSize
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.rememberScrollState
10+
import androidx.compose.foundation.verticalScroll
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.remember
13+
import androidx.compose.runtime.rememberCoroutineScope
14+
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.platform.testTag
16+
import androidx.compose.ui.tooling.preview.Preview
17+
import androidx.compose.ui.unit.dp
18+
import kiwi.orbit.compose.catalog.AppTheme
19+
import kiwi.orbit.compose.catalog.semantics.SubScreenSemantics
20+
import kiwi.orbit.compose.icons.Icons
21+
import kiwi.orbit.compose.ui.controls.Coupon
22+
import kiwi.orbit.compose.ui.controls.Scaffold
23+
import kiwi.orbit.compose.ui.controls.Text
24+
import kiwi.orbit.compose.ui.controls.ToastHostState
25+
import kiwi.orbit.compose.ui.controls.TopAppBar
26+
import kotlinx.coroutines.launch
27+
28+
@Composable
29+
internal fun CouponScreen(
30+
onNavigateUp: () -> Unit,
31+
) {
32+
val toastHostState = remember { ToastHostState() }
33+
val coroutineScope = rememberCoroutineScope()
34+
35+
Scaffold(
36+
modifier = Modifier.testTag(SubScreenSemantics.Tag),
37+
topBar = {
38+
TopAppBar(
39+
title = { Text("Coupon") },
40+
onNavigateUp = onNavigateUp,
41+
)
42+
},
43+
toastHostState = toastHostState,
44+
) { contentPadding ->
45+
Box(
46+
modifier = Modifier
47+
.fillMaxSize()
48+
.verticalScroll(rememberScrollState())
49+
.padding(contentPadding),
50+
) {
51+
CouponScreenInner(
52+
onCouponCopied = {
53+
coroutineScope.launch {
54+
toastHostState.showToast("Copied to clipboard!") { Icons.Copy }
55+
}
56+
},
57+
)
58+
}
59+
}
60+
}
61+
62+
@Composable
63+
private fun CouponScreenInner(
64+
onCouponCopied: () -> Unit,
65+
) {
66+
Column(
67+
modifier = Modifier.padding(16.dp),
68+
verticalArrangement = Arrangement.spacedBy(16.dp),
69+
) {
70+
Row(
71+
horizontalArrangement = Arrangement.spacedBy(4.dp),
72+
) {
73+
Text(
74+
text = "Your coupon:",
75+
modifier = Modifier.alignByBaseline(),
76+
)
77+
Coupon(
78+
code = "hxt3b81f",
79+
onCopied = null,
80+
modifier = Modifier.alignByBaseline(),
81+
)
82+
}
83+
Row(
84+
horizontalArrangement = Arrangement.spacedBy(4.dp),
85+
) {
86+
Text(
87+
text = "Copy your coupon:",
88+
modifier = Modifier.alignByBaseline(),
89+
)
90+
Coupon(
91+
code = "hxt3b81f",
92+
onCopied = onCouponCopied,
93+
modifier = Modifier.alignByBaseline(),
94+
)
95+
}
96+
}
97+
}
98+
99+
@Preview
100+
@Composable
101+
private fun CouponScreenPreview() {
102+
AppTheme {
103+
CouponScreen(onNavigateUp = {})
104+
}
105+
}

catalog/src/main/java/kiwi/orbit/compose/catalog/screens/MainScreen.kt

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ internal fun MainScreen(
9494
MenuItem("Checkbox", MIcons.CheckBox, Semantics.CheckboxItemTag) { Destinations.Checkbox },
9595
MenuItem("Choice Tile", MIcons.Ballot, Semantics.ChoiceTileItemTag) { Destinations.ChoiceTile },
9696
MenuItem("Collapse", Icons.ChevronDown, Semantics.CollapseItemTag) { Destinations.Collapse },
97+
MenuItem("Coupon", Icons.PromoCode, Semantics.CouponItemTag) { Destinations.Coupon },
9798
MenuItem("Dialog", Icons.Chat, Semantics.DialogItemTag) { Destinations.Dialog },
9899
MenuItem("EmptyState", MIcons.SignalWifiOff, Semantics.EmptyStateItemTag) { Destinations.EmptyState },
99100
MenuItem("KeyValue", MIcons.DragHandle, Semantics.KeyValueItemTag) { Destinations.KeyValue },

component-status.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
android: Released
2323
- component: CountryFlag
2424
android: Released
25+
- component: Coupon
26+
android: Released
2527
- component: Dialog
2628
android: Released
2729
- component: EmptyState

0 commit comments

Comments
 (0)