@momo-kits/native-kits 0.163.1-beta.2 → 0.163.1-beta.20-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 (345) hide show
  1. package/.claude/settings.local.json +112 -0
  2. package/CLAUDE.md +1 -1
  3. package/build.gradle.kts +11 -0
  4. package/compose/build.gradle.kts +190 -0
  5. package/compose/build.gradle.kts.backup +190 -0
  6. package/compose/compose.podspec +47 -0
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
  8. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +7 -0
  9. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +150 -0
  10. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  11. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  12. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  13. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  14. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  15. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  16. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  17. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  18. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  19. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  20. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  21. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  22. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  23. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +52 -0
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +106 -0
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +183 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +207 -0
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +39 -0
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +293 -0
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +826 -0
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +110 -0
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +378 -0
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +56 -0
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +82 -0
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +338 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +175 -0
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +356 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +113 -0
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +89 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +128 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +209 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +542 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +125 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +231 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +112 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +477 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +114 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +214 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +240 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +216 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +259 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +182 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +343 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +84 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +328 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +97 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +310 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +59 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +21 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +90 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +323 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +217 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +473 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +122 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +199 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +91 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +470 -0
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +88 -0
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +131 -0
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +203 -0
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +498 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +175 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +182 -0
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +193 -0
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +234 -0
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +188 -0
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +325 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +22 -0
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +276 -0
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +52 -0
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +38 -0
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +39 -0
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +52 -0
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +66 -0
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +104 -0
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +48 -0
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +299 -0
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +129 -0
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +100 -0
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +172 -0
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +372 -0
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +581 -0
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +156 -0
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +225 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +169 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +320 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +81 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +309 -0
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +34 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +360 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +132 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +127 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +91 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +9 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +69 -0
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +55 -0
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +105 -0
  133. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +32 -0
  134. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +66 -0
  135. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +207 -0
  136. package/gradle/libs.versions.toml +69 -0
  137. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  138. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  139. package/gradle.properties +26 -0
  140. package/gradlew +252 -0
  141. package/gradlew.bat +94 -0
  142. package/ios/Application/ApplicationEnvironment.swift +15 -3
  143. package/ios/Application/Components.swift +36 -30
  144. package/ios/Application/FloatingButton.swift +10 -9
  145. package/ios/Application/Localize.swift +309 -0
  146. package/ios/Application/MaxApi.swift +18 -0
  147. package/ios/Application/Navigation/BottomTab/BottomTab.swift +104 -0
  148. package/ios/Application/Navigation/BottomTab/BottomTabBar.swift +215 -0
  149. package/ios/Application/Navigation/BottomTab/CurvedContainer.swift +65 -0
  150. package/ios/Application/Navigation/HeaderBackProps.swift +66 -0
  151. package/ios/Application/Navigation/HeaderTitle.swift +57 -0
  152. package/ios/Application/Navigation/HeaderUser.swift +209 -0
  153. package/ios/Application/Navigation/NavigationContainer.swift +203 -0
  154. package/ios/Application/Navigation/NavigationOptions.swift +109 -0
  155. package/ios/Application/Navigation/Navigator.swift +385 -0
  156. package/ios/Application/Navigation/Overplay/BottomSheet.swift +256 -0
  157. package/ios/Application/Navigation/Overplay/ModalScreen.swift +74 -0
  158. package/ios/Application/Navigation/Overplay/SnackBar.swift +144 -0
  159. package/ios/Application/Navigation/Tracking/ScreenTracker.swift +117 -0
  160. package/ios/Application/Navigation/component/Header.swift +178 -0
  161. package/ios/Application/Navigation/component/HeaderBackground.swift +83 -0
  162. package/ios/Application/Navigation/component/HeaderColor.swift +65 -0
  163. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +11 -0
  164. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +196 -0
  165. package/ios/Application/Screen.swift +2 -1
  166. package/ios/Application/StackScreen.swift +501 -0
  167. package/ios/Avatar/Avatar.swift +193 -0
  168. package/ios/Badge/Badge.swift +11 -14
  169. package/ios/Badge/BadgeRibbon.swift +91 -17
  170. package/ios/BaselineView/BaselineView.swift +163 -0
  171. package/ios/Button/Button.swift +137 -28
  172. package/ios/Carousel/Carousel.swift +196 -0
  173. package/ios/Checkbox/Checkbox.swift +23 -28
  174. package/ios/Chip/Chip.swift +56 -33
  175. package/ios/Collapse/Collapse.swift +192 -0
  176. package/ios/Colors+Radius+Spacing/Colors.swift +20 -17
  177. package/ios/Colors+Radius+Spacing/Spacing.swift +3 -1
  178. package/ios/Colors+Radius+Spacing/Theme.swift +295 -0
  179. package/ios/DateTimePicker/DateTimePicker.swift +212 -0
  180. package/ios/DateTimePicker/DateTimePickerTypes.swift +55 -0
  181. package/ios/DateTimePicker/DateTimePickerUtils.swift +167 -0
  182. package/ios/DateTimePicker/WheelPicker.swift +165 -0
  183. package/ios/Divider/Divider.swift +16 -0
  184. package/ios/Extensions/ActiveOpacityButtonStyle.swift +14 -0
  185. package/ios/Extensions/Color++.swift +32 -0
  186. package/ios/Icon/Icon.swift +10 -1
  187. package/ios/IconButton/IconButton.swift +140 -0
  188. package/ios/Image/Image.swift +16 -3
  189. package/ios/Information/Information.swift +3 -1
  190. package/ios/Input/ErrorView.swift +3 -1
  191. package/ios/Input/Input.swift +72 -33
  192. package/ios/Input/InputPhoneNumber.swift +33 -21
  193. package/ios/Input/InputSearch.swift +107 -48
  194. package/ios/Input/InputTextArea.swift +134 -64
  195. package/ios/InputDropDown/InputDropDown.swift +201 -0
  196. package/ios/InputMoney/InputMoney.swift +347 -0
  197. package/ios/InputOTP/InputOTP.swift +210 -0
  198. package/ios/Loader/Loader.swift +113 -0
  199. package/ios/MoMoUIKits.podspec +5 -0
  200. package/ios/Pagination/PaginationDot.swift +61 -0
  201. package/ios/Pagination/PaginationNumber.swift +35 -0
  202. package/ios/Pagination/PaginationScroll.swift +101 -0
  203. package/ios/Pagination/PaginationWhiteDot.swift +37 -0
  204. package/ios/Popup/PopupDisplay.swift +11 -20
  205. package/ios/Popup/PopupInput.swift +2 -8
  206. package/ios/Popup/PopupNotify.swift +218 -0
  207. package/ios/Popup/PopupPromotion.swift +5 -3
  208. package/ios/ProgressInfo/ProgressInfo.swift +296 -0
  209. package/ios/Radio/Radio.swift +69 -0
  210. package/ios/Rating/Rating.swift +82 -0
  211. package/ios/Resources/MoMoUIKitsColors.xcassets/AccentColor.colorset/Contents.json +11 -0
  212. package/ios/Resources/MoMoUIKitsColors.xcassets/Background.colorset/Contents.json +38 -0
  213. package/ios/Resources/MoMoUIKitsColors.xcassets/Border.colorset/Contents.json +38 -0
  214. package/ios/Resources/MoMoUIKitsColors.xcassets/Card.colorset/Contents.json +38 -0
  215. package/ios/Resources/MoMoUIKitsColors.xcassets/Contents.json +6 -0
  216. package/ios/Resources/MoMoUIKitsColors.xcassets/Error.colorset/Contents.json +38 -0
  217. package/ios/Resources/MoMoUIKitsColors.xcassets/Primary.colorset/Contents.json +38 -0
  218. package/ios/Resources/MoMoUIKitsColors.xcassets/PrimaryDark.colorset/Contents.json +38 -0
  219. package/ios/Resources/MoMoUIKitsColors.xcassets/PrimaryLight.colorset/Contents.json +38 -0
  220. package/ios/Resources/MoMoUIKitsColors.xcassets/Secondary.colorset/Contents.json +38 -0
  221. package/ios/Resources/MoMoUIKitsColors.xcassets/Success.colorset/Contents.json +38 -0
  222. package/ios/Resources/MoMoUIKitsColors.xcassets/Text.colorset/Contents.json +38 -0
  223. package/ios/Resources/MoMoUIKitsColors.xcassets/TextSecondary.colorset/Contents.json +38 -0
  224. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/Contents.json +9 -0
  225. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-default.colorset/Contents.json +38 -0
  226. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-disable.colorset/Contents.json +38 -0
  227. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-pressed.colorset/Contents.json +38 -0
  228. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-selected.colorset/Contents.json +38 -0
  229. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-surface.colorset/Contents.json +38 -0
  230. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-tonal.colorset/Contents.json +38 -0
  231. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/border-default.colorset/Contents.json +38 -0
  232. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/border-disable.colorset/Contents.json +38 -0
  233. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/gradient.colorset/Contents.json +38 -0
  234. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/primary.colorset/Contents.json +38 -0
  235. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/secondary.colorset/Contents.json +38 -0
  236. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-container.colorset/Contents.json +38 -0
  237. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-primary.colorset/Contents.json +38 -0
  238. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-secondary.colorset/Contents.json +38 -0
  239. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-default.colorset/Contents.json +38 -0
  240. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-disable.colorset/Contents.json +38 -0
  241. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-hint.colorset/Contents.json +38 -0
  242. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-secondary.colorset/Contents.json +38 -0
  243. package/ios/Resources/MoMoUIKitsColors.xcassets/Warning.colorset/Contents.json +38 -0
  244. package/ios/Skeleton/Skeleton.swift +99 -0
  245. package/ios/Slider/Slider.swift +237 -0
  246. package/ios/Stepper/Stepper.swift +220 -0
  247. package/ios/Steps/Steps.swift +467 -0
  248. package/ios/SuggestAction/SuggestAction.swift +99 -0
  249. package/ios/Swipeable/SwipeCell.swift +187 -0
  250. package/ios/Swipeable/SwipeCellModel.swift +21 -0
  251. package/ios/Switch/Switch.swift +53 -28
  252. package/ios/TabView/TabView.swift +534 -0
  253. package/ios/Tag/Tag.swift +98 -0
  254. package/ios/Template/TrustBanner/TrustBanner.swift +7 -8
  255. package/ios/Title/Title.swift +269 -0
  256. package/ios/Tooltip/Tooltip.swift +485 -0
  257. package/ios/Typography/FontScaleStore.swift +19 -0
  258. package/ios/Typography/Text.swift +86 -17
  259. package/ios/Typography/Typography.swift +12 -14
  260. package/ios/Uploader/Uploader.swift +174 -0
  261. package/ios/native-kits.podspec +61 -8
  262. package/ios-demo/MoMoUIKitsDemo.podspec +20 -0
  263. package/ios-demo/README.md +120 -0
  264. package/ios-demo/Resources/dot_loading.json +558 -0
  265. package/ios-demo/Resources/icon.json +4052 -0
  266. package/ios-demo/Resources/lottie_circle_loader.json +1 -0
  267. package/ios-demo/Sources/MoMoUIKitsDemo/DemoScaffold.swift +48 -0
  268. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsBadgeDemoView.swift +25 -0
  269. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsButtonDemoView.swift +26 -0
  270. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsCheckboxDemoView.swift +19 -0
  271. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsChipDemoView.swift +33 -0
  272. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsInputDemoView.swift +48 -0
  273. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsPopupDemoView.swift +21 -0
  274. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsRadioDemoView.swift +17 -0
  275. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsTypographyDemoView.swift +28 -0
  276. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoContext.swift +31 -0
  277. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoFactory.swift +24 -0
  278. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AnimatedHeaderDemo.swift +110 -0
  279. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +93 -0
  280. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +269 -0
  281. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BaselineView.swift +117 -0
  282. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BottomTabDemo.swift +89 -0
  283. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ButtonDemo.swift +100 -0
  284. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +126 -0
  285. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +64 -0
  286. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +20 -0
  287. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +93 -0
  288. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +107 -0
  289. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +124 -0
  290. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +14 -0
  291. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/HeaderUserDemo.swift +49 -0
  292. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +279 -0
  293. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +58 -0
  294. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +78 -0
  295. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +138 -0
  296. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +111 -0
  297. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +136 -0
  298. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +107 -0
  299. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +73 -0
  300. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +100 -0
  301. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +32 -0
  302. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +57 -0
  303. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +70 -0
  304. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LocalizeDemo.swift +188 -0
  305. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +229 -0
  306. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +72 -0
  307. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +175 -0
  308. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +121 -0
  309. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +76 -0
  310. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +89 -0
  311. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +32 -0
  312. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +56 -0
  313. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +32 -0
  314. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +150 -0
  315. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +138 -0
  316. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +103 -0
  317. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +94 -0
  318. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +79 -0
  319. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +152 -0
  320. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +33 -0
  321. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +190 -0
  322. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +34 -0
  323. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +182 -0
  324. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +109 -0
  325. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +187 -0
  326. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +87 -0
  327. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +131 -0
  328. package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +51 -0
  329. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoModels.swift +15 -0
  330. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoRegistry.swift +73 -0
  331. package/local.properties +8 -0
  332. package/package.json +1 -1
  333. package/publish.sh +53 -0
  334. package/scripts/gen-ios-color.mjs +136 -0
  335. package/settings.gradle.kts +64 -0
  336. package/example/ios/Example.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  337. package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  338. package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -5
  339. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
  340. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
  341. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
  342. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
  343. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
  344. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -46
  345. package/ios/Application/FontScaleStore.swift +0 -59
@@ -0,0 +1,175 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.clickable
6
+ import androidx.compose.foundation.layout.Arrangement
7
+ import androidx.compose.foundation.layout.Column
8
+ import androidx.compose.foundation.layout.Row
9
+ import androidx.compose.foundation.layout.fillMaxWidth
10
+ import androidx.compose.foundation.layout.height
11
+ import androidx.compose.foundation.layout.padding
12
+ import androidx.compose.foundation.layout.width
13
+ import androidx.compose.foundation.shape.RoundedCornerShape
14
+ import androidx.compose.runtime.Composable
15
+ import androidx.compose.ui.Alignment
16
+ import androidx.compose.ui.Modifier
17
+ import androidx.compose.ui.draw.clip
18
+ import androidx.compose.ui.graphics.Color
19
+ import androidx.compose.ui.layout.ContentScale
20
+ import androidx.compose.ui.unit.dp
21
+ import vn.momo.kits.application.LocalLocalize
22
+ import vn.momo.kits.application.IsShowBaseLineDebug
23
+ import vn.momo.kits.const.Colors
24
+ import vn.momo.kits.const.Typography
25
+ import vn.momo.kits.modifier.conditional
26
+ import vn.momo.kits.modifier.noFeedbackClickable
27
+
28
+ val defaultBanner = TrustBannerData(
29
+ content = mapOf(
30
+ "vi" to "An toàn tài sản & Bảo mật thông tin của bạn là ưu tiên hàng đầu của MoMo.",
31
+ "en" to "Ensuring financial security and data privacy is MoMo's highest priority."
32
+ ),
33
+ subContent = mapOf(
34
+ "vi" to "Tìm hiểu thêm",
35
+ "en" to "Learn more"
36
+ ),
37
+ pciImage = "https://static.momocdn.net/app/img/kits/trustBanner/pci_dss.png",
38
+ sslImage = "https://static.momocdn.net/app/img/kits/trustBanner/ssl.png",
39
+ urlConfig = "login_and_security",
40
+ icons = listOf(
41
+ "https://static.momocdn.net/app/img/kits/trustBanner/ic_viettinbank.png",
42
+ "https://static.momocdn.net/app/img/kits/trustBanner/ic_agribank.png",
43
+ "https://static.momocdn.net/app/img/kits/trustBanner/ic_vietcombank.png",
44
+ "https://static.momocdn.net/app/img/kits/trustBanner/ic_bidv.png"
45
+ ),
46
+ momoImage = "https://static.momocdn.net/app/img/kits/trustBanner/ic_secu.png"
47
+ )
48
+
49
+ const val backgroundBlue = 0xFFF2F8FF
50
+ const val contentColor = 0xFF484848
51
+ const val subContentColor = 0xFFEB2F96
52
+
53
+ data class TrustBannerData(
54
+ val content: Map<String, String> = mapOf("vi" to "", "en" to ""),
55
+ val subContent: Map<String, String> = mapOf("vi" to "", "en" to ""),
56
+ val pciImage: String? = null,
57
+ val momoImage: String? = null,
58
+ val sslImage: String? = null,
59
+ val icons: List<String>? = null,
60
+ val urlConfig: String = ""
61
+ )
62
+
63
+ @Composable
64
+ fun TrustBanner(
65
+ serviceName: String = "",
66
+ screenName: String = "",
67
+ onPress: ((Map<String, String>) -> Unit)? = null,
68
+ trackEvent: ((String, Map<String, String>) -> Unit)? = null
69
+ ) {
70
+ val localize = LocalLocalize.current
71
+ val trustBanner = defaultBanner
72
+ val trackParams = mapOf(
73
+ "service_name" to serviceName,
74
+ "screen_name" to screenName,
75
+ "component_name" to "logo_trust",
76
+ "url_config" to trustBanner.urlConfig
77
+ )
78
+
79
+ Row(
80
+ modifier = Modifier
81
+ .clip(RoundedCornerShape(12.dp))
82
+ .background(color = Color(backgroundBlue))
83
+ .conditional(IsShowBaseLineDebug) {
84
+ border(1.dp, Colors.blue_03)
85
+ }
86
+ .padding(12.dp)
87
+ .then(
88
+ if (onPress != null) {
89
+ Modifier.clickable {
90
+ trackEvent?.invoke(
91
+ "service_component_clicked", trackParams
92
+ )
93
+
94
+ onPress(
95
+ mapOf(
96
+ "service_name" to serviceName,
97
+ "screen_name" to screenName,
98
+ "url_config" to trustBanner.urlConfig,
99
+ )
100
+ )
101
+
102
+ }
103
+ } else {
104
+ Modifier.noFeedbackClickable {
105
+ trackEvent?.invoke(
106
+ "service_component_clicked", trackParams
107
+ )
108
+ }
109
+ }
110
+ )
111
+ ) {
112
+ if (trustBanner.momoImage != null) {
113
+ Image(
114
+ source = trustBanner.momoImage,
115
+ modifier = Modifier
116
+ .width(64.dp)
117
+ .height(64.dp)
118
+ )
119
+ }
120
+ Column(
121
+ modifier = Modifier
122
+ .padding(start = 10.dp)
123
+ ) {
124
+ Text(
125
+ text = localize.translateData(trustBanner.content),
126
+ modifier = Modifier.padding(bottom = 8.dp),
127
+ color = Color(contentColor),
128
+ style = Typography.descriptionDefaultRegular,
129
+ maxLines = 2
130
+ )
131
+ Row(
132
+ modifier = Modifier.fillMaxWidth(),
133
+ horizontalArrangement = Arrangement.SpaceBetween
134
+ ) {
135
+ Row(
136
+ verticalAlignment = Alignment.CenterVertically,
137
+ ) {
138
+ Text(
139
+ text = localize.translateData(trustBanner.subContent),
140
+ color = Color(subContentColor),
141
+ style = Typography.actionXsBold,
142
+ maxLines = 2
143
+ )
144
+ Icon(
145
+ source = "https://img.mservice.io/momo_app_v2/new_version/img/appx_icon/16_arrow_chevron_right_small.png",
146
+ color = Color(subContentColor),
147
+ )
148
+ }
149
+ Row {
150
+ if (trustBanner.pciImage != null) {
151
+ Image(
152
+ source = trustBanner.pciImage, modifier = Modifier
153
+ .padding(end = 4.dp)
154
+ .width(27.dp)
155
+ .height(20.dp), options = Options(
156
+ contentScale = ContentScale.Fit,
157
+ )
158
+ )
159
+ }
160
+ if (trustBanner.sslImage != null) {
161
+ Image(
162
+ source = trustBanner.sslImage, modifier = Modifier
163
+ .width(52.dp)
164
+ .height(20.dp),
165
+ options = Options(
166
+ contentScale = ContentScale.Fit,
167
+ )
168
+ )
169
+ }
170
+
171
+ }
172
+ }
173
+ }
174
+ }
175
+ }
@@ -0,0 +1,182 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.horizontalScroll
6
+ import androidx.compose.foundation.layout.*
7
+ import androidx.compose.foundation.rememberScrollState
8
+ import androidx.compose.foundation.shape.RoundedCornerShape
9
+ import androidx.compose.runtime.Composable
10
+ import androidx.compose.runtime.remember
11
+ import androidx.compose.ui.Alignment
12
+ import androidx.compose.ui.Modifier
13
+ import androidx.compose.ui.draw.clip
14
+ import androidx.compose.ui.draw.drawBehind
15
+ import androidx.compose.ui.geometry.CornerRadius
16
+ import androidx.compose.ui.graphics.Color
17
+ import androidx.compose.ui.graphics.PathEffect
18
+ import androidx.compose.ui.graphics.drawscope.Stroke
19
+ import androidx.compose.ui.unit.Dp
20
+ import androidx.compose.ui.unit.dp
21
+ import vn.momo.kits.application.IsShowBaseLineDebug
22
+ import vn.momo.kits.const.*
23
+ import vn.momo.kits.modifier.activeOpacityClickable
24
+ import vn.momo.kits.modifier.conditional
25
+
26
+ data class UploadImage(
27
+ val uri: String? = null,
28
+ val loading: Boolean = false,
29
+ )
30
+
31
+ @Composable
32
+ fun Uploader(
33
+ images: List<UploadImage>,
34
+ modifier: Modifier = Modifier,
35
+ numberOfImages: Int = 1,
36
+ disabled: Boolean = false,
37
+ width: Dp = 64.dp,
38
+ height: Dp = 64.dp,
39
+ onAdd: () -> Unit = {},
40
+ onCancel: ((image: UploadImage, index: Int) -> Unit)? = null,
41
+ onPressImage: (image: UploadImage, index: Int) -> Unit = { _, _ -> },
42
+ ) {
43
+ val shouldShowPicker = remember(images.size, numberOfImages) {
44
+ images.size < numberOfImages
45
+ }
46
+
47
+ Row(
48
+ modifier = modifier
49
+ .conditional(IsShowBaseLineDebug) { border(1.dp, Colors.blue_03) },
50
+ horizontalArrangement = Arrangement.spacedBy(Spacing.S),
51
+ verticalAlignment = Alignment.Top,
52
+ ) {
53
+ if (shouldShowPicker) {
54
+ UploaderPickerCell(
55
+ disabled = disabled,
56
+ width = width,
57
+ height = height,
58
+ onAdd = onAdd,
59
+ )
60
+ }
61
+
62
+ Row(
63
+ modifier = Modifier.horizontalScroll(rememberScrollState()),
64
+ horizontalArrangement = Arrangement.spacedBy(Spacing.S),
65
+ ) {
66
+ images.forEachIndexed { index, image ->
67
+ UploaderImageItem(
68
+ image = image,
69
+ width = width,
70
+ height = height,
71
+ index = index,
72
+ onCancel = onCancel,
73
+ onPressImage = { onPressImage(image, index) },
74
+ )
75
+ }
76
+ }
77
+ }
78
+ }
79
+
80
+ @Composable
81
+ private fun UploaderPickerCell(
82
+ disabled: Boolean,
83
+ width: Dp,
84
+ height: Dp,
85
+ onAdd: () -> Unit,
86
+ ) {
87
+ val theme = AppTheme.current
88
+ val mainColor = if (disabled) theme.colors.text.disable else theme.colors.text.hint
89
+ val borderColor = if (disabled) theme.colors.border.disable else theme.colors.border.default
90
+
91
+ Box(
92
+ modifier = Modifier
93
+ .size(width = width, height = height)
94
+ .clip(RoundedCornerShape(Radius.XS))
95
+ .dashedBorder(color = borderColor, radius = Radius.XS)
96
+ .activeOpacityClickable(enabled = !disabled, onClick = onAdd),
97
+ contentAlignment = Alignment.Center,
98
+ ) {
99
+ Column(
100
+ horizontalAlignment = Alignment.CenterHorizontally,
101
+ verticalArrangement = Arrangement.spacedBy(Spacing.XXS),
102
+ ) {
103
+ Icon(
104
+ source = "16_navigation_plus",
105
+ color = mainColor,
106
+ size = 16.dp,
107
+ )
108
+ Text(
109
+ text = "Thêm hình",
110
+ style = Typography.descriptionXsRegular,
111
+ color = mainColor,
112
+ )
113
+ }
114
+ }
115
+ }
116
+
117
+ @Composable
118
+ private fun UploaderImageItem(
119
+ image: UploadImage,
120
+ width: Dp,
121
+ height: Dp,
122
+ index: Int,
123
+ onCancel: ((image: UploadImage, index: Int) -> Unit)?,
124
+ onPressImage: () -> Unit,
125
+ ) {
126
+ Box(
127
+ modifier = Modifier
128
+ .size(width = width, height = height)
129
+ .activeOpacityClickable(onClick = onPressImage),
130
+ ) {
131
+ Image(
132
+ source = image.uri ?: "",
133
+ modifier = Modifier
134
+ .fillMaxSize()
135
+ .clip(RoundedCornerShape(Radius.XS)),
136
+ )
137
+
138
+ if (onCancel != null && !image.loading) {
139
+ Icon(
140
+ source = "navigation_close_circle_full",
141
+ size = 16.dp,
142
+ color = null,
143
+ modifier = Modifier
144
+ .align(Alignment.TopEnd)
145
+ .padding(top = Spacing.XXS, end = Spacing.XXS)
146
+ .activeOpacityClickable { onCancel(image, index) },
147
+ )
148
+ }
149
+
150
+ if (image.loading) {
151
+ Box(
152
+ modifier = Modifier
153
+ .fillMaxSize()
154
+ .clip(RoundedCornerShape(Radius.XS))
155
+ .background(Color(0x66FFFFFF)),
156
+ contentAlignment = Alignment.Center,
157
+ ) {
158
+ Skeleton()
159
+ }
160
+ }
161
+ }
162
+ }
163
+
164
+ private fun Modifier.dashedBorder(
165
+ color: Color,
166
+ radius: Dp,
167
+ strokeWidth: Dp = 1.dp,
168
+ dashWidth: Float = 10f,
169
+ dashGap: Float = 6f,
170
+ ): Modifier = this.drawBehind {
171
+ val strokePx = strokeWidth.toPx()
172
+ val pathEffect = PathEffect.dashPathEffect(floatArrayOf(dashWidth, dashGap), 0f)
173
+ val cornerRadiusPx = radius.toPx()
174
+ drawRoundRect(
175
+ color = color,
176
+ style = Stroke(
177
+ width = strokePx,
178
+ pathEffect = pathEffect,
179
+ ),
180
+ cornerRadius = CornerRadius(cornerRadiusPx, cornerRadiusPx),
181
+ )
182
+ }
@@ -0,0 +1,193 @@
1
+ package vn.momo.kits.components.datetimepicker
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.layout.*
6
+ import androidx.compose.runtime.*
7
+ import androidx.compose.ui.Alignment
8
+ import androidx.compose.ui.Modifier
9
+ import androidx.compose.ui.unit.dp
10
+ import kotlinx.coroutines.flow.collect
11
+ import kotlinx.coroutines.flow.mapNotNull
12
+ import kotlinx.coroutines.flow.onEach
13
+ import kotlinx.datetime.LocalDateTime
14
+ import kotlinx.datetime.number
15
+ import vn.momo.kits.application.IsShowBaseLineDebug
16
+ import vn.momo.kits.components.Text
17
+ import vn.momo.kits.const.AppTheme
18
+ import vn.momo.kits.const.Colors
19
+ import vn.momo.kits.const.Spacing
20
+ import vn.momo.kits.const.Typography
21
+ import vn.momo.kits.modifier.conditional
22
+
23
+ private val datePickerHeight = 210.dp
24
+ private val datePickerWithLabelsHeight = 238.dp
25
+
26
+ @Composable
27
+ fun DateTimePicker(
28
+ modifier: Modifier = Modifier,
29
+ format: String = "DD-MM-YYYY",
30
+ minuteInterval: Int = 1,
31
+ onChange: (LocalDateTime) -> Unit,
32
+ selectedValue: LocalDateTime? = null,
33
+ minDate: LocalDateTime? = null,
34
+ maxDate: LocalDateTime? = null,
35
+ arrayLabelTime: List<String> = emptyList()
36
+ ) {
37
+ val effectiveSelectedValue = remember(selectedValue) {
38
+ selectedValue ?: getCurrentDateTime()
39
+ }
40
+
41
+ val effectiveMinDate = remember(minDate) {
42
+ minDate ?: createRelativeDate(-10)
43
+ }
44
+
45
+ val effectiveMaxDate = remember(maxDate) {
46
+ maxDate ?: createRelativeDate(10)
47
+ }
48
+
49
+ val needCheckRange = remember(minDate, maxDate) {
50
+ minDate == null && maxDate == null
51
+ }
52
+
53
+ val initialValue = remember(effectiveMinDate, effectiveMaxDate, effectiveSelectedValue) {
54
+ when {
55
+ !needCheckRange -> effectiveSelectedValue
56
+ effectiveSelectedValue < effectiveMinDate -> effectiveMinDate
57
+ effectiveSelectedValue > effectiveMaxDate -> effectiveMaxDate
58
+ else -> effectiveSelectedValue
59
+ }
60
+ }
61
+
62
+ var currentDate by remember(initialValue) {
63
+ mutableStateOf(
64
+ PickerData(
65
+ day = initialValue.day,
66
+ month = initialValue.month.number,
67
+ year = initialValue.year,
68
+ hour = initialValue.hour,
69
+ minute = initialValue.minute
70
+ )
71
+ )
72
+ }
73
+
74
+ val onWheelChangeValue = remember(currentDate, effectiveMinDate, effectiveMaxDate) {
75
+ { name: String, value: String ->
76
+ var day = if (name == "day") value.toInt() else currentDate.day
77
+ var month = if (name == "month") value.toInt() else currentDate.month
78
+ val year = if (name == "year") value.toInt() else currentDate.year
79
+ val hour = if (name == "hour") value.toInt() else currentDate.hour
80
+ val minute = if (name == "minute") value.toInt() else currentDate.minute
81
+ val timeMode = if (name == "timeMode") value else currentDate.timeMode
82
+ if (name == "year") {
83
+ month = when (year) {
84
+ effectiveMaxDate.year -> month.coerceIn(
85
+ 1,
86
+ effectiveMaxDate.month.number
87
+ )
88
+ effectiveMinDate.year -> month.coerceIn(
89
+ effectiveMinDate.month.number,
90
+ 12,
91
+ )
92
+ else -> month
93
+ }
94
+ }
95
+ if (name == "month" || name == "year") {
96
+ val maxDayOfMonth = when (month) {
97
+ 4, 6, 9, 11 -> 30
98
+ 2 -> if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) 29 else 28
99
+ else -> 31
100
+ }
101
+
102
+ day = when {
103
+ year == effectiveMaxDate.year && month == effectiveMaxDate.month.number ->
104
+ day.coerceIn(1, effectiveMaxDate.day)
105
+
106
+ year == effectiveMinDate.year && month == effectiveMinDate.month.number ->
107
+ day.coerceIn(effectiveMinDate.day, maxDayOfMonth)
108
+
109
+ day > maxDayOfMonth -> maxDayOfMonth
110
+ else -> day
111
+ }
112
+ }
113
+ currentDate = PickerData(
114
+ day = day,
115
+ month = month,
116
+ year = year,
117
+ hour = hour,
118
+ minute = minute,
119
+ timeMode = timeMode,
120
+ )
121
+ }
122
+ }
123
+
124
+ LaunchedEffect(effectiveMinDate, effectiveMaxDate) {
125
+ snapshotFlow { currentDate }
126
+ .mapNotNull {
127
+ val dateTime = it.toLocalDateTime()
128
+ if (!needCheckRange || dateTime in effectiveMinDate..effectiveMaxDate) dateTime
129
+ else null
130
+ }
131
+ .onEach(onChange)
132
+ .collect()
133
+ }
134
+
135
+ val pickerHeight = if (arrayLabelTime.isNotEmpty())
136
+ datePickerWithLabelsHeight else
137
+ datePickerHeight
138
+
139
+ Row(
140
+ modifier = modifier
141
+ .fillMaxWidth()
142
+ .height(pickerHeight)
143
+ .background(AppTheme.current.colors.background.surface)
144
+ .conditional(IsShowBaseLineDebug) {
145
+ border(1.dp, Colors.blue_03)
146
+ }
147
+ .padding(horizontal = Spacing.M),
148
+ verticalAlignment = Alignment.CenterVertically
149
+ ) {
150
+ val dateComponents = getDateComponents(
151
+ format,
152
+ currentDate,
153
+ effectiveMinDate,
154
+ effectiveMaxDate,
155
+ minuteInterval,
156
+ )
157
+ dateComponents.forEachIndexed { index, component ->
158
+ val hasLabel = index < arrayLabelTime.size && arrayLabelTime[index].isNotEmpty()
159
+
160
+ Column(
161
+ horizontalAlignment = Alignment.CenterHorizontally,
162
+ modifier = Modifier.weight(1f)
163
+ ) {
164
+ if (hasLabel) {
165
+ Text(
166
+ text = arrayLabelTime[index],
167
+ style = Typography.actionSBold,
168
+ modifier = Modifier.padding(bottom = Spacing.S)
169
+ )
170
+ }
171
+
172
+ WheelPicker(
173
+ name = component.name,
174
+ data = component.data,
175
+ selectedData = when (component.name) {
176
+ "day" -> paddingNum(currentDate.day)
177
+ "month" -> paddingNum(currentDate.month)
178
+ "year" -> currentDate.year.toString()
179
+ "hour" -> paddingNum(currentDate.hour)
180
+ "minute" -> paddingNum(currentDate.minute)
181
+ "timeMode" -> currentDate.timeMode
182
+ else -> ""
183
+ },
184
+ onChange = onWheelChangeValue,
185
+ )
186
+ }
187
+
188
+ if (index < dateComponents.size - 1) {
189
+ Spacer(modifier = Modifier.width(Spacing.M))
190
+ }
191
+ }
192
+ }
193
+ }
@@ -0,0 +1,29 @@
1
+ package vn.momo.kits.components.datetimepicker
2
+
3
+ import kotlinx.datetime.LocalDateTime
4
+
5
+ data class PickerData(
6
+ var day: Int,
7
+ var month: Int,
8
+ var year: Int,
9
+ var hour: Int = 0,
10
+ var minute: Int = 0,
11
+ var timeMode: String = ""
12
+ ) {
13
+ fun toLocalDateTime(): LocalDateTime {
14
+ return LocalDateTime(
15
+ year = year,
16
+ month = month,
17
+ day = day,
18
+ hour = hour,
19
+ minute = minute,
20
+ second = 0,
21
+ nanosecond = 0
22
+ )
23
+ }
24
+ }
25
+
26
+ data class DateComponent(
27
+ val name: String,
28
+ val data: List<String>
29
+ )