Add TextFieldState overload to design system TextField, use it in UserStatusView

This commit is contained in:
ganfra
2026-06-15 16:05:20 +02:00
parent 73a8a3d5d8
commit 57617a362a
2 changed files with 60 additions and 5 deletions
@@ -34,7 +34,7 @@ import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.FilledTextField
import io.element.android.libraries.designsystem.theme.components.TextField
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.IconButton
import io.element.android.libraries.designsystem.theme.components.IconSource
@@ -171,12 +171,12 @@ private fun CustomStatusInputRow(
) {
ListItem(
headlineContent = {
FilledTextField(
TextField(
state = textFieldState,
placeholder = { Text(stringResource(R.string.screen_preferences_user_status_custom_hint)) },
placeholder = stringResource(R.string.screen_preferences_user_status_custom_hint),
inputTransformation = InputTransformation { if (length > 30) revertAllChanges() },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = { if (textFieldState.text.isNotBlank()) onConfirm() },
onKeyboardAction = { if (textFieldState.text.isNotBlank()) onConfirm() },
lineLimits = TextFieldLineLimits.SingleLine,
)
},
@@ -195,7 +195,8 @@ private fun CustomStatusInputRow(
Text(text = emoji, style = ElementTheme.typography.fontBodyLgRegular)
}
}
})
}),
modifier = modifier,
)
/*
@@ -24,6 +24,11 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.input.InputTransformation
import androidx.compose.foundation.text.input.KeyboardActionHandler
import androidx.compose.foundation.text.input.TextFieldDecorator
import androidx.compose.foundation.text.input.TextFieldLineLimits
import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.material3.LocalContentColor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
@@ -161,6 +166,55 @@ fun TextField(
}
}
@Composable
fun TextField(
state: TextFieldState,
modifier: Modifier = Modifier,
label: String? = null,
supportingText: String? = null,
placeholder: String? = null,
leadingIcon: @Composable (() -> Unit)? = null,
trailingIcon: @Composable (() -> Unit)? = null,
validity: TextFieldValidity = TextFieldValidity.None,
enabled: Boolean = true,
readOnly: Boolean = false,
inputTransformation: InputTransformation? = null,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
onKeyboardAction: KeyboardActionHandler? = null,
lineLimits: TextFieldLineLimits = TextFieldLineLimits.Default,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) {
val isFocused by interactionSource.collectIsFocusedAsState()
BasicTextField(
state = state,
modifier = modifier,
textStyle = textFieldStyle(enabled),
interactionSource = interactionSource,
enabled = enabled,
readOnly = readOnly,
inputTransformation = inputTransformation,
cursorBrush = SolidColor(ElementTheme.colors.textPrimary),
keyboardOptions = keyboardOptions,
onKeyboardAction = onKeyboardAction,
lineLimits = lineLimits,
decorator = TextFieldDecorator { innerTextField ->
DecorationBox(
label = label,
readOnly = readOnly,
enabled = enabled,
isFocused = isFocused,
validity = validity,
leadingIcon = leadingIcon,
placeholder = placeholder,
isTextEmpty = state.text.isEmpty(),
innerTextField = innerTextField,
trailingIcon = trailingIcon,
supportingText = supportingText,
)
}
)
}
@Composable
private fun DecorationBox(
label: String?,