Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(sdds-acore/uikit): Cell was implemented for compose #274

Merged
merged 4 commits into from
Feb 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading