@momo-kits/native-kits 0.154.1-beta.9 → 0.154.2-test.1
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/README.md +175 -5
- package/ios/native-kits.podspec +18 -16
- package/package.json +2 -4
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -114
- package/LICENSE +0 -20
- package/build.gradle.kts +0 -32
- package/compose/MoMoComposeKits.podspec +0 -54
- package/compose/build.gradle.kts +0 -149
- package/compose/src/androidMain/AndroidManifest.xml +0 -2
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -105
- package/compose/src/commonMain/composeResources/files/lottie_circle_loader.json +0 -1
- package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
- package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -57
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -102
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -201
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -222
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -48
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -305
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -715
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -114
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -404
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -78
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -27
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -334
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -345
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -90
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -133
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -69
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -143
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -179
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -111
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -393
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -164
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -234
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -226
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -221
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -246
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -233
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -364
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -50
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -34
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -85
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -33
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -338
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -95
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -64
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -89
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -86
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -94
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -208
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -170
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -199
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -237
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -191
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -13
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -189
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -285
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -35
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -59
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -68
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -49
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -232
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -111
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -94
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -163
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -302
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -483
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -169
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -215
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -180
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -251
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -80
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -306
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -31
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -385
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -125
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -38
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -62
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -88
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -144
- package/gradle.properties +0 -19
- package/gradlew +0 -240
- package/gradlew.bat +0 -91
- package/ios/Theme.md +0 -18
- package/local.properties +0 -8
- package/settings.gradle.kts +0 -25
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.application
|
|
2
|
-
|
|
3
|
-
import androidx.compose.runtime.Composable
|
|
4
|
-
import androidx.compose.runtime.CompositionLocalProvider
|
|
5
|
-
import androidx.compose.runtime.LaunchedEffect
|
|
6
|
-
import androidx.compose.runtime.getValue
|
|
7
|
-
import androidx.compose.runtime.mutableStateOf
|
|
8
|
-
import androidx.compose.runtime.remember
|
|
9
|
-
import androidx.compose.runtime.setValue
|
|
10
|
-
import androidx.compose.runtime.staticCompositionLocalOf
|
|
11
|
-
import androidx.compose.ui.unit.Dp
|
|
12
|
-
import vn.momo.kits.const.AppStatusBar
|
|
13
|
-
import vn.momo.kits.const.AppTheme
|
|
14
|
-
import vn.momo.kits.const.Theme
|
|
15
|
-
import vn.momo.kits.const.ThemeAssets
|
|
16
|
-
import vn.momo.kits.const.defaultTheme
|
|
17
|
-
import vn.momo.kits.platform.getStatusBarHeight
|
|
18
|
-
|
|
19
|
-
@Deprecated("Use IMaxApi instead", ReplaceWith("IMaxApi"))
|
|
20
|
-
interface ComposeApi {
|
|
21
|
-
fun request(funcName: String, params: Any?): String
|
|
22
|
-
fun request(funcName: String, params: Any?, onResponse: ((String) -> Unit)?): String
|
|
23
|
-
fun requestCallback(funcName: String, params: Any?, onResponse: ((String) -> Unit)?)
|
|
24
|
-
fun removeCallback(id: String)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
class Navigator {
|
|
28
|
-
fun push(content: @Composable () -> Unit) {
|
|
29
|
-
//implement
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
fun present(content: @Composable () -> Unit) {
|
|
33
|
-
//implement
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
fun reset(content: @Composable () -> Unit) {
|
|
37
|
-
//implement
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
fun pop() {
|
|
41
|
-
//implement
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
fun replace(content: @Composable () -> Unit) {
|
|
45
|
-
//implement
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
fun popToTop() {
|
|
49
|
-
//implement
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
fun showModal(
|
|
53
|
-
onClose: () -> Unit = {},
|
|
54
|
-
canBackgroundClose: Boolean = true,
|
|
55
|
-
content: @Composable () -> Unit,
|
|
56
|
-
) {
|
|
57
|
-
//implement
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
fun showBottomSheet(content: @Composable () -> Unit) {
|
|
61
|
-
//implement
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
@Deprecated("Use LocalApi instead", ReplaceWith("LocalApi"))
|
|
69
|
-
val PlatformApi = staticCompositionLocalOf<Any?> { null }
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
@Deprecated("Use NavigationContainer instead", ReplaceWith("NavigationContainer"))
|
|
73
|
-
@Composable
|
|
74
|
-
fun ApplicationContainer(
|
|
75
|
-
theme: Theme = defaultTheme,
|
|
76
|
-
composeApi: ComposeApi? = null,
|
|
77
|
-
statusBarHeight: Dp? = AppStatusBar.current,
|
|
78
|
-
applicationContext: MiniAppContext? = null,
|
|
79
|
-
config: KitConfig? = null,
|
|
80
|
-
language: String? = null,
|
|
81
|
-
isWhiteList: Boolean = false,
|
|
82
|
-
content: @Composable () -> Unit,
|
|
83
|
-
) {
|
|
84
|
-
var appTheme by remember { mutableStateOf(theme) }
|
|
85
|
-
|
|
86
|
-
LaunchedEffect(Unit) {
|
|
87
|
-
try {
|
|
88
|
-
val headerBar = config?.headerBar
|
|
89
|
-
if (headerBar != null && appTheme.assets.headerBackground == null) {
|
|
90
|
-
appTheme = appTheme.copy(
|
|
91
|
-
assets = ThemeAssets(
|
|
92
|
-
headerBackground = headerBar
|
|
93
|
-
)
|
|
94
|
-
)
|
|
95
|
-
}
|
|
96
|
-
} catch (e: Exception) {
|
|
97
|
-
print("@@ == NavigationContainer get config error $e")
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
val appStatusBarHeight = statusBarHeight ?: getStatusBarHeight()
|
|
102
|
-
|
|
103
|
-
CompositionLocalProvider(
|
|
104
|
-
AppTheme provides appTheme,
|
|
105
|
-
PlatformApi provides composeApi,
|
|
106
|
-
AppStatusBar provides appStatusBarHeight,
|
|
107
|
-
ApplicationContext provides applicationContext,
|
|
108
|
-
AppConfig provides config,
|
|
109
|
-
AppLanguage provides language,
|
|
110
|
-
) {
|
|
111
|
-
content()
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
}
|
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.application
|
|
2
|
-
|
|
3
|
-
import androidx.compose.animation.core.Animatable
|
|
4
|
-
import androidx.compose.animation.core.animateFloatAsState
|
|
5
|
-
import androidx.compose.animation.core.tween
|
|
6
|
-
import androidx.compose.foundation.ScrollState
|
|
7
|
-
import androidx.compose.foundation.background
|
|
8
|
-
import androidx.compose.foundation.gestures.detectTapGestures
|
|
9
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
10
|
-
import androidx.compose.foundation.layout.Box
|
|
11
|
-
import androidx.compose.foundation.layout.Column
|
|
12
|
-
import androidx.compose.foundation.layout.Spacer
|
|
13
|
-
import androidx.compose.foundation.layout.WindowInsets
|
|
14
|
-
import androidx.compose.foundation.layout.asPaddingValues
|
|
15
|
-
import androidx.compose.foundation.layout.aspectRatio
|
|
16
|
-
import androidx.compose.foundation.layout.fillMaxSize
|
|
17
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
18
|
-
import androidx.compose.foundation.layout.height
|
|
19
|
-
import androidx.compose.foundation.layout.ime
|
|
20
|
-
import androidx.compose.foundation.layout.imePadding
|
|
21
|
-
import androidx.compose.foundation.layout.offset
|
|
22
|
-
import androidx.compose.foundation.layout.padding
|
|
23
|
-
import androidx.compose.foundation.layout.systemBars
|
|
24
|
-
import androidx.compose.foundation.rememberScrollState
|
|
25
|
-
import androidx.compose.foundation.verticalScroll
|
|
26
|
-
import androidx.compose.runtime.Composable
|
|
27
|
-
import androidx.compose.runtime.CompositionLocalProvider
|
|
28
|
-
import androidx.compose.runtime.DisposableEffect
|
|
29
|
-
import androidx.compose.runtime.LaunchedEffect
|
|
30
|
-
import androidx.compose.runtime.getValue
|
|
31
|
-
import androidx.compose.runtime.mutableStateOf
|
|
32
|
-
import androidx.compose.runtime.remember
|
|
33
|
-
import androidx.compose.runtime.setValue
|
|
34
|
-
import androidx.compose.runtime.staticCompositionLocalOf
|
|
35
|
-
import androidx.compose.ui.Alignment
|
|
36
|
-
import androidx.compose.ui.Modifier
|
|
37
|
-
import androidx.compose.ui.graphics.Color
|
|
38
|
-
import androidx.compose.ui.input.pointer.pointerInput
|
|
39
|
-
import androidx.compose.ui.layout.LayoutCoordinates
|
|
40
|
-
import androidx.compose.ui.layout.onGloballyPositioned
|
|
41
|
-
import androidx.compose.ui.platform.LocalDensity
|
|
42
|
-
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
|
|
43
|
-
import androidx.compose.ui.unit.Dp
|
|
44
|
-
import androidx.compose.ui.unit.IntOffset
|
|
45
|
-
import androidx.compose.ui.unit.dp
|
|
46
|
-
import androidx.compose.ui.unit.min
|
|
47
|
-
import androidx.compose.ui.zIndex
|
|
48
|
-
import kotlinx.coroutines.CoroutineScope
|
|
49
|
-
import kotlinx.coroutines.Dispatchers
|
|
50
|
-
import kotlinx.coroutines.SupervisorJob
|
|
51
|
-
import kotlinx.coroutines.cancel
|
|
52
|
-
import kotlinx.coroutines.delay
|
|
53
|
-
import kotlinx.coroutines.launch
|
|
54
|
-
import vn.momo.kits.components.InputSearchProps
|
|
55
|
-
import vn.momo.kits.const.AppNavigationBar
|
|
56
|
-
import vn.momo.kits.const.AppTheme
|
|
57
|
-
import vn.momo.kits.const.Colors
|
|
58
|
-
import vn.momo.kits.const.Spacing
|
|
59
|
-
import vn.momo.kits.modifier.conditional
|
|
60
|
-
import vn.momo.kits.modifier.shadow
|
|
61
|
-
import vn.momo.kits.navigation.component.SnackBar
|
|
62
|
-
import vn.momo.kits.platform.getAndroidBuildVersion
|
|
63
|
-
import vn.momo.kits.utils.getAppStatusBarHeight
|
|
64
|
-
|
|
65
|
-
enum class HeaderType {
|
|
66
|
-
DEFAULT,
|
|
67
|
-
EXTENDED,
|
|
68
|
-
NONE
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const val HEADER_HEIGHT = 52
|
|
72
|
-
|
|
73
|
-
@Deprecated("Use NavigationContainer(StackScreen) instead", ReplaceWith("NavigationContainer(StackScreen)"))
|
|
74
|
-
@Composable
|
|
75
|
-
fun Screen(
|
|
76
|
-
backgroundColor: Color? = null,
|
|
77
|
-
tintColor: Color? = null,
|
|
78
|
-
headerTransparent: Boolean = false,
|
|
79
|
-
fullScreenContent: Boolean = false,
|
|
80
|
-
isBack: Boolean = true,
|
|
81
|
-
headerType: HeaderType = HeaderType.DEFAULT,
|
|
82
|
-
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
|
83
|
-
horizontalAlignment: Alignment.Horizontal = Alignment.Start,
|
|
84
|
-
title: String = "Stack",
|
|
85
|
-
titlePosition: TitlePosition = TitlePosition.LEFT,
|
|
86
|
-
goBack: (() -> Unit)? = null,
|
|
87
|
-
scrollable: Boolean = true,
|
|
88
|
-
scrollState: ScrollState = rememberScrollState(),
|
|
89
|
-
onContentLayout: ((LayoutCoordinates) -> Unit)? = null,
|
|
90
|
-
useAvoidKeyboard: Boolean = true,
|
|
91
|
-
footer: @Composable (() -> Unit)? = null,
|
|
92
|
-
headerRight: @Composable (() -> Unit)? = null,
|
|
93
|
-
fabProps: FabProps? = null,
|
|
94
|
-
animatedHeader: AnimatedHeader? = null,
|
|
95
|
-
layoutOffset: Dp = 56.dp,
|
|
96
|
-
inputSearchProps: InputSearchProps? = null,
|
|
97
|
-
useAnimationSearch: Boolean = false,
|
|
98
|
-
headerRightWidth: Dp = 0.dp,
|
|
99
|
-
content: @Composable () -> Unit,
|
|
100
|
-
) {
|
|
101
|
-
val statusBarHeight = getAppStatusBarHeight()
|
|
102
|
-
val keyboardController = LocalSoftwareKeyboardController.current
|
|
103
|
-
|
|
104
|
-
val isKeyboardVisible = isKeyboardVisible()
|
|
105
|
-
val indicator = WindowInsets.systemBars.asPaddingValues().calculateBottomPadding()
|
|
106
|
-
val bottomPadding = min(indicator, if (isKeyboardVisible) 0.dp else 21.dp)
|
|
107
|
-
|
|
108
|
-
val headerHeight = if (animatedHeader !== null)
|
|
109
|
-
with(LocalDensity.current) { layoutOffset.roundToPx() }
|
|
110
|
-
else HEADER_HEIGHT
|
|
111
|
-
val opacity by animateFloatAsState(
|
|
112
|
-
targetValue = ((scrollState.value.toFloat() / headerHeight)).coerceIn(0f, 1f),
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
val headerAnimated =
|
|
116
|
-
@Composable {
|
|
117
|
-
Box(
|
|
118
|
-
modifier = Modifier
|
|
119
|
-
.fillMaxWidth()
|
|
120
|
-
.aspectRatio(animatedHeader?.aspectRatio?.value ?: AnimatedHeaderRatio.RATIO_16_9.value)
|
|
121
|
-
) {
|
|
122
|
-
animatedHeader?.composable?.invoke(scrollState.value)
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
val helper = remember { ScreenHelper() }
|
|
126
|
-
|
|
127
|
-
DisposableEffect(Unit) {
|
|
128
|
-
onDispose { helper.dispose() }
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
CompositionLocalProvider(
|
|
132
|
-
LocalScreenHelper provides helper
|
|
133
|
-
) {
|
|
134
|
-
Box(
|
|
135
|
-
Modifier.fillMaxSize()
|
|
136
|
-
.background(backgroundColor ?: AppTheme.current.colors.background.default)
|
|
137
|
-
.conditional(useAvoidKeyboard && getAndroidBuildVersion() > 29) {
|
|
138
|
-
imePadding()
|
|
139
|
-
}
|
|
140
|
-
) {
|
|
141
|
-
val footerHeightPx = remember { mutableStateOf(0) }
|
|
142
|
-
|
|
143
|
-
Box(Modifier.zIndex(1f)) {
|
|
144
|
-
if (animatedHeader === null) {
|
|
145
|
-
HeaderBackground(
|
|
146
|
-
headerType = headerType,
|
|
147
|
-
scrollState = scrollState.value,
|
|
148
|
-
headerTransparent = headerTransparent
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
Box(Modifier.zIndex(5f)) {
|
|
154
|
-
Header(
|
|
155
|
-
headerType = headerType,
|
|
156
|
-
title = title,
|
|
157
|
-
titlePosition = titlePosition,
|
|
158
|
-
headerRight = headerRight,
|
|
159
|
-
headerRightWidth = headerRightWidth,
|
|
160
|
-
goBack = goBack,
|
|
161
|
-
opacity = opacity,
|
|
162
|
-
animatedHeader = animatedHeader,
|
|
163
|
-
inputSearchProps = inputSearchProps,
|
|
164
|
-
scrollState = scrollState.value,
|
|
165
|
-
useAnimationSearch = useAnimationSearch,
|
|
166
|
-
tintColor = tintColor
|
|
167
|
-
)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
Box(Modifier.zIndex(2f).fillMaxSize()){
|
|
171
|
-
Column(
|
|
172
|
-
modifier = Modifier.fillMaxSize()
|
|
173
|
-
.padding( top = when {
|
|
174
|
-
animatedHeader != null -> 0.dp
|
|
175
|
-
headerType == HeaderType.NONE -> 0.dp
|
|
176
|
-
fullScreenContent -> 0.dp
|
|
177
|
-
else -> statusBarHeight + HEADER_HEIGHT.dp
|
|
178
|
-
})
|
|
179
|
-
.pointerInput(Unit) {
|
|
180
|
-
detectTapGestures(onTap = {
|
|
181
|
-
keyboardController?.hide()
|
|
182
|
-
})
|
|
183
|
-
}
|
|
184
|
-
.zIndex(1f),
|
|
185
|
-
) {
|
|
186
|
-
|
|
187
|
-
Column(
|
|
188
|
-
modifier = Modifier
|
|
189
|
-
.conditional(scrollable) { weight(1f) }
|
|
190
|
-
.conditional(onContentLayout != null) {
|
|
191
|
-
onGloballyPositioned(onContentLayout ?: {})
|
|
192
|
-
}
|
|
193
|
-
.conditional(scrollable) { verticalScroll(scrollState) },
|
|
194
|
-
verticalArrangement = verticalArrangement,
|
|
195
|
-
horizontalAlignment = horizontalAlignment
|
|
196
|
-
) {
|
|
197
|
-
Box {
|
|
198
|
-
if (animatedHeader !== null) headerAnimated()
|
|
199
|
-
Column {
|
|
200
|
-
if (animatedHeader !== null) {
|
|
201
|
-
Spacer(modifier = Modifier.padding(top = statusBarHeight + HEADER_HEIGHT.dp + layoutOffset))
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (useAnimationSearch && inputSearchProps != null && headerType == HeaderType.EXTENDED) {
|
|
205
|
-
Spacer(modifier = Modifier.padding(top = (HEADER_HEIGHT.dp + Spacing.S)))
|
|
206
|
-
}
|
|
207
|
-
content()
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
footer?.let {
|
|
213
|
-
val footerHeight = with(LocalDensity.current) { footerHeightPx.value.toDp() }
|
|
214
|
-
Spacer(Modifier.height(footerHeight))
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
Box(Modifier.zIndex(4f).align(Alignment.BottomCenter)) {
|
|
220
|
-
footer?.let {
|
|
221
|
-
Footer(
|
|
222
|
-
footer = footer,
|
|
223
|
-
bottom = bottomPadding,
|
|
224
|
-
onFooterMeasured = { footerHeightPx.value = it }
|
|
225
|
-
)
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
Column (Modifier.zIndex(6f)) {
|
|
230
|
-
if (fabProps != null) {
|
|
231
|
-
FloatingButton(
|
|
232
|
-
scrollPosition = fabProps.scrollState?.value ?: scrollState.value,
|
|
233
|
-
onClick = fabProps.onClick,
|
|
234
|
-
containerColor = AppTheme.current.colors.primary,
|
|
235
|
-
bottom = fabProps.bottom
|
|
236
|
-
?: if (footer != null) bottomPadding + 76.dp else bottomPadding + 12.dp,
|
|
237
|
-
icon = fabProps.icon,
|
|
238
|
-
iconColor = fabProps.iconColor,
|
|
239
|
-
text = fabProps.label,
|
|
240
|
-
size = fabProps.size,
|
|
241
|
-
position = fabProps.position ?: FABPosition.END,
|
|
242
|
-
)
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
Box(
|
|
247
|
-
modifier = Modifier
|
|
248
|
-
.align(Alignment.BottomCenter)
|
|
249
|
-
.zIndex(3f)
|
|
250
|
-
) {
|
|
251
|
-
ScreenSnackBarHost(if (footer == null) 0 else footerHeightPx.value)
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
@Composable
|
|
258
|
-
internal fun isKeyboardVisible(): Boolean {
|
|
259
|
-
val ime = WindowInsets.ime
|
|
260
|
-
val density = LocalDensity.current
|
|
261
|
-
val bottom = ime.getBottom(density)
|
|
262
|
-
return bottom > 0
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
@Composable
|
|
266
|
-
fun Footer(
|
|
267
|
-
footer: @Composable (() -> Unit)? = null,
|
|
268
|
-
bottom: Dp = 0.dp,
|
|
269
|
-
onFooterMeasured: ((Int) -> Unit)? = null
|
|
270
|
-
) {
|
|
271
|
-
Box(
|
|
272
|
-
Modifier
|
|
273
|
-
.shadow(
|
|
274
|
-
color = Colors.black_20.copy(alpha = 0.05f),
|
|
275
|
-
blurRadius = 24f,
|
|
276
|
-
offsetX = 0.dp,
|
|
277
|
-
offsetY = (-4).dp
|
|
278
|
-
)
|
|
279
|
-
.background(AppTheme.current.colors.background.surface)
|
|
280
|
-
.onGloballyPositioned {
|
|
281
|
-
onFooterMeasured?.invoke(it.size.height)
|
|
282
|
-
}
|
|
283
|
-
) {
|
|
284
|
-
Box(
|
|
285
|
-
Modifier.fillMaxWidth()
|
|
286
|
-
.padding(bottom = bottom)
|
|
287
|
-
.padding(vertical = Spacing.S, horizontal = Spacing.M)
|
|
288
|
-
) {
|
|
289
|
-
footer?.invoke()
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
class ScreenHelper {
|
|
296
|
-
|
|
297
|
-
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
|
298
|
-
|
|
299
|
-
internal var snackBarState by mutableStateOf<SnackBarData?>(null)
|
|
300
|
-
|
|
301
|
-
internal var requestHide by mutableStateOf(false)
|
|
302
|
-
|
|
303
|
-
fun showSnackBar(snackBar: SnackBar, onDismiss: (() -> Unit)? = null) {
|
|
304
|
-
scope.launch {
|
|
305
|
-
requestHide = false
|
|
306
|
-
snackBarState = SnackBarData(snackBar, onDismiss)
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
fun hideSnackBar() {
|
|
311
|
-
scope.launch {
|
|
312
|
-
requestHide = true
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
internal fun removeSnackBarNow() {
|
|
317
|
-
snackBarState = null
|
|
318
|
-
requestHide = false
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
fun dispose() {
|
|
322
|
-
scope.cancel()
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
data class SnackBarData(
|
|
326
|
-
val type: SnackBar,
|
|
327
|
-
val onDismiss: (() -> Unit)?
|
|
328
|
-
)
|
|
329
|
-
|
|
330
|
-
val LocalScreenHelper = staticCompositionLocalOf<ScreenHelper> {
|
|
331
|
-
error("No Screen helper provided")
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
@Composable
|
|
335
|
-
fun ScreenSnackBarHost(footerHeightPx: Int) {
|
|
336
|
-
val helper = LocalScreenHelper.current
|
|
337
|
-
val snackBarData = helper.snackBarState ?: return
|
|
338
|
-
val density = LocalDensity.current
|
|
339
|
-
val navigationBar = AppNavigationBar.current
|
|
340
|
-
|
|
341
|
-
val footerHeight = if (footerHeightPx > 0) {
|
|
342
|
-
footerHeightPx
|
|
343
|
-
} else {
|
|
344
|
-
with(density) {
|
|
345
|
-
min(navigationBar, 21.dp).toPx()
|
|
346
|
-
}
|
|
347
|
-
}.toInt()
|
|
348
|
-
|
|
349
|
-
var startPosition by remember { mutableStateOf(Float.MAX_VALUE) }
|
|
350
|
-
val targetPosition = 0f
|
|
351
|
-
|
|
352
|
-
var offsetY by remember { mutableStateOf(Animatable(startPosition)) }
|
|
353
|
-
|
|
354
|
-
LaunchedEffect(startPosition) {
|
|
355
|
-
if (startPosition != Float.MAX_VALUE){
|
|
356
|
-
offsetY.snapTo(startPosition)
|
|
357
|
-
offsetY.animateTo(targetPosition, tween(350))
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
LaunchedEffect(helper.requestHide) {
|
|
362
|
-
if (helper.requestHide) {
|
|
363
|
-
offsetY.animateTo(startPosition, tween(200))
|
|
364
|
-
helper.removeSnackBarNow()
|
|
365
|
-
snackBarData.onDismiss?.invoke()
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
LaunchedEffect(snackBarData.type.duration) {
|
|
370
|
-
val duration = snackBarData.type.duration
|
|
371
|
-
if (duration != null) {
|
|
372
|
-
delay(duration)
|
|
373
|
-
helper.hideSnackBar()
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
DisposableEffect(Unit) {
|
|
378
|
-
onDispose { snackBarData.onDismiss?.invoke() }
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
Box(
|
|
382
|
-
modifier = Modifier
|
|
383
|
-
.offset { IntOffset(0, offsetY.value.toInt() - footerHeight) }
|
|
384
|
-
.onGloballyPositioned {
|
|
385
|
-
if (startPosition != it.size.height.toFloat()) {
|
|
386
|
-
startPosition = it.size.height.toFloat()
|
|
387
|
-
offsetY = Animatable(startPosition)
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
.fillMaxWidth()
|
|
391
|
-
) {
|
|
392
|
-
when (val type = snackBarData.type) {
|
|
393
|
-
is SnackBar.Custom -> type.content()
|
|
394
|
-
is SnackBar.Toast -> {}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.application
|
|
2
|
-
|
|
3
|
-
import androidx.compose.animation.animateColorAsState
|
|
4
|
-
import androidx.compose.animation.core.animateFloatAsState
|
|
5
|
-
import androidx.compose.runtime.Composable
|
|
6
|
-
import androidx.compose.runtime.getValue
|
|
7
|
-
import androidx.compose.ui.graphics.Color
|
|
8
|
-
import androidx.compose.ui.unit.Dp
|
|
9
|
-
import androidx.compose.ui.unit.dp
|
|
10
|
-
import vn.momo.kits.const.AppTheme
|
|
11
|
-
import vn.momo.kits.const.Colors
|
|
12
|
-
import vn.momo.kits.platform.getScreenDimensions
|
|
13
|
-
|
|
14
|
-
data class HeaderAnimations(
|
|
15
|
-
val opacity: Float,
|
|
16
|
-
val backgroundSearch: Color,
|
|
17
|
-
val translateX: Float,
|
|
18
|
-
val width: Float,
|
|
19
|
-
val translateY: Float
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
private const val SCREEN_PADDING = 12
|
|
23
|
-
private const val BACK_WIDTH = 28
|
|
24
|
-
|
|
25
|
-
@Deprecated("Use vn.momo.kits.navigation.component.Header instead", ReplaceWith("vn.momo.kits.navigation.component.Header"))
|
|
26
|
-
@Composable
|
|
27
|
-
fun useHeaderSearchAnimation(
|
|
28
|
-
opacityAni: Float,
|
|
29
|
-
scrollState: Int,
|
|
30
|
-
headerRightWidth: Dp,
|
|
31
|
-
isBack: Boolean
|
|
32
|
-
): HeaderAnimations {
|
|
33
|
-
val screenWidth = getScreenDimensions().width
|
|
34
|
-
val leftPosition = if (isBack) (BACK_WIDTH + 20).dp else 12.dp
|
|
35
|
-
val searchWidth = screenWidth - (SCREEN_PADDING * 2)
|
|
36
|
-
|
|
37
|
-
val backgroundSearch by animateColorAsState(
|
|
38
|
-
targetValue = animateColor(
|
|
39
|
-
Colors.black_01,
|
|
40
|
-
AppTheme.current.colors.background.default,
|
|
41
|
-
opacityAni
|
|
42
|
-
),
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
val animatedTranslateX by animateFloatAsState(
|
|
46
|
-
targetValue = (scrollState / HEADER_HEIGHT * 1f).coerceIn(
|
|
47
|
-
0f,
|
|
48
|
-
1f
|
|
49
|
-
) * (leftPosition.value - 12) + 12,
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
val animatedWidth by animateFloatAsState(
|
|
53
|
-
targetValue = (scrollState / HEADER_HEIGHT * 1f).coerceIn(
|
|
54
|
-
0f,
|
|
55
|
-
1f
|
|
56
|
-
) * ((searchWidth - leftPosition.value - headerRightWidth.value + 12) - searchWidth) + searchWidth,
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
val animatedTranslateY by animateFloatAsState(
|
|
60
|
-
targetValue = (1 - (scrollState / HEADER_HEIGHT * 1f).coerceIn(0f, 1f)) * HEADER_HEIGHT
|
|
61
|
-
)
|
|
62
|
-
return HeaderAnimations(
|
|
63
|
-
opacity = opacityAni,
|
|
64
|
-
backgroundSearch = backgroundSearch,
|
|
65
|
-
translateX = animatedTranslateX,
|
|
66
|
-
width = animatedWidth,
|
|
67
|
-
translateY = animatedTranslateY
|
|
68
|
-
)
|
|
69
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.components
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.background
|
|
4
|
-
import androidx.compose.foundation.border
|
|
5
|
-
import androidx.compose.foundation.layout.Box
|
|
6
|
-
import androidx.compose.foundation.layout.height
|
|
7
|
-
import androidx.compose.foundation.layout.padding
|
|
8
|
-
import androidx.compose.foundation.layout.widthIn
|
|
9
|
-
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
10
|
-
import androidx.compose.runtime.Composable
|
|
11
|
-
import androidx.compose.ui.Alignment
|
|
12
|
-
import androidx.compose.ui.Modifier
|
|
13
|
-
import androidx.compose.ui.graphics.Color
|
|
14
|
-
import androidx.compose.ui.unit.dp
|
|
15
|
-
import vn.momo.kits.const.AppTheme
|
|
16
|
-
import vn.momo.kits.const.Colors
|
|
17
|
-
import vn.momo.kits.const.Radius
|
|
18
|
-
import vn.momo.kits.const.Spacing
|
|
19
|
-
import vn.momo.kits.const.Typography
|
|
20
|
-
import vn.momo.kits.const.scaleSize
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@Composable
|
|
24
|
-
fun Badge(label: String = "Label", backgroundColor: Color? = null) {
|
|
25
|
-
val primaryColors = listOf(
|
|
26
|
-
Color(0xFFF0F0F0),
|
|
27
|
-
Color(0xFFEB2F96),
|
|
28
|
-
Color(0xFF962AF0),
|
|
29
|
-
Color(0xFF4E4BFF),
|
|
30
|
-
Color(0xFF007AFF),
|
|
31
|
-
Color(0xFF13C2C2),
|
|
32
|
-
Color(0xFF34C759),
|
|
33
|
-
Color(0xFFA0D911),
|
|
34
|
-
Color(0xFFFFCC00),
|
|
35
|
-
Color(0xFFFA8C16),
|
|
36
|
-
Color(0xFFFA541C),
|
|
37
|
-
Color(0xFFF5222D)
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
fun isNumber(label: String): Boolean {
|
|
41
|
-
val numberRegex = "^\\d+$".toRegex()
|
|
42
|
-
return numberRegex.matches(label)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
fun formatTitle(label: String): String {
|
|
46
|
-
if (isNumber(label) && label.toInt() > 99) {
|
|
47
|
-
return "99+"
|
|
48
|
-
}
|
|
49
|
-
return label
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
var badgeColor =
|
|
53
|
-
if (isNumber(label)) {
|
|
54
|
-
AppTheme.current.colors.error.primary
|
|
55
|
-
} else {
|
|
56
|
-
AppTheme.current.colors.warning.primary
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (backgroundColor != null && primaryColors.contains(backgroundColor)) {
|
|
60
|
-
badgeColor = backgroundColor
|
|
61
|
-
}
|
|
62
|
-
val scaleSize = scaleSize(16f)
|
|
63
|
-
|
|
64
|
-
Box(
|
|
65
|
-
modifier = Modifier
|
|
66
|
-
.height(scaleSize.dp)
|
|
67
|
-
.widthIn(min = scaleSize.dp)
|
|
68
|
-
.background(color = badgeColor, shape = RoundedCornerShape(Radius.M))
|
|
69
|
-
.border(width = 1.dp, shape = RoundedCornerShape(Radius.M), color = Colors.black_01)
|
|
70
|
-
.padding(horizontal = Spacing.XS), contentAlignment = Alignment.Center
|
|
71
|
-
) {
|
|
72
|
-
Text(
|
|
73
|
-
text = formatTitle(label),
|
|
74
|
-
color = Colors.black_01,
|
|
75
|
-
style = Typography.actionXxsBold
|
|
76
|
-
)
|
|
77
|
-
}
|
|
78
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.components
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.background
|
|
4
|
-
import androidx.compose.foundation.border
|
|
5
|
-
import androidx.compose.foundation.layout.Box
|
|
6
|
-
import androidx.compose.foundation.layout.size
|
|
7
|
-
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
8
|
-
import androidx.compose.runtime.Composable
|
|
9
|
-
import androidx.compose.ui.Modifier
|
|
10
|
-
import androidx.compose.ui.unit.dp
|
|
11
|
-
import vn.momo.kits.const.Colors
|
|
12
|
-
import vn.momo.kits.const.Radius
|
|
13
|
-
|
|
14
|
-
enum class DotSize(val size: Int) {
|
|
15
|
-
Small(10),
|
|
16
|
-
Large(16)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
@Composable
|
|
20
|
-
fun BadgeDot(size: DotSize = DotSize.Large, modifier: Modifier = Modifier) {
|
|
21
|
-
Box(
|
|
22
|
-
modifier = modifier
|
|
23
|
-
.size(size.size.dp)
|
|
24
|
-
.border(width = 1.dp, color = Colors.black_01, shape = RoundedCornerShape(Radius.S))
|
|
25
|
-
.background(color = Colors.red_03, shape = RoundedCornerShape(Radius.S))
|
|
26
|
-
)
|
|
27
|
-
}
|