Move suggestion generation to ViewModel.
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing

This commit is contained in:
2023-05-11 23:40:17 +02:00
parent 2e40d0315c
commit 1e8e72557d
4 changed files with 42 additions and 20 deletions

View File

@@ -31,15 +31,6 @@ fun TypeaheadTextField(
var isFocused by remember { mutableStateOf(false) }
val focusManager = LocalFocusManager.current
var filtered = items.filter { it.isNotEmpty() && it != value }
if(value.isNotEmpty())
{
filtered = filtered.filter { it.contains(value) }
}
filtered = filtered.sorted().sortedBy { it.length }.take(5)
ExposedDropdownMenuBox(
expanded = isFocused,
modifier = modifier,
@@ -79,13 +70,13 @@ fun TypeaheadTextField(
colors = colors
)
ExposedDropdownMenu(
expanded = isFocused && filtered.isNotEmpty(),
expanded = isFocused && items.isNotEmpty(),
modifier = Modifier
.width(with(LocalDensity.current){dropDownWidth.toDp()}),
onDismissRequest = { }
) {
filtered.forEach {
items.forEach {
DropdownMenuItem(
onClick = {
onValueChange(it)

View File

@@ -35,7 +35,8 @@ fun Landscape(viewModel: ICounterViewModel) {
TeamNamesView(
viewModel.teamNameA,
viewModel.teamNameB,
viewModel.distinctTeamNames,
viewModel.teamNameSuggestionsA,
viewModel.teamNameSuggestionsB,
{ viewModel.updateNameA(it) },
{ viewModel.updateNameB(it) }
)
@@ -65,7 +66,8 @@ fun Portrait(viewModel: ICounterViewModel) {
TeamNamesView(
viewModel.teamNameA,
viewModel.teamNameB,
viewModel.distinctTeamNames,
viewModel.teamNameSuggestionsA,
viewModel.teamNameSuggestionsB,
{ viewModel.updateNameA(it) },
{ viewModel.updateNameB(it) }
)
@@ -113,7 +115,8 @@ internal class PreviewViewModel : ICounterViewModel {
override var activeValue: String = currentScoreA
override var inactiveValue: String = currentScoreB
override var keyboardHidden: Boolean = false
override val distinctTeamNames: List<String> = listOf("TeamA", "asdffd", "TeamB", "really really long Team Name that is way too long")
override val teamNameSuggestionsA: List<String> = listOf("TeamA", "asdffd", "TeamB", "really really long Team Name that is way too long")
override val teamNameSuggestionsB: List<String> = listOf("TeamA", "asdffd", "TeamB", "really really long Team Name that is way too long")
override fun focusLastInput() {
}

View File

@@ -34,7 +34,6 @@ interface IKeyBoardViewModel {
val activeValue: String
val inactiveValue: String
val keyboardHidden: Boolean
val distinctTeamNames: List<String>
fun focusLastInput()
fun updateOtherScore()
@@ -59,6 +58,8 @@ interface ICounterViewModel : IKeyBoardViewModel {
val totalScoreB: Int
val teamNameA: String
val teamNameB: String
val teamNameSuggestionsA: List<String>
val teamNameSuggestionsB: List<String>
fun updateNameA(value: String)
fun updateNameB(value: String)
@@ -109,7 +110,10 @@ class CounterViewModel @Inject constructor(
override var keyboardHidden by mutableStateOf(false)
private set
override var distinctTeamNames by mutableStateOf(listOf<String>())
override var teamNameSuggestionsA by mutableStateOf(listOf<String>())
private set
override var teamNameSuggestionsB by mutableStateOf(listOf<String>())
private set
override var activeValue: String
@@ -151,6 +155,8 @@ class CounterViewModel @Inject constructor(
private var deleteJob: Job? = null
private var distinctTeamNames = listOf<String>()
init {
viewModelScope.launch {
gameRepository.getActiveGameFlow().collect {
@@ -164,6 +170,9 @@ class CounterViewModel @Inject constructor(
teamNameA = it.game.nameA
teamNameB = it.game.nameB
buildTeamNameSuggestions()
}
}
}
@@ -171,6 +180,8 @@ class CounterViewModel @Inject constructor(
viewModelScope.launch {
gameRepository.getDistinctTeamNames().collect() {
distinctTeamNames = it
buildTeamNameSuggestions()
}
}
}
@@ -339,4 +350,20 @@ class CounterViewModel @Inject constructor(
}
}
}
private fun buildTeamNameSuggestions(){
teamNameSuggestionsA = buildTypeaheadList(distinctTeamNames, teamNameA)
teamNameSuggestionsB = buildTypeaheadList(distinctTeamNames, teamNameB)
}
private fun buildTypeaheadList(rawList: List<String>, currentInput: String ): List<String> {
var filtered = rawList.filter { it.isNotEmpty() && it != currentInput }
if(currentInput.isNotEmpty())
{
filtered = filtered.filter { it.contains(currentInput) }
}
return filtered.sorted().sortedBy { it.length }.take(10)
}
}

View File

@@ -19,7 +19,8 @@ import me.zobrist.tichucounter.ui.composables.TypeaheadTextField
fun TeamNamesView(
nameA: String,
nameB: String,
nameSuggestions: List<String>,
nameSuggestionsA: List<String>,
nameSuggestionsB: List<String>,
updateA: (String) -> Unit,
updateB: (String) -> Unit
) {
@@ -32,7 +33,7 @@ fun TeamNamesView(
TypeaheadTextField(
value = nameA,
items = nameSuggestions,
items = nameSuggestionsA,
onValueChange = { updateA(it) },
modifier = Modifier.weight(1f),
colors = color,
@@ -41,7 +42,7 @@ fun TeamNamesView(
TypeaheadTextField(
value = nameB,
items = nameSuggestions,
items = nameSuggestionsB,
onValueChange = { updateB(it) },
modifier = Modifier.weight(1f),
colors = color,
@@ -57,6 +58,6 @@ fun TeamNamesView(
@Composable
private fun TeamNamesViewPreview() {
AppTheme {
TeamNamesView("TeamA", "TeamB", listOf("Test1", "Test3"), {}, {})
TeamNamesView("TeamA", "TeamB", listOf("Test1", "Test3"), listOf("Test3", "Test5"), {}, {})
}
}