@momo-kits/native-kits 0.152.4-beta.3 → 0.152.5

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 (155) hide show
  1. package/package.json +7 -6
  2. package/shared/build.gradle.kts +74 -0
  3. package/CODE_OF_CONDUCT.md +0 -133
  4. package/CONTRIBUTING.md +0 -114
  5. package/LICENSE +0 -20
  6. package/README.md +0 -7
  7. package/build.gradle.kts +0 -32
  8. package/compose/MoMoComposeKits.podspec +0 -54
  9. package/compose/build.gradle.kts +0 -149
  10. package/compose/src/androidMain/AndroidManifest.xml +0 -2
  11. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -105
  12. package/compose/src/commonMain/composeResources/files/lottie_circle_loader.json +0 -1
  13. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  14. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  15. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  16. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  17. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  18. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  19. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  20. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  21. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  22. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  23. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  24. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  25. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  26. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -57
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -201
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -222
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -48
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -306
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -715
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -214
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -236
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -77
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -27
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -334
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -345
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -90
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -131
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -69
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -143
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -179
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -111
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -384
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -160
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -234
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -223
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -232
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -236
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -228
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -364
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -50
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -34
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -85
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -33
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -338
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -95
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -64
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -89
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -86
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -84
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -208
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -172
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -199
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -237
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -191
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -13
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -191
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -258
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -2
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -35
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -2
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -59
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -68
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -49
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -232
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -111
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -94
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -159
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -232
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScaleSizeScope.kt +0 -17
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -459
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -169
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -216
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -180
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -251
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -80
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -306
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -31
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -385
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -38
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -62
  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 -144
  111. package/gradle.properties +0 -19
  112. package/gradlew +0 -240
  113. package/gradlew.bat +0 -91
  114. package/ios/Application/ApplicationEnvironment.swift +0 -50
  115. package/ios/Application/Components.swift +0 -263
  116. package/ios/Application/ComposeApi.swift +0 -22
  117. package/ios/Application/FloatingButton.swift +0 -172
  118. package/ios/Application/HeaderRight.swift +0 -271
  119. package/ios/Application/Screen.swift +0 -249
  120. package/ios/Badge/BadgeDot.swift +0 -31
  121. package/ios/Button/Button.swift +0 -211
  122. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +0 -126
  123. package/ios/Checkbox/Checkbox.swift +0 -81
  124. package/ios/Chip/Chip.swift +0 -96
  125. package/ios/Colors+Radius+Spacing/Colors.swift +0 -172
  126. package/ios/Colors+Radius+Spacing/Radius.swift +0 -22
  127. package/ios/Colors+Radius+Spacing/Spacing.swift +0 -12
  128. package/ios/Extensions/Color++.swift +0 -25
  129. package/ios/Icon/Icon.swift +0 -51
  130. package/ios/Image/Image.swift +0 -70
  131. package/ios/Input/Input.swift +0 -207
  132. package/ios/Input/InputPhoneNumber.swift +0 -176
  133. package/ios/Input/InputSearch.swift +0 -238
  134. package/ios/Input/InputTextArea.swift +0 -242
  135. package/ios/Lottie/LottieView.swift +0 -86
  136. package/ios/OTPKeyboard/KeyboardButton.swift +0 -41
  137. package/ios/OTPKeyboard/OTPKeyboard.swift +0 -145
  138. package/ios/Popup/PopupDisplay.swift +0 -284
  139. package/ios/Popup/PopupInput.swift +0 -96
  140. package/ios/Popup/PopupPromotion.swift +0 -73
  141. package/ios/PopupView/FullscreenPopup.swift +0 -251
  142. package/ios/PopupView/Modifiers.swift +0 -158
  143. package/ios/PopupView/PopupView.swift +0 -289
  144. package/ios/PopupView/Utils++.swift +0 -281
  145. package/ios/ScrollIndicator/ScrollIndicator.swift +0 -110
  146. package/ios/Swipeable/SwipeCell.swift +0 -278
  147. package/ios/Swipeable/SwipeCellModel.swift +0 -86
  148. package/ios/Switch/Switch.swift +0 -44
  149. package/ios/Template/Logo/Logo.swift +0 -75
  150. package/ios/Template/TrustBanner/TrustBanner.swift +0 -120
  151. package/ios/Theme.md +0 -18
  152. package/ios/Typography/Text.swift +0 -140
  153. package/ios/Typography/Typography.swift +0 -95
  154. package/ios/native-kits.podspec +0 -18
  155. package/settings.gradle.kts +0 -25
