@momo-kits/native-kits 0.157.1-skill.1 → 0.157.1-skill.3-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 (220) hide show
  1. package/.claude/momo-native-kits-skill/SKILL.md +51 -0
  2. package/.claude/momo-native-kits-skill/evals/evals.json +95 -0
  3. package/.claude/momo-native-kits-skill/references/badge.md +52 -0
  4. package/.claude/momo-native-kits-skill/references/button.md +182 -0
  5. package/.claude/momo-native-kits-skill/references/card.md +48 -0
  6. package/.claude/momo-native-kits-skill/references/checkbox.md +51 -0
  7. package/.claude/momo-native-kits-skill/references/chip.md +48 -0
  8. package/.claude/momo-native-kits-skill/references/constants.md +260 -0
  9. package/.claude/momo-native-kits-skill/references/divider.md +26 -0
  10. package/.claude/momo-native-kits-skill/references/input.md +408 -0
  11. package/.claude/momo-native-kits-skill/references/navigation.md +475 -0
  12. package/.claude/momo-native-kits-skill/references/popup.md +97 -0
  13. package/.claude/momo-native-kits-skill/references/radio.md +60 -0
  14. package/.claude/momo-native-kits-skill/references/skeleton.md +40 -0
  15. package/.claude/momo-native-kits-skill/references/snackbar.md +54 -0
  16. package/.claude/momo-native-kits-skill/references/switch.md +62 -0
  17. package/.claude/momo-native-kits-skill/references/text.md +195 -0
  18. package/.claude/momo-native-kits-skill/references/tooltip.md +34 -0
  19. package/.claude/momo-native-kits-skill/references/trustbanner.md +61 -0
  20. package/.claude/momo-native-kits-skill/workspace/iteration-1/benchmark.json +20 -0
  21. package/.claude/momo-native-kits-skill/workspace/iteration-1/benchmark.md +13 -0
  22. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/eval_metadata.json +6 -0
  23. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/with_skill/outputs/ButtonExample.kt +55 -0
  24. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/without_skill/outputs/ButtonExample.kt +45 -0
  25. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/eval_metadata.json +6 -0
  26. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/with_skill/outputs/InputPhoneExample.kt +40 -0
  27. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/without_skill/outputs/InputPhoneExample.kt +42 -0
  28. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/eval_metadata.json +6 -0
  29. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/with_skill/outputs/BottomTabExample.kt +236 -0
  30. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/without_skill/outputs/BottomTabExample.kt +152 -0
  31. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/eval_metadata.json +6 -0
  32. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/with_skill/outputs/CheckBoxExample.kt +49 -0
  33. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/without_skill/outputs/CheckBoxExample.kt +123 -0
  34. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/eval_metadata.json +6 -0
  35. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/with_skill/outputs/DateTimePickerExample.kt +318 -0
  36. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/without_skill/outputs/DateTimePickerExample.kt +330 -0
  37. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-card/with_skill/outputs/CardExample.kt +124 -0
  38. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-card/without_skill/outputs/CardExample.kt +71 -0
  39. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-loginform/with_skill/outputs/LoginFormExample.kt +134 -0
  40. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-loginform/without_skill/outputs/LoginFormExample.kt +199 -0
  41. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-navcontainer/with_skill/outputs/NavigationContainerExample.kt +224 -0
  42. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-navcontainer/without_skill/outputs/NavigationContainerExample.kt +225 -0
  43. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-popup/with_skill/outputs/PopupExample.kt +79 -0
  44. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-popup/without_skill/outputs/PopupExample.kt +169 -0
  45. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/eval_metadata.json +6 -0
  46. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/with_skill/outputs/SetOptionsExample.kt +255 -0
  47. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/without_skill/outputs/SetOptionsExample.kt +212 -0
  48. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-skeleton/with_skill/outputs/SkeletonExample.kt +199 -0
  49. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-skeleton/without_skill/outputs/SkeletonExample.kt +229 -0
  50. package/.claude/momo-native-kits-skill/workspace/iteration-3/benchmark.json +20 -0
  51. package/.claude/momo-native-kits-skill/workspace/iteration-3/benchmark.md +13 -0
  52. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/eval_metadata.json +22 -0
  53. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/with_skill/outputs/PrimaryButtonExample.kt +38 -0
  54. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/with_skill/timing.json +5 -0
  55. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/without_skill/outputs/PrimaryButtonExample.kt +83 -0
  56. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/without_skill/timing.json +5 -0
  57. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/eval_metadata.json +22 -0
  58. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/with_skill/outputs/NavigationContainerExample.kt +547 -0
  59. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/with_skill/timing.json +5 -0
  60. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/without_skill/outputs/MoMoNavigationContainer.kt +519 -0
  61. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/without_skill/timing.json +5 -0
  62. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/eval_metadata.json +27 -0
  63. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/with_skill/outputs/SetOptionsExample.kt +429 -0
  64. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/with_skill/timing.json +5 -0
  65. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/without_skill/outputs/SetOptionsExample.kt +353 -0
  66. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/without_skill/timing.json +5 -0
  67. package/.claude/settings.local.json +35 -7
  68. package/build.gradle.kts +11 -0
  69. package/compose/build.gradle.kts +180 -0
  70. package/compose/build.gradle.kts.backup +180 -0
  71. package/compose/compose.podspec +54 -0
  72. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +110 -0
  73. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  74. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  75. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  76. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  77. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  78. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  79. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  80. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  81. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  82. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  83. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  84. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  85. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  86. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +57 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +107 -0
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +201 -0
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +222 -0
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +48 -0
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +305 -0
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +720 -0
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +121 -0
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +405 -0
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +85 -0
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +340 -0
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +198 -0
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +357 -0
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +94 -0
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +136 -0
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +543 -0
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +148 -0
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +188 -0
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +116 -0
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +448 -0
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +172 -0
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +255 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +231 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +233 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +254 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +241 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +364 -0
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +92 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +352 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +103 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +70 -0
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +17 -0
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +96 -0
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +96 -0
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +92 -0
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +130 -0
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +214 -0
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +590 -0
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +177 -0
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +205 -0
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +239 -0
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +191 -0
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +306 -0
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +13 -0
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +185 -0
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +285 -0
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +35 -0
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
  149. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +59 -0
  150. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +68 -0
  151. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  152. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +14 -0
  153. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
  154. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  155. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +239 -0
  156. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +119 -0
  157. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +98 -0
  158. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +161 -0
  159. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +331 -0
  160. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +497 -0
  161. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +162 -0
  162. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +243 -0
  163. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  164. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +187 -0
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +279 -0
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +80 -0
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +306 -0
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +32 -0
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +370 -0
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +132 -0
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +42 -0
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +62 -0
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +88 -0
  176. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +149 -0
  177. package/gradle/libs.versions.toml +57 -0
  178. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  179. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  180. package/gradle.properties +26 -0
  181. package/gradlew +252 -0
  182. package/gradlew.bat +94 -0
  183. package/ios/Input/Input.swift +112 -50
  184. package/local.properties +8 -0
  185. package/package.json +1 -1
  186. package/settings.gradle.kts +52 -0
  187. package/.claude/momo-native-kits/SKILL.md +0 -87
  188. package/.claude/momo-native-kits/references/Badge.md +0 -39
  189. package/.claude/momo-native-kits/references/BadgeDot.md +0 -37
  190. package/.claude/momo-native-kits/references/BottomSheet.md +0 -51
  191. package/.claude/momo-native-kits/references/BottomTab.md +0 -65
  192. package/.claude/momo-native-kits/references/Button.md +0 -197
  193. package/.claude/momo-native-kits/references/CheckBox.md +0 -51
  194. package/.claude/momo-native-kits/references/Chip.md +0 -47
  195. package/.claude/momo-native-kits/references/Divider.md +0 -29
  196. package/.claude/momo-native-kits/references/HeaderTitle.md +0 -45
  197. package/.claude/momo-native-kits/references/HeaderType.md +0 -47
  198. package/.claude/momo-native-kits/references/Icon.md +0 -32
  199. package/.claude/momo-native-kits/references/Image.md +0 -38
  200. package/.claude/momo-native-kits/references/Information.md +0 -36
  201. package/.claude/momo-native-kits/references/Input.md +0 -334
  202. package/.claude/momo-native-kits/references/InputDropDown.md +0 -47
  203. package/.claude/momo-native-kits/references/InputMoney.md +0 -241
  204. package/.claude/momo-native-kits/references/InputOTP.md +0 -52
  205. package/.claude/momo-native-kits/references/InputPhoneNumber.md +0 -175
  206. package/.claude/momo-native-kits/references/InputSearch.md +0 -57
  207. package/.claude/momo-native-kits/references/InputTextArea.md +0 -46
  208. package/.claude/momo-native-kits/references/NavigationContainer.md +0 -51
  209. package/.claude/momo-native-kits/references/Navigator.md +0 -287
  210. package/.claude/momo-native-kits/references/PaginationDot.md +0 -28
  211. package/.claude/momo-native-kits/references/PaginationNumber.md +0 -28
  212. package/.claude/momo-native-kits/references/PopupNotify.md +0 -47
  213. package/.claude/momo-native-kits/references/Radio.md +0 -44
  214. package/.claude/momo-native-kits/references/Skeleton.md +0 -32
  215. package/.claude/momo-native-kits/references/Switch.md +0 -36
  216. package/.claude/momo-native-kits/references/Tag.md +0 -40
  217. package/.claude/momo-native-kits/references/Text.md +0 -37
  218. package/.claude/momo-native-kits/references/Title.md +0 -43
  219. package/.claude/momo-native-kits/references/Tooltip.md +0 -30
  220. package/building-skill-for-claude.md +0 -1190
