@momo-kits/native-kits 0.164.1-beta.7-debug → 0.164.1-beta.7

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.
Files changed (134) hide show
  1. package/package.json +1 -1
  2. package/build.gradle.kts +0 -11
  3. package/compose/build.gradle.kts +0 -190
  4. package/compose/build.gradle.kts.backup +0 -190
  5. package/compose/compose.podspec +0 -47
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  8. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  9. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -150
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -106
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -826
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -134
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -475
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -214
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -216
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -259
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -182
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -328
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -97
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -217
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -470
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -131
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -203
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -175
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -16
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -263
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -52
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -38
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -39
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -299
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -129
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -103
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -190
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -406
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -612
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -164
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -156
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -225
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -320
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -81
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -309
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -34
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -360
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -69
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -105
  121. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -40
  122. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -118
  123. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  124. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  125. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -220
  126. package/gradle/libs.versions.toml +0 -69
  127. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  128. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  129. package/gradle.properties +0 -26
  130. package/gradlew +0 -252
  131. package/gradlew.bat +0 -94
  132. package/ios-demo/README.md +0 -120
  133. package/local.properties +0 -8
  134. package/settings.gradle.kts +0 -64
@@ -1,309 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import vn.momo.kits.modifier.InternalApi
4
-
5
- import androidx.compose.foundation.background
6
- import androidx.compose.foundation.border
7
- import androidx.compose.foundation.layout.Arrangement
8
- import androidx.compose.foundation.layout.Box
9
- import androidx.compose.foundation.layout.Row
10
- import androidx.compose.foundation.layout.height
11
- import androidx.compose.foundation.layout.offset
12
- import androidx.compose.foundation.layout.padding
13
- import androidx.compose.foundation.layout.size
14
- import androidx.compose.foundation.layout.width
15
- import androidx.compose.foundation.shape.CircleShape
16
- import androidx.compose.foundation.shape.RoundedCornerShape
17
- import androidx.compose.runtime.Composable
18
- import androidx.compose.runtime.LaunchedEffect
19
- import androidx.compose.runtime.derivedStateOf
20
- import androidx.compose.runtime.getValue
21
- import androidx.compose.runtime.mutableStateOf
22
- import androidx.compose.runtime.remember
23
- import androidx.compose.runtime.setValue
24
- import androidx.compose.ui.Alignment
25
- import androidx.compose.ui.Modifier
26
- import androidx.compose.ui.draw.clip
27
- import androidx.compose.ui.graphics.Color
28
- import androidx.compose.ui.unit.dp
29
- import vn.momo.kits.application.LocalContext
30
- import vn.momo.kits.application.MiniAppContext
31
- import vn.momo.kits.components.BadgeDot
32
- import vn.momo.kits.components.DotSize
33
- import vn.momo.kits.components.Icon
34
- import vn.momo.kits.const.Colors
35
- import vn.momo.kits.const.Spacing
36
- import vn.momo.kits.modifier.activeOpacityClickable
37
- import vn.momo.kits.navigation.LocalMaxApi
38
-
39
- @Composable
40
- @InternalApi
41
- fun HeaderRight(
42
- headerRight: HeaderRight,
43
- tintColor: Color? = null,
44
- headerColor: HeaderColor
45
- ) {
46
- when (headerRight) {
47
- is HeaderRight.None -> {}
48
- is HeaderRight.Custom -> {
49
- headerRight.content()
50
- }
51
- is HeaderRight.OnBoarding -> {}
52
- is HeaderRight.Toolkit -> {
53
- Toolkit(
54
- headerRight = headerRight,
55
- tintColor = tintColor,
56
- headerColor = headerColor
57
- )
58
- }
59
- }
60
- }
61
-
62
- @Composable
63
- internal fun Toolkit(
64
- headerRight: HeaderRight.Toolkit,
65
- tintColor: Color? = null,
66
- headerColor: HeaderColor
67
- ) {
68
- val api = LocalMaxApi.current
69
- val context = LocalContext.current
70
-
71
- var isFavorite by remember { mutableStateOf(false) }
72
- val isLoading by remember { mutableStateOf(false) }
73
-
74
- LaunchedEffect(context?.appCode) {
75
- api?.isFavoriteApp(mapOf("code" to context?.appCode)) { callback ->
76
- val response = callback?.get("response") as? Boolean
77
- isFavorite = response == true
78
- }
79
- }
80
-
81
- fun onPressShortcut() {
82
- api?.onToolAction(mapOf("item" to mapOf("key" to "onFavorite"), "context" to MiniAppContext.toMap(context))) { callback ->
83
- val response = callback?.get("response") as? Map<*, *>?
84
- val success = response?.get("success") as? Boolean
85
- if (success == true){
86
- isFavorite = !isFavorite
87
- }
88
- }
89
- }
90
-
91
- fun onPressMore() {
92
- api?.showTools(
93
- mapOf(
94
- "useSystemTools" to headerRight.useSystemTools,
95
- "tools" to headerRight.tools.map { it.toMap() },
96
- "context" to MiniAppContext.toMap(context)
97
- )
98
- ) { callback ->
99
- val response = callback?.get("response") as? String
100
- if (response != null) {
101
- headerRight.toolCallback?.invoke(response)
102
- }
103
- }
104
- }
105
-
106
- val navButtonConfig = getNavigationButtonConfig(
107
- headerRight,
108
- ::onPressShortcut,
109
- ::onPressMore
110
- )
111
-
112
- val showBadge = headerRight.tools.any { group ->
113
- group.items.any { it.showBadge }
114
- }
115
-
116
- val isShowShortcut by remember(headerRight.useShortcut, headerRight.useMore, context) {
117
- derivedStateOf {
118
- (headerRight.useShortcut == true) &&
119
- !(headerRight.useMore == true && context == null)
120
- }
121
- }
122
-
123
- val icon by remember(navButtonConfig.icon, isFavorite) {
124
- derivedStateOf {
125
- navButtonConfig.icon.takeUnless { it == "star" }
126
- ?: if (isFavorite) "pin_star_checked" else "pin_star"
127
- }
128
- }
129
-
130
- Row(
131
- verticalAlignment = Alignment.CenterVertically
132
- ) {
133
- if (isShowShortcut) {
134
- NavigationButton(
135
- disabled = isLoading,
136
- icon = icon,
137
- showBadge = showBadge,
138
- onClick = navButtonConfig.onPress,
139
- headerColor = headerColor
140
- )
141
- }
142
-
143
- Row(
144
- verticalAlignment = Alignment.CenterVertically,
145
- horizontalArrangement = Arrangement.Center,
146
- modifier = Modifier
147
- .padding(start = Spacing.S)
148
- .border(0.2.dp, headerColor.borderColor, shape = RoundedCornerShape(14.dp))
149
- .height(28.dp)
150
- .clip(shape = RoundedCornerShape(14.dp))
151
- .background(headerColor.backgroundButton)
152
- ) {
153
- if (context != null) {
154
- Icon(
155
- source = "help_center",
156
- size = 20.dp,
157
- color = headerColor.tintIconColor,
158
- modifier = Modifier.padding(4.dp).activeOpacityClickable {
159
- api?.showHelpCenter(
160
- mapOf(
161
- "appId" to context.appId,
162
- "code" to context.appCode,
163
- "name" to context.appName,
164
- "icon" to context.appIcon,
165
- "description" to context.description
166
- )
167
- ) {}
168
- }
169
- )
170
- Box(
171
- modifier = Modifier
172
- .width(0.5.dp)
173
- .height(12.dp)
174
- .background(tintColor ?: Colors.black_20)
175
- )
176
- }
177
- Icon(
178
- source = "16_basic_home",
179
- size = 20.dp,
180
- color = headerColor.tintIconColor,
181
- modifier = Modifier.padding(4.dp).activeOpacityClickable {
182
- api?.dismissAll { }
183
- }
184
- )
185
- }
186
- }
187
- }
188
-
189
-
190
-
191
- @Composable
192
- internal fun NavigationButton(
193
- disabled: Boolean,
194
- icon: String,
195
- showBadge: Boolean? = false,
196
- onClick: () -> Unit,
197
- headerColor: HeaderColor
198
- ) {
199
- Box(
200
- modifier = Modifier
201
- .size(28.dp)
202
- .activeOpacityClickable(enabled = !disabled, onClick = onClick)
203
- ) {
204
- Box(
205
- modifier = Modifier
206
- .matchParentSize()
207
- .clip(CircleShape)
208
- .background(headerColor.backgroundButton)
209
- .border(0.2.dp, headerColor.borderColor, CircleShape)
210
- )
211
- Box(
212
- modifier = Modifier.matchParentSize(),
213
- contentAlignment = Alignment.Center
214
- ) {
215
- Icon(
216
- source = icon,
217
- size = 20.dp,
218
- color = headerColor.tintIconColor
219
- )
220
- }
221
-
222
- if (showBadge == true) {
223
- BadgeDot(
224
- size = DotSize.Small,
225
- modifier = Modifier
226
- .align(Alignment.TopEnd)
227
- .offset(x = -Spacing.XXS, y = -Spacing.XXS)
228
- )
229
- }
230
- }
231
- }
232
-
233
- private fun getNavigationButtonConfig(
234
- headerRight: HeaderRight.Toolkit,
235
- onPressShortcut: () -> Unit,
236
- onPressMore: () -> Unit
237
- ): NavigationButtonConfig {
238
- val totalTools = headerRight.tools.sumOf { it.items.size }
239
- val config = NavigationButtonConfig(icon = "star", onPress = onPressShortcut)
240
- return if (totalTools > 1 || headerRight.useMore == true) {
241
- NavigationButtonConfig(
242
- icon = "navigation_more_icon",
243
- onPress = onPressMore
244
- )
245
- } else if (totalTools == 1 && headerRight.tools.isNotEmpty()) {
246
- val singleTool = headerRight.tools.first().items.firstOrNull()
247
- return if (singleTool != null){
248
- NavigationButtonConfig(
249
- icon = singleTool.icon,
250
- onPress = {
251
- headerRight.toolCallback?.invoke(singleTool.key)
252
- }
253
- )
254
- } else {
255
- config
256
- }
257
- } else {
258
- config
259
- }
260
- }
261
-
262
- sealed interface HeaderRight {
263
- data object None : HeaderRight
264
- data class Custom(
265
- val content: @Composable () -> Unit
266
- ) : HeaderRight
267
- data object OnBoarding : HeaderRight
268
- data class Toolkit(
269
- val useShortcut: Boolean = false,
270
- val useMore: Boolean = false,
271
- val useSystemTools: Boolean = true,
272
- val tools: List<ToolGroup> = emptyList(),
273
- val toolCallback: ((String) -> Unit)? = { _ -> }
274
- ) : HeaderRight
275
- }
276
-
277
- data class ToolGroup(
278
- val title: Map<String, String> = emptyMap(),
279
- val items: List<Tool>
280
- ) {
281
- fun toMap(): Map<String, Any> {
282
- return mapOf(
283
- "title" to title,
284
- "items" to items.map { it.toMap() }
285
- )
286
- }
287
- }
288
- data class Tool(
289
- val key: String,
290
- val icon: String,
291
- val showBadge: Boolean = false,
292
- val name: Map<String, String> = emptyMap(),
293
- val showRightIcon: Boolean = true,
294
- ) {
295
- fun toMap(): Map<String, Any> {
296
- return mapOf(
297
- "key" to key,
298
- "icon" to icon,
299
- "showBadge" to showBadge,
300
- "name" to name,
301
- "showRightIcon" to showRightIcon
302
- )
303
- }
304
- }
305
-
306
- private data class NavigationButtonConfig(
307
- val icon: String,
308
- val onPress: () -> Unit
309
- )
@@ -1,34 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import androidx.compose.foundation.layout.fillMaxWidth
4
- import androidx.compose.runtime.Composable
5
- import androidx.compose.ui.Modifier
6
- import androidx.compose.ui.graphics.Color
7
- import androidx.compose.ui.text.style.TextAlign
8
- import androidx.compose.ui.text.style.TextOverflow
9
- import androidx.compose.ui.unit.sp
10
- import androidx.compose.ui.zIndex
11
- import vn.momo.kits.components.Text
12
- import vn.momo.kits.const.Typography
13
- import vn.momo.kits.modifier.setAutomationId
14
-
15
- @Composable
16
- internal fun HeaderTitle(
17
- title: String = "",
18
- color: Color? = null,
19
- modifier: Modifier = Modifier.fillMaxWidth(),
20
- textAlign: TextAlign = TextAlign.Start,
21
- ) {
22
- Text(
23
- modifier = modifier.zIndex(1f).setAutomationId("title_navigation_header"),
24
- text = title,
25
- textAlign = textAlign,
26
- style = Typography.actionSBold.copy(
27
- fontSize = 15.sp,
28
- lineHeight = 22.sp,
29
- ),
30
- color = color,
31
- maxLines = 1,
32
- overflow = TextOverflow.Ellipsis
33
- )
34
- }
@@ -1,360 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import androidx.compose.foundation.background
4
- import androidx.compose.foundation.border
5
- import androidx.compose.foundation.layout.*
6
- import androidx.compose.foundation.shape.CircleShape
7
- import androidx.compose.foundation.shape.RoundedCornerShape
8
- import androidx.compose.foundation.text.BasicText
9
- import androidx.compose.foundation.text.TextAutoSize
10
- import androidx.compose.runtime.Composable
11
- import androidx.compose.runtime.Immutable
12
- import androidx.compose.runtime.remember
13
- import androidx.compose.ui.Alignment
14
- import androidx.compose.ui.Modifier
15
- import androidx.compose.ui.draw.clip
16
- import androidx.compose.ui.draw.clipToBounds
17
- import androidx.compose.ui.layout.ContentScale
18
- import androidx.compose.ui.text.TextStyle
19
- import androidx.compose.ui.text.style.TextOverflow
20
- import androidx.compose.ui.unit.Dp
21
- import androidx.compose.ui.unit.dp
22
- import androidx.compose.ui.unit.sp
23
- import vn.momo.kits.components.Image
24
- import vn.momo.kits.components.Options
25
- import vn.momo.kits.components.Skeleton
26
- import vn.momo.kits.components.Text
27
- import vn.momo.kits.const.AppTheme
28
- import vn.momo.kits.const.Colors
29
- import vn.momo.kits.const.Spacing
30
- import vn.momo.kits.const.Typography
31
- import vn.momo.kits.modifier.activeOpacityClickable
32
- import vn.momo.kits.navigation.component.HeaderTitle.User
33
- import vn.momo.kits.platform.getScreenDimensions
34
-
35
- @Composable
36
- internal fun HeaderUser(
37
- data: HeaderTitle
38
- ) {
39
- if (data !is User) return
40
-
41
- if (data.isLoading) {
42
- return TitleUserShimmer()
43
- }
44
-
45
- val maxWidth = getScreenDimensions().width.dp - 172.dp
46
-
47
- Row(
48
- modifier = Modifier
49
- .fillMaxWidth()
50
- .padding(vertical = Spacing.XS)
51
- .activeOpacityClickable(enabled = data.onPress != null, onClick = { data.onPress?.invoke() }),
52
- horizontalArrangement = Arrangement.SpaceBetween,
53
- verticalAlignment = Alignment.CenterVertically
54
- ) {
55
- Row(
56
- modifier = Modifier.widthIn(max = maxWidth),
57
- verticalAlignment = Alignment.CenterVertically
58
- ) {
59
- Box(modifier = Modifier.size(Spacing.XXL)) {
60
- AvatarGroup(urls = AvatarUrls(data.image ?: listOf()), title = data.title)
61
- if (data.dotColor != null) {
62
- Box(
63
- modifier = Modifier
64
- .align(Alignment.BottomEnd)
65
- .size(10.dp)
66
- .clip(CircleShape)
67
- .background(data.dotColor)
68
- )
69
- }
70
- }
71
-
72
- Spacer(Modifier.width(6.dp))
73
-
74
- Column(modifier = Modifier.weight(1f, fill = false)) {
75
- Row(verticalAlignment = Alignment.CenterVertically) {
76
- Text(
77
- text = data.title,
78
- color = data.tintColor,
79
- style = Typography.actionXsBold,
80
- maxLines = 1,
81
- overflow = TextOverflow.Ellipsis
82
- )
83
- if (data.icons.isNotEmpty()) {
84
- Spacer(Modifier.width(6.dp))
85
- Row(verticalAlignment = Alignment.CenterVertically) {
86
- data.icons.forEach { icon ->
87
- RemoteIcon16(url = icon)
88
- }
89
- }
90
- }
91
- }
92
-
93
- if (!data.subTitle.isNullOrEmpty()) {
94
- Spacer(Modifier.height(2.dp))
95
- Text(
96
- text = data.subTitle,
97
- color = data.tintColor,
98
- style = Typography.descriptionXsRegular,
99
- maxLines = 1,
100
- overflow = TextOverflow.Ellipsis
101
- )
102
- }
103
- }
104
- }
105
- }
106
- }
107
-
108
- @Composable
109
- private fun TitleUserShimmer() {
110
- val theme = AppTheme.current
111
- Row(
112
- modifier = Modifier
113
- .fillMaxWidth()
114
- .padding(vertical = Spacing.XS),
115
- verticalAlignment = Alignment.CenterVertically
116
- ) {
117
- Box(
118
- modifier = Modifier
119
- .size(Spacing.XXL)
120
- .clip(CircleShape)
121
- .background(theme.colors.border.default)
122
- ) {
123
- Skeleton()
124
- }
125
- Spacer(Modifier.width(Spacing.M / 2))
126
- Column(modifier = Modifier.fillMaxWidth()) {
127
- Box(
128
- modifier = Modifier
129
- .height(18.dp)
130
- .width(120.dp)
131
- .clip(RoundedCornerShape(8.dp))
132
- ) { Skeleton() }
133
- Spacer(Modifier.height(Spacing.XXS))
134
- Box(
135
- modifier = Modifier
136
- .height(12.dp)
137
- .width(120.dp)
138
- .clip(RoundedCornerShape(8.dp))
139
- ) { Skeleton() }
140
- }
141
- }
142
- }
143
-
144
- @Composable
145
- private fun AvatarGroup(
146
- urls: AvatarUrls?,
147
- title: String? = null,
148
- size: Dp = Spacing.XXL
149
- ) {
150
- val theme = AppTheme.current
151
- val modifierBorder = remember {
152
- Modifier.clip(CircleShape).border(width = (0.5).dp, color = theme.colors.border.default, shape = CircleShape)
153
- }
154
- val options = Options(
155
- contentScale = ContentScale.Crop,
156
- alignment = Alignment.Center
157
- )
158
-
159
- when (urls?.items?.size) {
160
- 0 -> InitialsAvatar(
161
- modifier = modifierBorder,
162
- name = title ?: "",
163
- fallbackInitials = null,
164
- size = size
165
- )
166
- 1 -> SingleAvatar(options = options, modifier = modifierBorder, urls.items[0], size)
167
- 2 -> TwoAvatar(options = options, modifier = modifierBorder, urls, size)
168
- 3 -> ThreeAvatar(options = options, modifier = modifierBorder, urls, size)
169
- 4 -> FourAvatar(options = options, modifier = modifierBorder, urls, size)
170
- else -> ManyAvatar(options = options, modifier = modifierBorder, urls!!, size)
171
- }
172
- }
173
-
174
- @Composable
175
- private fun SingleAvatar(options: Options, modifier: Modifier = Modifier, url: String, size: Dp) {
176
- Image(
177
- source = url,
178
- options = options,
179
- modifier = modifier
180
- .size(size)
181
- )
182
- }
183
-
184
- @Composable
185
- private fun TwoAvatar(options: Options, modifier: Modifier = Modifier, urls: AvatarUrls, size: Dp) {
186
- val child = 24.dp
187
- Box(modifier = Modifier.size(size)) {
188
- Image(
189
- source = urls.items[0],
190
- options = options,
191
- modifier = modifier
192
- .size(child)
193
- .align(Alignment.TopEnd)
194
- )
195
- Image(
196
- source = urls.items[1],
197
- options = options,
198
- modifier = modifier
199
- .size(child)
200
- .align(Alignment.BottomStart)
201
- )
202
- }
203
- }
204
-
205
- @Composable
206
- private fun ThreeAvatar(options: Options, modifier: Modifier = Modifier, urls: AvatarUrls, size: Dp) {
207
- val child = 16.dp
208
- Box(modifier = Modifier.size(size).padding(2.dp)) {
209
- Image(
210
- source = urls.items[0],
211
- options = options,
212
- modifier = modifier
213
- .size(child)
214
- .align(Alignment.BottomEnd)
215
- )
216
- Image(
217
- source = urls.items[1],
218
- options = options,
219
- modifier = modifier
220
- .size(child)
221
- .align(Alignment.TopCenter)
222
- )
223
- Image(
224
- source = urls.items[2],
225
- options = options,
226
- modifier = modifier
227
- .size(child)
228
- .align(Alignment.BottomStart)
229
- )
230
- }
231
- }
232
-
233
- @Composable
234
- private fun FourAvatar(options: Options, modifier: Modifier = Modifier, urls: AvatarUrls, size: Dp) {
235
- val child = 16.dp
236
- Box(modifier = Modifier.size(size).padding(1.dp)) {
237
- Image(
238
- source = urls.items[0],
239
- options = options,
240
- modifier = modifier
241
- .size(child)
242
- .align(Alignment.BottomStart)
243
- )
244
- Image(
245
- source = urls.items[1],
246
- options = options,
247
- modifier = modifier
248
- .size(child)
249
- .align(Alignment.BottomEnd)
250
- )
251
- Image(
252
- source = urls.items[2],
253
- options = options,
254
- modifier = modifier
255
- .size(child)
256
- .align(Alignment.TopEnd)
257
- )
258
- Image(
259
- source = urls.items[3],
260
- options = options,
261
- modifier = modifier
262
- .size(child)
263
- .align(Alignment.TopStart)
264
- )
265
- }
266
- }
267
-
268
- @Composable
269
- private fun ManyAvatar(options: Options, modifier: Modifier = Modifier, urls: AvatarUrls, size: Dp) {
270
- val child = 16.dp
271
- val more = urls.items.size - 3
272
- Box(modifier = Modifier.size(size).padding(1.dp)) {
273
- Image(
274
- source = urls.items[0],
275
- options = options,
276
- modifier = modifier
277
- .size(child)
278
- .align(Alignment.BottomStart)
279
- )
280
- Image(
281
- source = urls.items[1],
282
- options = options,
283
- modifier = modifier
284
- .size(child)
285
- .align(Alignment.TopEnd)
286
- )
287
- Image(
288
- source = urls.items[2],
289
- options = options,
290
- modifier = modifier
291
- .size(child)
292
- .align(Alignment.TopStart)
293
- )
294
- Box(
295
- modifier = modifier
296
- .size(child)
297
- .align(Alignment.BottomEnd)
298
- .background(Colors.pink_09)
299
- .padding(1.dp)
300
- .clipToBounds(),
301
- contentAlignment = Alignment.Center
302
- ) {
303
- BasicText(
304
- text = "+$more",
305
- style = TextStyle(
306
- color = Colors.pink_03
307
- ),
308
- maxLines = 1,
309
- autoSize = TextAutoSize.StepBased(
310
- minFontSize = 1.sp,
311
- maxFontSize = 10.sp,
312
- stepSize = 1.sp
313
- )
314
- )
315
- }
316
- }
317
- }
318
-
319
- @Composable
320
- private fun InitialsAvatar(
321
- modifier: Modifier = Modifier,
322
- name: String,
323
- fallbackInitials: String? = null,
324
- size: Dp = Spacing.XXL
325
- ) {
326
- val initials = remember(name, fallbackInitials) {
327
- fallbackInitials ?: run {
328
- val words = name.trim().split(Regex("\\s+")).takeLast(2)
329
- words.joinToString("") { it.firstOrNull()?.uppercase() ?: "" }
330
- }
331
- }
332
- Box(
333
- modifier = modifier
334
- .size(size)
335
- .background(Colors.pink_09),
336
- contentAlignment = Alignment.Center
337
- ) {
338
- Text(
339
- text = initials,
340
- color = Colors.pink_03,
341
- style = Typography.descriptionXsRegular
342
- )
343
- }
344
- }
345
-
346
- @Composable
347
- private fun RemoteIcon16(url: String) {
348
- Image(
349
- source = url,
350
- options = Options(
351
- contentScale = ContentScale.Crop
352
- ),
353
- modifier = Modifier
354
- .size(16.dp)
355
- .clip(RoundedCornerShape(4.dp)),
356
- )
357
- }
358
-
359
- @Immutable
360
- private data class AvatarUrls(val items: List<String>)