Skip to content

Commit dd95e3c

Browse files
committed
fix (*) issues with theme api
1 parent d61b61b commit dd95e3c

File tree

11 files changed

+185
-145
lines changed

11 files changed

+185
-145
lines changed

template/app/src/commonMain/kotlin/kotli/app/showcases/presentation/ShowcasesViewModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class ShowcasesViewModel : BaseViewModel() {
4949
Showcase.Header("User Flow :: Theme"),
5050
ChangeThemeShowcases.screen,
5151
ChangeThemeShowcases.dialog,
52+
ChangeThemeShowcases.bottomSheet,
5253
ToggleThemeRoute.screen,
5354
Showcase.Header("User Flow :: Passcode"),
5455
PasscodeShowcases.set,
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package kotli.app.showcases.presentation.userflow.theme.change
22

33
import kotli.app.showcases.domain.Showcase
4+
import kotli.app.theme.change.presentation.ChangeThemeBottomSheetRoute
45
import kotli.app.theme.change.presentation.ChangeThemeDialogRoute
56
import kotli.app.theme.change.presentation.ChangeThemeRoute
67

78
object ChangeThemeShowcases {
89

9-
val dialog = Showcase.Screen("Change Theme Dialog", ChangeThemeDialogRoute)
1010
val screen = Showcase.Screen("Change Theme Screen", ChangeThemeRoute)
11+
val dialog = Showcase.Screen("Change Theme Dialog", ChangeThemeDialogRoute)
12+
val bottomSheet = Showcase.Screen("Change Theme Bottom Sheet", ChangeThemeBottomSheetRoute)
1113
}

template/app/src/commonMain/kotlin/kotli/app/theme/ThemeConfig.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import androidx.navigation.NavHostController
77
import androidx.navigation.compose.composable
88
import androidx.navigation.compose.dialog
99
import kotli.app.get
10+
import kotli.app.theme.change.presentation.ChangeThemeBottomSheet
11+
import kotli.app.theme.change.presentation.ChangeThemeBottomSheetRoute
1012
import kotli.app.theme.change.presentation.ChangeThemeDialog
1113
import kotli.app.theme.change.presentation.ChangeThemeDialogRoute
1214
import kotli.app.theme.change.presentation.ChangeThemeRoute
@@ -27,6 +29,7 @@ import shared.presentation.theme.ThemeState
2729
import shared.presentation.ui.theme.DsThemes
2830

2931
fun NavGraphBuilder.theme(navController: NavHostController) {
32+
dialog<ChangeThemeBottomSheetRoute> { ChangeThemeBottomSheet(navController::back) }
3033
composable<ChangeThemeRoute> { ChangeThemeScreen(navController::back) }
3134
dialog<ChangeThemeDialogRoute> { ChangeThemeDialog() }
3235
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package kotli.app.theme.change.presentation
2+
3+
import androidx.compose.foundation.layout.padding
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.ui.Modifier
6+
import androidx.compose.ui.unit.dp
7+
import kotlinx.serialization.Serializable
8+
import shared.presentation.ui.container.DsBottomSheet
9+
import shared.presentation.viewmodel.provideViewModel
10+
11+
@Serializable
12+
object ChangeThemeBottomSheetRoute
13+
14+
@Composable
15+
fun ChangeThemeBottomSheet(onBack: () -> Unit) {
16+
val viewModel: ChangeThemeViewModel = provideViewModel()
17+
DsBottomSheet(onDismissRequest = onBack) {
18+
ChangeThemeLayout(
19+
modifier = Modifier.padding(16.dp),
20+
state = viewModel.state,
21+
onUseDark = viewModel::onUseDark,
22+
onUseLight = viewModel::onUseLight,
23+
onUseSystemDefault = viewModel::onUseSystemDefault,
24+
onEnableDynamicColors = viewModel::onEnableDynamicColors,
25+
onDisableDynamicColors = viewModel::onDisableDynamicColors
26+
)
27+
}
28+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package kotli.app.theme.change.presentation
2+
3+
import androidx.compose.runtime.Composable
4+
import kotlinx.serialization.Serializable
5+
import shared.presentation.ui.component.DsDialogContent
6+
import shared.presentation.viewmodel.provideViewModel
7+
8+
@Serializable
9+
object ChangeThemeDialogRoute
10+
11+
@Composable
12+
fun ChangeThemeDialog() {
13+
val viewModel: ChangeThemeViewModel = provideViewModel()
14+
DsDialogContent {
15+
ChangeThemeLayout(
16+
state = viewModel.state,
17+
onUseDark = viewModel::onUseDark,
18+
onUseLight = viewModel::onUseLight,
19+
onUseSystemDefault = viewModel::onUseSystemDefault,
20+
onEnableDynamicColors = viewModel::onEnableDynamicColors,
21+
onDisableDynamicColors = viewModel::onDisableDynamicColors
22+
)
23+
}
24+
}

template/app/src/commonMain/kotlin/kotli/app/theme/change/presentation/ChangeThemeDialogRoute.kt

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package kotli.app.theme.change.presentation
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.Row
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.ui.Alignment
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.unit.dp
10+
import org.jetbrains.compose.resources.stringResource
11+
import shared.presentation.ui.component.DsRadioButton
12+
import shared.presentation.ui.component.DsText
13+
import shared.presentation.ui.component.DsTextHeader
14+
import template.app.generated.resources.Res
15+
import template.app.generated.resources.theme_change_dark_mode
16+
import template.app.generated.resources.theme_change_dark_mode_off
17+
import template.app.generated.resources.theme_change_dark_mode_on
18+
import template.app.generated.resources.theme_change_dark_mode_system
19+
import template.app.generated.resources.theme_change_dynamic_color
20+
import template.app.generated.resources.theme_change_dynamic_color_off
21+
import template.app.generated.resources.theme_change_dynamic_color_on
22+
23+
@Composable
24+
fun ChangeThemeLayout(
25+
modifier: Modifier = Modifier,
26+
state: ChangeThemeState,
27+
onUseDark: () -> Unit,
28+
onUseLight: () -> Unit,
29+
onUseSystemDefault: () -> Unit,
30+
onEnableDynamicColors: () -> Unit,
31+
onDisableDynamicColors: () -> Unit,
32+
) {
33+
Column(
34+
modifier = modifier,
35+
verticalArrangement = Arrangement.spacedBy(32.dp)
36+
) {
37+
DynamicColorBlock(
38+
state = state,
39+
onEnableDynamicColors = onEnableDynamicColors,
40+
onDisableDynamicColors = onDisableDynamicColors
41+
)
42+
DarkModePreferenceBlock(
43+
state = state,
44+
onUseDark = onUseDark,
45+
onUseLight = onUseLight,
46+
onUseSystemDefault = onUseSystemDefault
47+
)
48+
}
49+
}
50+
51+
@Composable
52+
private fun DynamicColorBlock(
53+
state: ChangeThemeState,
54+
onEnableDynamicColors: () -> Unit,
55+
onDisableDynamicColors: () -> Unit,
56+
) {
57+
val dynamic = state.dynamic ?: return
58+
Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
59+
HeaderBlock(stringResource(Res.string.theme_change_dynamic_color))
60+
ToggleBlock(
61+
label = stringResource(Res.string.theme_change_dynamic_color_on),
62+
selected = dynamic,
63+
onClick = onEnableDynamicColors
64+
)
65+
ToggleBlock(
66+
label = stringResource(Res.string.theme_change_dynamic_color_off),
67+
selected = !dynamic,
68+
onClick = onDisableDynamicColors
69+
)
70+
}
71+
}
72+
73+
@Composable
74+
fun DarkModePreferenceBlock(
75+
state: ChangeThemeState,
76+
onUseDark: () -> Unit,
77+
onUseLight: () -> Unit,
78+
onUseSystemDefault: () -> Unit
79+
) {
80+
val config = state.currentConfig ?: return
81+
Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
82+
HeaderBlock(stringResource(Res.string.theme_change_dark_mode))
83+
ToggleBlock(
84+
label = stringResource(Res.string.theme_change_dark_mode_system),
85+
selected = config.autoDark,
86+
onClick = onUseSystemDefault
87+
)
88+
ToggleBlock(
89+
label = stringResource(Res.string.theme_change_dark_mode_off),
90+
selected = !config.autoDark && !config.defaultTheme.dark,
91+
onClick = onUseLight
92+
)
93+
ToggleBlock(
94+
label = stringResource(Res.string.theme_change_dark_mode_on),
95+
selected = !config.autoDark && config.defaultTheme.dark,
96+
onClick = onUseDark
97+
)
98+
}
99+
}
100+
101+
@Composable
102+
private fun HeaderBlock(title: String) {
103+
DsTextHeader(text = title)
104+
}
105+
106+
@Composable
107+
private fun ToggleBlock(label: String, selected: Boolean, onClick: () -> Unit) {
108+
Row(
109+
horizontalArrangement = Arrangement.spacedBy(8.dp),
110+
verticalAlignment = Alignment.CenterVertically
111+
) {
112+
DsRadioButton(
113+
selected = selected,
114+
onClick = onClick
115+
)
116+
DsText(text = label)
117+
}
118+
}

template/app/src/commonMain/kotlin/kotli/app/theme/change/presentation/ChangeThemeRoute.kt

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 4 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,19 @@
11
package kotli.app.theme.change.presentation
22

3-
import androidx.compose.foundation.layout.Arrangement
4-
import androidx.compose.foundation.layout.Column
5-
import androidx.compose.foundation.layout.Row
63
import androidx.compose.foundation.layout.padding
74
import androidx.compose.runtime.Composable
8-
import androidx.compose.ui.Alignment
95
import androidx.compose.ui.Modifier
106
import androidx.compose.ui.unit.dp
7+
import kotlinx.serialization.Serializable
118
import org.jetbrains.compose.resources.stringResource
12-
import shared.presentation.ui.component.DsDialogContent
13-
import shared.presentation.ui.component.DsRadioButton
14-
import shared.presentation.ui.component.DsSpacer8
15-
import shared.presentation.ui.component.DsText
16-
import shared.presentation.ui.component.DsTextHeader
179
import shared.presentation.ui.container.DsFixedTopBarColumn
1810
import shared.presentation.viewmodel.provideViewModel
1911
import template.app.generated.resources.Res
20-
import template.app.generated.resources.theme_change_dark_mode
21-
import template.app.generated.resources.theme_change_dark_mode_off
22-
import template.app.generated.resources.theme_change_dark_mode_on
23-
import template.app.generated.resources.theme_change_dark_mode_system
24-
import template.app.generated.resources.theme_change_dynamic_color
25-
import template.app.generated.resources.theme_change_dynamic_color_off
26-
import template.app.generated.resources.theme_change_dynamic_color_on
2712
import template.app.generated.resources.theme_change_title
2813

14+
@Serializable
15+
object ChangeThemeRoute
16+
2917
@Composable
3018
fun ChangeThemeScreen(onBack: () -> Unit) {
3119
val viewModel: ChangeThemeViewModel = provideViewModel()
@@ -45,118 +33,4 @@ fun ChangeThemeScreen(onBack: () -> Unit) {
4533
)
4634
}
4735
)
48-
}
49-
50-
@Composable
51-
fun ChangeThemeDialog() {
52-
val viewModel: ChangeThemeViewModel = provideViewModel()
53-
DsDialogContent {
54-
ChangeThemeLayout(
55-
state = viewModel.state,
56-
onUseDark = viewModel::onUseDark,
57-
onUseLight = viewModel::onUseLight,
58-
onUseSystemDefault = viewModel::onUseSystemDefault,
59-
onEnableDynamicColors = viewModel::onEnableDynamicColors,
60-
onDisableDynamicColors = viewModel::onDisableDynamicColors
61-
)
62-
}
63-
}
64-
65-
@Composable
66-
private fun ChangeThemeLayout(
67-
modifier: Modifier = Modifier,
68-
state: ChangeThemeState,
69-
onUseDark: () -> Unit,
70-
onUseLight: () -> Unit,
71-
onUseSystemDefault: () -> Unit,
72-
onEnableDynamicColors: () -> Unit,
73-
onDisableDynamicColors: () -> Unit,
74-
) {
75-
Column(
76-
modifier = modifier,
77-
verticalArrangement = Arrangement.spacedBy(16.dp)
78-
) {
79-
DynamicColorBlock(
80-
state = state,
81-
onEnableDynamicColors = onEnableDynamicColors,
82-
onDisableDynamicColors = onDisableDynamicColors
83-
)
84-
DarkModePreferenceBlock(
85-
state = state,
86-
onUseDark = onUseDark,
87-
onUseLight = onUseLight,
88-
onUseSystemDefault = onUseSystemDefault
89-
)
90-
}
91-
}
92-
93-
@Composable
94-
private fun DynamicColorBlock(
95-
state: ChangeThemeState,
96-
onEnableDynamicColors: () -> Unit,
97-
onDisableDynamicColors: () -> Unit,
98-
) {
99-
val dynamic = state.dynamic ?: return
100-
Column {
101-
HeaderBlock(stringResource(Res.string.theme_change_dynamic_color))
102-
DsSpacer8()
103-
ToggleBlock(
104-
label = stringResource(Res.string.theme_change_dynamic_color_on),
105-
selected = dynamic,
106-
onClick = onEnableDynamicColors
107-
)
108-
ToggleBlock(
109-
label = stringResource(Res.string.theme_change_dynamic_color_off),
110-
selected = !dynamic,
111-
onClick = onDisableDynamicColors
112-
)
113-
}
114-
}
115-
116-
@Composable
117-
fun DarkModePreferenceBlock(
118-
state: ChangeThemeState,
119-
onUseDark: () -> Unit,
120-
onUseLight: () -> Unit,
121-
onUseSystemDefault: () -> Unit
122-
) {
123-
val config = state.currentConfig ?: return
124-
Column {
125-
HeaderBlock(stringResource(Res.string.theme_change_dark_mode))
126-
DsSpacer8()
127-
ToggleBlock(
128-
label = stringResource(Res.string.theme_change_dark_mode_system),
129-
selected = config.autoDark,
130-
onClick = onUseSystemDefault
131-
)
132-
ToggleBlock(
133-
label = stringResource(Res.string.theme_change_dark_mode_off),
134-
selected = !config.autoDark && !config.defaultTheme.dark,
135-
onClick = onUseLight
136-
)
137-
ToggleBlock(
138-
label = stringResource(Res.string.theme_change_dark_mode_on),
139-
selected = !config.autoDark && config.defaultTheme.dark,
140-
onClick = onUseDark
141-
)
142-
}
143-
}
144-
145-
@Composable
146-
private fun HeaderBlock(title: String) {
147-
DsTextHeader(text = title)
148-
}
149-
150-
@Composable
151-
private fun ToggleBlock(label: String, selected: Boolean, onClick: () -> Unit) {
152-
Row(
153-
horizontalArrangement = Arrangement.spacedBy(8.dp),
154-
verticalAlignment = Alignment.CenterVertically
155-
) {
156-
DsRadioButton(
157-
selected = selected,
158-
onClick = onClick
159-
)
160-
DsText(text = label)
161-
}
16236
}

0 commit comments

Comments
 (0)