@momo-kits/native-kits 0.162.50 → 0.162.51-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.
- package/CLAUDE.md +1 -1
- package/build.gradle.kts +11 -0
- package/compose/build.gradle.kts +198 -0
- package/compose/build.gradle.kts.backup +198 -0
- package/compose/compose.podspec +47 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +20 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +12 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +7 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +153 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/ReservedRegions.android.kt +6 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +110 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/DesignSystemKits.kt +62 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +1071 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +56 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +81 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +338 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +175 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +357 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +115 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +89 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +128 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +209 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +542 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +49 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +125 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +231 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +189 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +478 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +114 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +265 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +235 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +223 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +265 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +185 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +343 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +84 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +370 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +108 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +308 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +59 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +21 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +90 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +330 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +220 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +473 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +122 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +207 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +92 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +560 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +125 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +207 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +501 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +176 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +182 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +193 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +236 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +180 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +325 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +17 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +194 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +287 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +54 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +50 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +321 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +41 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +52 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +66 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +104 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +48 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +499 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +58 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +148 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +116 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +205 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +422 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +732 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +148 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +35 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +228 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +217 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoBarCompression.kt +97 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoTabBar.kt +377 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +169 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +455 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +105 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +106 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +74 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +399 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +39 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +363 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +192 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +133 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +127 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +12 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +91 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +9 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +74 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ReservedRegions.kt +20 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +55 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +118 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +42 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +45 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +32 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +38 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +66 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +218 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/ReservedRegions.ios.kt +138 -0
- package/gradle/libs.versions.toml +69 -0
- package/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/gradle/wrapper/gradle-wrapper.properties +8 -0
- package/gradle.properties +26 -0
- package/gradlew +252 -0
- package/gradlew.bat +94 -0
- package/ios/Navigation/BottomSheet.swift +5 -3
- package/ios-demo/README.md +120 -0
- package/package.json +1 -1
- package/settings.gradle.kts +64 -0
package/CLAUDE.md
CHANGED
|
@@ -81,7 +81,7 @@ Publishing is automated (`publish.sh` + GitLab CI on `[ci build]` / `main`). Do
|
|
|
81
81
|
- Glass header: on Duo with a side bar, Default/Extended headers without search and with a `ScrollState` let content scroll under the bar (`usesDuoGlassHeader`); the bar fades in a translucent surface + hairline over 16pt (Compose has no backdrop blur — RN's fallback look), the gradient leaves with the content.
|
|
82
82
|
- Quick return header: glass headers and Animated headers (with a `ScrollState`) on the Duo side bar layout slide out with the content and back in on a reverse scroll; a half-shown header settles in or out once the scroll stops. The side bar is drawn apart from the header, so it stays put.
|
|
83
83
|
- Overlays on Duo: the modal sits inside the safe area (all four insets, so clear of the side toolbar strip) and caps its content at `duoModalMaxWidth` / `duoModalMaxHeight` (440 × 640pt, at least XL off the safe area); popups fill that width with radius XL and drop their own side padding (body scrolls, actions stay). Snackbars keep clear of the strip.
|
|
84
|
-
- Bottom sheet on Duo: radius XL, window height, centered
|
|
84
|
+
- Bottom sheet on Duo: radius XL, window height less `duoTopInset` (it never passes the side status bar: unlike RN, nothing restyles the clock over it), centered when the short side ≥ 600 (inner display in either orientation, buttons stay in the header row; RN parity). Below that (outer display, landscape too) it floats `Spacing.M` off the side edges, pads header/content/footer by `inset − M`, and a `Title` header moves back / close into 48pt side bar buttons on the strip part of the sheet (HIG: sheet controls go vertical on the outer display) when the strip fits one; they follow the header row while the sheet is short and stay below `sideBar.top` when it is tall. `BottomHeader.Title(onBack)` / `.title(onBack:)` closes the sheet, then runs (RN `leftOptions.onPressIconLeft`).
|
|
85
85
|
- Font scale deliberately uses the short side (`min(w, h)`), unlike RN which reads the window width — landscape must not inflate every font.
|
|
86
86
|
- Font scale measures the **window**, never `UIScreen.main`: on iPhone Duo the main screen stays on one display while the window follows the one in use. Compose iOS `getScreenDimensions()` reads `LocalWindowInfo.containerSize` (recomposes on fold/unfold); SwiftUI `DesignSystemKits` KVO-observes each `UIWindowScene.effectiveGeometry` and republishes `windowShortSide`.
|
|
87
87
|
- `StackScreen` pads content/footer/search/FAB by the side insets and provides an inset-consumed layout to its content; a bottom-tab root stays full width (tab bar + each tab's StackScreen handle insets). Grid columns use `contentWidth`.
|
package/build.gradle.kts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
plugins {
|
|
2
|
+
// this is necessary to avoid the plugins to be loaded multiple times
|
|
3
|
+
// in each subproject's classloader
|
|
4
|
+
alias(libs.plugins.android.application) apply false
|
|
5
|
+
alias(libs.plugins.android.library) apply false
|
|
6
|
+
alias(libs.plugins.compose) apply false
|
|
7
|
+
alias(libs.plugins.kotlin.compose.compiler) apply false
|
|
8
|
+
alias(libs.plugins.jetbrains.kotlin.multiplatform) apply false
|
|
9
|
+
alias(libs.plugins.jetbrains.kotlin.serialization) apply false
|
|
10
|
+
alias(libs.plugins.vanniktech.mavenPublish) apply false
|
|
11
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// import com.vanniktech.maven.publish.JavadocJar
|
|
2
|
+
// import com.vanniktech.maven.publish.KotlinMultiplatform
|
|
3
|
+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
4
|
+
|
|
5
|
+
plugins {
|
|
6
|
+
alias(libs.plugins.jetbrains.kotlin.multiplatform)
|
|
7
|
+
alias(libs.plugins.android.library)
|
|
8
|
+
alias(libs.plugins.compose)
|
|
9
|
+
alias(libs.plugins.kotlin.compose.compiler)
|
|
10
|
+
// alias(libs.plugins.vanniktech.mavenPublish)
|
|
11
|
+
id(libs.plugins.jetbrains.kotlin.cocoapods.get().pluginId)
|
|
12
|
+
kotlin("plugin.serialization")
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
val gitlabName: String = findProperty("name") as String? ?: ""
|
|
16
|
+
val gitlabRepo: String = findProperty("repo") as String? ?: ""
|
|
17
|
+
val gitlabUrl: String = findProperty("url") as String? ?: ""
|
|
18
|
+
val gitlabGroup: String = findProperty("group") as String? ?: ""
|
|
19
|
+
val gitlabArtifactId: String = findProperty("artifact.id") as String? ?: ""
|
|
20
|
+
val gitlabVersion: String = findProperty("version") as String? ?: ""
|
|
21
|
+
val gitlabUser: String = findProperty("gitlab.user") as String? ?: ""
|
|
22
|
+
val gitlabKey: String = findProperty("gitlab.password") as String? ?: ""
|
|
23
|
+
|
|
24
|
+
kotlin {
|
|
25
|
+
androidTarget {
|
|
26
|
+
compilerOptions {
|
|
27
|
+
jvmTarget.set(JvmTarget.JVM_17)
|
|
28
|
+
}
|
|
29
|
+
publishLibraryVariants("release")
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
val fwName = gitlabArtifactId
|
|
33
|
+
val iosTargets = listOf(iosArm64(), iosSimulatorArm64())
|
|
34
|
+
iosTargets.forEach {
|
|
35
|
+
it.binaries.framework {
|
|
36
|
+
baseName = fwName
|
|
37
|
+
binaryOption("bundleId", "$gitlabGroup.$fwName")
|
|
38
|
+
isStatic = true
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
cocoapods {
|
|
43
|
+
version = "0.162.51-debug"
|
|
44
|
+
summary = "IOS Shared module"
|
|
45
|
+
homepage = "https://momo.vn"
|
|
46
|
+
ios.deploymentTarget = "15.0"
|
|
47
|
+
|
|
48
|
+
framework {
|
|
49
|
+
baseName = fwName
|
|
50
|
+
isStatic = true
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
pod("lottie-ios") {
|
|
54
|
+
moduleName = "Lottie"
|
|
55
|
+
version = "4.4.3"
|
|
56
|
+
extraOpts += listOf("-compiler-option", "-fmodules")
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
sourceSets {
|
|
61
|
+
all {
|
|
62
|
+
languageSettings.optIn("vn.momo.kits.modifier.InternalApi")
|
|
63
|
+
}
|
|
64
|
+
commonMain.dependencies {
|
|
65
|
+
implementation(compose.runtime)
|
|
66
|
+
implementation(compose.material)
|
|
67
|
+
implementation(compose.material3)
|
|
68
|
+
implementation(compose.components.resources)
|
|
69
|
+
implementation(libs.compose.ui.backhandler)
|
|
70
|
+
implementation(libs.ktor.client.core)
|
|
71
|
+
implementation(libs.jetbrains.coroutines.core)
|
|
72
|
+
implementation(libs.navigation.multiplatform)
|
|
73
|
+
implementation(libs.coil.multiplatform.compose)
|
|
74
|
+
implementation(libs.coil.multiplatform.core)
|
|
75
|
+
implementation(libs.coil.multiplatform.network.ktor)
|
|
76
|
+
implementation(libs.jetbrains.serialization.json)
|
|
77
|
+
implementation(libs.kotlinx.datetime)
|
|
78
|
+
api(libs.native.max.api)
|
|
79
|
+
implementation(libs.compottie)
|
|
80
|
+
implementation(libs.gif.image)
|
|
81
|
+
}
|
|
82
|
+
androidMain.dependencies {
|
|
83
|
+
implementation(libs.ktor.client.okhttp)
|
|
84
|
+
implementation(libs.airbnb.lottie)
|
|
85
|
+
}
|
|
86
|
+
iosMain.dependencies {
|
|
87
|
+
implementation(libs.ktor.client.darwin)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
android {
|
|
93
|
+
namespace = "vn.momo.kits.kits"
|
|
94
|
+
compileSdk = 35
|
|
95
|
+
compileOptions {
|
|
96
|
+
sourceCompatibility = JavaVersion.VERSION_17
|
|
97
|
+
targetCompatibility = JavaVersion.VERSION_17
|
|
98
|
+
}
|
|
99
|
+
defaultConfig {
|
|
100
|
+
minSdk = 24
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
dependencies {
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
repositories {
|
|
108
|
+
google {
|
|
109
|
+
mavenContent {
|
|
110
|
+
includeGroupAndSubgroups("androidx")
|
|
111
|
+
includeGroupAndSubgroups("com.android")
|
|
112
|
+
includeGroupAndSubgroups("com.google")
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
mavenCentral()
|
|
116
|
+
maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
|
|
117
|
+
maven {
|
|
118
|
+
url = uri("https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven")
|
|
119
|
+
credentials {username = "download_packages"; password = "gldt-bjDqLpU_sPcHDuXau2ws" }
|
|
120
|
+
}
|
|
121
|
+
maven {
|
|
122
|
+
url = uri("https://artifacts.mservice.com.vn/repository/maven-momo-app/")
|
|
123
|
+
credentials {
|
|
124
|
+
username = "viewer"
|
|
125
|
+
password = "viewer"
|
|
126
|
+
}
|
|
127
|
+
isAllowInsecureProtocol = true
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
compose {
|
|
132
|
+
resources {
|
|
133
|
+
publicResClass = true
|
|
134
|
+
packageOfResClass = "vn.momo.uikits.resources"
|
|
135
|
+
generateResClass = always
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// publishing {
|
|
140
|
+
// repositories {
|
|
141
|
+
// maven {
|
|
142
|
+
// name = "${gitlabRepo}Packages"
|
|
143
|
+
// credentials {
|
|
144
|
+
// username = gitlabUser
|
|
145
|
+
// password = gitlabKey
|
|
146
|
+
// }
|
|
147
|
+
// url = uri("$gitlabUrl")
|
|
148
|
+
// }
|
|
149
|
+
// }
|
|
150
|
+
// }
|
|
151
|
+
|
|
152
|
+
// mavenPublishing {
|
|
153
|
+
// configure(
|
|
154
|
+
// KotlinMultiplatform(
|
|
155
|
+
// javadocJar = JavadocJar.Empty(),
|
|
156
|
+
// sourcesJar = true,
|
|
157
|
+
// androidVariantsToPublish = listOf("release")
|
|
158
|
+
// )
|
|
159
|
+
// )
|
|
160
|
+
//
|
|
161
|
+
// repositories {
|
|
162
|
+
// maven {
|
|
163
|
+
// name = "${gitlabRepo}Packages"
|
|
164
|
+
// credentials { username = gitlabUser; password = gitlabKey }
|
|
165
|
+
// url = uri("$gitlabUrl")
|
|
166
|
+
// }
|
|
167
|
+
// }
|
|
168
|
+
//
|
|
169
|
+
// coordinates(gitlabGroup.toString(), gitlabArtifactId, gitlabVersion.toString())
|
|
170
|
+
//
|
|
171
|
+
// pom {
|
|
172
|
+
// name = "$gitlabName Klib"
|
|
173
|
+
// description = "$gitlabName"
|
|
174
|
+
// url = "https://gitlab.mservice.com.vn"
|
|
175
|
+
// licenses {
|
|
176
|
+
// license {
|
|
177
|
+
// name = "The Apache License, Version 2.0"
|
|
178
|
+
// url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
|
179
|
+
// distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
|
180
|
+
// }
|
|
181
|
+
// }
|
|
182
|
+
// developers {
|
|
183
|
+
// developer {
|
|
184
|
+
// id = "kotlin-hands-on"
|
|
185
|
+
// name = "Kotlin Developer Advocate"
|
|
186
|
+
// url = "https://github.com/kotlin-hands-on/"
|
|
187
|
+
// }
|
|
188
|
+
// }
|
|
189
|
+
// }
|
|
190
|
+
// }
|
|
191
|
+
|
|
192
|
+
// Xcode 27 rejects iOS < 15; KGP's synthetic Podfile only raises pods to 12 (KT-57741), leaving lottie-ios at 13.
|
|
193
|
+
tasks.named("podGenIos") {
|
|
194
|
+
doLast {
|
|
195
|
+
val podfile = layout.buildDirectory.file("cocoapods/synthetic/ios/Podfile").get().asFile
|
|
196
|
+
podfile.writeText(podfile.readText().replace("major < 12 ||", "major < 15 ||").replace("#{12}", "#{15}"))
|
|
197
|
+
}
|
|
198
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import com.vanniktech.maven.publish.JavadocJar
|
|
2
|
+
import com.vanniktech.maven.publish.KotlinMultiplatform
|
|
3
|
+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
4
|
+
|
|
5
|
+
plugins {
|
|
6
|
+
alias(libs.plugins.jetbrains.kotlin.multiplatform)
|
|
7
|
+
alias(libs.plugins.android.library)
|
|
8
|
+
alias(libs.plugins.compose)
|
|
9
|
+
alias(libs.plugins.kotlin.compose.compiler)
|
|
10
|
+
alias(libs.plugins.vanniktech.mavenPublish)
|
|
11
|
+
id(libs.plugins.jetbrains.kotlin.cocoapods.get().pluginId)
|
|
12
|
+
kotlin("plugin.serialization")
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
val gitlabName: String = findProperty("name") as String? ?: ""
|
|
16
|
+
val gitlabRepo: String = findProperty("repo") as String? ?: ""
|
|
17
|
+
val gitlabUrl: String = findProperty("url") as String? ?: ""
|
|
18
|
+
val gitlabGroup: String = findProperty("group") as String? ?: ""
|
|
19
|
+
val gitlabArtifactId: String = findProperty("artifact.id") as String? ?: ""
|
|
20
|
+
val gitlabVersion: String = findProperty("version") as String? ?: ""
|
|
21
|
+
val gitlabUser: String = findProperty("gitlab.user") as String? ?: ""
|
|
22
|
+
val gitlabKey: String = findProperty("gitlab.password") as String? ?: ""
|
|
23
|
+
|
|
24
|
+
kotlin {
|
|
25
|
+
androidTarget {
|
|
26
|
+
compilerOptions {
|
|
27
|
+
jvmTarget.set(JvmTarget.JVM_17)
|
|
28
|
+
}
|
|
29
|
+
publishLibraryVariants("release")
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
val fwName = gitlabArtifactId
|
|
33
|
+
val iosTargets = listOf(iosArm64(), iosSimulatorArm64())
|
|
34
|
+
iosTargets.forEach {
|
|
35
|
+
it.binaries.framework {
|
|
36
|
+
baseName = fwName
|
|
37
|
+
binaryOption("bundleId", "$gitlabGroup.$fwName")
|
|
38
|
+
isStatic = true
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
cocoapods {
|
|
43
|
+
version = gitlabVersion
|
|
44
|
+
summary = "IOS Shared module"
|
|
45
|
+
homepage = "https://momo.vn"
|
|
46
|
+
ios.deploymentTarget = "15.0"
|
|
47
|
+
|
|
48
|
+
framework {
|
|
49
|
+
baseName = fwName
|
|
50
|
+
isStatic = true
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
pod("lottie-ios") {
|
|
54
|
+
moduleName = "Lottie"
|
|
55
|
+
version = "4.4.3"
|
|
56
|
+
extraOpts += listOf("-compiler-option", "-fmodules")
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
sourceSets {
|
|
61
|
+
all {
|
|
62
|
+
languageSettings.optIn("vn.momo.kits.modifier.InternalApi")
|
|
63
|
+
}
|
|
64
|
+
commonMain.dependencies {
|
|
65
|
+
implementation(compose.runtime)
|
|
66
|
+
implementation(compose.material)
|
|
67
|
+
implementation(compose.material3)
|
|
68
|
+
implementation(compose.components.resources)
|
|
69
|
+
implementation(libs.compose.ui.backhandler)
|
|
70
|
+
implementation(libs.ktor.client.core)
|
|
71
|
+
implementation(libs.jetbrains.coroutines.core)
|
|
72
|
+
implementation(libs.navigation.multiplatform)
|
|
73
|
+
implementation(libs.coil.multiplatform.compose)
|
|
74
|
+
implementation(libs.coil.multiplatform.core)
|
|
75
|
+
implementation(libs.coil.multiplatform.network.ktor)
|
|
76
|
+
implementation(libs.jetbrains.serialization.json)
|
|
77
|
+
implementation(libs.kotlinx.datetime)
|
|
78
|
+
api(libs.native.max.api)
|
|
79
|
+
implementation(libs.compottie)
|
|
80
|
+
implementation(libs.gif.image)
|
|
81
|
+
}
|
|
82
|
+
androidMain.dependencies {
|
|
83
|
+
implementation(libs.ktor.client.okhttp)
|
|
84
|
+
implementation(libs.airbnb.lottie)
|
|
85
|
+
}
|
|
86
|
+
iosMain.dependencies {
|
|
87
|
+
implementation(libs.ktor.client.darwin)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
android {
|
|
93
|
+
namespace = "$gitlabGroup.$gitlabArtifactId"
|
|
94
|
+
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
|
95
|
+
compileOptions {
|
|
96
|
+
sourceCompatibility = JavaVersion.VERSION_17
|
|
97
|
+
targetCompatibility = JavaVersion.VERSION_17
|
|
98
|
+
}
|
|
99
|
+
defaultConfig {
|
|
100
|
+
minSdk = libs.versions.android.minSdk.get().toInt()
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
dependencies {
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
repositories {
|
|
108
|
+
google {
|
|
109
|
+
mavenContent {
|
|
110
|
+
includeGroupAndSubgroups("androidx")
|
|
111
|
+
includeGroupAndSubgroups("com.android")
|
|
112
|
+
includeGroupAndSubgroups("com.google")
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
mavenCentral()
|
|
116
|
+
maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
|
|
117
|
+
maven {
|
|
118
|
+
url = uri("https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven")
|
|
119
|
+
credentials {username = "download_packages"; password = "gldt-bjDqLpU_sPcHDuXau2ws" }
|
|
120
|
+
}
|
|
121
|
+
maven {
|
|
122
|
+
url = uri("https://artifacts.mservice.com.vn/repository/maven-momo-app/")
|
|
123
|
+
credentials {
|
|
124
|
+
username = "viewer"
|
|
125
|
+
password = "viewer"
|
|
126
|
+
}
|
|
127
|
+
isAllowInsecureProtocol = true
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
compose {
|
|
132
|
+
resources {
|
|
133
|
+
publicResClass = true
|
|
134
|
+
packageOfResClass = "vn.momo.uikits.resources"
|
|
135
|
+
generateResClass = always
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
publishing {
|
|
140
|
+
repositories {
|
|
141
|
+
maven {
|
|
142
|
+
name = "${gitlabRepo}Packages"
|
|
143
|
+
credentials {
|
|
144
|
+
username = gitlabUser
|
|
145
|
+
password = gitlabKey
|
|
146
|
+
}
|
|
147
|
+
url = uri("$gitlabUrl")
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
mavenPublishing {
|
|
153
|
+
configure(
|
|
154
|
+
KotlinMultiplatform(
|
|
155
|
+
javadocJar = JavadocJar.Empty(),
|
|
156
|
+
sourcesJar = true,
|
|
157
|
+
androidVariantsToPublish = listOf("release")
|
|
158
|
+
)
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
repositories {
|
|
162
|
+
maven {
|
|
163
|
+
name = "${gitlabRepo}Packages"
|
|
164
|
+
credentials { username = gitlabUser; password = gitlabKey }
|
|
165
|
+
url = uri("$gitlabUrl")
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
coordinates(gitlabGroup.toString(), gitlabArtifactId, gitlabVersion.toString())
|
|
170
|
+
|
|
171
|
+
pom {
|
|
172
|
+
name = "$gitlabName Klib"
|
|
173
|
+
description = "$gitlabName"
|
|
174
|
+
url = "https://gitlab.mservice.com.vn"
|
|
175
|
+
licenses {
|
|
176
|
+
license {
|
|
177
|
+
name = "The Apache License, Version 2.0"
|
|
178
|
+
url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
|
179
|
+
distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
developers {
|
|
183
|
+
developer {
|
|
184
|
+
id = "kotlin-hands-on"
|
|
185
|
+
name = "Kotlin Developer Advocate"
|
|
186
|
+
url = "https://github.com/kotlin-hands-on/"
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Xcode 27 rejects iOS < 15; KGP's synthetic Podfile only raises pods to 12 (KT-57741), leaving lottie-ios at 13.
|
|
193
|
+
tasks.named("podGenIos") {
|
|
194
|
+
doLast {
|
|
195
|
+
val podfile = layout.buildDirectory.file("cocoapods/synthetic/ios/Podfile").get().asFile
|
|
196
|
+
podfile.writeText(podfile.readText().replace("major < 12 ||", "major < 15 ||").replace("#{12}", "#{15}"))
|
|
197
|
+
}
|
|
198
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
Pod::Spec.new do |spec|
|
|
2
|
+
spec.name = 'compose'
|
|
3
|
+
spec.version = '0.168.1-beta.8-debug'
|
|
4
|
+
spec.homepage = 'https://momo.vn'
|
|
5
|
+
spec.source = { :http=> ''}
|
|
6
|
+
spec.authors = ''
|
|
7
|
+
spec.license = ''
|
|
8
|
+
spec.summary = 'IOS Shared module'
|
|
9
|
+
spec.vendored_frameworks = 'build/cocoapods/framework/kits.framework'
|
|
10
|
+
spec.libraries = 'c++'
|
|
11
|
+
spec.ios.deployment_target = '15.0'
|
|
12
|
+
spec.dependency 'lottie-ios', '4.4.3'
|
|
13
|
+
if !Dir.exist?('build/cocoapods/framework/kits.framework') || Dir.empty?('build/cocoapods/framework/kits.framework')
|
|
14
|
+
raise "
|
|
15
|
+
Kotlin framework 'kits' doesn't exist yet, so a proper Xcode project can't be generated.
|
|
16
|
+
'pod install' should be executed after running ':generateDummyFramework' Gradle task:
|
|
17
|
+
./gradlew :compose:generateDummyFramework
|
|
18
|
+
Alternatively, proper pod installation is performed during Gradle sync in the IDE (if Podfile location is set)"
|
|
19
|
+
end
|
|
20
|
+
spec.xcconfig = {
|
|
21
|
+
'ENABLE_USER_SCRIPT_SANDBOXING' => 'NO',
|
|
22
|
+
}
|
|
23
|
+
spec.pod_target_xcconfig = {
|
|
24
|
+
'KOTLIN_PROJECT_PATH' => ':compose',
|
|
25
|
+
'PRODUCT_MODULE_NAME' => 'kits',
|
|
26
|
+
}
|
|
27
|
+
spec.script_phases = [
|
|
28
|
+
{
|
|
29
|
+
:name => 'Build compose',
|
|
30
|
+
:execution_position => :before_compile,
|
|
31
|
+
:shell_path => '/bin/sh',
|
|
32
|
+
:script => <<-SCRIPT
|
|
33
|
+
if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then
|
|
34
|
+
echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\""
|
|
35
|
+
exit 0
|
|
36
|
+
fi
|
|
37
|
+
set -ev
|
|
38
|
+
REPO_ROOT="$PODS_TARGET_SRCROOT"
|
|
39
|
+
"$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
|
|
40
|
+
-Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \
|
|
41
|
+
-Pkotlin.native.cocoapods.archs="$ARCHS" \
|
|
42
|
+
-Pkotlin.native.cocoapods.configuration="$CONFIGURATION"
|
|
43
|
+
SCRIPT
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
spec.resources = ['build/compose/cocoapods/compose-resources']
|
|
47
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package vn.momo.kits.const
|
|
2
|
+
|
|
3
|
+
import androidx.compose.runtime.Composable
|
|
4
|
+
import androidx.compose.runtime.remember
|
|
5
|
+
import androidx.compose.ui.platform.LocalContext
|
|
6
|
+
import androidx.compose.ui.text.font.Font
|
|
7
|
+
import androidx.compose.ui.text.font.FontFamily
|
|
8
|
+
import androidx.compose.ui.text.font.FontWeight
|
|
9
|
+
|
|
10
|
+
@Composable
|
|
11
|
+
internal actual fun hostFontFamily(fileName: String, weight: FontWeight): FontFamily? {
|
|
12
|
+
val assets = LocalContext.current.applicationContext.assets
|
|
13
|
+
return remember(fileName, weight) {
|
|
14
|
+
val path = "fonts/$fileName"
|
|
15
|
+
// AssetManager.open ném IOException nếu thiếu file; Font(path, assetManager) thì lỗi
|
|
16
|
+
// muộn lúc render nên phải kiểm tra tồn tại trước.
|
|
17
|
+
val exists = runCatching { assets.open(path).close() }.isSuccess
|
|
18
|
+
if (exists) FontFamily(Font(path = path, assetManager = assets, weight = weight)) else null
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
package vn.momo.kits.platform
|
|
2
|
+
|
|
3
|
+
import androidx.compose.runtime.Composable
|
|
4
|
+
import androidx.compose.runtime.State
|
|
5
|
+
import androidx.compose.runtime.mutableStateOf
|
|
6
|
+
import androidx.compose.runtime.remember
|
|
7
|
+
|
|
8
|
+
// No passive observer at androidx.activity 1.10.x; a second callback would steal the gesture.
|
|
9
|
+
@Composable
|
|
10
|
+
actual fun rememberBackGestureProgress(): State<Float?> = remember { mutableStateOf(null) }
|
|
11
|
+
|
|
12
|
+
actual fun reportFloatingArrowBack(shouldUse: Boolean) = Unit
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
package vn.momo.kits.platform
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.content.res.Resources
|
|
5
|
+
import android.graphics.BlurMaskFilter
|
|
6
|
+
import android.graphics.PorterDuff
|
|
7
|
+
import android.graphics.PorterDuffColorFilter
|
|
8
|
+
import android.os.Build
|
|
9
|
+
import androidx.compose.foundation.layout.Box
|
|
10
|
+
import androidx.compose.runtime.Composable
|
|
11
|
+
import androidx.compose.runtime.LaunchedEffect
|
|
12
|
+
import androidx.compose.runtime.getValue
|
|
13
|
+
import androidx.compose.runtime.rememberUpdatedState
|
|
14
|
+
import androidx.compose.runtime.snapshotFlow
|
|
15
|
+
import androidx.compose.ui.Modifier
|
|
16
|
+
import androidx.compose.ui.graphics.Color
|
|
17
|
+
import androidx.compose.ui.graphics.NativePaint
|
|
18
|
+
import androidx.compose.ui.graphics.toArgb
|
|
19
|
+
import androidx.compose.ui.platform.LocalConfiguration
|
|
20
|
+
import androidx.compose.ui.semantics.contentDescription
|
|
21
|
+
import androidx.compose.ui.semantics.semantics
|
|
22
|
+
import androidx.compose.ui.unit.Dp
|
|
23
|
+
import androidx.compose.ui.unit.dp
|
|
24
|
+
import com.airbnb.lottie.LottieProperty
|
|
25
|
+
import com.airbnb.lottie.compose.LottieAnimation
|
|
26
|
+
import com.airbnb.lottie.compose.LottieCompositionSpec
|
|
27
|
+
import com.airbnb.lottie.compose.animateLottieCompositionAsState
|
|
28
|
+
import com.airbnb.lottie.compose.rememberLottieComposition
|
|
29
|
+
import com.airbnb.lottie.compose.rememberLottieDynamicProperties
|
|
30
|
+
import com.airbnb.lottie.compose.rememberLottieDynamicProperty
|
|
31
|
+
import vn.momo.kits.const.AppNavigationBar
|
|
32
|
+
import vn.momo.kits.const.AppStatusBar
|
|
33
|
+
import vn.momo.kits.navigation.Navigator
|
|
34
|
+
import vn.momo.kits.utils.readJson
|
|
35
|
+
import androidx.activity.compose.BackHandler as AndroidBackHandler
|
|
36
|
+
|
|
37
|
+
actual fun getPlatformName(): String = "Android"
|
|
38
|
+
|
|
39
|
+
actual fun isPhoneIdiom(): Boolean = false
|
|
40
|
+
|
|
41
|
+
@Composable
|
|
42
|
+
actual fun getScreenDimensions(): ScreenDimension {
|
|
43
|
+
val config = LocalConfiguration.current
|
|
44
|
+
return ScreenDimension(
|
|
45
|
+
config.screenWidthDp, config.screenHeightDp
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
actual fun NativePaint.setMaskFilter(blurRadius: Float) {
|
|
50
|
+
this.maskFilter = BlurMaskFilter(blurRadius, BlurMaskFilter.Blur.NORMAL)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@SuppressLint("InternalInsetResource")
|
|
54
|
+
@Composable
|
|
55
|
+
actual fun getStatusBarHeight(): Dp {
|
|
56
|
+
val resourceId = Resources.getSystem().getIdentifier(
|
|
57
|
+
"status_bar_height",
|
|
58
|
+
"dimen",
|
|
59
|
+
"android"
|
|
60
|
+
)
|
|
61
|
+
return if(resourceId > 0) Resources.getSystem().getDimensionPixelSize(resourceId).dp else 0.dp
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@Composable
|
|
65
|
+
actual fun BackHandler(enabled: Boolean, onBack: () -> Unit) {
|
|
66
|
+
AndroidBackHandler(enabled = enabled, onBack = onBack)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@Composable
|
|
70
|
+
actual fun ProvideNavigationEventDispatcherOwner(navigator: Navigator, content: @Composable () -> Unit) {
|
|
71
|
+
content()
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@Composable
|
|
75
|
+
actual fun getScreenHeight(): Dp {
|
|
76
|
+
return getScreenDimensions().height.dp + if (getOSVersion() >= 35) 0.dp else AppStatusBar.current + AppNavigationBar.current
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
actual fun getOSVersion(): OSVersion = OSVersion.Android(sdk = Build.VERSION.SDK_INT)
|
|
80
|
+
|
|
81
|
+
@Composable
|
|
82
|
+
actual fun LottieAnimation(
|
|
83
|
+
path: String,
|
|
84
|
+
tintColor: Color?,
|
|
85
|
+
bgColor: Color?,
|
|
86
|
+
placedAsOverlay: Boolean,
|
|
87
|
+
iterations: Int,
|
|
88
|
+
isPlaying: Boolean,
|
|
89
|
+
onEvent: ((String) -> Unit)?,
|
|
90
|
+
modifier: Modifier,
|
|
91
|
+
useCompose: Boolean
|
|
92
|
+
) {
|
|
93
|
+
if (useCompose) {
|
|
94
|
+
ComposeLottieAnimation(path, tintColor, bgColor, iterations, isPlaying, onEvent, modifier)
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
val json = readJson(path)
|
|
99
|
+
|
|
100
|
+
if (json.isEmpty()) {
|
|
101
|
+
Box(modifier)
|
|
102
|
+
return
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
val composition by rememberLottieComposition(
|
|
106
|
+
LottieCompositionSpec.JsonString(json)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
val colorFilter = PorterDuffColorFilter(
|
|
110
|
+
tintColor?.toArgb() ?: Color.White.toArgb(),
|
|
111
|
+
PorterDuff.Mode.SRC_ATOP
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
val dynamicProperties = rememberLottieDynamicProperties(
|
|
115
|
+
rememberLottieDynamicProperty(
|
|
116
|
+
property = LottieProperty.COLOR_FILTER,
|
|
117
|
+
value = colorFilter,
|
|
118
|
+
keyPath = arrayOf("**")
|
|
119
|
+
)
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
val lottieState = animateLottieCompositionAsState(
|
|
123
|
+
composition = composition,
|
|
124
|
+
iterations = iterations,
|
|
125
|
+
isPlaying = isPlaying,
|
|
126
|
+
restartOnPlay = false,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
val currentOnEvent by rememberUpdatedState(onEvent)
|
|
130
|
+
|
|
131
|
+
LaunchedEffect(isPlaying) {
|
|
132
|
+
currentOnEvent?.invoke(if (isPlaying) LottieEvent.Start else LottieEvent.Pause)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
LaunchedEffect(lottieState) {
|
|
136
|
+
var armed = false
|
|
137
|
+
snapshotFlow { lottieState.isAtEnd }.collect { atEnd ->
|
|
138
|
+
if (!atEnd) armed = true
|
|
139
|
+
else if (armed) { armed = false; currentOnEvent?.invoke(LottieEvent.Finish) }
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
LottieAnimation(
|
|
144
|
+
composition = composition,
|
|
145
|
+
progress = { lottieState.progress },
|
|
146
|
+
dynamicProperties = if (tintColor != null) dynamicProperties else null,
|
|
147
|
+
modifier = modifier
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
actual fun NativePaint.setColor(color: Color){
|
|
152
|
+
this.color = color.toArgb()
|
|
153
|
+
}
|