mirror of https://github.com/Ashinch/ReadYou.git
105 lines
4.1 KiB
Kotlin
105 lines
4.1 KiB
Kotlin
package me.ash.reader.ui.page.home.flow
|
|
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.foundation.shape.CircleShape
|
|
import androidx.compose.foundation.text.KeyboardActions
|
|
import androidx.compose.foundation.text.KeyboardOptions
|
|
import androidx.compose.material.icons.Icons
|
|
import androidx.compose.material.icons.rounded.Close
|
|
import androidx.compose.material.icons.rounded.Search
|
|
import androidx.compose.material3.*
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.draw.alpha
|
|
import androidx.compose.ui.focus.FocusRequester
|
|
import androidx.compose.ui.focus.focusRequester
|
|
import androidx.compose.ui.graphics.Color
|
|
import androidx.compose.ui.platform.LocalFocusManager
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.text.input.ImeAction
|
|
import androidx.compose.ui.unit.dp
|
|
import me.ash.reader.R
|
|
import me.ash.reader.domain.model.constant.ElevationTokens
|
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@Composable
|
|
fun SearchBar(
|
|
value: String,
|
|
placeholder: String = "",
|
|
focusRequester: FocusRequester = remember { FocusRequester() },
|
|
onValueChange: (String) -> Unit = {},
|
|
onClose: () -> Unit = {},
|
|
) {
|
|
val focusManager = LocalFocusManager.current
|
|
|
|
Surface(
|
|
modifier = Modifier
|
|
.height(56.dp)
|
|
.padding(horizontal = 24.dp)
|
|
.fillMaxWidth(),
|
|
shape = CircleShape,
|
|
tonalElevation = ElevationTokens.Level2.dp
|
|
) {
|
|
Row(
|
|
modifier = Modifier.fillMaxSize(),
|
|
horizontalArrangement = Arrangement.SpaceBetween,
|
|
verticalAlignment = Alignment.CenterVertically,
|
|
) {
|
|
Row(
|
|
modifier = Modifier.weight(1f),
|
|
verticalAlignment = Alignment.CenterVertically,
|
|
) {
|
|
Icon(
|
|
modifier = Modifier.padding(start = 16.dp),
|
|
imageVector = Icons.Rounded.Search,
|
|
contentDescription = stringResource(R.string.search),
|
|
tint = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
)
|
|
TextField(
|
|
modifier = Modifier
|
|
.height(56.dp)
|
|
.fillMaxWidth()
|
|
.focusRequester(focusRequester),
|
|
colors = TextFieldDefaults.colors(
|
|
unfocusedTextColor = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
focusedContainerColor = Color.Transparent,
|
|
unfocusedContainerColor = Color.Transparent,
|
|
disabledContainerColor = Color.Transparent,
|
|
focusedIndicatorColor = Color.Transparent,
|
|
unfocusedIndicatorColor = Color.Transparent,
|
|
),
|
|
value = value,
|
|
onValueChange = { onValueChange(it) },
|
|
placeholder = {
|
|
Text(
|
|
modifier = Modifier.alpha(0.7f),
|
|
text = placeholder,
|
|
style = MaterialTheme.typography.bodyLarge,
|
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
)
|
|
},
|
|
textStyle = MaterialTheme.typography.bodyLarge,
|
|
singleLine = true,
|
|
keyboardOptions = KeyboardOptions(
|
|
imeAction = ImeAction.Done
|
|
),
|
|
keyboardActions = KeyboardActions(
|
|
onDone = {
|
|
focusManager.clearFocus()
|
|
}
|
|
)
|
|
)
|
|
}
|
|
IconButton(onClick = { onClose() }) {
|
|
Icon(
|
|
imageVector = Icons.Rounded.Close,
|
|
contentDescription = stringResource(R.string.clear),
|
|
tint = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|