Created
February 3, 2025 09:55
-
-
Save Sottti/0fc18030f3c307a55bd0116aeca14428 to your computer and use it in GitHub Desktop.
One of the trickiest cases to write previews
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Related to https://gist.github.com/Sottti/d9933f0d7919b1c9996a2e76b7408019