@momo-kits/native-kits 0.157.2-debug → 0.157.2

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 (117) hide show
  1. package/package.json +1 -1
  2. package/build.gradle.kts +0 -11
  3. package/compose/build.gradle.kts +0 -180
  4. package/compose/build.gradle.kts.backup +0 -180
  5. package/compose/compose.podspec +0 -54
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -110
  7. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  8. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  9. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  10. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  11. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  12. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  13. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  14. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  15. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  16. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  17. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  18. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  19. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  20. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -57
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -107
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -201
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -222
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -48
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -305
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -720
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -121
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -405
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -85
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -340
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -198
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -357
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -94
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -136
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -148
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -188
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -116
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -448
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -172
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -255
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -231
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -233
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -254
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -241
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -364
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -92
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -352
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -103
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -70
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -96
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -96
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -92
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -130
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -214
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -576
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -177
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -205
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -239
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -191
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -13
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -185
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -285
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -2
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -35
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -2
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -59
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -68
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -14
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -50
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -239
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -119
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -98
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -161
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -331
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -497
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -162
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -243
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -187
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -279
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -80
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -306
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -32
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -370
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -42
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -62
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -88
  110. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -149
  111. package/gradle/libs.versions.toml +0 -57
  112. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  113. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  114. package/gradle.properties +0 -26
  115. package/gradlew +0 -252
  116. package/gradlew.bat +0 -94
  117. package/settings.gradle.kts +0 -52
