Skip to content

Instantly share code, notes, and snippets.

@KatieBarnett
Last active May 10, 2023 10:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KatieBarnett/5308a45bf437b02049fd4a1109bf39af to your computer and use it in GitHub Desktop.
Save KatieBarnett/5308a45bf437b02049fd4a1109bf39af to your computer and use it in GitHub Desktop.
ButtonComponent with preview parameter
data class ButtonConfig(
val buttonContent: @Composable RowScope.(Modifier) -> Unit,
val background: Color,
val contentColor: Color,
)
fun interface ButtonData {
@Composable
fun value(): ButtonConfig
}
private val primaryWithIcon = ButtonData {
ButtonConfig(
buttonContent = {
ButtonContentWithIcon(text = "Primary button with icon")
},
background = MaterialTheme.colorScheme.primary,
contentColor = MaterialTheme.colorScheme.onPrimary
)
}
private val secondaryWithIcon = ButtonData {
ButtonConfig(
buttonContent = {
ButtonContentWithIcon(text = "Secondary button with icon")
},
background = MaterialTheme.colorScheme.secondary,
contentColor = MaterialTheme.colorScheme.onSecondary
)
}
private val primaryWithoutIcon = ButtonData {
ButtonConfig(
buttonContent = {
ButtonContentWithoutIcon(text = "Primary button without icon")
},
background = MaterialTheme.colorScheme.primary,
contentColor = MaterialTheme.colorScheme.onPrimary
)
}
private val secondaryWithoutIcon = ButtonData {
ButtonConfig(
buttonContent = {
ButtonContentWithoutIcon(text = "Secondary button without icon")
},
background = MaterialTheme.colorScheme.secondary,
contentColor = MaterialTheme.colorScheme.onSecondary
)
}
class ButtonConfigProvider : PreviewParameterProvider<ButtonData> {
override val values: Sequence<ButtonData> = sequenceOf(
primaryWithIcon, secondaryWithIcon, primaryWithoutIcon, secondaryWithoutIcon
)
}
@Composable
fun RowScope.ButtonContentWithIcon(text: String) {
Icon(
imageVector = Icons.Outlined.Star,
contentDescription = "",
modifier = Modifier.padding(end = 8.dp)
)
Text(text = text)
}
@Composable
fun RowScope.ButtonContentWithoutIcon(text: String) {
Text(text = text)
}
@Composable
fun ButtonComponent(
background: Color,
contentColor: Color,
onClick: () -> Unit,
modifier: Modifier = Modifier,
content: @Composable (RowScope, Modifier) -> Unit,
) {
val buttonColors = ButtonDefaults.buttonColors(
containerColor = background,
contentColor = contentColor,
)
Button(colors = buttonColors, onClick = onClick, modifier = modifier) {
content(this, Modifier)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment