@momo-kits/native-kits 0.89.30-beta.1 → 0.89.30-beta.20
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/compose/src/commonMain/kotlin/vn/momo/kits/application/Components.kt +51 -73
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +22 -10
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +9 -10
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +8 -12
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +1 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +8 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +8 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +7 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +11 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +4 -3
- package/local.properties +2 -2
- package/package.json +1 -1
|
@@ -4,6 +4,7 @@ import androidx.compose.animation.animateColorAsState
|
|
|
4
4
|
import androidx.compose.foundation.background
|
|
5
5
|
import androidx.compose.foundation.border
|
|
6
6
|
import androidx.compose.foundation.clickable
|
|
7
|
+
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
7
8
|
import androidx.compose.foundation.layout.Arrangement
|
|
8
9
|
import androidx.compose.foundation.layout.Box
|
|
9
10
|
import androidx.compose.foundation.layout.BoxWithConstraints
|
|
@@ -15,6 +16,7 @@ import androidx.compose.foundation.layout.padding
|
|
|
15
16
|
import androidx.compose.foundation.layout.size
|
|
16
17
|
import androidx.compose.foundation.layout.width
|
|
17
18
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
19
|
+
import androidx.compose.material.ripple.rememberRipple
|
|
18
20
|
import androidx.compose.runtime.Composable
|
|
19
21
|
import androidx.compose.runtime.LaunchedEffect
|
|
20
22
|
import androidx.compose.runtime.getValue
|
|
@@ -24,12 +26,9 @@ import androidx.compose.runtime.setValue
|
|
|
24
26
|
import androidx.compose.runtime.snapshotFlow
|
|
25
27
|
import androidx.compose.ui.Alignment
|
|
26
28
|
import androidx.compose.ui.Modifier
|
|
27
|
-
import androidx.compose.ui.geometry.Offset
|
|
28
|
-
import androidx.compose.ui.graphics.Brush
|
|
29
29
|
import androidx.compose.ui.graphics.Color
|
|
30
30
|
import androidx.compose.ui.graphics.graphicsLayer
|
|
31
31
|
import androidx.compose.ui.layout.ContentScale
|
|
32
|
-
import androidx.compose.ui.platform.LocalDensity
|
|
33
32
|
import androidx.compose.ui.semantics.contentDescription
|
|
34
33
|
import androidx.compose.ui.semantics.semantics
|
|
35
34
|
import androidx.compose.ui.semantics.testTag
|
|
@@ -61,76 +60,45 @@ data class AnimatedHeader(
|
|
|
61
60
|
)
|
|
62
61
|
|
|
63
62
|
@Composable
|
|
64
|
-
fun
|
|
65
|
-
headerType: HeaderType = HeaderType.DEFAULT
|
|
63
|
+
fun HeaderImage(
|
|
64
|
+
headerType: HeaderType = HeaderType.DEFAULT,
|
|
65
|
+
headerBackground: String?,
|
|
66
66
|
) {
|
|
67
67
|
val statusBarHeight = AppStatusBar.current ?: getStatusBarHeight()
|
|
68
68
|
when (headerType) {
|
|
69
69
|
HeaderType.DEFAULT -> {
|
|
70
70
|
val height = statusBarHeight + 52.dp
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
) {
|
|
78
|
-
Box(
|
|
79
|
-
modifier = Modifier
|
|
80
|
-
.height(height)
|
|
81
|
-
.fillMaxWidth()
|
|
82
|
-
.background(
|
|
83
|
-
Brush.linearGradient(
|
|
84
|
-
colors = listOf(
|
|
85
|
-
Color(0xFFFDCACE),
|
|
86
|
-
Color(0x00FDCACE)
|
|
87
|
-
),
|
|
88
|
-
start = Offset(0f, 0f),
|
|
89
|
-
end = Offset(0f, with(LocalDensity.current) { 154.dp.toPx() })
|
|
90
|
-
)
|
|
91
|
-
)
|
|
71
|
+
Image(
|
|
72
|
+
source = headerBackground ?: "",
|
|
73
|
+
loading = false,
|
|
74
|
+
modifier = Modifier.fillMaxWidth().height(height),
|
|
75
|
+
options = Options(
|
|
76
|
+
contentScale = ContentScale.FillWidth
|
|
92
77
|
)
|
|
93
|
-
|
|
94
|
-
Image(
|
|
95
|
-
source = AppTheme.current.assets.headerBackground!!,
|
|
96
|
-
modifier = Modifier.fillMaxWidth().height(height),
|
|
97
|
-
options = Options(
|
|
98
|
-
contentScale = ContentScale.FillWidth
|
|
99
|
-
)
|
|
100
|
-
)
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
78
|
+
)
|
|
104
79
|
}
|
|
105
80
|
|
|
106
81
|
HeaderType.EXTENDED -> {
|
|
82
|
+
Image(
|
|
83
|
+
source = headerBackground ?: "",
|
|
84
|
+
loading = false,
|
|
85
|
+
modifier = Modifier.fillMaxWidth(),
|
|
86
|
+
options = Options(
|
|
87
|
+
contentScale = ContentScale.FillWidth
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
HeaderType.SURFACE -> {
|
|
93
|
+
val height = statusBarHeight + 52.dp
|
|
107
94
|
Box(
|
|
108
|
-
modifier = Modifier.fillMaxWidth().height(
|
|
109
|
-
.background(
|
|
110
|
-
Brush.linearGradient(
|
|
111
|
-
colors = listOf(
|
|
112
|
-
Color(0xFFFDCACE),
|
|
113
|
-
Color(0x00FDCACE)
|
|
114
|
-
),
|
|
115
|
-
start = Offset(0f, 0f),
|
|
116
|
-
end = Offset(0f, with(LocalDensity.current) { 154.dp.toPx() })
|
|
117
|
-
)
|
|
118
|
-
)
|
|
95
|
+
modifier = Modifier.fillMaxWidth().height(height)
|
|
96
|
+
.background(AppTheme.current.colors.background.surface)
|
|
119
97
|
.bottomBorder(
|
|
120
|
-
strokeWidth =
|
|
98
|
+
strokeWidth = 2.dp,
|
|
121
99
|
color = AppTheme.current.colors.border.default
|
|
122
100
|
)
|
|
123
|
-
)
|
|
124
|
-
if (AppTheme.current.assets.headerBackground != null) {
|
|
125
|
-
Image(
|
|
126
|
-
source = AppTheme.current.assets.headerBackground!!,
|
|
127
|
-
modifier = Modifier.fillMaxWidth().height(154.dp),
|
|
128
|
-
options = Options(
|
|
129
|
-
contentScale = ContentScale.FillWidth
|
|
130
|
-
)
|
|
131
|
-
)
|
|
132
|
-
}
|
|
133
|
-
}
|
|
101
|
+
)
|
|
134
102
|
}
|
|
135
103
|
|
|
136
104
|
else -> {
|
|
@@ -152,16 +120,22 @@ fun Header(
|
|
|
152
120
|
scrollState: Int = 0
|
|
153
121
|
) {
|
|
154
122
|
val statusBarHeight = AppStatusBar.current ?: getStatusBarHeight()
|
|
155
|
-
|
|
156
|
-
|
|
123
|
+
var tintIconColor = Colors.black_01
|
|
124
|
+
var backgroundButton = Colors.black_20.copy(alpha = 0.4f)
|
|
125
|
+
if (headerType == HeaderType.SURFACE) {
|
|
126
|
+
tintIconColor = AppTheme.current.colors.text.default
|
|
127
|
+
backgroundButton = Color.Transparent
|
|
128
|
+
}
|
|
157
129
|
|
|
158
130
|
var colorFraction by remember { mutableStateOf(0f) }
|
|
159
131
|
|
|
160
132
|
LaunchedEffect(scrollState) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
133
|
+
if (headerType == HeaderType.SURFACE) {
|
|
134
|
+
snapshotFlow { scrollState }
|
|
135
|
+
.map { (it / 50f).coerceIn(0f, 1f) }
|
|
136
|
+
.distinctUntilChanged()
|
|
137
|
+
.collect { fraction -> colorFraction = fraction }
|
|
138
|
+
}
|
|
165
139
|
}
|
|
166
140
|
|
|
167
141
|
val tintIconColorAnim by animateColorAsState(
|
|
@@ -192,11 +166,15 @@ fun Header(
|
|
|
192
166
|
modifier = Modifier
|
|
193
167
|
.size(28.dp)
|
|
194
168
|
.then(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
169
|
+
if (headerType == HeaderType.SURFACE) {
|
|
170
|
+
Modifier.border(
|
|
171
|
+
0.5.dp,
|
|
172
|
+
Colors.black_20.copy(alpha = 0.4f),
|
|
173
|
+
RoundedCornerShape(100)
|
|
174
|
+
)
|
|
175
|
+
} else {
|
|
176
|
+
Modifier
|
|
177
|
+
}
|
|
200
178
|
)
|
|
201
179
|
.background(
|
|
202
180
|
backgroundButton,
|
|
@@ -214,7 +192,7 @@ fun Header(
|
|
|
214
192
|
) {
|
|
215
193
|
Icon(
|
|
216
194
|
source = "ic_back_ios",
|
|
217
|
-
color = if (animatedHeader !== null) tintIconColorAnim else tintIconColor,
|
|
195
|
+
color = if (headerType == HeaderType.SURFACE && animatedHeader !== null) tintIconColorAnim else tintIconColor,
|
|
218
196
|
size = 20.dp,
|
|
219
197
|
)
|
|
220
198
|
}
|
|
@@ -245,7 +223,7 @@ fun Header(
|
|
|
245
223
|
) {
|
|
246
224
|
HeaderTitle(
|
|
247
225
|
title = title,
|
|
248
|
-
color = if (animatedHeader !== null) tintIconColorAnim else tintIconColor,
|
|
226
|
+
color = if (headerType == HeaderType.SURFACE && animatedHeader !== null) tintIconColorAnim else tintIconColor,
|
|
249
227
|
modifier = Modifier.semantics {
|
|
250
228
|
contentDescription = "title_navigation_header"
|
|
251
229
|
testTag = "title_navigation_header"
|
|
@@ -38,6 +38,7 @@ import vn.momo.kits.platform.getStatusBarHeight
|
|
|
38
38
|
|
|
39
39
|
enum class HeaderType {
|
|
40
40
|
DEFAULT,
|
|
41
|
+
SURFACE,
|
|
41
42
|
EXTENDED,
|
|
42
43
|
NONE
|
|
43
44
|
}
|
|
@@ -45,6 +46,7 @@ enum class HeaderType {
|
|
|
45
46
|
@Composable
|
|
46
47
|
fun Screen(
|
|
47
48
|
backgroundColor: Color? = null,
|
|
49
|
+
headerBackground: String? = null,
|
|
48
50
|
isBack: Boolean = true,
|
|
49
51
|
headerType: HeaderType = HeaderType.DEFAULT,
|
|
50
52
|
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
|
@@ -88,14 +90,18 @@ fun Screen(
|
|
|
88
90
|
) {
|
|
89
91
|
|
|
90
92
|
if (animatedHeader === null) {
|
|
91
|
-
|
|
93
|
+
HeaderImage(
|
|
94
|
+
headerType,
|
|
95
|
+
headerBackground ?: AppTheme.current.assets.headerBackground
|
|
96
|
+
)
|
|
92
97
|
} else {
|
|
93
98
|
Box(
|
|
94
|
-
Modifier.zIndex(5f)
|
|
95
|
-
.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
Modifier.zIndex(5f).background(Color.White.copy(alpha = opacity))
|
|
100
|
+
.graphicsLayer { alpha = opacity }) {
|
|
101
|
+
HeaderImage(
|
|
102
|
+
headerType,
|
|
103
|
+
headerBackground ?: AppTheme.current.assets.headerBackground
|
|
104
|
+
)
|
|
99
105
|
}
|
|
100
106
|
}
|
|
101
107
|
|
|
@@ -123,7 +129,9 @@ fun Screen(
|
|
|
123
129
|
) {
|
|
124
130
|
|
|
125
131
|
Column(
|
|
126
|
-
modifier = if (scrollable) Modifier.weight(1f).padding(bottom = keyboardSize)
|
|
132
|
+
modifier = if (scrollable) Modifier.weight(1f).padding(bottom = keyboardSize)
|
|
133
|
+
.verticalScroll(scrollState) else
|
|
134
|
+
Modifier.padding(bottom = keyboardSize),
|
|
127
135
|
verticalArrangement = verticalArrangement,
|
|
128
136
|
horizontalAlignment = horizontalAlignment
|
|
129
137
|
) {
|
|
@@ -148,7 +156,8 @@ fun Screen(
|
|
|
148
156
|
scrollPosition = fabProps.scrollState?.value ?: scrollState.value,
|
|
149
157
|
onClick = fabProps.onClick,
|
|
150
158
|
containerColor = AppTheme.current.colors.primary,
|
|
151
|
-
bottom = fabProps.bottom
|
|
159
|
+
bottom = fabProps.bottom
|
|
160
|
+
?: if (footer != null) bottomPadding + 76.dp else bottomPadding + 12.dp,
|
|
152
161
|
icon = fabProps.icon,
|
|
153
162
|
iconColor = fabProps.iconColor,
|
|
154
163
|
text = fabProps.label,
|
|
@@ -177,8 +186,11 @@ fun Footer(footer: @Composable (() -> Unit)? = null, keyboardSize: Dp = 0.dp, bo
|
|
|
177
186
|
.background(AppTheme.current.colors.background.surface)
|
|
178
187
|
) {
|
|
179
188
|
Box(
|
|
180
|
-
Modifier
|
|
181
|
-
|
|
189
|
+
Modifier
|
|
190
|
+
.fillMaxWidth()
|
|
191
|
+
.padding(vertical = Spacing.S, horizontal = Spacing.M)
|
|
192
|
+
)
|
|
193
|
+
{
|
|
182
194
|
footer?.invoke()
|
|
183
195
|
}
|
|
184
196
|
}
|
|
@@ -3,7 +3,6 @@ package vn.momo.kits.components
|
|
|
3
3
|
import androidx.compose.foundation.background
|
|
4
4
|
import androidx.compose.foundation.border
|
|
5
5
|
import androidx.compose.foundation.clickable
|
|
6
|
-
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
7
6
|
import androidx.compose.foundation.layout.Arrangement
|
|
8
7
|
import androidx.compose.foundation.layout.Box
|
|
9
8
|
import androidx.compose.foundation.layout.Row
|
|
@@ -13,14 +12,15 @@ import androidx.compose.foundation.layout.height
|
|
|
13
12
|
import androidx.compose.foundation.layout.padding
|
|
14
13
|
import androidx.compose.foundation.layout.size
|
|
15
14
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
16
|
-
import androidx.compose.material.ripple.rememberRipple
|
|
17
15
|
import androidx.compose.material3.CircularProgressIndicator
|
|
18
16
|
import androidx.compose.runtime.Composable
|
|
19
|
-
import androidx.compose.runtime.remember
|
|
20
17
|
import androidx.compose.ui.Alignment
|
|
21
18
|
import androidx.compose.ui.Modifier
|
|
22
19
|
import androidx.compose.ui.draw.clip
|
|
23
20
|
import androidx.compose.ui.graphics.Color
|
|
21
|
+
import androidx.compose.ui.semantics.contentDescription
|
|
22
|
+
import androidx.compose.ui.semantics.semantics
|
|
23
|
+
import androidx.compose.ui.semantics.testTag
|
|
24
24
|
import androidx.compose.ui.text.TextStyle
|
|
25
25
|
import androidx.compose.ui.text.style.TextOverflow
|
|
26
26
|
import androidx.compose.ui.unit.Dp
|
|
@@ -221,9 +221,6 @@ fun getTypeStyle(
|
|
|
221
221
|
* @param iconLeft [String] the icon at the left of title
|
|
222
222
|
* @param title [String] title of button
|
|
223
223
|
* @param loading [Boolean] used when you want to use loading animation
|
|
224
|
-
* @param enabled controls the enabled state of this button. When `false`,
|
|
225
|
-
* this component will not respond to user input, and it will appear
|
|
226
|
-
* visually disabled and disabled to accessibility services.
|
|
227
224
|
* @param useTintColor [Boolean] controls color of the icon.
|
|
228
225
|
*/
|
|
229
226
|
@Composable
|
|
@@ -235,7 +232,6 @@ fun Button(
|
|
|
235
232
|
iconLeft: String = "",
|
|
236
233
|
title: String = "Button",
|
|
237
234
|
loading: Boolean = false,
|
|
238
|
-
enabled: Boolean = true,
|
|
239
235
|
useTintColor: Boolean = true,
|
|
240
236
|
isFull: Boolean = true,
|
|
241
237
|
modifier: Modifier = Modifier,
|
|
@@ -244,14 +240,14 @@ fun Button(
|
|
|
244
240
|
modifier
|
|
245
241
|
.fillMaxWidth()
|
|
246
242
|
.clip(RoundedCornerShape(size.value.radius)).clickable(
|
|
247
|
-
enabled =
|
|
243
|
+
enabled = type != ButtonType.DISABLED,
|
|
248
244
|
onClick = onClick
|
|
249
245
|
)
|
|
250
246
|
|
|
251
247
|
} else {
|
|
252
248
|
modifier
|
|
253
249
|
.clip(RoundedCornerShape(size.value.radius)).clickable(
|
|
254
|
-
enabled =
|
|
250
|
+
enabled = type != ButtonType.DISABLED,
|
|
255
251
|
onClick = onClick
|
|
256
252
|
)
|
|
257
253
|
}
|
|
@@ -261,7 +257,10 @@ fun Button(
|
|
|
261
257
|
.padding(horizontal = size.value.padding)
|
|
262
258
|
.defaultMinSize(
|
|
263
259
|
minWidth = size.value.width
|
|
264
|
-
).height(size.value.height)
|
|
260
|
+
).height(size.value.height)
|
|
261
|
+
.semantics {
|
|
262
|
+
contentDescription = "btn_$title"; testTag = "btn_$title"
|
|
263
|
+
},
|
|
265
264
|
horizontalArrangement = Arrangement.Center,
|
|
266
265
|
verticalAlignment = Alignment.CenterVertically,
|
|
267
266
|
) {
|
|
@@ -33,7 +33,6 @@ fun CheckBox(
|
|
|
33
33
|
var backgroundColor = AppTheme.current.colors.background.surface
|
|
34
34
|
val iconSource = if (indeterminate) "minus" else "ic_checked"
|
|
35
35
|
|
|
36
|
-
|
|
37
36
|
if (checked) {
|
|
38
37
|
borderColor = AppTheme.current.colors.primary
|
|
39
38
|
backgroundColor = AppTheme.current.colors.primary
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
package vn.momo.kits.components
|
|
2
2
|
|
|
3
|
-
import androidx.compose.foundation.layout.Box
|
|
4
|
-
import androidx.compose.foundation.layout.fillMaxSize
|
|
5
3
|
import androidx.compose.foundation.layout.size
|
|
6
4
|
import androidx.compose.runtime.Composable
|
|
7
|
-
import androidx.compose.ui.Alignment
|
|
8
5
|
import androidx.compose.ui.Modifier
|
|
9
6
|
import androidx.compose.ui.graphics.Color
|
|
10
7
|
import androidx.compose.ui.graphics.ColorFilter
|
|
11
8
|
import androidx.compose.ui.layout.ContentScale
|
|
12
9
|
import androidx.compose.ui.unit.Dp
|
|
13
10
|
import androidx.compose.ui.unit.dp
|
|
14
|
-
import coil3.compose.AsyncImage
|
|
15
11
|
import vn.momo.kits.const.AppTheme
|
|
16
12
|
import vn.momo.kits.utils.Icons
|
|
17
13
|
|
|
@@ -25,16 +21,16 @@ fun Icon(
|
|
|
25
21
|
val icon = if (source.contains("https")) {
|
|
26
22
|
source
|
|
27
23
|
} else {
|
|
28
|
-
Icons[source]
|
|
24
|
+
Icons[source] ?: ""
|
|
29
25
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
Image(
|
|
27
|
+
modifier = modifier.size(size),
|
|
28
|
+
source = icon,
|
|
29
|
+
loading = false,
|
|
30
|
+
options = Options(
|
|
35
31
|
contentScale = ContentScale.Fit,
|
|
36
32
|
colorFilter = color?.let { ColorFilter.tint(it) }
|
|
37
|
-
)
|
|
38
|
-
|
|
33
|
+
),
|
|
34
|
+
)
|
|
39
35
|
}
|
|
40
36
|
|
|
@@ -110,7 +110,7 @@ fun IconButton(
|
|
|
110
110
|
.then(getIconStyle(type))
|
|
111
111
|
.clip(RoundedCornerShape(size.value.radius))
|
|
112
112
|
.clickable(
|
|
113
|
-
enabled = type
|
|
113
|
+
enabled = type != ButtonType.DISABLED,
|
|
114
114
|
onClick = onClick
|
|
115
115
|
),
|
|
116
116
|
contentAlignment = Alignment.Center
|
|
@@ -15,7 +15,6 @@ import androidx.compose.ui.layout.ContentScale
|
|
|
15
15
|
import androidx.compose.ui.semantics.contentDescription
|
|
16
16
|
import androidx.compose.ui.semantics.semantics
|
|
17
17
|
import androidx.compose.ui.semantics.testTag
|
|
18
|
-
import androidx.compose.ui.unit.dp
|
|
19
18
|
import coil3.compose.AsyncImage
|
|
20
19
|
import vn.momo.kits.const.AppTheme
|
|
21
20
|
|
|
@@ -37,7 +36,6 @@ fun Image(
|
|
|
37
36
|
options: Options? = null,
|
|
38
37
|
loading: Boolean = true,
|
|
39
38
|
) {
|
|
40
|
-
modifier.semantics {contentDescription = "img|$source"; testTag = "img|$source"}
|
|
41
39
|
var imageOptions = Options()
|
|
42
40
|
var imageState by remember { mutableStateOf(ImageState.Loading) }
|
|
43
41
|
|
|
@@ -52,7 +50,7 @@ fun Image(
|
|
|
52
50
|
|
|
53
51
|
Box(modifier = modifier) {
|
|
54
52
|
AsyncImage(
|
|
55
|
-
modifier = modifier,
|
|
53
|
+
modifier = modifier.semantics {contentDescription = "img|$source"; testTag = "img|$source"},
|
|
56
54
|
model = source,
|
|
57
55
|
contentDescription = null,
|
|
58
56
|
contentScale = imageOptions.contentScale,
|
|
@@ -29,6 +29,9 @@ import androidx.compose.ui.Alignment
|
|
|
29
29
|
import androidx.compose.ui.Modifier
|
|
30
30
|
import androidx.compose.ui.focus.onFocusChanged
|
|
31
31
|
import androidx.compose.ui.graphics.Color
|
|
32
|
+
import androidx.compose.ui.semantics.contentDescription
|
|
33
|
+
import androidx.compose.ui.semantics.semantics
|
|
34
|
+
import androidx.compose.ui.semantics.testTag
|
|
32
35
|
import androidx.compose.ui.text.TextStyle
|
|
33
36
|
import androidx.compose.ui.text.font.FontWeight
|
|
34
37
|
import androidx.compose.ui.text.input.KeyboardType
|
|
@@ -198,7 +201,11 @@ fun Input(
|
|
|
198
201
|
iconTintColor = disabledColor
|
|
199
202
|
}
|
|
200
203
|
|
|
201
|
-
|
|
204
|
+
val testId = if (disabled) "input_${floatingValue}_disabled" else "input_$floatingValue"
|
|
205
|
+
|
|
206
|
+
Column(modifier = Modifier.semantics {
|
|
207
|
+
contentDescription = testId; testTag = testId
|
|
208
|
+
}) {
|
|
202
209
|
BasicTextField(
|
|
203
210
|
enabled = !disabled,
|
|
204
211
|
readOnly = readOnly,
|
|
@@ -21,6 +21,9 @@ import androidx.compose.runtime.setValue
|
|
|
21
21
|
import androidx.compose.ui.Alignment
|
|
22
22
|
import androidx.compose.ui.Modifier
|
|
23
23
|
import androidx.compose.ui.graphics.Color
|
|
24
|
+
import androidx.compose.ui.semantics.contentDescription
|
|
25
|
+
import androidx.compose.ui.semantics.semantics
|
|
26
|
+
import androidx.compose.ui.semantics.testTag
|
|
24
27
|
import androidx.compose.ui.text.TextStyle
|
|
25
28
|
import androidx.compose.ui.unit.dp
|
|
26
29
|
import androidx.compose.ui.unit.sp
|
|
@@ -51,7 +54,7 @@ fun InputDropDown(
|
|
|
51
54
|
loading: Boolean = false,
|
|
52
55
|
required: Boolean = false,
|
|
53
56
|
) {
|
|
54
|
-
|
|
57
|
+
val isFocused by remember { mutableStateOf(false) }
|
|
55
58
|
|
|
56
59
|
val disabledColor = AppTheme.current.colors.text.disable
|
|
57
60
|
var textColor = AppTheme.current.colors.text.default
|
|
@@ -72,8 +75,11 @@ fun InputDropDown(
|
|
|
72
75
|
iconTintColor = disabledColor
|
|
73
76
|
}
|
|
74
77
|
|
|
78
|
+
val testId = if (disabled) "input_${floatingValue}_disabled" else "input_$floatingValue"
|
|
75
79
|
|
|
76
|
-
Column(modifier = Modifier.clickable(enabled = !disabled, onClick = onPress)
|
|
80
|
+
Column(modifier = Modifier.clickable(enabled = !disabled, onClick = onPress).semantics {
|
|
81
|
+
contentDescription = testId; testTag = testId
|
|
82
|
+
}) {
|
|
77
83
|
Box {
|
|
78
84
|
if (floatingValue.isNotEmpty() || floatingIcon.isNotEmpty()) {
|
|
79
85
|
Box(
|
|
@@ -27,6 +27,9 @@ import androidx.compose.ui.Alignment
|
|
|
27
27
|
import androidx.compose.ui.Modifier
|
|
28
28
|
import androidx.compose.ui.focus.onFocusChanged
|
|
29
29
|
import androidx.compose.ui.graphics.Color
|
|
30
|
+
import androidx.compose.ui.semantics.contentDescription
|
|
31
|
+
import androidx.compose.ui.semantics.semantics
|
|
32
|
+
import androidx.compose.ui.semantics.testTag
|
|
30
33
|
import androidx.compose.ui.text.AnnotatedString
|
|
31
34
|
import androidx.compose.ui.text.TextStyle
|
|
32
35
|
import androidx.compose.ui.text.input.KeyboardType
|
|
@@ -104,8 +107,11 @@ fun InputMoney(
|
|
|
104
107
|
iconTintColor = disabledColor
|
|
105
108
|
}
|
|
106
109
|
|
|
110
|
+
val testId = if (disabled) "input_${floatingValue}_disabled" else "input_$floatingValue"
|
|
107
111
|
|
|
108
|
-
Column {
|
|
112
|
+
Column(modifier = Modifier.semantics {
|
|
113
|
+
contentDescription = testId; testTag = testId
|
|
114
|
+
}) {
|
|
109
115
|
BasicTextField(
|
|
110
116
|
enabled = !disabled,
|
|
111
117
|
singleLine = true,
|
|
@@ -123,7 +123,10 @@ fun TrustBanner(
|
|
|
123
123
|
modifier = Modifier
|
|
124
124
|
.width(64.dp)
|
|
125
125
|
.height(64.dp)
|
|
126
|
-
.padding(end = 8.dp)
|
|
126
|
+
.padding(end = 8.dp),
|
|
127
|
+
options = Options(
|
|
128
|
+
contentScale = ContentScale.Fit,
|
|
129
|
+
)
|
|
127
130
|
)
|
|
128
131
|
Column {
|
|
129
132
|
Text(
|
|
@@ -141,11 +144,17 @@ fun TrustBanner(
|
|
|
141
144
|
.padding(end = 4.dp)
|
|
142
145
|
.width(52.dp)
|
|
143
146
|
.height(20.dp)
|
|
147
|
+
,options = Options(
|
|
148
|
+
contentScale = ContentScale.Fit,
|
|
149
|
+
)
|
|
144
150
|
)
|
|
145
151
|
Image(
|
|
146
152
|
source = trustBanner.sslImage, modifier = Modifier
|
|
147
153
|
.width(52.dp)
|
|
148
|
-
.height(20.dp)
|
|
154
|
+
.height(20.dp),
|
|
155
|
+
options = Options(
|
|
156
|
+
contentScale = ContentScale.Fit,
|
|
157
|
+
)
|
|
149
158
|
)
|
|
150
159
|
}
|
|
151
160
|
Row(
|
|
@@ -106,7 +106,7 @@ val defaultTheme = Theme(
|
|
|
106
106
|
),
|
|
107
107
|
font = "SFProText",
|
|
108
108
|
assets = ThemeAssets(
|
|
109
|
-
headerBackground =
|
|
109
|
+
headerBackground = "https://static.momocdn.net/app/img/app/img/header-background.png"
|
|
110
110
|
)
|
|
111
111
|
)
|
|
112
112
|
|
|
@@ -168,5 +168,6 @@ val darkTheme = Theme(
|
|
|
168
168
|
|
|
169
169
|
|
|
170
170
|
val AppTheme = staticCompositionLocalOf { defaultTheme }
|
|
171
|
-
|
|
172
|
-
|
|
171
|
+
val AppStatusBar = staticCompositionLocalOf<Dp?> {
|
|
172
|
+
null
|
|
173
|
+
}
|
package/local.properties
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
# Location of the SDK. This is only used by Gradle.
|
|
5
5
|
# For customization when using a Version Control System, please read the
|
|
6
6
|
# header note.
|
|
7
|
-
#
|
|
8
|
-
sdk.dir=/Users/
|
|
7
|
+
#Tue Apr 23 16:40:15 ICT 2024
|
|
8
|
+
sdk.dir=/Users/hung.dao1/Library/Android/sdk
|