@momo-kits/native-kits 0.157.1-skill.1-debug → 0.157.1-skill.3-debug
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/momo-native-kits-skill/SKILL.md +51 -0
- package/.claude/momo-native-kits-skill/evals/evals.json +95 -0
- package/.claude/momo-native-kits-skill/references/badge.md +52 -0
- package/.claude/momo-native-kits-skill/references/button.md +182 -0
- package/.claude/momo-native-kits-skill/references/card.md +48 -0
- package/.claude/momo-native-kits-skill/references/checkbox.md +51 -0
- package/.claude/momo-native-kits-skill/references/chip.md +48 -0
- package/.claude/momo-native-kits-skill/references/constants.md +260 -0
- package/.claude/momo-native-kits-skill/references/divider.md +26 -0
- package/.claude/momo-native-kits-skill/references/input.md +408 -0
- package/.claude/momo-native-kits-skill/references/navigation.md +475 -0
- package/.claude/momo-native-kits-skill/references/popup.md +97 -0
- package/.claude/momo-native-kits-skill/references/radio.md +60 -0
- package/.claude/momo-native-kits-skill/references/skeleton.md +40 -0
- package/.claude/momo-native-kits-skill/references/snackbar.md +54 -0
- package/.claude/momo-native-kits-skill/references/switch.md +62 -0
- package/.claude/momo-native-kits-skill/references/text.md +195 -0
- package/.claude/momo-native-kits-skill/references/tooltip.md +34 -0
- package/.claude/momo-native-kits-skill/references/trustbanner.md +61 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/benchmark.json +20 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/benchmark.md +13 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/eval_metadata.json +6 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/with_skill/outputs/ButtonExample.kt +55 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/without_skill/outputs/ButtonExample.kt +45 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/eval_metadata.json +6 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/with_skill/outputs/InputPhoneExample.kt +40 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/without_skill/outputs/InputPhoneExample.kt +42 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/eval_metadata.json +6 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/with_skill/outputs/BottomTabExample.kt +236 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/without_skill/outputs/BottomTabExample.kt +152 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/eval_metadata.json +6 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/with_skill/outputs/CheckBoxExample.kt +49 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/without_skill/outputs/CheckBoxExample.kt +123 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/eval_metadata.json +6 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/with_skill/outputs/DateTimePickerExample.kt +318 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/without_skill/outputs/DateTimePickerExample.kt +330 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-card/with_skill/outputs/CardExample.kt +124 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-card/without_skill/outputs/CardExample.kt +71 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-loginform/with_skill/outputs/LoginFormExample.kt +134 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-loginform/without_skill/outputs/LoginFormExample.kt +199 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-navcontainer/with_skill/outputs/NavigationContainerExample.kt +224 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-navcontainer/without_skill/outputs/NavigationContainerExample.kt +225 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-popup/with_skill/outputs/PopupExample.kt +79 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-popup/without_skill/outputs/PopupExample.kt +169 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/eval_metadata.json +6 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/with_skill/outputs/SetOptionsExample.kt +255 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/without_skill/outputs/SetOptionsExample.kt +212 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-skeleton/with_skill/outputs/SkeletonExample.kt +199 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-skeleton/without_skill/outputs/SkeletonExample.kt +229 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/benchmark.json +20 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/benchmark.md +13 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/eval_metadata.json +22 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/with_skill/outputs/PrimaryButtonExample.kt +38 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/with_skill/timing.json +5 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/without_skill/outputs/PrimaryButtonExample.kt +83 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/without_skill/timing.json +5 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/eval_metadata.json +22 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/with_skill/outputs/NavigationContainerExample.kt +547 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/with_skill/timing.json +5 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/without_skill/outputs/MoMoNavigationContainer.kt +519 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/without_skill/timing.json +5 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/eval_metadata.json +27 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/with_skill/outputs/SetOptionsExample.kt +429 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/with_skill/timing.json +5 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/without_skill/outputs/SetOptionsExample.kt +353 -0
- package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/without_skill/timing.json +5 -0
- package/.claude/settings.local.json +35 -7
- package/compose/build.gradle.kts +1 -1
- package/gradle.properties +1 -1
- package/ios/Input/Input.swift +112 -50
- package/local.properties +1 -1
- package/package.json +1 -1
- package/.claude/momo-native-kits/SKILL.md +0 -87
- package/.claude/momo-native-kits/references/Badge.md +0 -39
- package/.claude/momo-native-kits/references/BadgeDot.md +0 -37
- package/.claude/momo-native-kits/references/BottomSheet.md +0 -51
- package/.claude/momo-native-kits/references/BottomTab.md +0 -65
- package/.claude/momo-native-kits/references/Button.md +0 -197
- package/.claude/momo-native-kits/references/CheckBox.md +0 -51
- package/.claude/momo-native-kits/references/Chip.md +0 -47
- package/.claude/momo-native-kits/references/Divider.md +0 -29
- package/.claude/momo-native-kits/references/HeaderTitle.md +0 -45
- package/.claude/momo-native-kits/references/HeaderType.md +0 -47
- package/.claude/momo-native-kits/references/Icon.md +0 -32
- package/.claude/momo-native-kits/references/Image.md +0 -38
- package/.claude/momo-native-kits/references/Information.md +0 -36
- package/.claude/momo-native-kits/references/Input.md +0 -334
- package/.claude/momo-native-kits/references/InputDropDown.md +0 -47
- package/.claude/momo-native-kits/references/InputMoney.md +0 -241
- package/.claude/momo-native-kits/references/InputOTP.md +0 -52
- package/.claude/momo-native-kits/references/InputPhoneNumber.md +0 -175
- package/.claude/momo-native-kits/references/InputSearch.md +0 -57
- package/.claude/momo-native-kits/references/InputTextArea.md +0 -46
- package/.claude/momo-native-kits/references/NavigationContainer.md +0 -51
- package/.claude/momo-native-kits/references/Navigator.md +0 -287
- package/.claude/momo-native-kits/references/PaginationDot.md +0 -28
- package/.claude/momo-native-kits/references/PaginationNumber.md +0 -28
- package/.claude/momo-native-kits/references/PopupNotify.md +0 -47
- package/.claude/momo-native-kits/references/Radio.md +0 -44
- package/.claude/momo-native-kits/references/Skeleton.md +0 -32
- package/.claude/momo-native-kits/references/Switch.md +0 -36
- package/.claude/momo-native-kits/references/Tag.md +0 -40
- package/.claude/momo-native-kits/references/Text.md +0 -37
- package/.claude/momo-native-kits/references/Title.md +0 -43
- package/.claude/momo-native-kits/references/Tooltip.md +0 -30
- package/building-skill-for-claude.md +0 -1190
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
package com.example.momoapp
|
|
2
|
+
|
|
3
|
+
import androidx.compose.foundation.layout.Box
|
|
4
|
+
import androidx.compose.foundation.layout.fillMaxSize
|
|
5
|
+
import androidx.compose.foundation.layout.padding
|
|
6
|
+
import androidx.compose.material3.Text
|
|
7
|
+
import androidx.compose.runtime.Composable
|
|
8
|
+
import androidx.compose.ui.Alignment
|
|
9
|
+
import androidx.compose.ui.Modifier
|
|
10
|
+
import androidx.compose.ui.unit.dp
|
|
11
|
+
import vn.momo.kits.navigation.BottomTab
|
|
12
|
+
import vn.momo.kits.navigation.BottomTabItem
|
|
13
|
+
import vn.momo.kits.navigation.NavigationOptions
|
|
14
|
+
import vn.momo.kits.navigation.StackScreen
|
|
15
|
+
import vn.momo.kits.navigation.component.HeaderType
|
|
16
|
+
import vn.momo.kits.components.Title
|
|
17
|
+
import vn.momo.kits.components.TitleType
|
|
18
|
+
import vn.momo.kits.navigation.component.Header
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* MoMo App Bottom Tab Navigation Example
|
|
22
|
+
*
|
|
23
|
+
* This example demonstrates how to implement a bottom tab navigation
|
|
24
|
+
* with 4 tabs: Home, Wallet, History, Profile
|
|
25
|
+
*/
|
|
26
|
+
@Composable
|
|
27
|
+
fun MoMoApp() {
|
|
28
|
+
BottomTab(
|
|
29
|
+
items = listOf(
|
|
30
|
+
// Home Tab
|
|
31
|
+
BottomTabItem(
|
|
32
|
+
name = "home",
|
|
33
|
+
label = "Trang chủ",
|
|
34
|
+
icon = "ic_home",
|
|
35
|
+
screen = {
|
|
36
|
+
StackScreen(
|
|
37
|
+
navigationOptions = NavigationOptions(
|
|
38
|
+
headerType = HeaderType.DEFAULT,
|
|
39
|
+
isShowBottomTab = true
|
|
40
|
+
)
|
|
41
|
+
) {
|
|
42
|
+
HomeScreen()
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
|
|
47
|
+
// Wallet Tab
|
|
48
|
+
BottomTabItem(
|
|
49
|
+
name = "wallet",
|
|
50
|
+
label = "Ví của tôi",
|
|
51
|
+
icon = "ic_wallet",
|
|
52
|
+
screen = {
|
|
53
|
+
StackScreen(
|
|
54
|
+
navigationOptions = NavigationOptions(
|
|
55
|
+
headerType = HeaderType.DEFAULT,
|
|
56
|
+
isShowBottomTab = true
|
|
57
|
+
)
|
|
58
|
+
) {
|
|
59
|
+
WalletScreen()
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
|
|
64
|
+
// History Tab
|
|
65
|
+
BottomTabItem(
|
|
66
|
+
name = "history",
|
|
67
|
+
label = "Lịch sử",
|
|
68
|
+
icon = "ic_history",
|
|
69
|
+
screen = {
|
|
70
|
+
StackScreen(
|
|
71
|
+
navigationOptions = NavigationOptions(
|
|
72
|
+
headerType = HeaderType.DEFAULT,
|
|
73
|
+
isShowBottomTab = true
|
|
74
|
+
)
|
|
75
|
+
) {
|
|
76
|
+
HistoryScreen()
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
),
|
|
80
|
+
|
|
81
|
+
// Profile Tab
|
|
82
|
+
BottomTabItem(
|
|
83
|
+
name = "profile",
|
|
84
|
+
label = "Tài khoản",
|
|
85
|
+
icon = "ic_profile",
|
|
86
|
+
screen = {
|
|
87
|
+
StackScreen(
|
|
88
|
+
navigationOptions = NavigationOptions(
|
|
89
|
+
headerType = HeaderType.DEFAULT,
|
|
90
|
+
isShowBottomTab = true
|
|
91
|
+
)
|
|
92
|
+
) {
|
|
93
|
+
ProfileScreen()
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ==================== Screen Composables ====================
|
|
102
|
+
|
|
103
|
+
@Composable
|
|
104
|
+
private fun HomeScreen() {
|
|
105
|
+
Box(
|
|
106
|
+
modifier = Modifier
|
|
107
|
+
.fillMaxSize()
|
|
108
|
+
.padding(16.dp),
|
|
109
|
+
contentAlignment = Alignment.Center
|
|
110
|
+
) {
|
|
111
|
+
Title(
|
|
112
|
+
text = "Trang chủ",
|
|
113
|
+
type = TitleType.TITLE_1
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
@Composable
|
|
119
|
+
private fun WalletScreen() {
|
|
120
|
+
Box(
|
|
121
|
+
modifier = Modifier
|
|
122
|
+
.fillMaxSize()
|
|
123
|
+
.padding(16.dp),
|
|
124
|
+
contentAlignment = Alignment.Center
|
|
125
|
+
) {
|
|
126
|
+
Title(
|
|
127
|
+
text = "Ví của tôi",
|
|
128
|
+
type = TitleType.TITLE_1
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@Composable
|
|
134
|
+
private fun HistoryScreen() {
|
|
135
|
+
Box(
|
|
136
|
+
modifier = Modifier
|
|
137
|
+
.fillMaxSize()
|
|
138
|
+
.padding(16.dp),
|
|
139
|
+
contentAlignment = Alignment.Center
|
|
140
|
+
) {
|
|
141
|
+
Title(
|
|
142
|
+
text = "Lịch sử giao dịch",
|
|
143
|
+
type = TitleType.TITLE_1
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@Composable
|
|
149
|
+
private fun ProfileScreen() {
|
|
150
|
+
Box(
|
|
151
|
+
modifier = Modifier
|
|
152
|
+
.fillMaxSize()
|
|
153
|
+
.padding(16.dp),
|
|
154
|
+
contentAlignment = Alignment.Center
|
|
155
|
+
) {
|
|
156
|
+
Title(
|
|
157
|
+
text = "Tài khoản",
|
|
158
|
+
type = TitleType.TITLE_1
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ==================== Alternative: With Badge Example ====================
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Example showing how to add badges/dots to tabs
|
|
167
|
+
*/
|
|
168
|
+
@Composable
|
|
169
|
+
fun MoMoAppWithBadges() {
|
|
170
|
+
BottomTab(
|
|
171
|
+
items = listOf(
|
|
172
|
+
BottomTabItem(
|
|
173
|
+
name = "home",
|
|
174
|
+
label = "Trang chủ",
|
|
175
|
+
icon = "ic_home",
|
|
176
|
+
screen = {
|
|
177
|
+
StackScreen(
|
|
178
|
+
navigationOptions = NavigationOptions(
|
|
179
|
+
headerType = HeaderType.DEFAULT,
|
|
180
|
+
isShowBottomTab = true
|
|
181
|
+
)
|
|
182
|
+
) {
|
|
183
|
+
HomeScreen()
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
),
|
|
187
|
+
BottomTabItem(
|
|
188
|
+
name = "wallet",
|
|
189
|
+
label = "Ví của tôi",
|
|
190
|
+
icon = "ic_wallet",
|
|
191
|
+
showDot = true, // Shows notification dot
|
|
192
|
+
screen = {
|
|
193
|
+
StackScreen(
|
|
194
|
+
navigationOptions = NavigationOptions(
|
|
195
|
+
headerType = HeaderType.DEFAULT,
|
|
196
|
+
isShowBottomTab = true
|
|
197
|
+
)
|
|
198
|
+
) {
|
|
199
|
+
WalletScreen()
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
),
|
|
203
|
+
BottomTabItem(
|
|
204
|
+
name = "history",
|
|
205
|
+
label = "Lịch sử",
|
|
206
|
+
icon = "ic_history",
|
|
207
|
+
badgeLabel = "3", // Shows badge with number
|
|
208
|
+
screen = {
|
|
209
|
+
StackScreen(
|
|
210
|
+
navigationOptions = NavigationOptions(
|
|
211
|
+
headerType = HeaderType.DEFAULT,
|
|
212
|
+
isShowBottomTab = true
|
|
213
|
+
)
|
|
214
|
+
) {
|
|
215
|
+
HistoryScreen()
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
),
|
|
219
|
+
BottomTabItem(
|
|
220
|
+
name = "profile",
|
|
221
|
+
label = "Tài khoản",
|
|
222
|
+
icon = "ic_profile",
|
|
223
|
+
screen = {
|
|
224
|
+
StackScreen(
|
|
225
|
+
navigationOptions = NavigationOptions(
|
|
226
|
+
headerType = HeaderType.DEFAULT,
|
|
227
|
+
isShowBottomTab = true
|
|
228
|
+
)
|
|
229
|
+
) {
|
|
230
|
+
ProfileScreen()
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
)
|
|
234
|
+
)
|
|
235
|
+
)
|
|
236
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
package com.momo.app.ui.navigation
|
|
2
|
+
|
|
3
|
+
import androidx.compose.foundation.layout.padding
|
|
4
|
+
import androidx.compose.material.icons.Icons
|
|
5
|
+
import androidx.compose.material.icons.filled.Home
|
|
6
|
+
import androidx.compose.material.icons.filled.Person
|
|
7
|
+
import androidx.compose.material.icons.filled.Receipt
|
|
8
|
+
import androidx.compose.material.icons.filled.Wallet
|
|
9
|
+
import androidx.compose.material.icons.outlined.Home
|
|
10
|
+
import androidx.compose.material.icons.outlined.Person
|
|
11
|
+
import androidx.compose.material.icons.outlined.Receipt
|
|
12
|
+
import androidx.compose.material.icons.outlined.Wallet
|
|
13
|
+
import androidx.compose.material3.Icon
|
|
14
|
+
import androidx.compose.material3.NavigationBar
|
|
15
|
+
import androidx.compose.material3.NavigationBarItem
|
|
16
|
+
import androidx.compose.material3.Scaffold
|
|
17
|
+
import androidx.compose.material3.Text
|
|
18
|
+
import androidx.compose.runtime.Composable
|
|
19
|
+
import androidx.compose.runtime.getValue
|
|
20
|
+
import androidx.compose.ui.Modifier
|
|
21
|
+
import androidx.compose.ui.graphics.vector.ImageVector
|
|
22
|
+
import androidx.navigation.NavDestination.Companion.hierarchy
|
|
23
|
+
import androidx.navigation.NavGraph.Companion.findStartDestination
|
|
24
|
+
import androidx.navigation.compose.NavHost
|
|
25
|
+
import androidx.navigation.compose.composable
|
|
26
|
+
import androidx.navigation.compose.currentBackStackEntryAsState
|
|
27
|
+
import androidx.navigation.compose.rememberNavController
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Bottom Tab Navigation with 4 tabs: Home, Wallet, History, Profile
|
|
31
|
+
* Designed for MoMo app
|
|
32
|
+
*/
|
|
33
|
+
sealed class BottomNavItem(
|
|
34
|
+
val route: String,
|
|
35
|
+
val title: String,
|
|
36
|
+
val selectedIcon: ImageVector,
|
|
37
|
+
val unselectedIcon: ImageVector
|
|
38
|
+
) {
|
|
39
|
+
data object Home : BottomNavItem(
|
|
40
|
+
route = "home",
|
|
41
|
+
title = "Home",
|
|
42
|
+
selectedIcon = Icons.Filled.Home,
|
|
43
|
+
unselectedIcon = Icons.Outlined.Home
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
data object Wallet : BottomNavItem(
|
|
47
|
+
route = "wallet",
|
|
48
|
+
title = "Wallet",
|
|
49
|
+
selectedIcon = Icons.Filled.Wallet,
|
|
50
|
+
unselectedIcon = Icons.Outlined.Wallet
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
data object History : BottomNavItem(
|
|
54
|
+
route = "history",
|
|
55
|
+
title = "History",
|
|
56
|
+
selectedIcon = Icons.Filled.Receipt,
|
|
57
|
+
unselectedIcon = Icons.Outlined.Receipt
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
data object Profile : BottomNavItem(
|
|
61
|
+
route = "profile",
|
|
62
|
+
title = "Profile",
|
|
63
|
+
selectedIcon = Icons.Filled.Person,
|
|
64
|
+
unselectedIcon = Icons.Outlined.Person
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@Composable
|
|
69
|
+
fun BottomTabNavigation() {
|
|
70
|
+
val navController = rememberNavController()
|
|
71
|
+
val navBackStackEntry by navController.currentBackStackEntryAsState()
|
|
72
|
+
val currentDestination = navBackStackEntry?.destination
|
|
73
|
+
|
|
74
|
+
val bottomNavItems = listOf(
|
|
75
|
+
BottomNavItem.Home,
|
|
76
|
+
BottomNavItem.Wallet,
|
|
77
|
+
BottomNavItem.History,
|
|
78
|
+
BottomNavItem.Profile
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
Scaffold(
|
|
82
|
+
bottomBar = {
|
|
83
|
+
NavigationBar {
|
|
84
|
+
bottomNavItems.forEach { item ->
|
|
85
|
+
val selected = currentDestination?.hierarchy?.any { it.route == item.route } == true
|
|
86
|
+
|
|
87
|
+
NavigationBarItem(
|
|
88
|
+
selected = selected,
|
|
89
|
+
onClick = {
|
|
90
|
+
navController.navigate(item.route) {
|
|
91
|
+
popUpTo(navController.graph.findStartDestination().id) {
|
|
92
|
+
saveState = true
|
|
93
|
+
}
|
|
94
|
+
launchSingleTop = true
|
|
95
|
+
restoreState = true
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
icon = {
|
|
99
|
+
Icon(
|
|
100
|
+
imageVector = if (selected) item.selectedIcon else item.unselectedIcon,
|
|
101
|
+
contentDescription = item.title
|
|
102
|
+
)
|
|
103
|
+
},
|
|
104
|
+
label = {
|
|
105
|
+
Text(text = item.title)
|
|
106
|
+
}
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
) { paddingValues ->
|
|
112
|
+
NavHost(
|
|
113
|
+
navController = navController,
|
|
114
|
+
startDestination = BottomNavItem.Home.route,
|
|
115
|
+
modifier = Modifier.padding(paddingValues)
|
|
116
|
+
) {
|
|
117
|
+
composable(BottomNavItem.Home.route) {
|
|
118
|
+
HomeScreen()
|
|
119
|
+
}
|
|
120
|
+
composable(BottomNavItem.Wallet.route) {
|
|
121
|
+
WalletScreen()
|
|
122
|
+
}
|
|
123
|
+
composable(BottomNavItem.History.route) {
|
|
124
|
+
HistoryScreen()
|
|
125
|
+
}
|
|
126
|
+
composable(BottomNavItem.Profile.route) {
|
|
127
|
+
ProfileScreen()
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Placeholder screens for each tab
|
|
134
|
+
@Composable
|
|
135
|
+
private fun HomeScreen() {
|
|
136
|
+
Text(text = "Home Screen")
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@Composable
|
|
140
|
+
private fun WalletScreen() {
|
|
141
|
+
Text(text = "Wallet Screen")
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@Composable
|
|
145
|
+
private fun HistoryScreen() {
|
|
146
|
+
Text(text = "History Screen")
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@Composable
|
|
150
|
+
private fun ProfileScreen() {
|
|
151
|
+
Text(text = "Profile Screen")
|
|
152
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
package com.example
|
|
2
|
+
|
|
3
|
+
import androidx.compose.foundation.layout.Column
|
|
4
|
+
import androidx.compose.foundation.layout.Spacer
|
|
5
|
+
import androidx.compose.foundation.layout.height
|
|
6
|
+
import androidx.compose.foundation.layout.padding
|
|
7
|
+
import androidx.compose.runtime.getValue
|
|
8
|
+
import androidx.compose.runtime.mutableStateOf
|
|
9
|
+
import androidx.compose.runtime.remember
|
|
10
|
+
import androidx.compose.runtime.setValue
|
|
11
|
+
import androidx.compose.ui.Modifier
|
|
12
|
+
import androidx.compose.ui.unit.dp
|
|
13
|
+
import vn.momo.kits.components.Button
|
|
14
|
+
import vn.momo.kits.components.ButtonType
|
|
15
|
+
import vn.momo.kits.components.CheckBox
|
|
16
|
+
import vn.momo.kits.components.Size
|
|
17
|
+
import vn.momo.kits.const.Spacing
|
|
18
|
+
|
|
19
|
+
@Composable
|
|
20
|
+
fun TermsAndConditionsScreen() {
|
|
21
|
+
var isAgreed by remember { mutableStateOf(false) }
|
|
22
|
+
|
|
23
|
+
Column(
|
|
24
|
+
modifier = Modifier.padding(Spacing.L)
|
|
25
|
+
) {
|
|
26
|
+
// Checkbox for terms and conditions agreement
|
|
27
|
+
CheckBox(
|
|
28
|
+
checked = isAgreed,
|
|
29
|
+
onCheckedChange = { isAgreed = it },
|
|
30
|
+
label = "Tôi đồng ý với Điều khoản dịch vụ và Chính sách bảo mật",
|
|
31
|
+
enabled = true
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
Spacer(modifier = Modifier.height(Spacing.XL))
|
|
35
|
+
|
|
36
|
+
// Submit button that is enabled only when checkbox is checked
|
|
37
|
+
Button(
|
|
38
|
+
onClick = {
|
|
39
|
+
// Handle terms acceptance submission
|
|
40
|
+
// Navigate to next screen or process registration
|
|
41
|
+
},
|
|
42
|
+
title = "Tiếp tục",
|
|
43
|
+
type = ButtonType.PRIMARY,
|
|
44
|
+
size = Size.LARGE,
|
|
45
|
+
isFull = true,
|
|
46
|
+
enabled = isAgreed
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
package com.example.checkbox
|
|
2
|
+
|
|
3
|
+
import androidx.compose.foundation.layout.Column
|
|
4
|
+
import androidx.compose.foundation.layout.Row
|
|
5
|
+
import androidx.compose.foundation.layout.Spacer
|
|
6
|
+
import androidx.compose.foundation.layout.fillMaxWidth
|
|
7
|
+
import androidx.compose.foundation.layout.height
|
|
8
|
+
import androidx.compose.foundation.layout.padding
|
|
9
|
+
import androidx.compose.foundation.layout.width
|
|
10
|
+
import androidx.compose.material3.Button
|
|
11
|
+
import androidx.compose.material3.Checkbox
|
|
12
|
+
import androidx.compose.material3.MaterialTheme
|
|
13
|
+
import androidx.compose.material3.Text
|
|
14
|
+
import androidx.compose.material3.TextButton
|
|
15
|
+
import androidx.compose.runtime.Composable
|
|
16
|
+
import androidx.compose.runtime.getValue
|
|
17
|
+
import androidx.compose.runtime.mutableStateOf
|
|
18
|
+
import androidx.compose.runtime.remember
|
|
19
|
+
import androidx.compose.runtime.setValue
|
|
20
|
+
import androidx.compose.ui.Alignment
|
|
21
|
+
import androidx.compose.ui.Modifier
|
|
22
|
+
import androidx.compose.ui.text.style.TextDecoration
|
|
23
|
+
import androidx.compose.ui.unit.dp
|
|
24
|
+
|
|
25
|
+
@Composable
|
|
26
|
+
fun TermsAndConditionsCheckbox(
|
|
27
|
+
onTermsAccepted: (Boolean) -> Unit,
|
|
28
|
+
modifier: Modifier = Modifier
|
|
29
|
+
) {
|
|
30
|
+
var isChecked by remember { mutableStateOf(false) }
|
|
31
|
+
|
|
32
|
+
Row(
|
|
33
|
+
modifier = modifier
|
|
34
|
+
.fillMaxWidth()
|
|
35
|
+
.padding(vertical = 8.dp),
|
|
36
|
+
verticalAlignment = Alignment.CenterVertically
|
|
37
|
+
) {
|
|
38
|
+
Checkbox(
|
|
39
|
+
checked = isChecked,
|
|
40
|
+
onCheckedChange = { newValue ->
|
|
41
|
+
isChecked = newValue
|
|
42
|
+
onTermsAccepted(newValue)
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
Spacer(modifier = Modifier.width(8.dp))
|
|
47
|
+
|
|
48
|
+
Column(modifier = Modifier.weight(1f)) {
|
|
49
|
+
Row(verticalAlignment = Alignment.CenterVertically) {
|
|
50
|
+
Text(
|
|
51
|
+
text = "I agree to the",
|
|
52
|
+
style = MaterialTheme.typography.bodyMedium
|
|
53
|
+
)
|
|
54
|
+
TextButton(onClick = { /* Open terms */ }) {
|
|
55
|
+
Text(
|
|
56
|
+
text = "Terms and Conditions",
|
|
57
|
+
style = MaterialTheme.typography.bodyMedium,
|
|
58
|
+
textDecoration = TextDecoration.Underline,
|
|
59
|
+
color = MaterialTheme.colorScheme.primary
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
Text(
|
|
65
|
+
text = "and",
|
|
66
|
+
style = MaterialTheme.typography.bodyMedium
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
TextButton(onClick = { /* Open privacy policy */ }) {
|
|
70
|
+
Text(
|
|
71
|
+
text = "Privacy Policy",
|
|
72
|
+
style = MaterialTheme.typography.bodyMedium,
|
|
73
|
+
textDecoration = TextDecoration.Underline,
|
|
74
|
+
color = MaterialTheme.colorScheme.primary
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@Composable
|
|
82
|
+
fun CheckBoxExample(
|
|
83
|
+
modifier: Modifier = Modifier
|
|
84
|
+
) {
|
|
85
|
+
var termsAccepted by remember { mutableStateOf(false) }
|
|
86
|
+
|
|
87
|
+
Column(
|
|
88
|
+
modifier = modifier
|
|
89
|
+
.fillMaxWidth()
|
|
90
|
+
.padding(16.dp)
|
|
91
|
+
) {
|
|
92
|
+
Text(
|
|
93
|
+
text = "Create Account",
|
|
94
|
+
style = MaterialTheme.typography.headlineMedium,
|
|
95
|
+
modifier = Modifier.padding(bottom = 24.dp)
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
TermsAndConditionsCheckbox(
|
|
99
|
+
onTermsAccepted = { accepted ->
|
|
100
|
+
termsAccepted = accepted
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
Spacer(modifier = Modifier.height(24.dp))
|
|
105
|
+
|
|
106
|
+
Button(
|
|
107
|
+
onClick = { /* Handle signup */ },
|
|
108
|
+
enabled = termsAccepted,
|
|
109
|
+
modifier = Modifier.fillMaxWidth()
|
|
110
|
+
) {
|
|
111
|
+
Text(text = "Sign Up")
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (!termsAccepted) {
|
|
115
|
+
Spacer(modifier = Modifier.height(8.dp))
|
|
116
|
+
Text(
|
|
117
|
+
text = "Please accept the terms and conditions to continue",
|
|
118
|
+
style = MaterialTheme.typography.bodySmall,
|
|
119
|
+
color = MaterialTheme.colorScheme.error
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|