@@ -0,0 +1,331 @@
1
+ package vn.momo.kits.navigation
2
+
3
+ import androidx.compose.foundation.layout.Box
4
+ import androidx.compose.foundation.layout.fillMaxSize
5
+ import androidx.compose.runtime.Composable
6
+ import androidx.compose.runtime.MutableState
7
+ import androidx.compose.runtime.mutableStateOf
8
+ import androidx.compose.runtime.staticCompositionLocalOf
9
+ import androidx.compose.ui.Alignment
10
+ import androidx.compose.ui.Modifier
11
+ import androidx.navigation.NavController
12
+ import kotlinx.coroutines.CoroutineScope
13
+ import kotlinx.coroutines.Dispatchers
14
+ import kotlinx.coroutines.SupervisorJob
15
+ import kotlinx.coroutines.cancel
16
+ import kotlinx.coroutines.delay
17
+ import kotlinx.coroutines.launch
18
+ import kotlinx.serialization.Serializable
19
+ import vn.momo.kits.components.PopupAction
20
+ import vn.momo.kits.components.PopupNotify
21
+ import vn.momo.kits.navigation.BottomHeader.*
22
+ import vn.momo.kits.navigation.component.SnackBar
23
+ import vn.momo.maxapi.IMaxApi
24
+
25
+ class Navigator(
26
+ private val navController: NavController,
27
+ private val maxApi: IMaxApi?
28
+ ) {
29
+ private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
30
+
31
+ fun push(content: @Composable () -> Unit, options: NavigationOptions? = null) {
32
+ val route = DynamicScreenRegistry.register(content, options)
33
+ navController.navigate(DynamicScreenRoute(route.id))
34
+ }
35
+
36
+ fun replace(content: @Composable () -> Unit, options: NavigationOptions? = null) {
37
+ if (navController.previousBackStackEntry != null){
38
+ val latestScreen = DynamicScreenRegistry.getLatestScreen()
39
+ latestScreen?.let { DynamicScreenRegistry.unregisterScreen(it.id) }
40
+ navController.popBackStack()
41
+ push(content, options)
42
+ }
43
+ }
44
+
45
+ fun onBackSafe(callBack: (() -> Unit)? = null) {
46
+ val latestScreen = DynamicScreenRegistry.getLatestScreen()
47
+ val options = latestScreen?.options
48
+ if (options?.onBackHandler != null) {
49
+ options.onBackHandler.invoke()
50
+ return
51
+ }
52
+ val preventBack = options?.headerBackProps?.preventBack
53
+ if (preventBack != null) {
54
+ showModal(
55
+ content = {
56
+ PopupNotify(preventBack.copy(
57
+ primary = PopupAction(
58
+ title = preventBack.primary?.title ?: "",
59
+ onPress = {
60
+ preventBack.primary?.onPress?.invoke()
61
+ pop(2, callBack) // close popup notify, then close the screen
62
+ }
63
+ )
64
+ ))
65
+ }
66
+ )
67
+ } else {
68
+ pop(1, callBack)
69
+ }
70
+ }
71
+
72
+ fun pop(count: Int = 1, callBack: (() -> Unit)? = null) {
73
+ scope.launch {
74
+ repeat(count) {
75
+ if (OverplayComponentRegistry.getOverplayType() == OverplayComponentType.SNACK_BAR){
76
+ dismissScreen()
77
+ OverplayComponentRegistry.hardClearAfterDismiss()
78
+ }
79
+ else if (OverplayComponentRegistry.isOverplayShowing()){
80
+ dismissOverplay()
81
+ } else {
82
+ dismissScreen()
83
+ }
84
+ }
85
+ callBack?.invoke()
86
+ }
87
+ }
88
+ private suspend fun dismissOverplay(isDelay: Boolean = true) {
89
+ OverplayComponentRegistry.clear()
90
+ if (isDelay) delay(300L)
91
+ OverplayComponentRegistry.hardClearAfterDismiss()
92
+ }
93
+
94
+ private suspend fun dismissScreen() {
95
+ if (navController.previousBackStackEntry != null){
96
+ navController.popBackStack()
97
+ delay(300L)
98
+ DynamicScreenRegistry.getLatestScreen()?.let { it1 ->
99
+ DynamicScreenRegistry.unregisterScreen(it1.id)
100
+ }
101
+ } else {
102
+ maxApi?.dismiss { }
103
+ }
104
+ }
105
+
106
+ fun present(content: @Composable () -> Unit, options: NavigationOptions? = null) {
107
+ val route = DynamicScreenRegistry.register(content, options)
108
+ navController.navigate(DynamicDialogRoute(route.id))
109
+ }
110
+
111
+ fun reset(content: @Composable () -> Unit, options: NavigationOptions? = null) {
112
+ DynamicScreenRegistry.unregisterAll()
113
+
114
+ val route = DynamicScreenRegistry.register(content, options)
115
+ navController.navigate(DynamicScreenRoute(route.id)) {
116
+ popUpTo(0) { inclusive = true }
117
+ }
118
+ }
119
+
120
+ fun showModal(
121
+ content: @Composable () -> Unit,
122
+ barrierDismissible: Boolean = true,
123
+ onDismiss: (() -> Unit)? = null
124
+ ){
125
+ val id = DynamicScreenRegistry.getLatestScreen()?.id ?: -1
126
+ OverplayComponentRegistry.registerOverplay(id, content, OverplayComponentType.MODAL, false, barrierDismissible, onDismiss)
127
+ }
128
+
129
+ fun showBottomSheet(
130
+ content: @Composable () -> Unit,
131
+ isSurface: Boolean = false,
132
+ barrierDismissible: Boolean = true,
133
+ onDismiss: (() -> Unit)? = null,
134
+ bottomSheetHeader: BottomHeader? = null
135
+ ){
136
+ val id = DynamicScreenRegistry.getLatestScreen()?.id ?: -1
137
+ OverplayComponentRegistry.registerOverplay(id, content, OverplayComponentType.BOTTOM_SHEET, isSurface, barrierDismissible, onDismiss, bottomSheetHeader)
138
+ }
139
+
140
+ fun showSnackBar(snackBar: SnackBar, onDismiss: (() -> Unit)? = null) {
141
+ val id = DynamicScreenRegistry.getLatestScreen()?.id ?: -1
142
+ scope.launch {
143
+ OverplayComponentRegistry.registerOverplay(
144
+ id = id,
145
+ content = {
146
+ SnackBar(snackBar, onDismiss)
147
+ },
148
+ type = OverplayComponentType.SNACK_BAR,
149
+ onDismiss = onDismiss
150
+ )
151
+ }
152
+ }
153
+
154
+ fun hideSnackBar() {
155
+ scope.launch {
156
+ OverplayComponentRegistry.clear()
157
+ delay(250L)
158
+ OverplayComponentRegistry.hardClearAfterDismiss()
159
+ }
160
+ }
161
+
162
+ fun dispose(){
163
+ scope.cancel()
164
+ }
165
+ }
166
+
167
+ val LocalNavigator = staticCompositionLocalOf<Navigator> {
168
+ error("No NavigationStack provided")
169
+ }
170
+
171
+ @Serializable
172
+ data class DynamicScreenRoute(val id: Int)
173
+
174
+ @Serializable
175
+ data class DynamicDialogRoute(val id: Int)
176
+
177
+ data class DynamicScreen(
178
+ val id: Int,
179
+ val content: @Composable () -> Unit,
180
+ var options: NavigationOptions? = null
181
+ )
182
+
183
+ object DynamicScreenRegistry {
184
+ private val screens = mutableMapOf<Int, DynamicScreen>()
185
+ private var idCounter = 1
186
+
187
+ fun register(content: @Composable () -> Unit, options: NavigationOptions?): DynamicScreenRoute {
188
+ val id = idCounter++
189
+ screens[id] = DynamicScreen(
190
+ id = id,
191
+ content = content,
192
+ options = options
193
+ )
194
+ return DynamicScreenRoute(id)
195
+ }
196
+
197
+ fun unregisterScreen(id: Int) {
198
+ screens.remove(id)
199
+ }
200
+
201
+ fun getLatestScreen(): DynamicScreen?{
202
+ return screens.entries.lastOrNull()?.value
203
+ }
204
+
205
+ fun unregisterAll(){
206
+ val ids = screens.keys.toList()
207
+ for (id in ids) {
208
+ unregisterScreen(id)
209
+ }
210
+ }
211
+
212
+ fun getScreen(id: Int): DynamicScreen? = screens[id]
213
+
214
+ fun setOptions(id: Int, options: NavigationOptions){
215
+ screens[id]?.options = options
216
+ }
217
+ }
218
+
219
+
220
+ sealed class OverplayComponentParams {
221
+ class Modal(
222
+ val onDismiss: (() -> Unit)? = null,
223
+ val barrierDismissible: Boolean = true
224
+ ) : OverplayComponentParams()
225
+
226
+ class BottomSheet(
227
+ val isSurface: Boolean = false,
228
+ val onDismiss: (() -> Unit)? = null,
229
+ val barrierDismissible: Boolean = true,
230
+ val bottomSheetHeader: BottomHeader? = null,
231
+ ) : OverplayComponentParams()
232
+
233
+ class SnackBar() : OverplayComponentParams()
234
+ }
235
+
236
+ data class OverplayComponent(
237
+ val id: Int,
238
+ val type: OverplayComponentType? = null,
239
+ val content: @Composable () -> Unit,
240
+ val params: OverplayComponentParams? = null
241
+ )
242
+
243
+ enum class OverplayComponentType {
244
+ MODAL, BOTTOM_SHEET, SNACK_BAR
245
+ }
246
+
247
+ object OverplayComponentRegistry {
248
+ private var currentOverlayComponent : MutableState<OverplayComponent?> = mutableStateOf(null)
249
+ private var requestClose: (() -> Unit)? = null
250
+ internal fun bindClose(handler: (() -> Unit)?) {
251
+ requestClose = handler
252
+ }
253
+
254
+ fun registerOverplay(
255
+ id: Int,
256
+ content: @Composable () -> Unit,
257
+ type: OverplayComponentType,
258
+ isSurface: Boolean = false,
259
+ barrierDismissible: Boolean = true,
260
+ onDismiss: (() -> Unit)?,
261
+ bottomSheetHeader: BottomHeader? = null,
262
+ ){
263
+ val params = when(type){
264
+ OverplayComponentType.MODAL -> OverplayComponentParams.Modal(onDismiss, barrierDismissible)
265
+ OverplayComponentType.BOTTOM_SHEET -> OverplayComponentParams.BottomSheet(isSurface, onDismiss, barrierDismissible, bottomSheetHeader)
266
+ OverplayComponentType.SNACK_BAR -> OverplayComponentParams.SnackBar()
267
+ }
268
+
269
+ currentOverlayComponent.value = OverplayComponent(
270
+ id = id,
271
+ type = type,
272
+ content = content,
273
+ params = params
274
+ )
275
+ }
276
+
277
+ fun isOverplayShowing(): Boolean = currentOverlayComponent.value != null
278
+
279
+ fun getOverplayType(): OverplayComponentType? = currentOverlayComponent.value?.type
280
+
281
+ fun currentRootId(): Int? = currentOverlayComponent.value?.id
282
+
283
+ fun clear(){
284
+ if (requestClose != null) {
285
+ requestClose?.invoke()
286
+ } else {
287
+ currentOverlayComponent.value = null
288
+ }
289
+ }
290
+
291
+ internal fun hardClearAfterDismiss() {
292
+ currentOverlayComponent.value = null
293
+ requestClose = null
294
+ }
295
+
296
+ @Composable
297
+ fun OverlayComponent(){
298
+ val overplay = currentOverlayComponent.value ?: return
299
+
300
+ when (val params = overplay.params) {
301
+ is OverplayComponentParams.BottomSheet -> {
302
+ BottomSheet(
303
+ content = overplay.content,
304
+ header = params.bottomSheetHeader ?: Title(),
305
+ isSurface = params.isSurface,
306
+ barrierDismissible = params.barrierDismissible,
307
+ onDismiss = params.onDismiss
308
+ )
309
+ }
310
+
311
+ is OverplayComponentParams.Modal -> {
312
+ ModalScreen(
313
+ content = overplay.content,
314
+ barrierDismissible = params.barrierDismissible,
315
+ onDismiss = params.onDismiss
316
+ )
317
+ }
318
+
319
+ is OverplayComponentParams.SnackBar -> {
320
+ Box(
321
+ modifier = Modifier.fillMaxSize(),
322
+ contentAlignment = Alignment.BottomCenter
323
+ ) {
324
+ overplay.content()
325
+ }
326
+ }
327
+
328
+ null -> {}
329
+ }
330
+ }
331
+ }