fix(core-ui): ensure dropdown menu items are visible on iOS (#3092)

This commit is contained in:
Kartikey Shukla 2026-01-27 23:19:16 +05:30 committed by GitHub
parent 16d6edeefe
commit 6f052759ee
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -9,23 +9,20 @@
*/
package org.mifos.mobile.core.ui.component
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.Icon
import androidx.compose.material3.MenuAnchorType
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
@ -40,6 +37,7 @@ import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
import org.mifos.mobile.core.ui.utils.DevicePreview
import template.core.base.designsystem.theme.KptTheme
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MifosDropDownTextField(
onClick: (Int, String) -> Unit,
@ -52,23 +50,23 @@ fun MifosDropDownTextField(
selectedOption: String? = null,
) {
var expanded by rememberSaveable { mutableStateOf(false) }
val interactionSource = remember { MutableInteractionSource() }
val isPressed by interactionSource.collectIsPressedAsState()
LaunchedEffect(key1 = isPressed) {
if (isPressed) expanded = true && isEnabled
}
Box(
modifier = modifier.alpha(if (!isEnabled) 0.4f else 1f),
ExposedDropdownMenuBox(
expanded = expanded && isEnabled,
onExpandedChange = {
if (isEnabled) {
expanded = !expanded
}
},
modifier = modifier.alpha(if (!isEnabled) 0.4f else 1f).fillMaxWidth(),
) {
OutlinedTextField(
value = selectedOption ?: "",
onValueChange = { },
label = { Text(stringResource(labelResId)) },
interactionSource = interactionSource,
modifier = Modifier
.fillMaxWidth(),
.fillMaxWidth()
.menuAnchor(MenuAnchorType.PrimaryNotEditable, true),
readOnly = true,
enabled = isEnabled,
textStyle = KptTheme.typography.labelMedium,
@ -95,12 +93,11 @@ fun MifosDropDownTextField(
),
)
DropdownMenu(
ExposedDropdownMenu(
expanded = expanded && isEnabled,
modifier = Modifier
.fillMaxWidth(0.92f)
.heightIn(max = DesignToken.sizes.dropDownMenuHeightInDp200),
onDismissRequest = { expanded = false },
modifier = Modifier
.heightIn(max = DesignToken.sizes.dropDownMenuHeightInDp200),
) {
optionsList.forEachIndexed { index, item ->
DropdownMenuItem(
@ -115,6 +112,7 @@ fun MifosDropDownTextField(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MifosDropDownDoubleTextField(
onClick: (Int, Pair<String, String>) -> Unit,
@ -127,23 +125,23 @@ fun MifosDropDownDoubleTextField(
selectedOption: String? = null,
) {
var expanded by rememberSaveable { mutableStateOf(false) }
val interactionSource = remember { MutableInteractionSource() }
val isPressed by interactionSource.collectIsPressedAsState()
LaunchedEffect(key1 = isPressed) {
if (isPressed) expanded = true && isEnabled
}
Box(
modifier = modifier.alpha(if (!isEnabled) 0.4f else 1f),
ExposedDropdownMenuBox(
expanded = expanded && isEnabled,
onExpandedChange = {
if (isEnabled) {
expanded = !expanded
}
},
modifier = modifier.alpha(if (!isEnabled) 0.4f else 1f).fillMaxWidth(),
) {
OutlinedTextField(
value = selectedOption ?: "",
onValueChange = { },
label = { Text(stringResource(labelResId)) },
interactionSource = interactionSource,
modifier = Modifier
.fillMaxWidth(),
.fillMaxWidth()
.menuAnchor(MenuAnchorType.PrimaryNotEditable, true),
readOnly = true,
enabled = isEnabled,
textStyle = KptTheme.typography.labelSmall,
@ -170,12 +168,11 @@ fun MifosDropDownDoubleTextField(
),
)
DropdownMenu(
ExposedDropdownMenu(
expanded = expanded && isEnabled,
modifier = Modifier
.fillMaxWidth(0.92f)
.heightIn(max = DesignToken.sizes.dropDownMenuHeightInDp200),
onDismissRequest = { expanded = false },
modifier = Modifier
.heightIn(max = DesignToken.sizes.dropDownMenuHeightInDp200),
) {
optionsList.forEachIndexed { index, item ->
DropdownMenuItem(
@ -189,7 +186,6 @@ fun MifosDropDownDoubleTextField(
Text(text = item.second)
}
},
)
}
}