@momo-kits/native-kits 0.163.1-beta.1-debug → 0.163.1-beta.2-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 (113) hide show
  1. package/compose/build.gradle.kts +11 -8
  2. package/compose/build.gradle.kts.backup +10 -7
  3. package/compose/compose.podspec +1 -1
  4. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +2 -7
  5. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +11 -12
  6. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +6 -24
  7. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +4 -19
  8. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +1 -10
  9. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +2 -2
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +1 -1
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +1 -1
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +6 -17
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +1 -1
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +6 -101
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +3 -16
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +8 -33
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +1 -1
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +22 -25
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +27 -29
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +3 -26
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +27 -30
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +3 -13
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -5
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +3 -11
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +3 -18
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +11 -11
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +3 -11
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +1 -5
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +84 -59
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +13 -71
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +10 -51
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +6 -1
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +4 -21
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +1 -1
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +15 -76
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +5 -26
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +1 -1
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +3 -11
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +16 -40
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +3 -9
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -28
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +2 -13
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +4 -10
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +3 -28
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +8 -47
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +4 -25
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +2 -11
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +1 -17
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +1 -6
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +50 -111
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +1 -5
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +7 -8
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +1 -12
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +4 -96
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +5 -7
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +2 -12
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +9 -21
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +2 -2
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +9 -14
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +8 -11
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +1 -1
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +24 -40
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +1 -1
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -5
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -2
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +94 -4
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -2
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +2 -2
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +3 -7
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +5 -15
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +50 -10
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +48 -33
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +58 -57
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +3 -9
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +12 -32
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +1 -1
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +6 -24
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +11 -7
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +2 -1
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +9 -6
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +1 -1
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +3 -13
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +3 -2
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +1 -40
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -2
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -8
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +2 -17
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +1 -1
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +3 -3
  90. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +2 -3
  91. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -2
  92. package/gradle.properties +1 -1
  93. package/ios/Application/ApplicationEnvironment.swift +1 -0
  94. package/ios/Application/Components.swift +1 -0
  95. package/ios/Application/FloatingButton.swift +1 -0
  96. package/ios/Application/FontScaleStore.swift +59 -0
  97. package/ios/Badge/Badge.swift +1 -0
  98. package/ios/Badge/BadgeRibbon.swift +2 -0
  99. package/ios/Button/Button.swift +1 -1
  100. package/ios/Checkbox/Checkbox.swift +1 -0
  101. package/ios/Information/Information.swift +151 -0
  102. package/ios/Input/Input.swift +1 -0
  103. package/ios/Input/InputPhoneNumber.swift +1 -0
  104. package/ios/Input/InputSearch.swift +3 -0
  105. package/ios/Input/InputTextArea.swift +1 -0
  106. package/ios/OTPKeyboard/KeyboardButton.swift +1 -1
  107. package/ios/Popup/PopupDisplay.swift +6 -0
  108. package/ios/Popup/PopupInput.swift +2 -0
  109. package/ios/Template/TrustBanner/TrustBanner.swift +2 -0
  110. package/ios/Typography/Text.swift +13 -7
  111. package/ios/Typography/Typography.swift +22 -8
  112. package/package.json +1 -1
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
@@ -1,40 +1,21 @@
1
1
  package vn.momo.kits.navigation.component
2
2
 
3
- import androidx.compose.animation.AnimatedVisibility
3
+ import androidx.compose.animation.*
4
4
  import androidx.compose.animation.core.CubicBezierEasing
5
5
  import androidx.compose.animation.core.LinearEasing
6
6
  import androidx.compose.animation.core.animateDpAsState
7
7
  import androidx.compose.animation.core.tween
8
- import androidx.compose.animation.expandHorizontally
9
- import androidx.compose.animation.fadeIn
10
- import androidx.compose.animation.fadeOut
11
- import androidx.compose.animation.shrinkHorizontally
12
8
  import androidx.compose.foundation.ScrollState
13
9
  import androidx.compose.foundation.background
