@momo-kits/native-kits 0.156.1-test.12-debug → 0.156.1-test.14-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 (24) hide show
  1. package/compose/build.gradle.kts +1 -1
  2. package/compose/compose.podspec +1 -1
  3. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +1 -0
  4. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +2 -3
  5. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +46 -7
  6. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +58 -1
  7. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +218 -0
  8. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +32 -0
  9. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  10. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  11. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +16 -0
  12. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +6 -0
  13. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
  14. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +58 -0
  15. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +58 -0
  16. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
  17. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
  18. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
  19. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +58 -0
  20. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +58 -0
  21. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +60 -0
  22. package/gradle.properties +1 -1
  23. package/local.properties +2 -2
  24. package/package.json +1 -1
@@ -40,7 +40,7 @@ kotlin {
40
40
  }
41
41
 
42
42
  cocoapods {
43
- version = "0.156.1-test.12-debug"
43
+ version = "0.156.1-test.14-debug"
44
44
  summary = "IOS Shared module"
45
45
  homepage = "https://momo.vn"
46
46
  ios.deploymentTarget = "15.0"
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |spec|
2
2
  spec.name = 'compose'
3
- spec.version = '0.156.1-beta.2'
3
+ spec.version = '0.156.1-beta.5'
4
4
  spec.homepage = 'https://momo.vn'
5
5
  spec.source = { :http=> ''}
6
6
  spec.authors = ''
@@ -72,6 +72,7 @@ val LocalNavigation = staticCompositionLocalOf<Navigation> {
72
72
 
73
73
  @Stable
74
74
  data class NavigationOptions(
75
+ val screenName: String? = null,
75
76
  val onBackHandler: (() -> Unit)? = null,
76
77
  val hiddenBack: Boolean = false,
77
78
  val headerBackProps: HeaderBackProps = HeaderBackProps(),
@@ -87,6 +87,7 @@ fun NavigationContainer(
87
87
  AppConfig provides config,
88
88
  AppLanguage provides language,
89
89
  ) {
90
+ println(mergedContext)
90
91
  LaunchedEffect(Unit) {
91
92
  setNavigator?.invoke(navigator)
92
93
  }
@@ -157,7 +158,5 @@ fun NavigationContainer(
157
158
  }
158
159
  }
159
160
 
160
- val LocalMaxApi = staticCompositionLocalOf<IMaxApi?> {
161
- error("No MaxApi provided")
162
- }
161
+ val LocalMaxApi = staticCompositionLocalOf<IMaxApi?> { null }
163
162
 
@@ -120,10 +120,23 @@ class Navigator(
120
120
  fun showModal(
121
121
  content: @Composable () -> Unit,
122
122
  barrierDismissible: Boolean = true,
123
- onDismiss: (() -> Unit)? = null
123
+ onDismiss: (() -> Unit)? = null,
124
+ popupName: String? = null,
125
+ title: String? = null,
126
+ desc: String? = null
124
127
  ){
125
128
  val id = DynamicScreenRegistry.getLatestScreen()?.id ?: -1
126
- OverplayComponentRegistry.registerOverplay(id, content, OverplayComponentType.MODAL, false, barrierDismissible, onDismiss)
129
+ OverplayComponentRegistry.registerOverplay(
130
+ id = id,
131
+ content = content,
132
+ type = OverplayComponentType.MODAL,
133
+ isSurface = false,
134
+ barrierDismissible = barrierDismissible,
135
+ onDismiss = onDismiss,
136
+ popupName = popupName,
137
+ popupTitle = title,
138
+ popupDesc = desc
139
+ )
127
140
  }
128
141
 
129
142
  fun showBottomSheet(
@@ -131,10 +144,24 @@ class Navigator(
131
144
  isSurface: Boolean = false,
132
145
  barrierDismissible: Boolean = true,
133
146
  onDismiss: (() -> Unit)? = null,
134
- bottomSheetHeader: BottomHeader? = null
147
+ bottomSheetHeader: BottomHeader? = null,
148
+ sheetName: String? = null,
149
+ title: String? = null,
150
+ desc: String? = null
135
151
  ){
136
152
  val id = DynamicScreenRegistry.getLatestScreen()?.id ?: -1
137
- OverplayComponentRegistry.registerOverplay(id, content, OverplayComponentType.BOTTOM_SHEET, isSurface, barrierDismissible, onDismiss, bottomSheetHeader)
153
+ OverplayComponentRegistry.registerOverplay(
154
+ id = id,
155
+ content = content,
156
+ type = OverplayComponentType.BOTTOM_SHEET,
157
+ isSurface = isSurface,
158
+ barrierDismissible = barrierDismissible,
159
+ onDismiss = onDismiss,
160
+ bottomSheetHeader = bottomSheetHeader,
161
+ sheetName = sheetName,
162
+ sheetTitle = title,
163
+ sheetDesc = desc
164
+ )
138
165
  }
139
166
 
140
167
  fun showSnackBar(snackBar: SnackBar, onDismiss: (() -> Unit)? = null) {
@@ -220,7 +247,10 @@ object DynamicScreenRegistry {
220
247
  sealed class OverplayComponentParams {
221
248
  class Modal(
222
249
  val onDismiss: (() -> Unit)? = null,
223
- val barrierDismissible: Boolean = true
250
+ val barrierDismissible: Boolean = true,
251
+ val popupName: String? = null,
252
+ val title: String? = null,
253
+ val desc: String? = null
224
254
  ) : OverplayComponentParams()
225
255
 
226
256
  class BottomSheet(
@@ -228,6 +258,9 @@ sealed class OverplayComponentParams {
228
258
  val onDismiss: (() -> Unit)? = null,
229
259
  val barrierDismissible: Boolean = true,
230
260
  val bottomSheetHeader: BottomHeader? = null,
261
+ val sheetName: String? = null,
262
+ val title: String? = null,
263
+ val desc: String? = null
231
264
  ) : OverplayComponentParams()
232
265
 
233
266
  class SnackBar() : OverplayComponentParams()
@@ -259,10 +292,16 @@ object OverplayComponentRegistry {
259
292
  barrierDismissible: Boolean = true,
260
293
  onDismiss: (() -> Unit)?,
261
294
  bottomSheetHeader: BottomHeader? = null,
295
+ popupName: String? = null,
296
+ sheetName: String? = null,
297
+ popupTitle: String? = null,
298
+ popupDesc: String? = null,
299
+ sheetTitle: String? = null,
300
+ sheetDesc: String? = null
262
301
  ){
263
302
  val params = when(type){
264
- OverplayComponentType.MODAL -> OverplayComponentParams.Modal(onDismiss, barrierDismissible)
265
- OverplayComponentType.BOTTOM_SHEET -> OverplayComponentParams.BottomSheet(isSurface, onDismiss, barrierDismissible, bottomSheetHeader)
303
+ OverplayComponentType.MODAL -> OverplayComponentParams.Modal(onDismiss, barrierDismissible, popupName, popupTitle, popupDesc)
304
+ OverplayComponentType.BOTTOM_SHEET -> OverplayComponentParams.BottomSheet(isSurface, onDismiss, barrierDismissible, bottomSheetHeader, sheetName, sheetTitle, sheetDesc)
266
305
  OverplayComponentType.SNACK_BAR -> OverplayComponentParams.SnackBar()
267
306
  }
268
307
 
@@ -63,11 +63,17 @@ import vn.momo.kits.navigation.component.HeaderType
63
63
  import vn.momo.kits.navigation.component.InputSearchType
64
64
  import vn.momo.kits.platform.BackHandler
65
65
  import vn.momo.kits.platform.getAndroidBuildVersion
66
+ import vn.momo.kits.navigation.tracking.ScreenTracker
67
+ import vn.momo.kits.navigation.tracking.ScreenTrackingState
68
+ import kotlinx.coroutines.delay
69
+ import vn.momo.kits.application.ApplicationContext
70
+ import kotlin.time.Clock
71
+ import kotlin.time.ExperimentalTime
66
72
 
67
73
  internal val LocalFooterHeightPx = staticCompositionLocalOf { mutableIntStateOf(0) }
68
74
  internal val LocalHeaderRightWidthPx = staticCompositionLocalOf { mutableIntStateOf(0) }
69
75
 
70
- @OptIn(ExperimentalMaterialApi::class)
76
+ @OptIn(ExperimentalMaterialApi::class, ExperimentalTime::class)
71
77
  @Composable
72
78
  internal fun StackScreen(
73
79
  content: @Composable () -> Unit,
@@ -77,12 +83,63 @@ internal fun StackScreen(
77
83
  onBackHandler: (() -> Unit)? = null,
78
84
  ) {
79
85
  val navigator = LocalNavigator.current
86
+ val maxApi = LocalMaxApi.current
87
+ val context = ApplicationContext.current
80
88
  val statusBar = AppStatusBar.current
81
89
  val density = LocalDensity.current
82
90
  val navigation = remember { Navigation(id = id, bottomTabIndex = bottomTabIndex, initOptions = navigationOptions) }
83
91
 
84
92
  val options by navigation.currentOptions
85
93
 
94
+ // Auto tracking state
95
+ val trackingState = remember {
96
+ ScreenTrackingState().apply {
97
+ startTime = Clock.System.now().toEpochMilliseconds()
98
+ }
99
+ }
100
+ val screenName = remember(options.screenName) {
101
+ options.screenName ?: "Screen_$id"
102
+ }
103
+
104
+ // Determine action: push or back
105
+ val action = remember {
106
+ if (ScreenTracker.getLastScreenName() != null) "push" else "push"
107
+ }
108
+
109
+ // Auto tracking effects
110
+ LaunchedEffect(screenName) {
111
+ // Track screen navigated immediately
112
+ ScreenTracker.trackScreenNavigated(
113
+ maxApi = maxApi,
114
+ context = context,
115
+ screenName = screenName,
116
+ action = action,
117
+ state = trackingState
118
+ )
119
+
120
+ // Track screen displayed after 2 seconds (debounce)
121
+ delay(2000)
122
+ val loadTime = Clock.System.now().toEpochMilliseconds() - trackingState.startTime
123
+ ScreenTracker.trackScreenDisplayed(
124
+ maxApi = maxApi,
125
+ context = context,
126
+ screenName = screenName,
127
+ duration = loadTime,
128
+ state = trackingState
129
+ )
130
+
131
+ // Track screen interacted after displayed
132
+ val interactionTime = Clock.System.now().toEpochMilliseconds() - trackingState.startTime
133
+ ScreenTracker.trackScreenInteracted(
134
+ maxApi = maxApi,
135
+ context = context,
136
+ screenName = screenName,
137
+ duration = interactionTime - loadTime,
138
+ totalDuration = interactionTime,
139
+ state = trackingState
140
+ )
141
+ }
142
+
86
143
  val limit = with(density) {
87
144
  (statusBar).toPx() + HEADER_HEIGHT
88
145
  }.toInt()
@@ -0,0 +1,218 @@
1
+ package vn.momo.kits.navigation.tracking
2
+
3
+ import vn.momo.kits.application.MiniAppContext
4
+ import vn.momo.maxapi.IMaxApi
5
+ import kotlin.time.Clock
6
+ import kotlin.time.ExperimentalTime
7
+
8
+ /**
9
+ * Screen tracking state holder
10
+ */
11
+ class ScreenTrackingState {
12
+ @OptIn(ExperimentalTime::class)
13
+ var startTime: Long = Clock.System.now().toEpochMilliseconds()
14
+ var endTime: Long = startTime
15
+ var releaseNavigated: Boolean = false
16
+ var releaseLoad: Boolean = false
17
+ var releaseInteraction: Boolean = false
18
+ var previousScreenName: String? = null
19
+ var action: String = "push"
20
+ }
21
+
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
+ object ScreenTracker {
31
+
32
+ private var lastScreenName: String? = null
33
+
34
+ /**
35
+ * Track screen navigation event
36
+ * Called when screen is focused
37
+ */
38
+ fun trackScreenNavigated(
39
+ maxApi: IMaxApi?,
40
+ context: MiniAppContext?,
41
+ screenName: String,
42
+ action: String,
43
+ state: ScreenTrackingState
44
+ ) {
45
+ if (state.releaseNavigated) return
46
+
47
+ val previousScreen = lastScreenName
48
+ lastScreenName = screenName
49
+
50
+ maxApi?.track(
51
+ eventName = "auto_screen_navigated",
52
+ params = buildBaseParams(context, screenName).apply {
53
+ put("pre_screen_name", previousScreen)
54
+ put("state", "navigated")
55
+ put("action", action)
56
+ }
57
+ )
58
+
59
+ state.releaseNavigated = true
60
+ state.previousScreenName = previousScreen
61
+ }
62
+
63
+ /**
64
+ * Track screen displayed event
65
+ * Called when screen finished loading all elements
66
+ */
67
+ fun trackScreenDisplayed(
68
+ maxApi: IMaxApi?,
69
+ context: MiniAppContext?,
70
+ screenName: String,
71
+ duration: Long,
72
+ state: ScreenTrackingState
73
+ ) {
74
+ if (state.releaseLoad) return
75
+
76
+ maxApi?.track(
77
+ eventName = "auto_screen_displayed",
78
+ params = buildBaseParams(context, screenName).apply {
79
+ put("state", "load")
80
+ put("duration", duration)
81
+ }
82
+ )
83
+
84
+ state.releaseLoad = true
85
+ }
86
+
87
+ /**
88
+ * Track screen interacted event
89
+ * Called when screen is ready for user interaction
90
+ */
91
+ fun trackScreenInteracted(
92
+ maxApi: IMaxApi?,
93
+ context: MiniAppContext?,
94
+ screenName: String,
95
+ duration: Long,
96
+ totalDuration: Long,
97
+ state: ScreenTrackingState
98
+ ) {
99
+ if (state.releaseInteraction) return
100
+
101
+ maxApi?.track(
102
+ eventName = "auto_screen_interacted",
103
+ params = buildBaseParams(context, screenName).apply {
104
+ put("state", "interaction")
105
+ put("duration", duration)
106
+ put("total_duration", totalDuration)
107
+ }
108
+ )
109
+
110
+ state.releaseInteraction = true
111
+ }
112
+
113
+ /**
114
+ * Build base tracking params from MiniAppContext
115
+ */
116
+ private fun buildBaseParams(
117
+ context: MiniAppContext?,
118
+ screenName: String,
119
+ componentName: String = "Screen"
120
+ ): MutableMap<String, Any?> {
121
+ return mutableMapOf(
122
+ "app_id" to context?.appId,
123
+ "feature_code" to context?.appCode,
124
+ // "miniapp_version" to context?.,
125
+ "screen_name" to screenName,
126
+ "component_name" to componentName,
127
+ "tracking_source" to 1
128
+ )
129
+ }
130
+
131
+ /**
132
+ * Track popup/modal displayed event
133
+ * Called when popup is opened or closed
134
+ *
135
+ * @param action "open" or "close"
136
+ * @param popupName name of the popup/modal
137
+ * @param parentScreenName the screen that shows the popup
138
+ * @param title popup title for tracking
139
+ * @param desc popup description for tracking
140
+ */
141
+ fun trackPopupDisplayed(
142
+ maxApi: IMaxApi?,
143
+ context: MiniAppContext?,
144
+ action: String,
145
+ popupName: String?,
146
+ parentScreenName: String?,
147
+ title: String? = null,
148
+ desc: String? = null
149
+ ) {
150
+ // When opening: screen_name = parent screen, component_name = popup name
151
+ // When closing: screen_name = popup name, component_name = parent screen
152
+ val screenName = if (action == "open") parentScreenName else popupName
153
+ val componentName = if (action == "open") popupName else parentScreenName
154
+
155
+ maxApi?.track(
156
+ eventName = "auto_popup_displayed",
157
+ params = mutableMapOf(
158
+ "app_id" to context?.appId,
159
+ "feature_code" to context?.appCode,
160
+ "screen_name" to screenName,
161
+ "component_name" to componentName,
162
+ "action" to action,
163
+ "title" to title,
164
+ "desc" to desc,
165
+ "tracking_source" to 1
166
+ )
167
+ )
168
+ }
169
+
170
+ /**
171
+ * Track bottom sheet displayed event
172
+ * Called when bottom sheet is opened or closed
173
+ *
174
+ * @param action "open" or "close"
175
+ * @param sheetName name of the bottom sheet
176
+ * @param parentScreenName the screen that shows the bottom sheet
177
+ * @param title sheet title for tracking
178
+ * @param desc sheet description for tracking
179
+ */
180
+ fun trackBottomSheetDisplayed(
181
+ maxApi: IMaxApi?,
182
+ context: MiniAppContext?,
183
+ action: String,
184
+ sheetName: String?,
185
+ parentScreenName: String?,
186
+ title: String? = null,
187
+ desc: String? = null
188
+ ) {
189
+ val screenName = if (action == "open") parentScreenName else sheetName
190
+ val componentName = if (action == "open") sheetName else parentScreenName
191
+
192
+ maxApi?.track(
193
+ eventName = "auto_bottomsheet_displayed",
194
+ params = mutableMapOf(
195
+ "app_id" to context?.appId,
196
+ "feature_code" to context?.appCode,
197
+ "screen_name" to screenName,
198
+ "component_name" to componentName,
199
+ "action" to action,
200
+ "title" to title,
201
+ "desc" to desc,
202
+ "tracking_source" to 1
203
+ )
204
+ )
205
+ }
206
+
207
+ /**
208
+ * Get previous screen name for back navigation detection
209
+ */
210
+ fun getLastScreenName(): String? = lastScreenName
211
+
212
+ /**
213
+ * Reset tracker (for testing or cleanup)
214
+ */
215
+ fun reset() {
216
+ lastScreenName = null
217
+ }
218
+ }
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ version = "1.3">
4
+ <BuildAction>
5
+ <BuildActionEntries>
6
+ <BuildActionEntry
7
+ buildForRunning = "YES">
8
+ <BuildableReference
9
+ BuildableIdentifier = "primary"
10
+ BlueprintIdentifier = "A6A920D22B2ADD1E00C1A11F"
11
+ BuildableName = "Example"
12
+ BlueprintName = "Example"
13
+ ReferencedContainer = "container:Example.xcodeproj">
14
+ </BuildableReference>
15
+ </BuildActionEntry>
16
+ </BuildActionEntries>
17
+ </BuildAction>
18
+ <LaunchAction
19
+ useCustomWorkingDirectory = "NO"
20
+ buildConfiguration = "Debug"
21
+ allowLocationSimulation = "YES">
22
+ <BuildableProductRunnable>
23
+ <BuildableReference
24
+ BuildableIdentifier = "primary"
25
+ BlueprintIdentifier = "A6A920D22B2ADD1E00C1A11F"
26
+ BuildableName = "Example"
27
+ BlueprintName = "Example"
28
+ ReferencedContainer = "container:Example.xcodeproj">
29
+ </BuildableReference>
30
+ </BuildableProductRunnable>
31
+ </LaunchAction>
32
+ </Scheme>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>SchemeUserState</key>
6
+ <dict>
7
+ <key>Example.xcscheme</key>
8
+ <dict>
9
+ <key>orderHint</key>
10
+ <integer>7</integer>
11
+ </dict>
12
+ </dict>
13
+ </dict>
14
+ </plist>
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>BuildLocationStyle</key>
6
+ <string>UseAppPreferences</string>
7
+ <key>CustomBuildLocationType</key>
8
+ <string>RelativeToDerivedData</string>
9
+ <key>DerivedDataCustomLocation</key>
10
+ <string>DerivedData</string>
11
+ <key>DerivedDataLocationStyle</key>
12
+ <string>WorkspaceRelativePath</string>
13
+ <key>ShowSharedSchemesAutomaticallyEnabled</key>
14
+ <true/>
15
+ </dict>
16
+ </plist>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Bucket
3
+ uuid = "6B3C387A-E951-41D1-A42C-FB6E447A46BA"
4
+ type = "0"
5
+ version = "2.0">
6
+ </Bucket>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict />
5
+ </plist>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "3B6FB503A75BF5BC1FA6F30BC06B9D28"
18
+ BuildableName = "MoMoUIKits.framework"
19
+ BlueprintName = "MoMoUIKits"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "0AEE99A309977BD12A049FF48AF9BA4B"
18
+ BuildableName = "Pods_Example.framework"
19
+ BlueprintName = "Pods-Example"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "3847153A6E5EEFB86565BA840768F429"
18
+ BuildableName = "SDWebImage.framework"
19
+ BlueprintName = "SDWebImage"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "92EBFA3E7005B4C18A9C0B44324EB80F"
18
+ BuildableName = "SDWebImageSwiftUI.framework"
19
+ BlueprintName = "SDWebImageSwiftUI"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "6510766A9670BFA3B251E2A62446FC5D"
18
+ BuildableName = "SkeletonUI.framework"
19
+ BlueprintName = "SkeletonUI"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "BF2A15FEC3F3424BBC4B9AD5F86F2D54"
18
+ BuildableName = "LottiePrivacyInfo.bundle"
19
+ BlueprintName = "lottie-ios-LottiePrivacyInfo"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "0B967D7F8561D42493EE289EC8D450D1"
18
+ BuildableName = "Lottie.framework"
19
+ BlueprintName = "lottie-ios"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,60 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>SchemeUserState</key>
6
+ <dict>
7
+ <key>MoMoUIKits.xcscheme</key>
8
+ <dict>
9
+ <key>isShown</key>
10
+ <false />
11
+ <key>orderHint</key>
12
+ <integer>0</integer>
13
+ </dict>
14
+ <key>Pods-Example.xcscheme</key>
15
+ <dict>
16
+ <key>isShown</key>
17
+ <false />
18
+ <key>orderHint</key>
19
+ <integer>1</integer>
20
+ </dict>
21
+ <key>SDWebImage.xcscheme</key>
22
+ <dict>
23
+ <key>isShown</key>
24
+ <false />
25
+ <key>orderHint</key>
26
+ <integer>2</integer>
27
+ </dict>
28
+ <key>SDWebImageSwiftUI.xcscheme</key>
29
+ <dict>
30
+ <key>isShown</key>
31
+ <false />
32
+ <key>orderHint</key>
33
+ <integer>3</integer>
34
+ </dict>
35
+ <key>SkeletonUI.xcscheme</key>
36
+ <dict>
37
+ <key>isShown</key>
38
+ <false />
39
+ <key>orderHint</key>
40
+ <integer>4</integer>
41
+ </dict>
42
+ <key>lottie-ios-LottiePrivacyInfo.xcscheme</key>
43
+ <dict>
44
+ <key>isShown</key>
45
+ <false />
46
+ <key>orderHint</key>
47
+ <integer>5</integer>
48
+ </dict>
49
+ <key>lottie-ios.xcscheme</key>
50
+ <dict>
51
+ <key>isShown</key>
52
+ <false />
53
+ <key>orderHint</key>
54
+ <integer>6</integer>
55
+ </dict>
56
+ </dict>
57
+ <key>SuppressBuildableAutocreation</key>
58
+ <dict />
59
+ </dict>
60
+ </plist>
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.156.1-test.12
21
+ version=0.156.1-test.14
22
22
 
23
23
  repo=GitLab
24
24
  url=https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven
package/local.properties CHANGED
@@ -4,5 +4,5 @@
4
4
  # Location of the SDK. This is only used by Gradle.
5
5
  # For customization when using a Version Control System, please read the
6
6
  # header note.
7
- #Mon Dec 22 10:07:29 ICT 2025
8
- sdk.dir=/Users/phuc/Library/Android/sdk
7
+ #Tue Apr 08 11:13:31 ICT 2025
8
+ sdk.dir=/Users/sonnguyen/Library/Android/sdk
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momo-kits/native-kits",
3
- "version": "0.156.1-test.12-debug",
3
+ "version": "0.156.1-test.14-debug",
4
4
  "private": false,
5
5
  "dependencies": {},
6
6
  "devDependencies": {},