@@ -1,279 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import androidx.compose.animation.core.animateFloatAsState
4
- import androidx.compose.foundation.background
5
- import androidx.compose.foundation.border
6
- import androidx.compose.foundation.layout.Arrangement
7
- import androidx.compose.foundation.layout.Box
8
- import androidx.compose.foundation.layout.Row
9
- import androidx.compose.foundation.layout.RowScope
10
- import androidx.compose.foundation.layout.Spacer
11
- import androidx.compose.foundation.layout.fillMaxWidth
12
- import androidx.compose.foundation.layout.height
13
- import androidx.compose.foundation.layout.offset
14
- import androidx.compose.foundation.layout.padding
15
- import androidx.compose.foundation.layout.size
16
- import androidx.compose.foundation.layout.width
17
- import androidx.compose.foundation.shape.RoundedCornerShape
18
- import androidx.compose.runtime.Composable
19
- import androidx.compose.runtime.getValue
20
- import androidx.compose.ui.Alignment
21
- import androidx.compose.ui.Modifier
22
- import androidx.compose.ui.graphics.Brush
23
- import androidx.compose.ui.graphics.Color
24
- import androidx.compose.ui.layout.onGloballyPositioned
25
- import androidx.compose.ui.platform.LocalDensity
26
- import androidx.compose.ui.unit.Dp
27
- import androidx.compose.ui.unit.dp
28
- import vn.momo.kits.components.Icon
29
- import vn.momo.kits.components.InputSearchProps
30
- import vn.momo.kits.const.AppStatusBar
31
- import vn.momo.kits.const.AppTheme
32
- import vn.momo.kits.const.Colors
33
- import vn.momo.kits.components.PopupNotifyProps
34
- import vn.momo.kits.application.IsShowBaseLineDebug
35
- import vn.momo.kits.const.Spacing
36
- import vn.momo.kits.modifier.activeOpacityClickable
37
- import vn.momo.kits.modifier.conditional
38
- import vn.momo.kits.modifier.setAutomationId
39
- import vn.momo.kits.navigation.LocalHeaderRightWidthPx
40
- import vn.momo.kits.navigation.LocalNavigator
41
- import vn.momo.kits.navigation.LocalOptions
42
- import vn.momo.kits.navigation.LocalScrollState
43
- import vn.momo.kits.navigation.getInputSearchType
44
-
45
- const val HEADER_HEIGHT = 52
46
- enum class InputSearchType { None, Header, Animated }
47
-
48
- @Composable
49
- fun Header(onBackHandler: (() -> Unit)? = null) {
50
- val options = LocalOptions.current
51
- val navigator = LocalNavigator.current
52
- val scrollState = LocalScrollState.current
53
- val headerRightWidthPx = LocalHeaderRightWidthPx.current
54
- val inputSearchType = getInputSearchType(options)
55
-
56
- val opacityHeight = when (val header = options.headerType) {
57
- is HeaderType.Animated -> with(LocalDensity.current) { header.layoutOffSet.roundToPx() }
58
- else -> HEADER_HEIGHT
59
- }
60
- val opacity by animateFloatAsState(
61
- targetValue = if (options.headerType is HeaderType.Transparent) {
62
- 0f
63
- } else {
64
- (scrollState.value / opacityHeight.toFloat())
65
- .coerceIn(0f, 1f)
66
- }
67
- )
68
-
69
- val headerColor = getHeaderColor(options.headerType, opacity, options.tintColor, Colors.black_17)
70
-
71
- val animatedAlpha by animateFloatAsState(targetValue = opacity, label = "BackgroundAlpha")
72
-
73
- val background = if (options.headerType is HeaderType.Transparent)
74
- options.backgroundColor ?: AppTheme.current.colors.background.surface
75
- else
76
- AppTheme.current.colors.background.surface
77
-
78
- if (options.headerType == HeaderType.None) return
79
- Box(
80
- Modifier.height(AppStatusBar.current + HEADER_HEIGHT.dp)
81
- .fillMaxWidth()
82
- .background(background.copy(alpha = animatedAlpha))
83
- .conditional(IsShowBaseLineDebug) {
84
- border(1.dp, Colors.blue_03)
85
- },
86
- contentAlignment = Alignment.BottomCenter
87
- ) {
88
- Row(
89
- modifier = Modifier.height(HEADER_HEIGHT.dp)
90
- .fillMaxWidth()
91
- .padding(horizontal = Spacing.M),
92
- verticalAlignment = Alignment.CenterVertically,
93
- horizontalArrangement = Arrangement.SpaceBetween
94
- ) {
95
- if(!options.hiddenBack) {
96
- BackButton(
97
- borderColor = headerColor.borderColor,
98
- backgroundButton = headerColor.backgroundButton,
99
- tintIconColor = headerColor.tintIconColor,
100
- onBackHandler = {
101
- onBackHandler?.invoke() ?: navigator.onBackSafe { }
102
- }
103
- )
104
- Spacer(Modifier.width(Spacing.M))
105
- }
106
-
107
- HeaderContent(
108
- options.headerTitle,
109
- headerColor.tintIconColor
110
- .copy(alpha = if (inputSearchType == InputSearchType.Animated) 1f - animatedAlpha else 1f)
111
- )
112
- Box(Modifier.onGloballyPositioned {
113
- if(headerRightWidthPx.intValue != it.size.width) headerRightWidthPx.intValue = it.size.width
114
- }){
115
- HeaderRight(options.headerRight, options.tintColor, headerColor)
116
- }
117
- }
118
- VerticalShadow(opacity)
119
- }
120
- }
121
-
122
- @Composable
123
- private fun BackButton(borderColor: Color, backgroundButton: Color, tintIconColor: Color, onBackHandler: () -> Unit){
124
- Box(
125
- modifier = Modifier
126
- .size(28.dp)
127
- .background(backgroundButton, RoundedCornerShape(100))
128
- .border(width = 0.2.dp, color = borderColor, shape = RoundedCornerShape(100))
129
- .activeOpacityClickable(onClick = onBackHandler)
130
- .padding(Spacing.XS)
131
- .setAutomationId("btn_navigation_back"),
132
- contentAlignment = Alignment.Center
133
- ) {
134
- Icon(
135
- source = "arrow-back",
136
- color = tintIconColor,
137
- size = 20.dp,
138
- )
139
- }
140
- }
141
-
142
- @Composable
143
- fun RowScope.HeaderContent(headerTitle: HeaderTitle, tintIconColor: Color){
144
- Box(
145
- Modifier.weight(1f)
146
- ) {
147
- when (headerTitle){
148
- is HeaderTitle.Default -> {
149
- HeaderTitle(
150
- title = headerTitle.title,
151
- color = tintIconColor
152
- )
153
- }
154
- is HeaderTitle.Journey -> {}
155
- is HeaderTitle.Location -> {}
156
- is HeaderTitle.User -> {
157
- HeaderUser(
158
- data = headerTitle
159
- )
160
- }
161
- }
162
- }
163
- }
164
-
165
- @Composable
166
- fun VerticalShadow(opacity: Float){
167
- if(opacity == 1f){
168
- Box(modifier = Modifier
169
- .fillMaxWidth()
170
- .height(6.dp)
171
- .offset(x = 0.dp, y = 6.dp)
172
- .background(
173
- brush = Brush.verticalGradient(
174
- colors = listOf(Color.Black.copy(alpha = 0.05f), Color.Transparent)
175
- )
176
- )
177
- )
178
- }
179
- }
180
-
181
- sealed class HeaderTitle {
182
- class Default(val title: String) : HeaderTitle()
183
-
184
- class User(
185
- val title: String,
186
- val subTitle: String? = null,
187
- val image: List<String>? = null,
188
- val dotColor: Color? = null,
189
- val tintColor: Color? = null,
190
- val onPress: (() -> Unit)? = null,
191
- val icons: List<String> = emptyList(),
192
- val isLoading: Boolean = false
193
- ) : HeaderTitle()
194
-
195
- class Location(
196
- val description: String? = null,
197
- val location: String,
198
- val tintColor: String? = null,
199
- val onPress: (() -> Unit)? = null,
200
- val isLoading: Boolean = false
201
- ) : HeaderTitle()
202
-
203
- class Journey(
204
- val start: String,
205
- val end: String? = null,
206
- val description: String? = null,
207
- val icon: String,
208
- val iconColor: String? = null,
209
- val tintColor: String? = null,
210
- val onPress: (() -> Unit)? = null,
211
- val isLoading: Boolean = false
212
- ) : HeaderTitle()
213
- }
214
-
215
- sealed class HeaderType {
216
- interface DefaultOrExtended {
217
- val useAnimated: Boolean
218
- val inputSearchProps: InputSearchProps?
219
- }
220
-
221
- data class Default(
222
- override val useAnimated: Boolean = false,
223
- override val inputSearchProps: InputSearchProps? = null
224
- ) : HeaderType(), DefaultOrExtended
225
-
226
- data class Extended(
227
- override val useAnimated: Boolean = false,
228
- override val inputSearchProps: InputSearchProps? = null
229
- ) : HeaderType(), DefaultOrExtended
230
-
231
- data object None : HeaderType()
232
-
233
- data class Animated(
234
- val aspectRatio: AnimatedHeaderRatio = AnimatedHeaderRatio.RATIO_16_9,
235
- val isSurface: Boolean = true,
236
- val layoutOffSet: Dp = 56.dp,
237
- val composable: @Composable (scrollState: Int) -> Unit = {}
238
- ) : HeaderType()
239
-
240
- data class Transparent(
241
- val isFullScreenContent: Boolean = false
242
- ) : HeaderType()
243
- }
244
-
245
- data class HeaderBackProps(
246
- val preventBack: PopupNotifyProps? = null,
247
- )
248
-
249
- data class HeaderColor(val tintIconColor: Color, val backgroundButton: Color, val borderColor: Color)
250
- fun getHeaderColor(headerType: HeaderType, opacity: Float, tintColor: Color?, defaultColor: Color): HeaderColor{
251
- return if(headerType is HeaderType.Animated) {
252
- if (opacity == 1f || !headerType.isSurface)
253
- HeaderColor(
254
- tintIconColor = Colors.black_17,
255
- backgroundButton = Colors.black_01.copy(alpha = 0.6f),
256
- borderColor = Colors.black_20.copy(alpha = 0.2f)
257
- )
258
- else
259
- HeaderColor(
260
- tintIconColor = Colors.black_01,
261
- backgroundButton = Colors.black_20.copy(alpha = 0.6f),
262
- borderColor = Color.Transparent
263
- )
264
- }
265
- else {
266
- if (tintColor == Colors.black_01)
267
- HeaderColor(
268
- tintIconColor = tintColor,
269
- backgroundButton = Colors.black_20.copy(alpha = 0.6f),
270
- borderColor = Colors.black_01.copy(alpha = 0.2f)
271
- )
272
- else
273
- HeaderColor(
274
- tintIconColor = tintColor ?: defaultColor,
275
- backgroundButton = Colors.black_01.copy(alpha = 0.6f),
276
- borderColor = Colors.black_20.copy(alpha = 0.2f)
277
- )
278
- }
279
- }
@@ -1,80 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import androidx.compose.animation.core.animateFloatAsState
4
- import androidx.compose.foundation.background
5
- import androidx.compose.foundation.layout.Box
6
- import androidx.compose.foundation.layout.fillMaxSize
7
- import androidx.compose.foundation.layout.fillMaxWidth
8
- import androidx.compose.foundation.layout.height
9
- import androidx.compose.runtime.Composable
10
- import androidx.compose.runtime.getValue
11
- import androidx.compose.ui.Modifier
12
- import androidx.compose.ui.geometry.Offset
13
- import androidx.compose.ui.graphics.Brush
14
- import androidx.compose.ui.graphics.Color
15
- import androidx.compose.ui.platform.LocalDensity
16
- import androidx.compose.ui.unit.dp
17
- import vn.momo.kits.components.Image
18
- import vn.momo.kits.const.AppStatusBar
19
- import vn.momo.kits.const.AppTheme
20
- import vn.momo.kits.modifier.conditional
21
- import vn.momo.kits.navigation.LocalOptions
22
- import vn.momo.kits.navigation.LocalScrollState
23
-
24
- enum class AnimatedHeaderRatio(val value: Float){
25
- RATIO_16_9(16f / 9f),
26
- RATIO_1_1(1f),
27
- RATIO_3_2(3f / 2f)
28
- }
29
-
30
- @Composable
31
- fun HeaderBackground() {
32
- val density = LocalDensity.current
33
- val theme = AppTheme.current
34
- val options = LocalOptions.current
35
- val scrollState = LocalScrollState.current
36
- val backgroundColor = options.backgroundColor ?: AppTheme.current.colors.background.default
37
-
38
- val minHeight = AppStatusBar.current + HEADER_HEIGHT.dp
39
- val maxHeight = 154.dp
40
- val opacity by animateFloatAsState(
41
- targetValue = (1 - (scrollState.value * 1f / HEADER_HEIGHT * 1f)).coerceIn(0f, 1f),
42
- )
43
-
44
- val color = if (opacity == 0f) backgroundColor else Color(0xFFFDCADE)
45
- val height = when (options.headerType) {
46
- is HeaderType.Default -> minHeight
47
- is HeaderType.Extended -> {
48
- if (AppTheme.current.isHeaderImage()){
49
- if (opacity == 0f) minHeight else maxHeight
50
- } else {
51
- maxHeight
52
- }
53
- }
54
- else -> 0.dp
55
- }
56
-
57
- Box(Modifier.fillMaxWidth().height(height).background(backgroundColor)) {
58
- Box(Modifier
59
- .height(maxHeight)
60
- .fillMaxWidth()
61
- .conditional(!theme.isHeaderImage()) {
62
- background(Brush.linearGradient(
63
- colors = listOf(
64
- color,
65
- backgroundColor
66
- ),
67
- start = Offset(0f, 0f),
68
- end = Offset(0f, with(density) { maxHeight.toPx() })
69
- )
70
- )
71
- }
72
- ){
73
- if (!theme.isHeaderImage()) return@Box
74
- Image(
75
- source = theme.assets.headerBackground!!,
76
- modifier = Modifier.fillMaxSize(),
77
- )
78
- }
79
- }
80
- }
@@ -1,306 +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.Arrangement
6
- import androidx.compose.foundation.layout.Box
7
- import androidx.compose.foundation.layout.Row
8
- import androidx.compose.foundation.layout.height
9
- import androidx.compose.foundation.layout.offset
10
- import androidx.compose.foundation.layout.padding
11
- import androidx.compose.foundation.layout.size
12
- import androidx.compose.foundation.layout.width
13
- import androidx.compose.foundation.shape.CircleShape
14
- import androidx.compose.foundation.shape.RoundedCornerShape
15
- import androidx.compose.runtime.Composable
16
- import androidx.compose.runtime.LaunchedEffect
17
- import androidx.compose.runtime.derivedStateOf
18
- import androidx.compose.runtime.getValue
19
- import androidx.compose.runtime.mutableStateOf
20
- import androidx.compose.runtime.remember
21
- import androidx.compose.runtime.setValue
22
- import androidx.compose.ui.Alignment
23
- import androidx.compose.ui.Modifier
24
- import androidx.compose.ui.draw.clip
25
- import androidx.compose.ui.graphics.Color
26
- import androidx.compose.ui.unit.dp
27
- import vn.momo.kits.application.ApplicationContext
28
- import vn.momo.kits.application.MiniAppContext
29
- import vn.momo.kits.components.BadgeDot
30
- import vn.momo.kits.components.DotSize
31
- import vn.momo.kits.components.Icon
32
- import vn.momo.kits.const.Colors
33
- import vn.momo.kits.const.Spacing
34
- import vn.momo.kits.modifier.activeOpacityClickable
35
- import vn.momo.kits.navigation.LocalMaxApi
36
-
37
- @Composable
38
- fun HeaderRight(
39
- headerRight: HeaderRight,
40
- tintColor: Color? = null,
41
- headerColor: HeaderColor
42
- ) {
43
- when (headerRight) {
44
- is HeaderRight.None -> {}
45
- is HeaderRight.Custom -> {
46
- headerRight.content()
47
- }
48
- is HeaderRight.OnBoarding -> {}
49
- is HeaderRight.Toolkit -> {
50
- Toolkit(
51
- headerRight = headerRight,
52
- tintColor = tintColor,
53
- headerColor = headerColor
54
- )
55
- }
56
- }
57
- }
58
-
59
- @Composable
60
- fun Toolkit(
61
- headerRight: HeaderRight.Toolkit,
62
- tintColor: Color? = null,
63
- headerColor: HeaderColor
64
- ) {
65
- val api = LocalMaxApi.current
66
- val context = ApplicationContext.current
67
-
68
- var isFavorite by remember { mutableStateOf(false) }
69
- val isLoading by remember { mutableStateOf(false) }
70
-
71
- LaunchedEffect(context?.appCode) {
72
- api?.isFavoriteApp(mapOf("code" to context?.appCode)) { callback ->
73
- val response = callback?.get("response") as? Boolean
74
- isFavorite = response == true
75
- }
76
- }
77
-
78
- fun onPressShortcut() {
79
- api?.onToolAction(mapOf("item" to mapOf("key" to "onFavorite"), "context" to MiniAppContext.toMap(context))) { callback ->
80
- val response = callback?.get("response") as? Map<*, *>?
81
- val success = response?.get("success") as? Boolean
82
- if (success == true){
83
- isFavorite = !isFavorite
84
- }
85
- }
86
- }
87
-
88
- fun onPressMore() {
89
- api?.showTools(
90
- mapOf(
91
- "useSystemTools" to headerRight.useSystemTools,
92
- "tools" to headerRight.tools.map { it.toMap() },
93
- "context" to MiniAppContext.toMap(context)
94
- )
95
- ) { callback ->
96
- val response = callback?.get("response") as? String
97
- if (response != null) {
98
- headerRight.toolCallback?.invoke(response)
99
- }
100
- }
101
- }
102
-
103
- val navButtonConfig = getNavigationButtonConfig(
104
- headerRight,
105
- ::onPressShortcut,
106
- ::onPressMore
107
- )
108
-
109
- val showBadge = headerRight.tools.any { group ->
110
- group.items.any { it.showBadge }
111
- }
112
-
113
- val isShowShortcut by remember(headerRight.useShortcut, headerRight.useMore, context) {
114
- derivedStateOf {
115
- (headerRight.useShortcut == true) &&
116
- !(headerRight.useMore == true && context == null)
117
- }
118
- }
119
-
120
- val icon by remember(navButtonConfig.icon, isFavorite) {
121
- derivedStateOf {
122
- navButtonConfig.icon.takeUnless { it == "star" }
123
- ?: if (isFavorite) "pin_star_checked" else "pin_star"
124
- }
125
- }
126
-
127
- Row(
128
- verticalAlignment = Alignment.CenterVertically
129
- ) {
130
- if (isShowShortcut) {
131
- NavigationButton(
132
- disabled = isLoading,
133
- icon = icon,
134
- showBadge = showBadge,
135
- onClick = navButtonConfig.onPress,
136
- headerColor = headerColor
137
- )
138
- }
139
-
140
- Row(
141
- verticalAlignment = Alignment.CenterVertically,
142
- horizontalArrangement = Arrangement.Center,
143
- modifier = Modifier
144
- .padding(start = Spacing.S)
145
- .border(0.2.dp, headerColor.borderColor, shape = RoundedCornerShape(14.dp))
146
- .height(28.dp)
147
- .clip(shape = RoundedCornerShape(14.dp))
148
- .background(headerColor.backgroundButton)
149
- ) {
150
- if (context != null) {
151
- Icon(
152
- source = "help_center",
153
- size = 20.dp,
154
- color = headerColor.tintIconColor,
155
- modifier = Modifier.padding(4.dp).activeOpacityClickable {
156
- api?.showHelpCenter(
157
- mapOf(
158
- "appId" to context.appId,
159
- "code" to context.appCode,
160
- "name" to context.appName,
161
- "icon" to context.appIcon,
162
- "description" to context.description
163
- )
164
- ) {}
165
- }
166
- )
167
- Box(
168
- modifier = Modifier
169
- .width(0.5.dp)
170
- .height(12.dp)
171
- .background(tintColor ?: Colors.black_20)
172
- )
173
- }
174
- Icon(
175
- source = "16_basic_home",
176
- size = 20.dp,
177
- color = headerColor.tintIconColor,
178
- modifier = Modifier.padding(4.dp).activeOpacityClickable {
179
- api?.dismissAll { }
180
- }
181
- )
182
- }
183
- }
184
- }
185
-
186
-
187
-
188
- @Composable
189
- fun NavigationButton(
190
- disabled: Boolean,
191
- icon: String,
192
- showBadge: Boolean? = false,
193
- onClick: () -> Unit,
194
- headerColor: HeaderColor
195
- ) {
196
- Box(
197
- modifier = Modifier
198
- .size(28.dp)
199
- .activeOpacityClickable(enabled = !disabled, onClick = onClick)
200
- ) {
201
- Box(
202
- modifier = Modifier
203
- .matchParentSize()
204
- .clip(CircleShape)
205
- .background(headerColor.backgroundButton)
206
- .border(0.2.dp, headerColor.borderColor, CircleShape)
207
- )
208
- Box(
209
- modifier = Modifier.matchParentSize(),
210
- contentAlignment = Alignment.Center
211
- ) {
212
- Icon(
213
- source = icon,
214
- size = 20.dp,
215
- color = headerColor.tintIconColor
216
- )
217
- }
218
-
219
- if (showBadge == true) {
220
- BadgeDot(
221
- size = DotSize.Small,
222
- modifier = Modifier
223
- .align(Alignment.TopEnd)
224
- .offset(x = -Spacing.XXS, y = -Spacing.XXS)
225
- )
226
- }
227
- }
228
- }
229
-
230
- private fun getNavigationButtonConfig(
231
- headerRight: HeaderRight.Toolkit,
232
- onPressShortcut: () -> Unit,
233
- onPressMore: () -> Unit
234
- ): NavigationButtonConfig {
235
- val totalTools = headerRight.tools.sumOf { it.items.size }
236
- val config = NavigationButtonConfig(icon = "star", onPress = onPressShortcut)
237
- return if (totalTools > 1 || headerRight.useMore == true) {
238
- NavigationButtonConfig(
239
- icon = "navigation_more_icon",
240
- onPress = onPressMore
241
- )
242
- } else if (totalTools == 1 && headerRight.tools.isNotEmpty()) {
243
- val singleTool = headerRight.tools.first().items.firstOrNull()
244
- return if (singleTool != null){
245
- NavigationButtonConfig(
246
- icon = singleTool.icon,
247
- onPress = {
248
- headerRight.toolCallback?.invoke(singleTool.key)
249
- }
250
- )
251
- } else {
252
- config
253
- }
254
- } else {
255
- config
256
- }
257
- }
258
-
259
- sealed interface HeaderRight {
260
- data object None : HeaderRight
261
- data class Custom(
262
- val content: @Composable () -> Unit
263
- ) : HeaderRight
264
- data object OnBoarding : HeaderRight
265
- data class Toolkit(
266
- val useShortcut: Boolean = false,
267
- val useMore: Boolean = false,
268
- val useSystemTools: Boolean = true,
269
- val tools: List<ToolGroup> = emptyList(),
270
- val toolCallback: ((String) -> Unit)? = { _ -> }
271
- ) : HeaderRight
272
- }
273
-
274
- data class ToolGroup(
275
- val title: Map<String, String> = emptyMap(),
276
- val items: List<Tool>
277
- ) {
278
- fun toMap(): Map<String, Any> {
279
- return mapOf(
280
- "title" to title,
281
- "items" to items.map { it.toMap() }
282
- )
283
- }
284
- }
285
- data class Tool(
286
- val key: String,
287
- val icon: String,
288
- val showBadge: Boolean = false,
289
- val name: Map<String, String> = emptyMap(),
290
- val showRightIcon: Boolean = true,
291
- ) {
292
- fun toMap(): Map<String, Any> {
293
- return mapOf(
294
- "key" to key,
295
- "icon" to icon,
296
- "showBadge" to showBadge,
297
- "name" to name,
298
- "showRightIcon" to showRightIcon
299
- )
300
- }
301
- }
302
-
303
- data class NavigationButtonConfig(
304
- val icon: String,
305
- val onPress: () -> Unit
306
- )
@@ -1,32 +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
- fun HeaderTitle(
17
- title: String = "",
18
- color: Color? = null,
19
- ) {
20
- Text(
21
- modifier = Modifier.fillMaxWidth().zIndex(1f).setAutomationId("title_navigation_header"),
22
- text = title,
23
- textAlign = TextAlign.Start,
24
- style = Typography.actionSBold.copy(
25
- fontSize = 15.sp,
26
- lineHeight = 22.sp,
27
- ),
28
- color = color,
29
- maxLines = 1,
30
- overflow = TextOverflow.Ellipsis
31
- )
32
- }