14
10
  import androidx.compose.foundation.border
15
11
  import androidx.compose.foundation.interaction.MutableInteractionSource
16
- import androidx.compose.foundation.layout.Arrangement
17
- import androidx.compose.foundation.layout.Box
18
- import androidx.compose.foundation.layout.Row
19
- import androidx.compose.foundation.layout.Spacer
20
- import androidx.compose.foundation.layout.fillMaxSize
21
- import androidx.compose.foundation.layout.height
22
- import androidx.compose.foundation.layout.offset
23
- import androidx.compose.foundation.layout.padding
24
- import androidx.compose.foundation.layout.sizeIn
25
- import androidx.compose.foundation.layout.width
12
+ import androidx.compose.foundation.layout.*
26
13
  import androidx.compose.material3.AlertDialogDefaults
27
14
  import androidx.compose.material3.FloatingActionButton
28
15
  import androidx.compose.material3.FloatingActionButtonDefaults
29
16
  import androidx.compose.material3.FloatingActionButtonElevation
30
- import androidx.compose.runtime.Composable
31
- import androidx.compose.runtime.LaunchedEffect
32
- import androidx.compose.runtime.getValue
33
- import androidx.compose.runtime.mutableStateOf
34
- import androidx.compose.runtime.remember
35
- import androidx.compose.runtime.rememberCoroutineScope
17
+ import androidx.compose.runtime.*
36
18
  import androidx.compose.runtime.saveable.rememberSaveable
37
- import androidx.compose.runtime.setValue
38
19
  import androidx.compose.ui.Alignment
39
20
  import androidx.compose.ui.Modifier
40
21
  import androidx.compose.ui.graphics.Color
@@ -50,6 +31,7 @@ import vn.momo.kits.components.Text
50
31
  import vn.momo.kits.const.Colors
51
32
  import vn.momo.kits.const.Typography
52
33
  import vn.momo.kits.modifier.conditional
34
+ import kotlin.time.Duration.Companion.milliseconds
53
35
 
54
36
  enum class FABSize { SMALL, DEFAULT }
55
37
  enum class FABPosition { END, CENTER }
@@ -73,7 +55,7 @@ private val FabIconSizeDefault = 24.dp
73
55
  private val FabPaddingHorizontal = 12.dp
74
56
 
75
57
  @Composable
76
- fun FloatingButton(
58
+ internal fun FloatingButton(
77
59
  scrollPosition: Int,
78
60
  bottom: Dp,
79
61
  onClick: () -> Unit,
@@ -106,7 +88,7 @@ fun FloatingButton(
106
88
  coroutineScope.launch {
107
89
  scrollStateFlow.collectLatest { newScroll ->
108
90
  isExpanded = newScroll <= lastScrollPosition
109
- delay(100)
91
+ delay(100.milliseconds)
110
92
  lastScrollPosition = newScroll
111
93
  }
112
94
  }
@@ -1,5 +1,7 @@
1
1
  package vn.momo.kits.navigation.component
2
2
 
3
+ import vn.momo.kits.modifier.InternalApi
4
+
3
5
  import androidx.compose.animation.core.animateFloatAsState
4
6
  import androidx.compose.foundation.background
5
7
  import androidx.compose.foundation.border
@@ -42,12 +44,13 @@ import vn.momo.kits.navigation.LocalOptions
42
44
  import vn.momo.kits.navigation.LocalScrollState
43
45
  import vn.momo.kits.navigation.getInputSearchType
44
46
 
45
- const val HEADER_HEIGHT = 52
46
- enum class InputSearchType { None, Header, Animated }
47
+ internal const val HEADER_HEIGHT = 52
48
+ internal enum class InputSearchType { None, Header, Animated }
47
49
  enum class TitlePosition { LEFT, CENTER }
48
50
 
51
+ @Suppress("FrequentlyChangingValue")
49
52
  @Composable
50
- fun Header(onBackHandler: (() -> Unit)? = null) {
53
+ internal fun Header(onBackHandler: (() -> Unit)? = null) {
51
54
  val options = LocalOptions.current
52
55
  val navigator = LocalNavigator.current
53
56
  val scrollState = LocalScrollState.current
@@ -106,7 +109,7 @@ fun Header(onBackHandler: (() -> Unit)? = null) {
106
109
  backgroundButton = headerColor.backgroundButton,
107
110
  tintIconColor = headerColor.tintIconColor,
108
111
  onBackHandler = {
109
- onBackHandler?.invoke() ?: navigator.onBackSafe { }
112
+ navigator.onBackSafe { }
110
113
  }
111
114
  )
112
115
  Spacer(Modifier.width(Spacing.S))
@@ -168,7 +171,7 @@ private fun BackButton(borderColor: Color, backgroundButton: Color, tintIconColo
168
171
  }
169
172
 
170
173
  @Composable
171
- fun HeaderContent(
174
+ internal fun HeaderContent(
172
175
  headerTitle: HeaderTitle,
173
176
  tintIconColor: Color,
174
177
  titlePosition: TitlePosition = TitlePosition.LEFT,
@@ -199,7 +202,7 @@ fun HeaderContent(
199
202
  }
200
203
 
201
204
  @Composable
202
- fun VerticalShadow(opacity: Float){
205
+ internal fun VerticalShadow(opacity: Float){
203
206
  if(opacity == 1f){
204
207
  Box(modifier = Modifier
205
208
  .fillMaxWidth()
@@ -282,8 +285,9 @@ data class HeaderBackProps(
282
285
  val preventBack: PopupNotifyProps? = null,
283
286
  )
284
287
 
288
+ @InternalApi
285
289
  data class HeaderColor(val tintIconColor: Color, val backgroundButton: Color, val borderColor: Color)
286
- fun getHeaderColor(headerType: HeaderType, opacity: Float, tintColor: Color?, defaultColor: Color): HeaderColor{
290
+ internal fun getHeaderColor(headerType: HeaderType, opacity: Float, tintColor: Color?, defaultColor: Color): HeaderColor{
287
291
  return if(headerType is HeaderType.Animated) {
288
292
  if (opacity == 1f || !headerType.isSurface)
289
293
  HeaderColor(
@@ -27,8 +27,9 @@ enum class AnimatedHeaderRatio(val value: Float){
27
27
  RATIO_3_2(3f / 2f)
28
28
  }
29
29
 
30
+ @Suppress("FrequentlyChangingValue")
30
31
  @Composable
31
- fun HeaderBackground() {
32
+ internal fun HeaderBackground() {
32
33
  val density = LocalDensity.current
33
34
  val theme = AppTheme.current
34
35
  val options = LocalOptions.current
@@ -1,5 +1,7 @@
1
1
  package vn.momo.kits.navigation.component
2
2
 
3
+ import vn.momo.kits.modifier.InternalApi
4
+
3
5
  import androidx.compose.foundation.background
4
6
  import androidx.compose.foundation.border
5
7
  import androidx.compose.foundation.layout.Arrangement
@@ -24,7 +26,7 @@ import androidx.compose.ui.Modifier
24
26
  import androidx.compose.ui.draw.clip
25
27
  import androidx.compose.ui.graphics.Color
26
28
  import androidx.compose.ui.unit.dp
27
- import vn.momo.kits.application.ApplicationContext
29
+ import vn.momo.kits.application.LocalContext
28
30
  import vn.momo.kits.application.MiniAppContext
29
31
  import vn.momo.kits.components.BadgeDot
30
32
  import vn.momo.kits.components.DotSize
@@ -35,6 +37,7 @@ import vn.momo.kits.modifier.activeOpacityClickable
35
37
  import vn.momo.kits.navigation.LocalMaxApi
36
38
 
37
39
  @Composable
40
+ @InternalApi
38
41
  fun HeaderRight(
39
42
  headerRight: HeaderRight,
40
43
  tintColor: Color? = null,
@@ -57,13 +60,13 @@ fun HeaderRight(
57
60
  }
58
61
 
59
62
  @Composable
60
- fun Toolkit(
63
+ internal fun Toolkit(
61
64
  headerRight: HeaderRight.Toolkit,
62
65
  tintColor: Color? = null,
63
66
  headerColor: HeaderColor
64
67
  ) {
65
68
  val api = LocalMaxApi.current
66
- val context = ApplicationContext.current
69
+ val context = LocalContext.current
67
70
 
68
71
  var isFavorite by remember { mutableStateOf(false) }
69
72
  val isLoading by remember { mutableStateOf(false) }
@@ -186,7 +189,7 @@ fun Toolkit(
186
189
 
187
190
 
188
191
  @Composable
189
- fun NavigationButton(
192
+ internal fun NavigationButton(
190
193
  disabled: Boolean,
191
194
  icon: String,
192
195
  showBadge: Boolean? = false,
@@ -300,7 +303,7 @@ data class Tool(
300
303
  }
301
304
  }
302
305
 
303
- data class NavigationButtonConfig(
306
+ private data class NavigationButtonConfig(
304
307
  val icon: String,
305
308
  val onPress: () -> Unit
306
- )
309
+ )
@@ -13,7 +13,7 @@ import vn.momo.kits.const.Typography
13
13
  import vn.momo.kits.modifier.setAutomationId
14
14
 
15
15
  @Composable
16
- fun HeaderTitle(
16
+ internal fun HeaderTitle(
17
17
  title: String = "",
18
18
  color: Color? = null,
19
19
  modifier: Modifier = Modifier.fillMaxWidth(),
@@ -2,17 +2,7 @@ package vn.momo.kits.navigation.component
2
2
 
3
3
  import androidx.compose.foundation.background
4
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.Column
8
- import androidx.compose.foundation.layout.Row
9
- import androidx.compose.foundation.layout.Spacer
10
- import androidx.compose.foundation.layout.fillMaxWidth
11
- import androidx.compose.foundation.layout.height
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.layout.widthIn
5
+ import androidx.compose.foundation.layout.*
16
6
  import androidx.compose.foundation.shape.CircleShape
17
7
  import androidx.compose.foundation.shape.RoundedCornerShape
18
8
  import androidx.compose.foundation.text.BasicText
@@ -43,7 +33,7 @@ import vn.momo.kits.navigation.component.HeaderTitle.User
43
33
  import vn.momo.kits.platform.getScreenDimensions
44
34
 
45
35
  @Composable
46
- fun HeaderUser(
36
+ internal fun HeaderUser(
47
37
  data: HeaderTitle
48
38
  ) {
49
39
  if (data !is User) return
@@ -367,4 +357,4 @@ private fun RemoteIcon16(url: String) {
367
357
  }
368
358
 
369
359
  @Immutable
370
- data class AvatarUrls(val items: List<String>)
360
+ private data class AvatarUrls(val items: List<String>)
@@ -29,6 +29,7 @@ import vn.momo.kits.navigation.LocalFooterHeightPx
29
29
  import vn.momo.kits.navigation.LocalNavigator
30
30
  import vn.momo.kits.navigation.LocalOptions
31
31
  import vn.momo.kits.navigation.OverplayComponentRegistry
32
+ import kotlin.time.Duration.Companion.milliseconds
32
33
 
33
34
  sealed class SnackBar(open val duration: Long? = null) {
34
35
  data class Custom(
@@ -42,7 +43,7 @@ sealed class SnackBar(open val duration: Long? = null) {
42
43
  }
43
44
 
44
45
  @Composable
45
- fun SnackBar(
46
+ internal fun SnackBar(
46
47
  data: SnackBar,
47
48
  onDismiss: (() -> Unit)?
48
49
  ) {
@@ -95,7 +96,7 @@ fun SnackBar(
95
96
  LaunchedEffect(data.duration) {
96
97
  val duration = data.duration
97
98
  if (duration != null) {
98
- delay(duration)
99
+ delay(duration.milliseconds)
99
100
  navigator.hideSnackBar()
100
101
  }
101
102
  }
@@ -5,13 +5,9 @@ import vn.momo.maxapi.IMaxApi
5
5
  import kotlin.time.Clock
6
6
  import kotlin.time.ExperimentalTime
7
7
 
8
- /**
9
- * Screen tracking state holder
10
- */
11
8
  class ScreenTrackingState {
12
9
  @OptIn(ExperimentalTime::class)
13
- var startTime: Long = Clock.System.now().toEpochMilliseconds()
14
- var endTime: Long = startTime
10
+ var time: Long = Clock.System.now().toEpochMilliseconds()
15
11
  var releaseNavigated: Boolean = false
16
12
  var releaseLoad: Boolean = false
17
13
  var releaseInteraction: Boolean = false
@@ -19,22 +15,10 @@ class ScreenTrackingState {
19
15
  var action: String = "push"
20
16
  }
21
17
 
22
- /**
23
- * Screen tracker for auto tracking events
24
- *
25
- * Tracks 3 main events:
26
- * - auto_screen_navigated: When screen is focused
27
- * - auto_screen_displayed: When screen finished loading
28
- * - auto_screen_interacted: When screen is ready for interaction
29
- */
30
18
  object ScreenTracker {
31
19
 
32
20
  private var lastScreenName: String? = null
33
21
 
34
- /**
35
- * Track screen navigation event
36
- * Called when screen is focused
37
- */
38
22
  fun trackScreenNavigated(
39
23
  maxApi: IMaxApi?,
40
24
  context: MiniAppContext?,
@@ -61,10 +45,6 @@ object ScreenTracker {
61
45
  state.previousScreenName = previousScreen
62
46
  }
63
47
 
64
- /**
65
- * Track screen displayed event
66
- * Called when screen finished loading all elements
67
- */
68
48
  fun trackScreenDisplayed(
69
49
  maxApi: IMaxApi?,
70
50
  context: MiniAppContext?,
@@ -85,10 +65,6 @@ object ScreenTracker {
85
65
  state.releaseLoad = true
86
66
  }
87
67
 
88
- /**
89
- * Track screen interacted event
90
- * Called when screen is ready for user interaction
91
- */
92
68
  fun trackScreenInteracted(
93
69
  maxApi: IMaxApi?,
94
70
  context: MiniAppContext?,
@@ -111,9 +87,6 @@ object ScreenTracker {
111
87
  state.releaseInteraction = true
112
88
  }
113
89
 
114
- /**
115
- * Build base tracking params from MiniAppContext
116
- */
117
90
  private fun buildBaseParams(
118
91
  context: MiniAppContext?,
119
92
  screenName: String,
@@ -128,12 +101,6 @@ object ScreenTracker {
128
101
  )
129
102
  }
130
103
 
131
- /**
132
- * Track popup/modal displayed event
133
- *
134
- * @param popupName name of the popup/modal
135
- * @param parentScreenName the screen that shows the popup
136
- */
137
104
  fun trackPopupDisplayed(
138
105
  maxApi: IMaxApi?,
139
106
  context: MiniAppContext?,
@@ -152,14 +119,8 @@ object ScreenTracker {
152
119
  )
153
120
  }
154
121
 
155
- /**
156
- * Get previous screen name for back navigation detection
157
- */
158
122
  fun getLastScreenName(): String? = lastScreenName
159
123
 
160
- /**
161
- * Reset tracker (for testing or cleanup)
162
- */
163
124
  @Suppress("UNUSED")
164
125
  fun reset() {
165
126
  lastScreenName = null
@@ -36,8 +36,6 @@ internal fun ComposeLottieAnimation(
36
36
  LottieCompositionSpec.JsonString(json)
37
37
  }
38
38
 
39
- // Recolor only the fill/stroke color slots (matching the native lottie-ios per-keypath tint)
40
- // instead of a global ColorFilter.tint, which would flatten a multicolor animation to a silhouette.
41
39
  val dynamicProperties = if (tintColor != null) {
42
40
  rememberLottieDynamicProperties(tintColor) {
43
41
  shapeLayer("**") {
@@ -43,14 +43,6 @@ fun supportsImePadding(): Boolean = when (val v = getOSVersion()) {
43
43
  is OSVersion.Android -> v.sdk > 29
44
44
  is OSVersion.IOS -> true
45
45
  }
46
-
47
- /**
48
- * @param useCompose when `true`, renders via the pure-Compose Compottie engine instead of the
49
- * platform-native engine (airbnb-lottie on Android, lottie-ios on iOS). Defaults to `false` for
50
- * backward compatibility. Note: when `useCompose = true`, `tintColor` recolors only the fill/stroke
51
- * color slots (matching the native lottie-ios per-keypath tint), so gradient and text-layer colors
52
- * are left untinted; `placedAsOverlay` is a no-op.
53
- */
54
46
  @Composable
55
47
  expect fun LottieAnimation(
56
48
  path: String,
@@ -1,28 +1,13 @@
1
1
  package vn.momo.kits.utils
2
2
 
3
- import androidx.compose.runtime.Composable
4
- import androidx.compose.runtime.LaunchedEffect
5
- import androidx.compose.runtime.MutableState
6
- import androidx.compose.runtime.getValue
7
- import androidx.compose.runtime.mutableStateOf
8
- import androidx.compose.runtime.remember
3
+ import androidx.compose.runtime.*
9
4
  import org.jetbrains.compose.resources.DrawableResource
10
5
  import org.jetbrains.compose.resources.InternalResourceApi
11
6
  import org.jetbrains.compose.resources.ResourceItem
12
7
  import org.jetbrains.compose.resources.readResourceBytes
13
-
14
- @OptIn(InternalResourceApi::class)
15
- @Composable
16
- fun getResource(name: String): DrawableResource {
17
- return DrawableResource(
18
- "drawable:$name",
19
- setOf(ResourceItem(setOf(), "drawable/$name", -1, -1))
20
- )
21
- }
22
-
23
8
  @OptIn(InternalResourceApi::class)
24
9
  @Composable
25
- fun readJson(name: String): String {
10
+ internal fun readJson(name: String): String {
26
11
  val path = name.plus(".json")
27
12
  val candidatePaths = listOf(
28
13
  path,
@@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable
4
4
  import vn.momo.kits.application.LocalComponentInformation
5
5
 
6
6
  @Composable
7
- fun getComponentId(
7
+ internal fun getComponentId(
8
8
  componentName: String? = null,
9
9
  accessibilityLabel: String? = null,
10
10
  ): String {
@@ -41,8 +41,8 @@ internal fun Modifier.bottomBorder(strokeWidth: Dp, color: Color) = composed(
41
41
  }
42
42
  )
43
43
 
44
- inline fun <T> Boolean.ifTrue(trueCase: T, falseCase: T): T = if (this) trueCase else falseCase
45
- inline fun <T> String.ifNotNull(trueCase: T, falseCase: T): T =
44
+ fun <T> Boolean.ifTrue(trueCase: T, falseCase: T): T = if (this) trueCase else falseCase
45
+ fun <T> String.ifNotNull(trueCase: T, falseCase: T): T =
46
46
  if (this.isBlank()) falseCase else trueCase
47
47
 
48
48
  fun formatNumberToMoney(number: Long, currency: String = "đ"): String {
@@ -91,7 +91,7 @@ fun getAppStatusBarHeight(): Dp {
91
91
  }
92
92
 
93
93
  @Composable
94
- fun getNavigationBarHeight(): Dp {
94
+ internal fun getNavigationBarHeight(): Dp {
95
95
  return if (AppNavigationBar.current == 0.dp) {
96
96
  val systemBottomPadding = WindowInsets.systemBars.asPaddingValues().calculateBottomPadding()
97
97
  if (getPlatformName() == "iOS") {
@@ -13,14 +13,13 @@ private const val STATUS_BAR_TAPPED_NOTIFICATION = "statusBarSelected"
13
13
  internal actual fun RegisterScrollToTop(callback: (() -> Unit)?) {
14
14
  val maxApi = LocalMaxApi.current
15
15
  DisposableEffect(callback) {
16
- val cb = callback
17
- val token: NSObjectProtocol? = if (cb != null) {
16
+ val token: NSObjectProtocol? = if (callback != null) {
18
17
  NSNotificationCenter.defaultCenter.addObserverForName(
19
18
  name = STATUS_BAR_TAPPED_NOTIFICATION,
20
19
  `object` = null,
21
20
  queue = NSOperationQueue.mainQueue,
22
21
  ) { _: NSNotification? ->
23
- runCatching { cb() }.onFailure {
22
+ runCatching { callback() }.onFailure {
24
23
  maxApi?.logFile("[ScrollToTop] callback threw: ${it.message}") {}
25
24
 
26
25
  }
@@ -19,8 +19,6 @@ import androidx.compose.ui.backhandler.LocalCompatNavigationEventDispatcherOwner
19
19
  import androidx.compose.ui.graphics.Color
20
20
  import androidx.compose.ui.graphics.NativePaint
21
21
  import androidx.compose.ui.graphics.toArgb
22
- import androidx.compose.ui.semantics.SemanticsPropertyKey
23
- import androidx.compose.ui.semantics.semantics
24
22
  import androidx.compose.ui.unit.Dp
25
23
  import androidx.compose.ui.unit.dp
26
24
  import androidx.compose.ui.viewinterop.UIKitInteropProperties
package/gradle.properties CHANGED
@@ -18,7 +18,7 @@ kotlin.apple.xcodeCompatibility.nowarn=true
18
18
  name="ComposeKits"
19
19
  group=vn.momo.kits
20
20
  artifact.id=kits
21
- version=0.163.1-beta.1
21
+ version=0.163.1-beta.2
22
22
 
23
23
  repo=GitLab
24
24
  url=https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven
@@ -46,5 +46,6 @@ public class ApplicationEnvironment: ObservableObject {
46
46
  self.applicationContext = applicationContext
47
47
  self.composeApi = composeApi
48
48
  self.config = config
49
+ FontScaleStore.shared.bind(composeApi)
49
50
  }
50
51
  }
@@ -245,6 +245,7 @@ public struct Header: View {
245
245
  } else {
246
246
  Text(title)
247
247
  .font(.system(size: 17, weight: .bold))
248
+ .ignoreBoldTextSetting()
248
249
  .foregroundColor(tintColor ?? Colors.black17)
249
250
  .frame(maxWidth: titlePosition == .center ? UIScreen.main.bounds.width - 252 : nil)
250
251
  .frame(maxWidth: titlePosition == .center ? .infinity : UIScreen.main.bounds.width - 172, alignment: titlePosition == .center ? .center : .leading)
@@ -155,6 +155,7 @@ public struct FloatingButton: View {
155
155
  Text(label)
156
156
  .foregroundColor(.white)
157
157
  .font(.system(size: scaleSize(16), weight: .bold))
158
+ .ignoreBoldTextSetting()
158
159
  .lineLimit(1)
159
160
  .background(
160
161
  GeometryReader { geo in
@@ -0,0 +1,59 @@
1
+ import SwiftUI
2
+
3
+ public struct FontScaleConfig {
4
+ public var useOSFontScale: Bool
5
+ public var userScaleRate: CGFloat?
6
+
7
+ public init(useOSFontScale: Bool = true, userScaleRate: CGFloat? = nil) {
8
+ self.useOSFontScale = useOSFontScale
9
+ self.userScaleRate = userScaleRate
10
+ }
11
+ }
12
+
13
+ public final class FontScaleStore: ObservableObject {
14
+ public static let shared = FontScaleStore()
15
+
16
+ @Published public private(set) var config = FontScaleConfig()
17
+
18
+ private var didBind = false
19
+ private var observerId: String?
20
+
21
+ private init() {}
22
+
23
+ public func update(_ newConfig: FontScaleConfig) {
24
+ if Thread.isMainThread {
25
+ config = newConfig
26
+ } else {
27
+ DispatchQueue.main.async { [weak self] in self?.config = newConfig }
28
+ }
29
+ }
30
+
31
+ public func bind(_ api: KitComposeApi?) {
32
+ guard let api = api, !didBind else { return }
33
+ didBind = true
34
+
35
+ apply(api.request(funcName: "getFontScaleConfig", params: nil))
36
+ observerId = api.request(funcName: "observer", params: ["font_scale_config"]) { [weak self] response in
37
+ self?.apply(response)
38
+ }
39
+ }
40
+
41
+ private func apply(_ response: String) {
42
+ guard let parsed = FontScaleStore.parse(response) else { return }
43
+ update(parsed)
44
+ }
45
+
46
+ static func parse(_ response: String) -> FontScaleConfig? {
47
+ guard
48
+ let data = response.data(using: .utf8),
49
+ let json = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
50
+ else { return nil }
51
+
52
+ let obj = (json["response"] as? [String: Any]) ?? (json["data"] as? [String: Any]) ?? json
53
+ guard obj["useOSFontScale"] != nil || obj["userScaleRate"] != nil else { return nil }
54
+
55
+ let useOS = (obj["useOSFontScale"] as? Bool) ?? true
56
+ let rate = (obj["userScaleRate"] as? NSNumber).map { CGFloat($0.doubleValue) }
57
+ return FontScaleConfig(useOSFontScale: useOS, userScaleRate: rate)
58
+ }
59
+ }
@@ -54,6 +54,7 @@ public struct Badge: View {
54
54
  public var body: some View {
55
55
  Text(formatTitle(label))
56
56
  .font(.system(size: scaleSize(10), weight: .bold))
57
+ .ignoreBoldTextSetting()
57
58
  .foregroundColor(Colors.black01)
58
59
  .padding(.horizontal, Spacing.XS)
59
60
  .frame(minWidth: scaleSize(16), minHeight: scaleSize(16))
@@ -138,6 +138,7 @@ public struct BadgeRibbon: View {
138
138
  HStack(spacing: 0) {
139
139
  Text(label)
140
140
  .font(.system(size: scaleSize(12), weight: .medium))
141
+ .ignoreBoldTextSetting()
141
142
  .foregroundColor(Colors.black01)
142
143
  .lineLimit(1)
143
144
  .rotationEffect(rotation)
@@ -159,6 +160,7 @@ public struct BadgeRibbon: View {
159
160
  HStack(spacing: 0) {
160
161
  Text(label)
161
162
  .font(.system(size: scaleSize(12), weight: .medium))
163
+ .ignoreBoldTextSetting()
162
164
  .foregroundColor(Colors.black01)
163
165
  .lineLimit(1)
164
166
  .rotationEffect(rotation)
@@ -200,7 +200,7 @@ public struct Button: View {
200
200
  .background(bg)
201
201
  .overlay(
202
202
  RoundedRectangle(cornerRadius: size.radius)
203
- .stroke(border ?? .clear, lineWidth: border != nil ? borderWidth : 0)
203
+ .strokeBorder(border ?? .clear, lineWidth: border != nil ? borderWidth : 0)
204
204
  )
205
205
  .clipShape(RoundedRectangle(cornerRadius: size.radius))
206
206
  .opacity(loading ? 0.75 : 1)
@@ -55,6 +55,7 @@ public struct Checkbox: View{
55
55
  if !title.isEmpty {
56
56
  Text(title)
57
57
  .font(.description1)
58
+ .ignoreBoldTextSetting()
58
59
  }
59
60
  }
60
61
  }