mirror of
https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy.git
synced 2025-02-09 13:08:46 +01:00
feat(settings): implement language change
This commit is contained in:
parent
8a6cb62082
commit
ae99a7c2c2
@ -5,7 +5,6 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.composed
|
||||
import org.koin.core.parameter.parametersOf
|
||||
|
||||
fun Modifier.onClick(onClick: () -> Unit): Modifier = composed {
|
||||
clickable(indication = null,
|
||||
|
@ -30,7 +30,12 @@ fun ListingTypeBottomSheet(
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.background(MaterialTheme.colorScheme.background)
|
||||
.padding(Spacing.s),
|
||||
.padding(
|
||||
top = Spacing.s,
|
||||
start = Spacing.s,
|
||||
end = Spacing.s,
|
||||
bottom = Spacing.m,
|
||||
),
|
||||
verticalArrangement = Arrangement.spacedBy(Spacing.s)
|
||||
) {
|
||||
Text(
|
||||
|
@ -30,7 +30,12 @@ fun SortBottomSheet(
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.background(MaterialTheme.colorScheme.background)
|
||||
.padding(Spacing.s),
|
||||
.padding(
|
||||
top = Spacing.s,
|
||||
start = Spacing.s,
|
||||
end = Spacing.s,
|
||||
bottom = Spacing.m,
|
||||
),
|
||||
verticalArrangement = Arrangement.spacedBy(Spacing.s)
|
||||
) {
|
||||
Text(
|
||||
|
@ -31,12 +31,14 @@ import cafe.adriel.voyager.navigator.tab.Tab
|
||||
import cafe.adriel.voyager.navigator.tab.TabOptions
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_architecture.bindToLifecycle
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_home.viewmodel.HomeScreenMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_home.di.getHomeScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_home.modals.ListingTypeBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_home.modals.SortBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_home.viewmodel.HomeScreenMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.staticString
|
||||
import dev.icerock.moko.resources.desc.desc
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.flow.receiveAsFlow
|
||||
|
||||
@ -48,10 +50,11 @@ object HomeTab : Tab {
|
||||
override val options: TabOptions
|
||||
@Composable
|
||||
get() {
|
||||
val title = stringResource(MR.strings.navigation_home)
|
||||
val icon = rememberVectorPainter(Icons.Default.SpaceDashboard)
|
||||
|
||||
return remember {
|
||||
val languageRepository = remember { getLanguageRepository() }
|
||||
val lang by languageRepository.currentLanguage.collectAsState()
|
||||
return remember(lang) {
|
||||
val title = staticString(MR.strings.navigation_home.desc())
|
||||
TabOptions(
|
||||
index = 0u,
|
||||
title = title,
|
||||
|
@ -6,6 +6,8 @@ import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Inbox
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
@ -15,19 +17,22 @@ import cafe.adriel.voyager.navigator.tab.TabOptions
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_architecture.bindToLifecycle
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.staticString
|
||||
import dev.icerock.moko.resources.desc.desc
|
||||
|
||||
object InboxTab : Tab {
|
||||
|
||||
override val options: TabOptions
|
||||
@Composable
|
||||
get() {
|
||||
val title = stringResource(MR.strings.navigation_inbox)
|
||||
val icon = rememberVectorPainter(Icons.Default.Inbox)
|
||||
|
||||
return remember {
|
||||
val languageRepository = remember { getLanguageRepository() }
|
||||
val lang by languageRepository.currentLanguage.collectAsState()
|
||||
return remember(lang) {
|
||||
val title = staticString(MR.strings.navigation_inbox.desc())
|
||||
TabOptions(
|
||||
index = 1u,
|
||||
index = 0u,
|
||||
title = title,
|
||||
icon = icon
|
||||
)
|
||||
|
@ -6,6 +6,8 @@ import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Person
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
@ -15,19 +17,22 @@ import cafe.adriel.voyager.navigator.tab.TabOptions
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_architecture.bindToLifecycle
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.staticString
|
||||
import dev.icerock.moko.resources.desc.desc
|
||||
|
||||
object ProfileTab : Tab {
|
||||
|
||||
override val options: TabOptions
|
||||
@Composable
|
||||
get() {
|
||||
val title = stringResource(MR.strings.navigation_profile)
|
||||
val icon = rememberVectorPainter(Icons.Default.Person)
|
||||
|
||||
return remember {
|
||||
val languageRepository = remember { getLanguageRepository() }
|
||||
val lang by languageRepository.currentLanguage.collectAsState()
|
||||
return remember(lang) {
|
||||
val title = staticString(MR.strings.navigation_profile.desc())
|
||||
TabOptions(
|
||||
index = 2u,
|
||||
index = 0u,
|
||||
title = title,
|
||||
icon = icon
|
||||
)
|
||||
|
@ -6,6 +6,8 @@ import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Explore
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
@ -15,19 +17,22 @@ import cafe.adriel.voyager.navigator.tab.TabOptions
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_architecture.bindToLifecycle
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.staticString
|
||||
import dev.icerock.moko.resources.desc.desc
|
||||
|
||||
object SearchTab : Tab {
|
||||
|
||||
override val options: TabOptions
|
||||
@Composable
|
||||
get() {
|
||||
val title = stringResource(MR.strings.navigation_search)
|
||||
val icon = rememberVectorPainter(Icons.Default.Explore)
|
||||
|
||||
return remember {
|
||||
val languageRepository = remember { getLanguageRepository() }
|
||||
val lang by languageRepository.currentLanguage.collectAsState()
|
||||
return remember(lang) {
|
||||
val title = staticString(MR.strings.navigation_search.desc())
|
||||
TabOptions(
|
||||
index = 3u,
|
||||
index = 1u,
|
||||
title = title,
|
||||
icon = icon
|
||||
)
|
||||
|
@ -1,22 +1,20 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature_settings.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.repository.ThemeRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_preferences.TemporaryKeyStore
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.viewmodel.SettingsScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.viewmodel.SettingsScreenMviModel
|
||||
import org.koin.dsl.module
|
||||
import org.koin.java.KoinJavaComponent.get
|
||||
import org.koin.java.KoinJavaComponent.inject
|
||||
|
||||
actual val settingsTabModule = module {
|
||||
factory {
|
||||
SettingsScreenModel(
|
||||
themeRepository = get(ThemeRepository::class.java),
|
||||
keyStore = get(TemporaryKeyStore::class.java),
|
||||
mvi = DefaultMviModel(
|
||||
SettingsScreenMviModel.UiState()
|
||||
)
|
||||
),
|
||||
keyStore = get(),
|
||||
themeRepository = get(),
|
||||
languageRepository = get()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,63 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature_settings.modals
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import com.github.diegoberaldin.racconforlemmy.core_utils.onClick
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.ui.toLanguageName
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
|
||||
@Composable
|
||||
fun LanguageBottomSheet(
|
||||
onDismiss: (String) -> Unit,
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.background(MaterialTheme.colorScheme.background)
|
||||
.padding(
|
||||
top = Spacing.s,
|
||||
start = Spacing.s,
|
||||
end = Spacing.s,
|
||||
bottom = Spacing.m,
|
||||
),
|
||||
verticalArrangement = Arrangement.spacedBy(Spacing.s)
|
||||
) {
|
||||
Text(
|
||||
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s),
|
||||
text = stringResource(MR.strings.settings_language),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
color = MaterialTheme.colorScheme.onBackground,
|
||||
)
|
||||
val values = listOf(
|
||||
"en",
|
||||
"it",
|
||||
)
|
||||
Column(
|
||||
modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
|
||||
verticalArrangement = Arrangement.spacedBy(Spacing.xxxs)
|
||||
) {
|
||||
for (value in values) {
|
||||
Row(modifier = Modifier.padding(Spacing.s).onClick {
|
||||
onDismiss(value)
|
||||
}) {
|
||||
Text(
|
||||
text = value.toLanguageName(),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
color = MaterialTheme.colorScheme.onBackground,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -30,7 +30,12 @@ fun ThemeBottomSheet(
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.background(MaterialTheme.colorScheme.background)
|
||||
.padding(Spacing.s),
|
||||
.padding(
|
||||
top = Spacing.s,
|
||||
start = Spacing.s,
|
||||
end = Spacing.s,
|
||||
bottom = Spacing.m,
|
||||
),
|
||||
verticalArrangement = Arrangement.spacedBy(Spacing.s)
|
||||
) {
|
||||
Text(
|
||||
|
@ -2,19 +2,14 @@ package com.github.diegoberaldin.raccoonforlemmy.feature_settings.ui
|
||||
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.DarkMode
|
||||
import androidx.compose.material.icons.filled.LightMode
|
||||
import androidx.compose.material.icons.outlined.DarkMode
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import com.github.diegoberaldin.racconforlemmy.core_utils.onClick
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.data.ThemeState
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.viewmodel.SettingsScreenMviModel
|
||||
@ -25,28 +20,38 @@ import dev.icerock.moko.resources.compose.stringResource
|
||||
internal fun SettingsContent(
|
||||
uiState: SettingsScreenMviModel.UiState,
|
||||
onSelectTheme: () -> Unit,
|
||||
onSelectLanguage: () -> Unit,
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.fillMaxSize().padding(horizontal = Spacing.m),
|
||||
verticalArrangement = Arrangement.spacedBy(Spacing.xs)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.onClick {
|
||||
// theme
|
||||
SettingsRow(
|
||||
title = stringResource(MR.strings.settings_ui_theme),
|
||||
value = uiState.currentTheme.toReadableName(),
|
||||
onTap = {
|
||||
onSelectTheme()
|
||||
},
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
Text(
|
||||
text = stringResource(MR.strings.settings_ui_theme)
|
||||
)
|
||||
Spacer(modifier = Modifier.weight(1f))
|
||||
Text(
|
||||
text = uiState.currentTheme.toReadableName()
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
// language
|
||||
SettingsRow(
|
||||
title = stringResource(MR.strings.settings_language),
|
||||
value = uiState.lang.toLanguageName(),
|
||||
onTap = {
|
||||
onSelectLanguage()
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
internal fun String.toLanguageName() = when (this) {
|
||||
"it" -> stringResource(MR.strings.language_it)
|
||||
else -> stringResource(MR.strings.language_en)
|
||||
}
|
||||
|
||||
@Composable
|
||||
internal fun ThemeState.toReadableName() = when (this) {
|
||||
ThemeState.Black -> stringResource(MR.strings.settings_theme_black)
|
||||
|
@ -0,0 +1,38 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature_settings.ui
|
||||
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import com.github.diegoberaldin.racconforlemmy.core_utils.onClick
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.Spacing
|
||||
|
||||
@Composable
|
||||
internal fun SettingsRow(
|
||||
title: String,
|
||||
value: String,
|
||||
onTap: () -> Unit,
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.padding(vertical = Spacing.s)
|
||||
.onClick {
|
||||
onTap()
|
||||
},
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
Text(
|
||||
text = title,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
)
|
||||
Spacer(modifier = Modifier.weight(1f))
|
||||
Text(
|
||||
text = value,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
)
|
||||
}
|
||||
}
|
@ -12,6 +12,7 @@ import androidx.compose.material3.TopAppBar
|
||||
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.ui.Modifier
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
@ -21,10 +22,13 @@ import cafe.adriel.voyager.navigator.tab.TabOptions
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_architecture.bindToLifecycle
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.di.getSettingsScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.modals.LanguageBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.modals.ThemeBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.viewmodel.SettingsScreenMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.staticString
|
||||
import dev.icerock.moko.resources.desc.desc
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.flow.receiveAsFlow
|
||||
|
||||
@ -34,12 +38,12 @@ object SettingsTab : Tab {
|
||||
val bottomSheetFlow = bottomSheetChannel.receiveAsFlow()
|
||||
|
||||
override val options: TabOptions
|
||||
@Composable
|
||||
get() {
|
||||
val title = stringResource(MR.strings.navigation_settings)
|
||||
@Composable get() {
|
||||
val icon = rememberVectorPainter(Icons.Default.Settings)
|
||||
|
||||
return remember {
|
||||
val languageRepository = remember { getLanguageRepository() }
|
||||
val lang by languageRepository.currentLanguage.collectAsState()
|
||||
return remember(lang) {
|
||||
val title = staticString(MR.strings.navigation_settings.desc())
|
||||
TabOptions(
|
||||
index = 4u,
|
||||
title = title,
|
||||
@ -59,9 +63,14 @@ object SettingsTab : Tab {
|
||||
Scaffold(
|
||||
modifier = Modifier.padding(Spacing.xxs),
|
||||
topBar = {
|
||||
TopAppBar({
|
||||
val languageRepository = remember { getLanguageRepository() }
|
||||
val lang by languageRepository.currentLanguage.collectAsState()
|
||||
val title by remember(lang) {
|
||||
mutableStateOf(staticString(MR.strings.navigation_settings.desc()))
|
||||
}
|
||||
TopAppBar(title = {
|
||||
Text(
|
||||
text = stringResource(MR.strings.navigation_settings),
|
||||
text = title,
|
||||
style = MaterialTheme.typography.titleMedium
|
||||
)
|
||||
})
|
||||
@ -79,8 +88,15 @@ object SettingsTab : Tab {
|
||||
bottomSheetChannel.trySend(null)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
},
|
||||
onSelectLanguage = {
|
||||
bottomSheetChannel.trySend {
|
||||
LanguageBottomSheet { newValue ->
|
||||
model.reduce(SettingsScreenMviModel.Intent.ChangeLanguage(newValue))
|
||||
bottomSheetChannel.trySend(null)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,12 +8,14 @@ import com.github.diegoberaldin.raccoonforlemmy.core_architecture.DefaultMviMode
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_architecture.MviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_preferences.KeyStoreKeys
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core_preferences.TemporaryKeyStore
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.LanguageRepository
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class SettingsScreenModel(
|
||||
private val themeRepository: ThemeRepository,
|
||||
private val languageRepository: LanguageRepository,
|
||||
private val keyStore: TemporaryKeyStore,
|
||||
private val mvi: DefaultMviModel<SettingsScreenMviModel.Intent, SettingsScreenMviModel.UiState, SettingsScreenMviModel.Effect>,
|
||||
) : ScreenModel,
|
||||
@ -22,13 +24,21 @@ class SettingsScreenModel(
|
||||
override fun onStarted() {
|
||||
mvi.onStarted()
|
||||
themeRepository.state.onEach { currentTheme ->
|
||||
mvi.updateState { it.copy(currentTheme = currentTheme) }
|
||||
mvi.updateState {
|
||||
it.copy(currentTheme = currentTheme)
|
||||
}
|
||||
}.launchIn(mvi.scope)
|
||||
languageRepository.currentLanguage.onEach { lang ->
|
||||
mvi.updateState {
|
||||
it.copy(lang = lang)
|
||||
}
|
||||
}.launchIn(mvi.scope)
|
||||
}
|
||||
|
||||
override fun reduce(intent: SettingsScreenMviModel.Intent) {
|
||||
when (intent) {
|
||||
is SettingsScreenMviModel.Intent.ChangeTheme -> applyTheme(intent.value)
|
||||
is SettingsScreenMviModel.Intent.ChangeLanguage -> changeLanguage(intent.value)
|
||||
}
|
||||
}
|
||||
|
||||
@ -38,4 +48,11 @@ class SettingsScreenModel(
|
||||
keyStore.save(KeyStoreKeys.UITheme, value.toInt())
|
||||
}
|
||||
}
|
||||
|
||||
private fun changeLanguage(value: String) {
|
||||
languageRepository.changeLanguage(value)
|
||||
mvi.scope.launch {
|
||||
keyStore.save(KeyStoreKeys.Locale, value)
|
||||
}
|
||||
}
|
||||
}
|
@ -8,10 +8,12 @@ interface SettingsScreenMviModel :
|
||||
|
||||
sealed interface Intent {
|
||||
data class ChangeTheme(val value: ThemeState) : Intent
|
||||
data class ChangeLanguage(val value: String) : Intent
|
||||
}
|
||||
|
||||
data class UiState(
|
||||
val currentTheme: ThemeState = ThemeState.Light,
|
||||
val lang: String = "",
|
||||
)
|
||||
|
||||
sealed interface Effect
|
||||
|
@ -1,14 +0,0 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.resources
|
||||
|
||||
import org.koin.core.module.dsl.singleOf
|
||||
import org.koin.dsl.module
|
||||
import org.koin.java.KoinJavaComponent.inject
|
||||
|
||||
actual val localizationModule = module {
|
||||
singleOf<LanguageRepository>(::DefaultLanguageRepository)
|
||||
}
|
||||
|
||||
actual fun getLanguageRepository(): LanguageRepository {
|
||||
val res: LanguageRepository by inject(LanguageRepository::class.java)
|
||||
return res
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.resources.di
|
||||
|
||||
import android.content.Context
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.DefaultLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.LanguageRepository
|
||||
import dev.icerock.moko.resources.desc.StringDesc
|
||||
import org.koin.core.module.dsl.singleOf
|
||||
import org.koin.dsl.module
|
||||
import org.koin.java.KoinJavaComponent.inject
|
||||
|
||||
actual val localizationModule = module {
|
||||
singleOf<LanguageRepository>(::DefaultLanguageRepository)
|
||||
singleOf(::ResourceStringProvider)
|
||||
}
|
||||
|
||||
actual fun getLanguageRepository(): LanguageRepository {
|
||||
val res: LanguageRepository by inject(LanguageRepository::class.java)
|
||||
return res
|
||||
}
|
||||
|
||||
private class ResourceStringProvider(
|
||||
private val context: Context,
|
||||
) {
|
||||
fun getString(stringDesc: StringDesc): String = stringDesc.toString(context)
|
||||
}
|
||||
|
||||
actual fun staticString(stringDesc: StringDesc): String {
|
||||
val provider by inject<ResourceStringProvider>(ResourceStringProvider::class.java)
|
||||
return provider.getString(stringDesc)
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.resources
|
||||
|
||||
import org.koin.core.module.Module
|
||||
|
||||
expect val localizationModule: Module
|
||||
|
||||
expect fun getLanguageRepository(): LanguageRepository
|
@ -0,0 +1,11 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.resources.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.LanguageRepository
|
||||
import dev.icerock.moko.resources.desc.StringDesc
|
||||
import org.koin.core.module.Module
|
||||
|
||||
expect val localizationModule: Module
|
||||
|
||||
expect fun getLanguageRepository(): LanguageRepository
|
||||
|
||||
expect fun staticString(stringDesc: StringDesc): String
|
@ -35,4 +35,5 @@
|
||||
<string name="settings_theme_dark">Dark</string>
|
||||
<string name="settings_theme_light">Light</string>
|
||||
<string name="settings_theme_black">Pure black</string>
|
||||
<string name="settings_language">Language</string>
|
||||
</resources>
|
@ -3,10 +3,34 @@
|
||||
<string name="lang">it</string>
|
||||
|
||||
<string name="navigation_home">Post</string>
|
||||
<string name="navigation_inbox">Inbox</string>
|
||||
<string name="navigation_inbox">In arrivo</string>
|
||||
<string name="navigation_profile">Profilo</string>
|
||||
<string name="navigation_search">Ricerca</string>
|
||||
<string name="navigation_settings">Impostazioni</string>
|
||||
|
||||
<string name="settings_dark_theme">Tema scuro</string>
|
||||
<string name="home_listing_type_all">Tutti</string>
|
||||
<string name="home_listing_type_local">Locali</string>
|
||||
<string name="home_listing_type_subscribed">Iscrizioni</string>
|
||||
<string name="home_sort_title">Ordinamento</string>
|
||||
<string name="home_listing_title">Tipo di feed</string>
|
||||
<string name="home_sort_type_active">Attivi</string>
|
||||
<string name="home_sort_type_hot">Popolari</string>
|
||||
<string name="home_sort_type_most_comments">Più commentati</string>
|
||||
<string name="home_sort_type_new">Recenti</string>
|
||||
<string name="home_sort_type_new_comments">Commenti recenti</string>
|
||||
<string name="home_sort_type_top">Top…</string>
|
||||
<string name="home_sort_type_top_day">Top giorno</string>
|
||||
<string name="home_sort_type_top_month">Top mese</string>
|
||||
<string name="home_sort_type_top_12_hours">Top ultime 12h</string>
|
||||
<string name="home_sort_type_top_6_hours">Top ultime 6h</string>
|
||||
<string name="home_sort_type_top_hour">Top ultima ora</string>
|
||||
<string name="home_sort_type_top_week">Top settimana</string>
|
||||
<string name="home_sort_type_top_year">Top anno</string>
|
||||
<string name="home_instance_via">via %1$s</string>
|
||||
|
||||
<string name="settings_ui_theme">Tema interfaccia</string>
|
||||
<string name="settings_theme_dark">Scuro</string>
|
||||
<string name="settings_theme_light">Chiaro</string>
|
||||
<string name="settings_theme_black">Scuro (AMOLED)</string>
|
||||
<string name="settings_language">Lingua</string>
|
||||
</resources>
|
@ -1,5 +1,8 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.resources
|
||||
package com.github.diegoberaldin.raccoonforlemmy.resources.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.DefaultLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.LanguageRepository
|
||||
import dev.icerock.moko.resources.desc.StringDesc
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
import org.koin.core.module.dsl.singleOf
|
||||
@ -13,4 +16,6 @@ actual fun getLanguageRepository(): LanguageRepository = LanguageRepositoryHelpe
|
||||
|
||||
object LanguageRepositoryHelper : KoinComponent {
|
||||
val repository: LanguageRepository by inject()
|
||||
}
|
||||
}
|
||||
|
||||
actual fun staticString(stringDesc: StringDesc): String = stringDesc.localized()
|
@ -8,7 +8,7 @@ import com.github.diegoberaldin.raccoonforlemmy.feature_profile.profileTabModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_search.searchTabModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_home.di.homeTabModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.di.settingsTabModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.localizationModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.localizationModule
|
||||
import org.koin.dsl.module
|
||||
|
||||
val sharedHelperModule = module {
|
||||
|
@ -27,10 +27,11 @@ import com.github.diegoberaldin.raccoonforlemmy.feature_profile.ProfileTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_search.SearchTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.ui.SettingsTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.ui.navigation.TabNavigationItem
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import dev.icerock.moko.resources.desc.StringDesc
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.debounce
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
@ -50,7 +51,10 @@ fun App() {
|
||||
keyStore.get(KeyStoreKeys.Locale, defaultLocale)
|
||||
}
|
||||
val languageRepository = remember { getLanguageRepository() }
|
||||
languageRepository.changeLanguage(langCode)
|
||||
LaunchedEffect(Unit) {
|
||||
delay(100)
|
||||
languageRepository.changeLanguage(langCode)
|
||||
}
|
||||
|
||||
val scope = rememberCoroutineScope()
|
||||
languageRepository.currentLanguage.onEach { lang ->
|
||||
@ -65,29 +69,26 @@ fun App() {
|
||||
|
||||
val bottomSheetContent = remember { mutableStateOf<(@Composable () -> Unit)?>(null) }
|
||||
val bottomSheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
|
||||
LaunchedEffect(HomeTab) {
|
||||
HomeTab.bottomSheetFlow.debounce(250).onEach { content ->
|
||||
when {
|
||||
content != null -> {
|
||||
bottomSheetContent.value = content
|
||||
bottomSheetState.show()
|
||||
}
|
||||
|
||||
else -> bottomSheetState.hide()
|
||||
suspend fun handleBottomSheet(content: (@Composable () -> Unit)?) {
|
||||
when {
|
||||
content != null -> {
|
||||
bottomSheetContent.value = content
|
||||
bottomSheetState.show()
|
||||
}
|
||||
}.launchIn(this)
|
||||
|
||||
else -> bottomSheetState.hide()
|
||||
}
|
||||
}
|
||||
|
||||
LaunchedEffect(HomeTab) {
|
||||
HomeTab.bottomSheetFlow.debounce(250).onEach { content ->
|
||||
handleBottomSheet(content)
|
||||
}.launchIn(this)
|
||||
}
|
||||
LaunchedEffect(SettingsTab) {
|
||||
SettingsTab.bottomSheetFlow.debounce(250).onEach { content ->
|
||||
when {
|
||||
content != null -> {
|
||||
bottomSheetContent.value = content
|
||||
bottomSheetState.show()
|
||||
}
|
||||
|
||||
else -> bottomSheetState.hide()
|
||||
}
|
||||
handleBottomSheet(content)
|
||||
}.launchIn(this)
|
||||
}
|
||||
|
||||
@ -104,7 +105,7 @@ fun App() {
|
||||
},
|
||||
bottomBar = {
|
||||
BottomAppBar {
|
||||
TabNavigationItem(tab = HomeTab)
|
||||
TabNavigationItem(HomeTab)
|
||||
TabNavigationItem(SearchTab)
|
||||
TabNavigationItem(ProfileTab)
|
||||
TabNavigationItem(InboxTab)
|
||||
|
@ -8,7 +8,7 @@ import com.github.diegoberaldin.raccoonforlemmy.feature_inbox.inboxTabModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_profile.profileTabModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_search.searchTabModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature_settings.di.settingsTabModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.localizationModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.localizationModule
|
||||
import org.koin.core.context.startKoin
|
||||
|
||||
fun initKoin() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user