Skip to content

Commit

Permalink
feat(sdds-acore/uikit): Cell was implemented for compose (#274)
Browse files Browse the repository at this point in the history
  • Loading branch information
raininforest authored Feb 20, 2025
1 parent 006e531 commit 186f153
Show file tree
Hide file tree
Showing 35 changed files with 1,944 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ import androidx.core.view.WindowCompat
import com.sdds.compose.uikit.Avatar
import com.sdds.compose.uikit.AvatarGroup
import com.sdds.compose.uikit.BasicButton
import com.sdds.compose.uikit.Cell
import com.sdds.compose.uikit.CheckBox
import com.sdds.compose.uikit.CheckBoxGroup
import com.sdds.compose.uikit.Chip
import com.sdds.compose.uikit.IconButton
import com.sdds.compose.uikit.LocalAvatarGroupStyle
import com.sdds.compose.uikit.LocalAvatarStyle
import com.sdds.compose.uikit.LocalButtonStyle
import com.sdds.compose.uikit.LocalCellStyle
import com.sdds.compose.uikit.LocalCheckBoxGroupStyle
import com.sdds.compose.uikit.LocalCheckBoxStyle
import com.sdds.compose.uikit.LocalChipStyle
Expand All @@ -44,6 +46,7 @@ import com.sdds.serv.styles.button.basic.Default
import com.sdds.serv.styles.button.basic.M
import com.sdds.serv.styles.button.icon.Default
import com.sdds.serv.styles.button.icon.M
import com.sdds.serv.styles.cell.M
import com.sdds.serv.styles.checkbox.M
import com.sdds.serv.styles.checkbox.group.M
import com.sdds.serv.styles.chip.Default
Expand Down Expand Up @@ -113,6 +116,7 @@ fun SandboxTheme(
LocalAvatarGroupStyle provides AvatarGroup.S.style(),
LocalChipStyle provides Chip.M.Default.style(),
LocalTextFieldStyle provides TextField.M.OuterLabel.Default.style(),
LocalCellStyle provides Cell.M.style(),
content = content,
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ import com.sdds.playground.sandbox.avatar.compose.group.AvatarGroupScreen
import com.sdds.playground.sandbox.buttons.compose.BasicButtonScreen
import com.sdds.playground.sandbox.buttons.compose.IconButtonScreen
import com.sdds.playground.sandbox.buttons.compose.LinkButtonScreen
import com.sdds.playground.sandbox.cell.compose.CellScreen
import com.sdds.playground.sandbox.checkbox.compose.CheckBoxScreen
import com.sdds.playground.sandbox.checkbox.compose.group.CheckBoxGroupScreen
import com.sdds.playground.sandbox.chip.compose.ChipScreen
Expand Down Expand Up @@ -106,6 +107,7 @@ private sealed class MenuItem(
object Buttons : MenuItem("BasicButton", { BasicButtonScreen(it) })
object IconButtons : MenuItem("IconButton", { IconButtonScreen(it) })
object LinkButtons : MenuItem("LinkButton", { LinkButtonScreen(it) })
object Cell : MenuItem("Cell", { CellScreen(it) })
object CheckBox : MenuItem("CheckBox", { CheckBoxScreen(it) })
object CheckBoxGroup : MenuItem("CheckBoxGroup", { CheckBoxGroupScreen(it) })
object RadioBox : MenuItem("RadioBox", { RadioBoxScreen(it) })
Expand All @@ -128,6 +130,7 @@ private val menuItems = listOf(
MenuItem.Avatar,
MenuItem.AvatarGroup,
MenuItem.Buttons,
MenuItem.Cell,
MenuItem.IconButtons,
MenuItem.LinkButtons,
MenuItem.CheckBox,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package com.sdds.playground.sandbox.cell.compose

import androidx.compose.foundation.focusable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsFocusedAsState
import androidx.compose.foundation.layout.RowScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.viewmodel.compose.viewModel
import com.sdds.compose.uikit.Avatar
import com.sdds.compose.uikit.Cell
import com.sdds.compose.uikit.CheckBox
import com.sdds.compose.uikit.Icon
import com.sdds.compose.uikit.RadioBox
import com.sdds.compose.uikit.Switch
import com.sdds.compose.uikit.internal.focusselector.LocalFocusSelectorMode
import com.sdds.compose.uikit.internal.focusselector.applyFocusSelector
import com.sdds.playground.sandbox.SandboxTheme
import com.sdds.playground.sandbox.Theme
import com.sdds.playground.sandbox.core.compose.ComponentScaffold

@Composable
internal fun CellScreen(theme: Theme.ThemeInfoCompose = Theme.composeDefault) {
val cellViewModel: CellViewModel =
viewModel(
factory = CellViewModelFactory(CellUiState(), theme),
key = theme.toString(),
)
val uiState by cellViewModel.uiState.collectAsState()

ComponentScaffold(
component = {
theme.themeWrapper {
val interactionSource = remember { MutableInteractionSource() }
val isFocused = interactionSource.collectIsFocusedAsState()
Cell(
modifier = Modifier
.focusable(interactionSource = interactionSource)
.applyFocusSelector(
focusSelectorMode = LocalFocusSelectorMode.current,
) { isFocused.value },
style = cellViewModel
.getStyleProvider()
.style(uiState.variant),
title = AnnotatedString(uiState.title),
subtitle = AnnotatedString(uiState.subtitle),
label = AnnotatedString(uiState.label),
disclosureEnabled = uiState.hasDisclosure,
disclosureText = AnnotatedString(uiState.disclosureText),
startContent = cellContent(contentType = uiState.startContent),
endContent = cellContent(contentType = uiState.endContent),
interactionSource = interactionSource,
)
}
},
propertiesOwner = cellViewModel,
)
}

@Composable
private fun cellContent(contentType: CellContent): (@Composable RowScope.() -> Unit)? {
return if (contentType != CellContent.NONE) {
{
when (contentType) {
CellContent.AVATAR -> Avatar(
painter = painterResource(id = com.sdds.icons.R.drawable.ic_scribble_diagonal_24),
)

CellContent.ICON -> Icon(
painter = painterResource(id = com.sdds.icons.R.drawable.ic_scribble_diagonal_24),
contentDescription = "",
)

CellContent.SWITCH -> @Composable {
var active by remember { mutableStateOf(false) }
Switch(active = active, onActiveChanged = { active = it })
}

CellContent.CHECKBOX -> @Composable {
var checked by remember { mutableStateOf(false) }
CheckBox(checked = checked, onCheckedChange = { checked = it })
}

CellContent.RADIOBOX -> @Composable {
var checked by remember { mutableStateOf(false) }
RadioBox(checked = checked, onClick = { checked = true })
}

CellContent.NONE -> {}
}
}
} else {
null
}
}

@Preview
@Composable
internal fun CellScreenPreview() {
SandboxTheme {
CellScreen()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.sdds.playground.sandbox.cell.compose

import com.sdds.playground.sandbox.core.compose.UiState

internal data class CellUiState(
override val variant: String = "",
val label: String = "Label",
val title: String = "Title",
val subtitle: String = "Subtitle",
val hasDisclosure: Boolean = true,
val disclosureText: String = "",
val startContent: CellContent = CellContent.AVATAR,
val endContent: CellContent = CellContent.NONE,
) : UiState {
override fun updateVariant(variant: String): UiState {
return copy(variant = variant)
}
}

internal enum class CellContent {
NONE,
AVATAR,
ICON,
SWITCH,
CHECKBOX,
RADIOBOX,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.sdds.playground.sandbox.cell.compose

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.sdds.compose.uikit.CellStyle
import com.sdds.playground.sandbox.Theme
import com.sdds.playground.sandbox.core.compose.ComponentViewModel
import com.sdds.playground.sandbox.core.compose.Property
import com.sdds.playground.sandbox.core.compose.enumProperty
import com.sdds.playground.sandbox.core.integration.ComposeStyleProvider

internal class CellViewModel(
defaultState: CellUiState,
private val theme: Theme.ThemeInfoCompose,
) : ComponentViewModel<CellUiState, CellStyle>(defaultState) {

override fun getStyleProvider(): ComposeStyleProvider<String, CellStyle> {
return theme.stylesProvider.cell
}

override fun CellUiState.toProps(): List<Property<*>> {
return listOfNotNull(
Property.StringProperty(
name = "label",
value = label,
onApply = {
internalUiState.value = internalUiState.value.copy(label = it)
},
),
Property.StringProperty(
name = "title",
value = title,
onApply = {
internalUiState.value = internalUiState.value.copy(title = it)
},
),
Property.StringProperty(
name = "subtitle",
value = subtitle,
onApply = {
internalUiState.value = internalUiState.value.copy(subtitle = it)
},
),
Property.StringProperty(
name = "disclosureText",
value = disclosureText,
onApply = {
internalUiState.value = internalUiState.value.copy(disclosureText = it)
},
),
Property.BooleanProperty(
name = "hasDisclosure",
value = hasDisclosure,
onApply = {
internalUiState.value = internalUiState.value.copy(hasDisclosure = it)
},
),
enumProperty(
name = "startContent",
value = startContent,
onApply = {
internalUiState.value = internalUiState.value.copy(startContent = it)
},
),
enumProperty(
name = "endContent",
value = endContent,
onApply = {
internalUiState.value = internalUiState.value.copy(endContent = it)
},
),
)
}
}

internal class CellViewModelFactory(
private val defaultState: CellUiState,
private val theme: Theme.ThemeInfoCompose,
) : ViewModelProvider.Factory {

@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return CellViewModel(defaultState, theme) as T
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.sdds.playground.sandbox.core.integration
import com.sdds.compose.uikit.AvatarGroupStyle
import com.sdds.compose.uikit.AvatarStyle
import com.sdds.compose.uikit.ButtonStyle
import com.sdds.compose.uikit.CellStyle
import com.sdds.compose.uikit.CheckBoxGroupStyle
import com.sdds.compose.uikit.CheckBoxStyle
import com.sdds.compose.uikit.ChipGroupStyle
Expand Down Expand Up @@ -43,4 +44,5 @@ interface StylesProviderCompose {
val switch: ComposeStyleProvider<String, SwitchStyle>

val progress: ComposeStyleProvider<String, ProgressBarStyle>
val cell: ComposeStyleProvider<String, CellStyle>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.sdds.playground.sandbox.plasma.sd.service.integration
import com.sdds.compose.uikit.AvatarGroupStyle
import com.sdds.compose.uikit.AvatarStyle
import com.sdds.compose.uikit.ButtonStyle
import com.sdds.compose.uikit.CellStyle
import com.sdds.compose.uikit.CheckBoxGroupStyle
import com.sdds.compose.uikit.CheckBoxStyle
import com.sdds.compose.uikit.ChipGroupStyle
Expand All @@ -19,6 +20,7 @@ import com.sdds.playground.sandbox.plasma.sd.service.integration.avatar.group.Pl
import com.sdds.playground.sandbox.plasma.sd.service.integration.button.basic.PlasmaSdServiceBasicButtonVariationsCompose
import com.sdds.playground.sandbox.plasma.sd.service.integration.button.icon.PlasmaSdServiceIconButtonVariationsCompose
import com.sdds.playground.sandbox.plasma.sd.service.integration.button.link.PlasmaSdServiceLinkButtonVariationsCompose
import com.sdds.playground.sandbox.plasma.sd.service.integration.cell.compose.PlasmaSdServiceCellVariationsCompose
import com.sdds.playground.sandbox.plasma.sd.service.integration.checkbox.PlasmaSdServiceCheckBoxVariationsCompose
import com.sdds.playground.sandbox.plasma.sd.service.integration.checkbox.group.PlasmaSdServiceCheckBoxGroupVariationsCompose
import com.sdds.playground.sandbox.plasma.sd.service.integration.chip.PlasmaSdServiceChipVariationsCompose
Expand Down Expand Up @@ -71,4 +73,6 @@ object PlasmaSdServiceComposeStylesProvider : StylesProviderCompose {
get() = PlasmaSdServiceSwitchVariationsCompose
override val progress: ComposeStyleProvider<String, ProgressBarStyle>
get() = PlasmaSdServiceProgressVariationsCompose
override val cell: ComposeStyleProvider<String, CellStyle>
get() = PlasmaSdServiceCellVariationsCompose
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.sdds.playground.sandbox.plasma.sd.service.integration.badge.icon.Plas
import com.sdds.playground.sandbox.plasma.sd.service.integration.button.basic.PlasmaSdServiceBasicButtonVariationsView
import com.sdds.playground.sandbox.plasma.sd.service.integration.button.icon.PlasmaSdServiceIconButtonVariationsView
import com.sdds.playground.sandbox.plasma.sd.service.integration.button.link.PlasmaSdServiceLinkButtonVariationsView
import com.sdds.playground.sandbox.plasma.sd.service.integration.cell.PlasmaSdServiceCellVariationsView
import com.sdds.playground.sandbox.plasma.sd.service.integration.cell.vs.PlasmaSdServiceCellVariationsView
import com.sdds.playground.sandbox.plasma.sd.service.integration.checkbox.PlasmaSdServiceCheckBoxVariationsView
import com.sdds.playground.sandbox.plasma.sd.service.integration.checkbox.group.PlasmaSdServiceCheckBoxGroupVariationsView
import com.sdds.playground.sandbox.plasma.sd.service.integration.chip.PlasmaSdServiceChipVariationsView
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.sdds.playground.sandbox.plasma.sd.service.integration.cell.compose

import androidx.compose.runtime.Composable
import com.sdds.compose.uikit.Cell
import com.sdds.compose.uikit.CellStyle
import com.sdds.compose.uikit.style.style
import com.sdds.plasma.sd.service.styles.cell.L
import com.sdds.plasma.sd.service.styles.cell.M
import com.sdds.plasma.sd.service.styles.cell.S
import com.sdds.plasma.sd.service.styles.cell.Xs
import com.sdds.playground.sandbox.core.integration.ComposeStyleProvider

internal object PlasmaSdServiceCellVariationsCompose : ComposeStyleProvider<String, CellStyle>() {
override val variations: Map<String, @Composable () -> CellStyle> =
mapOf(
"L" to { Cell.L.style() },
"M" to { Cell.M.style() },
"S" to { Cell.S.style() },
"Xs" to { Cell.Xs.style() },
)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sdds.playground.sandbox.plasma.sd.service.integration.cell
package com.sdds.playground.sandbox.plasma.sd.service.integration.cell.vs

import com.sdds.playground.sandbox.core.integration.ViewStyleProvider
import com.sdds.playground.sandbox.plasma.sd.service.integration.s
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.sdds.playground.sandbox.sdds.serv.integration
import com.sdds.compose.uikit.AvatarGroupStyle
import com.sdds.compose.uikit.AvatarStyle
import com.sdds.compose.uikit.ButtonStyle
import com.sdds.compose.uikit.CellStyle
import com.sdds.compose.uikit.CheckBoxGroupStyle
import com.sdds.compose.uikit.CheckBoxStyle
import com.sdds.compose.uikit.ChipGroupStyle
Expand All @@ -19,6 +20,7 @@ import com.sdds.playground.sandbox.sdds.serv.integration.avatar.group.SddsServAv
import com.sdds.playground.sandbox.sdds.serv.integration.button.basic.SddsServBasicButtonVariationsCompose
import com.sdds.playground.sandbox.sdds.serv.integration.button.icon.SddsServIconButtonVariationsCompose
import com.sdds.playground.sandbox.sdds.serv.integration.button.link.SddsServLinkButtonVariationsCompose
import com.sdds.playground.sandbox.sdds.serv.integration.cell.compose.SddsServCellVariationsCompose
import com.sdds.playground.sandbox.sdds.serv.integration.checkbox.SddsServCheckBoxVariationsCompose
import com.sdds.playground.sandbox.sdds.serv.integration.checkbox.group.SddsServCheckBoxGroupVariationsCompose
import com.sdds.playground.sandbox.sdds.serv.integration.chip.SddsServChipVariationsCompose
Expand Down Expand Up @@ -71,4 +73,6 @@ object SddsServComposeStylesProvider : StylesProviderCompose {
get() = SddsServSwitchVariationsCompose
override val progress: ComposeStyleProvider<String, ProgressBarStyle>
get() = SddsServProgressVariationsCompose
override val cell: ComposeStyleProvider<String, CellStyle>
get() = SddsServCellVariationsCompose
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.sdds.playground.sandbox.sdds.serv.integration.badge.icon.SddsServIcon
import com.sdds.playground.sandbox.sdds.serv.integration.button.basic.SddsServBasicButtonVariationsView
import com.sdds.playground.sandbox.sdds.serv.integration.button.icon.SddsServIconButtonVariationsView
import com.sdds.playground.sandbox.sdds.serv.integration.button.link.SddsServLinkButtonVariationsView
import com.sdds.playground.sandbox.sdds.serv.integration.cell.SddsServCellVariationsView
import com.sdds.playground.sandbox.sdds.serv.integration.cell.vs.SddsServCellVariationsView
import com.sdds.playground.sandbox.sdds.serv.integration.checkbox.SddsServCheckBoxVariationsView
import com.sdds.playground.sandbox.sdds.serv.integration.checkbox.group.SddsServCheckBoxGroupVariationsView
import com.sdds.playground.sandbox.sdds.serv.integration.chip.SddsServChipVariationsView
Expand Down
Loading

0 comments on commit 186f153

Please sign in to comment.