@@ -1,251 +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.fillMaxWidth
11
- import androidx.compose.foundation.layout.height
12
- import androidx.compose.foundation.layout.offset
13
- import androidx.compose.foundation.layout.padding
14
- import androidx.compose.foundation.layout.size
15
- import androidx.compose.foundation.shape.RoundedCornerShape
16
- import androidx.compose.runtime.Composable
17
- import androidx.compose.runtime.getValue
18
- import androidx.compose.ui.Alignment
19
- import androidx.compose.ui.Modifier
20
- import androidx.compose.ui.graphics.Brush
21
- import androidx.compose.ui.graphics.Color
22
- import androidx.compose.ui.layout.onGloballyPositioned
23
- import androidx.compose.ui.platform.LocalDensity
24
- import androidx.compose.ui.text.style.TextAlign
25
- import androidx.compose.ui.unit.Dp
26
- import androidx.compose.ui.unit.dp
27
- import vn.momo.kits.components.Icon
28
- import vn.momo.kits.components.InputSearchProps
29
- import vn.momo.kits.const.AppStatusBar
30
- import vn.momo.kits.const.AppTheme
31
- import vn.momo.kits.const.Colors
32
- import vn.momo.kits.const.Spacing
33
- import vn.momo.kits.modifier.activeOpacityClickable
34
- import vn.momo.kits.navigation.LocalHeaderRightWidthPx
35
- import vn.momo.kits.navigation.LocalNavigator
36
- import vn.momo.kits.navigation.LocalOptions
37
- import vn.momo.kits.navigation.LocalScrollState
38
- import vn.momo.kits.navigation.getInputSearchType
39
-
40
- const val HEADER_HEIGHT = 52
41
- enum class InputSearchType { None, Header, Animated }
42
-
43
- @Composable
44
- fun Header() {
45
- val options = LocalOptions.current
46
- val navigator = LocalNavigator.current
47
- val scrollState = LocalScrollState.current
48
- val headerRightWidthPx = LocalHeaderRightWidthPx.current
49
- val inputSearchType = getInputSearchType(options)
50
-
51
- val opacityHeight = when (val header = options.headerType) {
52
- is HeaderType.Animated -> with(LocalDensity.current) { header.layoutOffSet.roundToPx() }
53
- else -> HEADER_HEIGHT
54
- }
55
- val opacity by animateFloatAsState(
56
- targetValue = ((scrollState.value * 1f / opacityHeight * 1f)).coerceIn(0f, 1f),
57
- )
58
-
59
- val headerColor = getHeaderColor(options.headerType, opacity, options.tintColor, Colors.black_17)
60
-
61
- val animatedAlpha by animateFloatAsState(targetValue = opacity, label = "BackgroundAlpha")
62
-
63
- if (options.headerType == HeaderType.None) return
64
- Box(
65
- Modifier.height(AppStatusBar.current + HEADER_HEIGHT.dp)
66
- .fillMaxWidth()
67
- .background(AppTheme.current.colors.background.surface.copy(alpha = animatedAlpha)),
68
- contentAlignment = Alignment.BottomCenter
69
- ) {
70
- Row(
71
- modifier = Modifier.height(HEADER_HEIGHT.dp)
72
- .fillMaxWidth()
73
- .padding(horizontal = Spacing.M),
74
- verticalAlignment = Alignment.CenterVertically,
75
- horizontalArrangement = Arrangement.SpaceBetween
76
- ) {
77
- if(!options.hiddenBack) {
78
- BackButton(
79
- borderColor = headerColor.borderColor,
80
- backgroundButton = headerColor.backgroundButton,
81
- tintIconColor = headerColor.tintIconColor,
82
- onBackHandler = {
83
- options.onBackHandler?.invoke() ?: navigator.pop()
84
- }
85
- )
86
- }
87
-
88
- HeaderContent(
89
- options.headerTitle,
90
- headerColor.tintIconColor
91
- .copy(alpha = if (inputSearchType == InputSearchType.Animated) 1f - animatedAlpha else 1f)
92
- )
93
- Box(Modifier.onGloballyPositioned {
94
- if(headerRightWidthPx.intValue != it.size.width) headerRightWidthPx.intValue = it.size.width
95
- }){
96
- HeaderRight(options.headerRight, options.tintColor, headerColor)
97
- }
98
- }
99
- VerticalShadow(opacity)
100
- }
101
- }
102
-
103
- @Composable
104
- fun BackButton(borderColor: Color, backgroundButton: Color, tintIconColor: Color, onBackHandler: () -> Unit){
105
- Box(
106
- modifier = Modifier
107
- .size(28.dp)
108
- .background(backgroundButton, RoundedCornerShape(100))
109
- .border(width = 0.2.dp, color = borderColor, shape = RoundedCornerShape(100))
110
- .activeOpacityClickable(onClick = onBackHandler)
111
- .padding(Spacing.XS),
112
- contentAlignment = Alignment.Center
113
- ) {
114
- Icon(
115
- source = "arrow-back",
116
- color = tintIconColor,
117
- size = 20.dp,
118
- )
119
- }
120
- }
121
-
122
- @Composable
123
- fun RowScope.HeaderContent(headerTitle: HeaderTitle, tintIconColor: Color){
124
- Box(
125
- Modifier.weight(1f).padding(horizontal = Spacing.M)
126
- ) {
127
- when (headerTitle){
128
- is HeaderTitle.Default -> {
129
- HeaderTitle(
130
- title = headerTitle.title,
131
- color = tintIconColor
132
- )
133
- }
134
- is HeaderTitle.Journey -> {}
135
- is HeaderTitle.Location -> {}
136
- is HeaderTitle.User -> {
137
- HeaderUser(
138
- data = headerTitle
139
- )
140
- }
141
- }
142
- }
143
- }
144
-
145
- @Composable
146
- fun VerticalShadow(opacity: Float){
147
- if(opacity == 1f){
148
- Box(modifier = Modifier
149
- .fillMaxWidth()
150
- .height(6.dp)
151
- .offset(x = 0.dp, y = 6.dp)
152
- .background(
153
- brush = Brush.verticalGradient(
154
- colors = listOf(Color.Black.copy(alpha = 0.05f), Color.Transparent)
155
- )
156
- )
157
- )
158
- }
159
- }
160
-
161
- sealed class HeaderTitle {
162
- class Default(val title: String) : HeaderTitle()
163
-
164
- class User(
165
- val title: String,
166
- val subTitle: String? = null,
167
- val image: List<String>? = null,
168
- val dotColor: Color? = null,
169
- val tintColor: Color? = null,
170
- val onPress: (() -> Unit)? = null,
171
- val icons: List<String> = emptyList(),
172
- val isLoading: Boolean = false
173
- ) : HeaderTitle()
174
-
175
- class Location(
176
- val description: String? = null,
177
- val location: String,
178
- val tintColor: String? = null,
179
- val onPress: (() -> Unit)? = null,
180
- val isLoading: Boolean = false
181
- ) : HeaderTitle()
182
-
183
- class Journey(
184
- val start: String,
185
- val end: String? = null,
186
- val description: String? = null,
187
- val icon: String,
188
- val iconColor: String? = null,
189
- val tintColor: String? = null,
190
- val onPress: (() -> Unit)? = null,
191
- val isLoading: Boolean = false
192
- ) : HeaderTitle()
193
- }
194
-
195
- sealed class HeaderType {
196
- interface DefaultOrExtended {
197
- val useAnimated: Boolean
198
- val inputSearchProps: InputSearchProps?
199
- }
200
-
201
- data class Default(
202
- override val useAnimated: Boolean = false,
203
- override val inputSearchProps: InputSearchProps? = null
204
- ) : HeaderType(), DefaultOrExtended
205
-
206
- data class Extended(
207
- override val useAnimated: Boolean = false,
208
- override val inputSearchProps: InputSearchProps? = null
209
- ) : HeaderType(), DefaultOrExtended
210
-
211
- data object None : HeaderType()
212
-
213
- data class Animated(
214
- val aspectRatio: AnimatedHeaderRatio = AnimatedHeaderRatio.RATIO_16_9,
215
- val isSurface: Boolean = true,
216
- val layoutOffSet: Dp = 56.dp,
217
- val composable: @Composable (scrollState: Int) -> Unit = {}
218
- ) : HeaderType()
219
- }
220
-
221
- data class HeaderColor(val tintIconColor: Color, val backgroundButton: Color, val borderColor: Color)
222
- fun getHeaderColor(headerType: HeaderType, opacity: Float, tintColor: Color?, defaultColor: Color): HeaderColor{
223
- return if(headerType is HeaderType.Animated) {
224
- if (opacity == 1f || !headerType.isSurface)
225
- HeaderColor(
226
- tintIconColor = Colors.black_17,
227
- backgroundButton = Colors.black_01.copy(alpha = 0.6f),
228
- borderColor = Colors.black_20.copy(alpha = 0.2f)
229
- )
230
- else
231
- HeaderColor(
232
- tintIconColor = Colors.black_01,
233
- backgroundButton = Colors.black_20.copy(alpha = 0.6f),
234
- borderColor = Color.Transparent
235
- )
236
- }
237
- else {
238
- if (tintColor == Colors.black_01)
239
- HeaderColor(
240
- tintIconColor = tintColor,
241
- backgroundButton = Colors.black_20.copy(alpha = 0.6f),
242
- borderColor = Colors.black_01.copy(alpha = 0.2f)
243
- )
244
- else
245
- HeaderColor(
246
- tintIconColor = tintColor ?: defaultColor,
247
- backgroundButton = Colors.black_01.copy(alpha = 0.6f),
248
- borderColor = Colors.black_20.copy(alpha = 0.2f)
249
- )
250
- }
251
- }
@@ -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.application.Spacing
30
- import vn.momo.kits.components.BadgeDot
31
- import vn.momo.kits.components.DotSize
32
- import vn.momo.kits.components.Icon
33
- import vn.momo.kits.const.Colors
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,31 +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
-
14
- @Composable
15
- fun HeaderTitle(
16
- title: String = "",
17
- color: Color? = null,
18
- ) {
19
- Text(
20
- modifier = Modifier.fillMaxWidth().zIndex(1f),
21
- text = title,
22
- textAlign = TextAlign.Start,
23
- style = Typography.actionSBold.copy(
24
- fontSize = 15.sp,
25
- lineHeight = 22.sp,
26
- ),
27
- color = color,
28
- maxLines = 1,
29
- overflow = TextOverflow.Ellipsis
30
- )
31
- }