Skip to content

Commit

Permalink
load other language
Browse files Browse the repository at this point in the history
  • Loading branch information
DatL4g committed Nov 14, 2023
1 parent f0c7b22 commit 3356319
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,10 @@ sealed class DialogConfig : Parcelable {
val selected: Series.Season,
val seasons: List<Series.Season>
) : DialogConfig()

@Parcelize
data class Language(
val selected: Series.Language,
val languages: List<Series.Language>
) : DialogConfig()
}
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,11 @@ private fun CompactScreen(component: SeriesComponent) {
component.showDialog(DialogConfig.Season(it, current.series.seasons))
}
},
onLanguageClick = { }
onLanguageClick = { language ->
language?.let {
component.showDialog(DialogConfig.Language(it, current.series.languages))
}
}
)
}

Expand Down Expand Up @@ -316,7 +320,11 @@ private fun DefaultScreen(component: SeriesComponent) {
component.showDialog(DialogConfig.Season(it, current.series.seasons))
}
},
onLanguageClick = { }
onLanguageClick = { language ->
language?.let {
component.showDialog(DialogConfig.Language(it, current.series.languages))
}
}
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import dev.datlag.burningseries.model.state.SeriesAction
import dev.datlag.burningseries.model.state.SeriesState
import dev.datlag.burningseries.network.state.SeriesStateMachine
import dev.datlag.burningseries.ui.navigation.DialogComponent
import dev.datlag.burningseries.ui.screen.initial.series.dialog.language.LanguageDialogComponent
import dev.datlag.burningseries.ui.screen.initial.series.dialog.season.SeasonDialogComponent
import io.ktor.client.*
import kotlinx.coroutines.flow.*
Expand Down Expand Up @@ -54,6 +55,16 @@ class SeriesScreenComponent(
onSelected = {
loadNewSeason(it)
}
) as DialogComponent
is DialogConfig.Language -> LanguageDialogComponent(
componentContext = slotContext,
di = di,
defaultLanguage = config.selected,
languages = config.languages,
onDismissed = dialogNavigation::dismiss,
onSelected = {
loadNewLanguage(it)
}
)
}
}
Expand Down Expand Up @@ -89,4 +100,10 @@ class SeriesScreenComponent(
seriesStateMachine.dispatch(SeriesAction.Load(series.hrefBuilder(season.value)))
}
}

private fun loadNewLanguage(language: Series.Language) = ioScope().launchIO {
(currentSeries.value ?: currentSeries.firstOrNull())?.let { series ->
seriesStateMachine.dispatch(SeriesAction.Load(series.hrefBuilder(language = language.value)))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package dev.datlag.burningseries.ui.screen.initial.series.dialog.language

import dev.datlag.burningseries.model.Series
import dev.datlag.burningseries.ui.navigation.DialogComponent

interface LanguageComponent : DialogComponent {

val defaultLanguage: Series.Language
val languages: List<Series.Language>

fun onConfirm(language: Series.Language)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package dev.datlag.burningseries.ui.screen.initial.series.dialog.language

import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Clear
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import dev.datlag.burningseries.shared.SharedRes
import dev.datlag.burningseries.ui.custom.CountryImage
import dev.icerock.moko.resources.compose.stringResource

@Composable
fun LanguageDialog(component: LanguageComponent) {
var selectedItem by remember { mutableStateOf(component.defaultLanguage) }

AlertDialog(
onDismissRequest = {
component.dismiss()
},
title = {
Text(
text = stringResource(SharedRes.strings.select_language),
style = MaterialTheme.typography.headlineMedium,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
softWrap = true
)
},
text = {
Column(
modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
component.languages.forEach {
val selected = selectedItem == it
Row(
modifier = Modifier.selectable(
selected = selected,
role = Role.RadioButton,
onClick = { selectedItem = it }
).fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically
) {
RadioButton(
selected = selected,
onClick = null
)
CountryImage(
code = it.value,
description = it.title,
modifier = Modifier.size(24.dp)
)
Text(
text = it.title,
overflow = TextOverflow.Ellipsis,
softWrap = true
)
}
}
}
},
confirmButton = {
Button(
onClick = {
if (component.defaultLanguage != selectedItem) {
component.onConfirm(selectedItem)
} else {
component.dismiss()
}
}
) {
Icon(
imageVector = Icons.Default.Check,
contentDescription = stringResource(SharedRes.strings.confirm),
modifier = Modifier.size(ButtonDefaults.IconSize)
)
Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing))
Text(text = stringResource(SharedRes.strings.confirm))
}
},
dismissButton = {
Button(
onClick = {
component.dismiss()
},
modifier = Modifier.padding(bottom = 8.dp),
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.errorContainer,
contentColor = MaterialTheme.colorScheme.onErrorContainer
)
) {
Icon(
imageVector = Icons.Default.Clear,
contentDescription = stringResource(SharedRes.strings.close),
modifier = Modifier.size(ButtonDefaults.IconSize)
)
Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing))
Text(text = stringResource(SharedRes.strings.close))
}
}
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package dev.datlag.burningseries.ui.screen.initial.series.dialog.language

import androidx.compose.runtime.Composable
import com.arkivanov.decompose.ComponentContext
import dev.datlag.burningseries.model.Series
import org.kodein.di.DI

class LanguageDialogComponent(
componentContext: ComponentContext,
override val di: DI,
override val defaultLanguage: Series.Language,
override val languages: List<Series.Language>,
private val onDismissed: () -> Unit,
private val onSelected: (Series.Language) -> Unit
) : LanguageComponent, ComponentContext by componentContext {

@Composable
override fun render() {
LanguageDialog(this)
}

override fun dismiss() {
onDismissed()
}

override fun onConfirm(language: Series.Language) {
onSelected(language)
dismiss()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ class SeasonDialogComponent(

override fun onConfirm(season: Series.Season) {
onSelected(season)
onDismissed()
dismiss()
}
}
1 change: 1 addition & 0 deletions app/shared/src/commonMain/resources/MR/base/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<string name="loading_search">Loading search information, please wait</string>
<string name="error_loading_search">Error while loading search information</string>
<string name="select_season">Select Season</string>
<string name="select_language">Select Language</string>
<string name="confirm">Confirm</string>
<string name="close">Close</string>
</resources>

0 comments on commit 3356319

Please sign in to comment.