@momo-kits/native-kits 0.167.1-beta.4 → 0.167.1-duo.1-debug

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/.claude/settings.local.json +178 -7
  2. package/CLAUDE.md +7 -0
  3. package/build.gradle.kts +11 -0
  4. package/compose/build.gradle.kts +190 -0
  5. package/compose/build.gradle.kts.backup +190 -0
  6. package/compose/compose.podspec +47 -0
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +19 -0
  8. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
  9. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +12 -0
  10. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +7 -0
  11. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +151 -0
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +52 -0
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +124 -0
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +183 -0
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +207 -0
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +39 -0
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +293 -0
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +831 -0
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +110 -0
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +378 -0
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +56 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +82 -0
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +338 -0
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +175 -0
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +356 -0
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +113 -0
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +89 -0
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +128 -0
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +209 -0
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +542 -0
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +49 -0
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +125 -0
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +231 -0
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +189 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +475 -0
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +114 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +266 -0
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +240 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +223 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +264 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +185 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +343 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +84 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +334 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +98 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +310 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +59 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +21 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +90 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +323 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +220 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +473 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +122 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +199 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +91 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +552 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +88 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +125 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +207 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +498 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +176 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +182 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +193 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +234 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +188 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +325 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +16 -0
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +18 -0
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +22 -0
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +297 -0
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +52 -0
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +38 -0
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +39 -0
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +52 -0
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +66 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +104 -0
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +48 -0
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +299 -0
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +58 -0
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +129 -0
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +106 -0
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +201 -0
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +393 -0
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +596 -0
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +148 -0
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +35 -0
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +175 -0
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +225 -0
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +169 -0
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +360 -0
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +83 -0
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +106 -0
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +75 -0
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +309 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +37 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +364 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +132 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +127 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +12 -0
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +91 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +9 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +71 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +55 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +115 -0
  129. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +40 -0
  130. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +45 -0
  131. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +32 -0
  132. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +38 -0
  133. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +66 -0
  134. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +213 -0
  135. package/gradle/libs.versions.toml +69 -0
  136. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  137. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  138. package/gradle.properties +26 -0
  139. package/gradlew +252 -0
  140. package/gradlew.bat +94 -0
  141. package/ios/Application/Navigation/Overplay/ModalScreen.swift +3 -0
  142. package/ios/Popup/PopupDisplay.swift +1 -0
  143. package/ios/Popup/PopupNotify.swift +8 -1
  144. package/ios/Popup/PopupPromotion.swift +3 -3
  145. package/ios/Typography/FontScale.swift +3 -3
  146. package/ios/native-kits.podspec +1 -1
  147. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  148. package/ios-demo/README.md +120 -0
  149. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +1 -0
  150. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +1 -0
  151. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +2 -2
  152. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +2 -0
  153. package/local.properties +8 -0
  154. package/package.json +1 -1
  155. package/settings.gradle.kts +64 -0
