Skip to content

Instantly share code, notes, and snippets.

@Sottti
Created February 3, 2025 09:55
Show Gist options
  • Save Sottti/0fc18030f3c307a55bd0116aeca14428 to your computer and use it in GitHub Desktop.
Save Sottti/0fc18030f3c307a55bd0116aeca14428 to your computer and use it in GitHub Desktop.
One of the trickiest cases to write previews
internal class ListItemAllRoundedSurfaceContentProvider :
PreviewParameterProvider<ListItemPreviewViewState> {
override val values: Sequence<ListItemPreviewViewState> =
listItemContentProviderValues(AllRounded)
}
internal class ListItemTopRoundedSurfaceContentProvider :
PreviewParameterProvider<ListItemPreviewViewState> {
override val values: Sequence<ListItemPreviewViewState> =
listItemContentProviderValues(TopRounded)
}
internal class ListItemBottomRoundedSurfaceContentProvider :
PreviewParameterProvider<ListItemPreviewViewState> {
override val values: Sequence<ListItemPreviewViewState> =
listItemContentProviderValues(BottomRounded)
}
internal class ListItemSharpSurfaceContentProvider :
PreviewParameterProvider<ListItemPreviewViewState> {
override val values: Sequence<ListItemPreviewViewState> =
listItemContentProviderValues(Sharp)
}
internal class ListItemNoneSurfaceContentProvider :
PreviewParameterProvider<ListItemPreviewViewState> {
override val values: Sequence<ListItemPreviewViewState> =
listItemContentProviderValues(None)
}
internal class ListItemWrappedSurfaceContentProvider :
PreviewParameterProvider<ListItemPreviewViewState> {
override val values: Sequence<ListItemPreviewViewState> =
listItemContentProviderValues(Wrapped)
}
private fun listItemContentProviderValues(
surface: ListItemSurfaceShape,
) = buildList {
primaryTextValues().forEach { primaryText ->
secondaryTextValues().forEach { secondaryText ->
trailingTextValues().forEach { trailingText ->
startIconValues().forEach { startIcon ->
badgeValues().forEach { badge ->
endIconResIdValues().forEach { endIconResId ->
add(
ListItemPreviewViewState(
badge = badge,
primaryText = primaryText,
modifier = Modifier.fillMaxWidth(),
secondaryText = secondaryText,
trailingText = trailingText,
startIcon = startIcon,
endIconResId = endIconResId,
onClick = { },
onEndIconClick = { },
surface = surface,
),
)
}
}
}
}
}
}
}.asSequence()
internal data class ListItemPreviewViewState(
val badge: ListItemIndicatorBadge?,
val primaryText: String,
val startIcon: ListItemStartIcon?,
val endIconColor: ListItemIconColor = NeutralMinorMuted,
val modifier: Modifier = Modifier,
val secondaryText: String? = null,
val trailingText: String? = null,
val trailingTextColor: ListItemTrailingTextStyle = OnSurfaceOrBackgroundMuted,
@DrawableRes val endIconResId: Int? = null,
val onClick: OnClick? = null,
val onEndIconClick: OnClick? = null,
val surface: ListItemSurfaceShape = None,
)
private fun primaryTextValues() =
listOf("Primary Text")
private fun secondaryTextValues() =
listOf(null, "Secondary Text")
private fun trailingTextValues() =
listOf(null, "Trailing Text")
private fun startIconValues(): List<ListItemStartIcon?> =
listOf(
null,
ListItemStartIcon(
resId = IconsR.ic_account,
style = ListItemStartIconStyle.Normal,
color = Primary,
),
ListItemStartIcon(
resId = IconsR.ic_account,
style = ListItemStartIconStyle.Wrapped,
color = Primary,
),
)
private fun badgeValues() =
listOf(
null,
ListItemIndicatorDot,
ListItemIndicatorCounter(38),
)
private fun endIconResIdValues() =
listOf(null, IconsR.ic_chevron_right_sm)
@Composable
internal fun ListItemPreview(
state: ListItemPreviewViewState,
) {
ListItem(
indicatorBadge = state.badge,
primaryText = state.primaryText,
startIcon = state.startIcon,
modifier = Modifier.fillMaxWidth(),
endIconColor = state.endIconColor,
secondaryText = state.secondaryText,
trailingText = state.trailingText,
trailingTextStyle = state.trailingTextColor,
endIconResId = state.endIconResId,
onClick = state.onClick,
onEndIconClick = state.onEndIconClick,
surface = state.surface,
)
}
@Composable
internal fun ListItemPreviewWithWrapper(
viewState: ListItemPreviewViewState,
) {
CuvvaTheme {
DesignComponentGenericPreviewWrapper {
ListItemPreview(viewState)
}
}
}
@Sottti
Copy link
Author

Sottti commented Feb 3, 2025

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment