feat(settings): implement language change

This commit is contained in:
Diego Beraldin 2023-07-27 23:22:25 +02:00
parent 8a6cb62082
commit ae99a7c2c2
25 changed files with 328 additions and 106 deletions

View File

@ -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,

View File

@ -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(

View File

@ -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(

View File

@ -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,

View File

@ -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
)

View File

@ -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
)

View File

@ -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
)

View File

@ -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()
)
}
}

View File

@ -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,
)
}
}
}
}
}

View File

@ -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(

View File

@ -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)

View File

@ -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,
)
}
}

View File

@ -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)
}
}
})
}
}
}

View File

@ -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)
}
}
}

View File

@ -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

View File

@ -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
}

View File

@ -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)
}

View File

@ -1,7 +0,0 @@
package com.github.diegoberaldin.raccoonforlemmy.resources
import org.koin.core.module.Module
expect val localizationModule: Module
expect fun getLanguageRepository(): LanguageRepository

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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()

View File

@ -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 {

View File

@ -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)

View File

@ -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() {