@@ -0,0 +1,334 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.clickable
6
+ import androidx.compose.foundation.interaction.MutableInteractionSource
7
+ import androidx.compose.foundation.layout.*
8
+ import androidx.compose.foundation.lazy.LazyColumn
9
+ import androidx.compose.foundation.shape.RoundedCornerShape
10
+ import androidx.compose.runtime.*
11
+ import androidx.compose.ui.Alignment
12
+ import androidx.compose.ui.Modifier
13
+ import androidx.compose.ui.draw.clip
14
+ import androidx.compose.ui.platform.LocalDensity
15
+ import androidx.compose.ui.text.TextLayoutResult
16
+ import androidx.compose.ui.unit.Dp
17
+ import androidx.compose.ui.unit.dp
18
+ import vn.momo.kits.application.IsShowBaseLineDebug
19
+ import vn.momo.kits.application.LocalLocalize
20
+ import vn.momo.kits.const.*
21
+ import vn.momo.kits.modifier.conditional
22
+ import vn.momo.kits.modifier.setAutomationId
23
+ import vn.momo.kits.platform.getScreenDimensions
24
+ import kotlin.math.min
25
+
26
+ data class PopupAction(
27
+ val title: String,
28
+ val onPress: (() -> Unit)?,
29
+ )
30
+
31
+ enum class PopupActionDirection {
32
+ ROW,
33
+ COLUMN,
34
+ AUTO
35
+ }
36
+
37
+ // Portrait width in landscape too, so aspect-ratio images don't push popups past the screen height.
38
+ @Composable
39
+ internal fun popupMaxWidth(): Dp = getScreenDimensions().let { minOf(it.width, it.height) }.dp
40
+
41
+ private fun heightForLines(
42
+ layout: TextLayoutResult,
43
+ ): Float {
44
+ val clampedLines = (8.5f).coerceAtLeast(1f)
45
+ val wholeLines = kotlin.math.floor(clampedLines).toInt()
46
+ val fractionalPart = clampedLines - wholeLines
47
+
48
+ val baseLineIndex = (wholeLines - 1)
49
+ .coerceAtLeast(0)
50
+ .coerceAtMost(layout.lineCount - 1)
51
+
52
+ var heightPx = layout.getLineBottom(baseLineIndex)
53
+
54
+ if (fractionalPart > 0f) {
55
+ val nextLineIndex = (baseLineIndex + 1)
56
+ .coerceAtMost(layout.lineCount - 1)
57
+ val nextBottomPx = layout.getLineBottom(nextLineIndex)
58
+ heightPx += (nextBottomPx - heightPx) * fractionalPart
59
+ }
60
+ return heightPx
61
+ }
62
+
63
+ data class PopupNotifyProps(
64
+ val image: String = "",
65
+ val title: String = "Title",
66
+ val description: String = "Description",
67
+ val error: String = "",
68
+ val primary: PopupAction? = null,
69
+ val secondary: PopupAction? = null,
70
+ val buttonDirection: PopupActionDirection = PopupActionDirection.ROW,
71
+ val onIconClose: () -> Unit,
72
+ val isShowCloseIcon: Boolean = true,
73
+ )
74
+
75
+ @Composable
76
+ fun PopupNotify(
77
+ props: PopupNotifyProps,
78
+ ) {
79
+ var isScroll by remember { mutableStateOf(false) }
80
+ val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
81
+
82
+ val density = LocalDensity.current
83
+ var scrollHeight: Dp by remember { mutableStateOf(0.dp) }
84
+
85
+ LaunchedEffect(layoutResult.value) {
86
+ if ((layoutResult.value?.lineCount ?: 0) > 3) {
87
+ isScroll = true
88
+ }
89
+ }
90
+
91
+ LaunchedEffect(layoutResult.value) {
92
+ layoutResult.value?.let { v ->
93
+ // cap visible height at ~8.5 lines
94
+ val textPx = v.size.height.toFloat()
95
+ val capPx = heightForLines(v)
96
+
97
+ isScroll = textPx >= capPx
98
+ scrollHeight = with(density) { min(textPx, capPx).toDp() }
99
+ }
100
+ }
101
+
102
+ val content: @Composable (Modifier) -> Unit = if (isScroll) {
103
+ { modifier ->
104
+ LazyColumn(
105
+ modifier = modifier.height(scrollHeight)
106
+ ) {
107
+ item {
108
+ Text(
109
+ text = props.description,
110
+ onTextLayout = { layoutResult.value = it },
111
+ style = Typography.bodyDefaultRegular
112
+ )
113
+ }
114
+ }
115
+ }
116
+ } else {
117
+ { modifier ->
118
+ Box(modifier = modifier) {
119
+ Text(
120
+ text = props.description,
121
+ onTextLayout = { layoutResult.value = it },
122
+ style = Typography.bodyDefaultRegular
123
+ )
124
+ }
125
+ }
126
+ }
127
+
128
+ fun onClose(callback: (() -> Unit)?) {
129
+ callback?.invoke()
130
+ }
131
+
132
+ Box(
133
+ Modifier.setAutomationId("popup_notify"), contentAlignment = Alignment.TopEnd
134
+ ) {
135
+ Column(
136
+ modifier = Modifier
137
+ .widthIn(max = popupMaxWidth())
138
+ .fillMaxWidth()
139
+ .padding(horizontal = 12.dp)
140
+ .clip(RoundedCornerShape(Radius.L))
141
+ .background(
142
+ AppTheme.current.colors.background.surface,
143
+ RoundedCornerShape(Radius.L)
144
+ )
145
+ .conditional(IsShowBaseLineDebug) {
146
+ border(1.dp, Colors.blue_03)
147
+ }
148
+ ) {
149
+ if(props.image.isNotEmpty()) {
150
+ Image(
151
+ source = props.image,
152
+ modifier = Modifier.fillMaxWidth().aspectRatio(1.777f),
153
+ options = Options(alignment = Alignment.Center)
154
+ )
155
+ }
156
+
157
+ Column(modifier = Modifier.padding(Spacing.XL)) {
158
+ Text(
159
+ style = Typography.headerDefaultBold,
160
+ maxLines = 2,
161
+ text = props.title,
162
+ modifier = Modifier.setAutomationId("title_popup_permission")
163
+ )
164
+ content(Modifier.padding(top = Spacing.S))
165
+ if (props.error.isNotEmpty()) {
166
+ Text(
167
+ text = LocalLocalize.current.translate("errorCode") + props.error,
168
+ style = Typography.descriptionXsRegular,
169
+ color = AppTheme.current.colors.text.hint,
170
+ maxLines = 1,
171
+ modifier = Modifier.padding(top = Spacing.S)
172
+ )
173
+ }
174
+ }
175
+
176
+ Box(
177
+ modifier = Modifier.padding(horizontal = Spacing.XL)
178
+ .padding(bottom = Spacing.XL)
179
+ ) {
180
+ BuildAction(props.primary, props.secondary, props.buttonDirection, onAction = { callback ->
181
+ onClose(callback)
182
+ })
183
+ }
184
+ }
185
+
186
+ if(props.isShowCloseIcon) {
187
+ Box(
188
+ Modifier
189
+ .width(22.dp)
190
+ .height(22.dp)
191
+ .offset(x = -(1).dp, y = (-11).dp)
192
+ .background(
193
+ color = AppTheme.current.colors.text.default,
194
+ shape = RoundedCornerShape(Radius.M)
195
+ )
196
+ .border(
197
+ width = 2.dp,
198
+ color = AppTheme.current.colors.background.surface,
199
+ shape = RoundedCornerShape(Radius.M)
200
+ )
201
+ .clip(RoundedCornerShape(100))
202
+ .clickable(
203
+ interactionSource = remember { MutableInteractionSource() },
204
+ indication = null,
205
+ onClick = { onClose { props.onIconClose() } }
206
+ ),
207
+ contentAlignment = Alignment.Center
208
+ ) {
209
+ Icon(
210
+ source = "navigation_close",
211
+ color = AppTheme.current.colors.background.surface,
212
+ size = 16.dp,
213
+ modifier = Modifier.setAutomationId("ic_popup_close")
214
+ )
215
+ }
216
+ }
217
+ }
218
+ }
219
+
220
+ @Composable
221
+ internal fun BuildAction(
222
+ primary: PopupAction?,
223
+ secondary: PopupAction?,
224
+ buttonDirection: PopupActionDirection = PopupActionDirection.ROW,
225
+ onAction: (onPress: (() -> Unit)?) -> Unit,
226
+ ) {
227
+ val closeAction = remember { mutableStateOf("button_action") }
228
+ when (buttonDirection) {
229
+ PopupActionDirection.AUTO -> {
230
+ if (secondary != null && (secondary.title.length > 12 || primary?.title?.length!! > 12)) {
231
+ RenderColumn(
232
+ secondary = secondary,
233
+ onAction = onAction,
234
+ closeAction = closeAction,
235
+ primary = primary
236
+ )
237
+ } else {
238
+ RenderRow(
239
+ secondary = secondary,
240
+ onAction = onAction,
241
+ closeAction = closeAction,
242
+ primary = primary
243
+ )
244
+ }
245
+ }
246
+
247
+ PopupActionDirection.ROW -> RenderRow(
248
+ secondary = secondary,
249
+ onAction = onAction,
250
+ closeAction = closeAction,
251
+ primary = primary
252
+ )
253
+
254
+ else -> RenderColumn(
255
+ secondary = secondary,
256
+ onAction = onAction,
257
+ closeAction = closeAction,
258
+ primary = primary
259
+ )
260
+ }
261
+ }
262
+
263
+ @Composable
264
+ internal fun RenderRow(
265
+ secondary: PopupAction?,
266
+ closeAction: MutableState<String>,
267
+ primary: PopupAction?,
268
+ onAction: (onPress: (() -> Unit)?) -> Unit,
269
+ ) {
270
+ Row(horizontalArrangement = Arrangement.Center) {
271
+ secondary?.let {
272
+ Box(Modifier.weight(1f)) {
273
+ Button(
274
+ size = Size.MEDIUM,
275
+ onClick = {
276
+ closeAction.value = "button_action"
277
+ onAction(it.onPress)
278
+ },
279
+ title = it.title,
280
+ type = ButtonType.TEXT,
281
+ modifier = Modifier.setAutomationId("btn_popup_cancel")
282
+ )
283
+ }
284
+ Spacer(modifier = Modifier.width(Spacing.S))
285
+ }
286
+ Box(Modifier.weight(1f)) {
287
+ Button(
288
+ size = Size.MEDIUM,
289
+ onClick = {
290
+ closeAction.value = "button_action"
291
+ onAction(primary?.onPress)
292
+ },
293
+ title = primary?.title ?: "",
294
+ modifier = Modifier.setAutomationId("btn_popup_allow")
295
+ )
296
+ }
297
+ }
298
+ }
299
+
300
+ @Composable
301
+ internal fun RenderColumn(
302
+ secondary: PopupAction?,
303
+ closeAction: MutableState<String>,
304
+ primary: PopupAction?,
305
+ onAction: (onPress: (() -> Unit)?) -> Unit,
306
+ ) {
307
+ Column(horizontalAlignment = Alignment.CenterHorizontally) {
308
+ Button(
309
+ size = Size.MEDIUM,
310
+ onClick = {
311
+ closeAction.value = "button_action"
312
+ onAction(primary?.onPress)
313
+ },
314
+ title = primary?.title ?: "",
315
+ modifier = Modifier.setAutomationId("btn_popup_allow")
316
+ )
317
+ secondary?.let {
318
+ Spacer(modifier = Modifier.height(Spacing.S))
319
+ secondary.let {
320
+ Button(
321
+ size = Size.MEDIUM,
322
+ onClick = {
323
+ closeAction.value = "button_action"
324
+ onAction(it.onPress)
325
+ },
326
+ title = it.title,
327
+ type = ButtonType.TEXT,
328
+ modifier = Modifier.setAutomationId("btn_popup_cancel")
329
+ )
330
+ }
331
+ }
332
+ }
333
+ }
334
+
@@ -0,0 +1,98 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.clickable
6
+ import androidx.compose.foundation.interaction.MutableInteractionSource
7
+ import androidx.compose.foundation.layout.*
8
+ import androidx.compose.foundation.shape.RoundedCornerShape
9
+ import androidx.compose.runtime.Composable
10
+ import androidx.compose.runtime.remember
11
+ import androidx.compose.ui.Alignment
12
+ import androidx.compose.ui.Modifier
13
+ import androidx.compose.ui.draw.clip
14
+ import androidx.compose.ui.layout.ContentScale
15
+ import androidx.compose.ui.unit.dp
16
+ import vn.momo.kits.application.IsShowBaseLineDebug
17
+ import vn.momo.kits.const.AppTheme
18
+ import vn.momo.kits.const.Colors
19
+ import vn.momo.kits.const.Radius
20
+ import vn.momo.kits.const.Spacing
21
+ import vn.momo.kits.modifier.conditional
22
+ import vn.momo.kits.modifier.setAutomationId
23
+ import vn.momo.kits.utils.ifNotNull
24
+
25
+ @Composable
26
+ fun PopupPromotion(
27
+ source: String = "",
28
+ onPress: (() -> Unit) = {},
29
+ onClose: (() -> Unit) = {},
30
+ ) {
31
+ Column(Modifier
32
+ .widthIn(max = popupMaxWidth())
33
+ .padding(horizontal = Spacing.M)
34
+ .conditional(IsShowBaseLineDebug) {
35
+ border(1.dp, Colors.blue_03)
36
+ }
37
+ .setAutomationId("popup_notify")) {
38
+ source.ifNotNull(
39
+ Image(
40
+ source = source,
41
+ modifier = Modifier.fillMaxWidth()
42
+ .aspectRatio(0.72f)
43
+ .clickable(
44
+ interactionSource = remember { MutableInteractionSource() },
45
+ indication = null,
46
+ onClick = onPress
47
+ ),
48
+ options = Options(alignment = Alignment.Center, contentScale = ContentScale.FillBounds)
49
+ ), null
50
+ )
51
+ Box(
52
+ modifier = Modifier
53
+ .padding(top = Spacing.S)
54
+ .fillMaxWidth()
55
+ .width(40.dp)
56
+ .height(40.dp),
57
+ contentAlignment = Alignment.Center
58
+ ) {
59
+ Box(
60
+ modifier = Modifier
61
+ .width(40.dp)
62
+ .height(40.dp)
63
+ .clickable(
64
+ interactionSource = remember { MutableInteractionSource() },
65
+ indication = null,
66
+ onClick = onClose
67
+ ),
68
+ contentAlignment = Alignment.Center
69
+ ) {
70
+ Box(
71
+ Modifier
72
+ .width(22.dp)
73
+ .height(22.dp)
74
+ .background(
75
+ color = AppTheme.current.colors.text.default,
76
+ shape = RoundedCornerShape(Radius.M)
77
+ )
78
+ .border(
79
+ width = 2.dp,
80
+ color = AppTheme.current.colors.background.surface,
81
+ shape = RoundedCornerShape(Radius.M)
82
+ )
83
+ .clip(RoundedCornerShape(100))
84
+ ,
85
+ contentAlignment = Alignment.Center
86
+ ) {
87
+ Icon(
88
+ source = "navigation_close",
89
+ color = AppTheme.current.colors.background.surface,
90
+ size = 16.dp,
91
+ modifier = Modifier.setAutomationId("ic_popup_close")
92
+ )
93
+ }
94
+ }
95
+
96
+ }
97
+ }
98
+ }