Skip to content

Commit

Permalink
Add input fields for values to MeasurementTypeForm
Browse files Browse the repository at this point in the history
  • Loading branch information
Faltenreich committed Apr 1, 2024
1 parent f82eefb commit ff4c602
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
package com.faltenreich.diaguard.measurement.type.form

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import com.faltenreich.diaguard.AppTheme
import com.faltenreich.diaguard.MR
import com.faltenreich.diaguard.measurement.unit.list.MeasurementUnitList
import com.faltenreich.diaguard.shared.di.inject
import com.faltenreich.diaguard.shared.localization.getString
import com.faltenreich.diaguard.shared.view.Divider
import com.faltenreich.diaguard.shared.view.LoadingIndicator
import com.faltenreich.diaguard.shared.view.TextDivider
import com.faltenreich.diaguard.shared.view.TextInput

@Composable
Expand All @@ -37,6 +43,7 @@ fun MeasurementTypeForm(
.padding(all = AppTheme.dimensions.padding.P_3),
)
}

if (viewState.type.property.isUserGenerated) {
item {
TextInput(
Expand All @@ -51,6 +58,81 @@ fun MeasurementTypeForm(
} else {
MeasurementUnitList(units = viewState.type.units)
}

item {
Column {
TextDivider(getString(MR.strings.values))
TextInput(
input = viewModel.minimumValue.collectAsState().value,
onInputChange = { input -> viewModel.minimumValue.value = input },
label = getString(MR.strings.value_minimum),
modifier = Modifier
.fillMaxWidth()
.padding(all = AppTheme.dimensions.padding.P_3),
maxLines = 1,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Decimal,
imeAction = ImeAction.Next,
),
)
Divider()
TextInput(
input = viewModel.lowValue.collectAsState().value,
onInputChange = { input -> viewModel.lowValue.value = input },
label = getString(MR.strings.value_low),
modifier = Modifier
.fillMaxWidth()
.padding(all = AppTheme.dimensions.padding.P_3),
maxLines = 1,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Decimal,
imeAction = ImeAction.Next,
),
)
Divider()
TextInput(
input = viewModel.targetValue.collectAsState().value,
onInputChange = { input -> viewModel.targetValue.value = input },
label = getString(MR.strings.value_target),
modifier = Modifier
.fillMaxWidth()
.padding(all = AppTheme.dimensions.padding.P_3),
maxLines = 1,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Decimal,
imeAction = ImeAction.Next,
),
)
Divider()
TextInput(
input = viewModel.highValue.collectAsState().value,
onInputChange = { input -> viewModel.highValue.value = input },
label = getString(MR.strings.value_high),
modifier = Modifier
.fillMaxWidth()
.padding(all = AppTheme.dimensions.padding.P_3),
maxLines = 1,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Decimal,
imeAction = ImeAction.Next,
),
)
Divider()
TextInput(
input = viewModel.maximumValue.collectAsState().value,
onInputChange = { input -> viewModel.maximumValue.value = input },
label = getString(MR.strings.value_maximum),
modifier = Modifier
.fillMaxWidth()
.padding(all = AppTheme.dimensions.padding.P_3),
maxLines = 1,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Decimal,
imeAction = ImeAction.Done,
),
)
}
}
}

if (viewState.showDeletionDialog) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.faltenreich.diaguard.measurement.type.form

import com.faltenreich.diaguard.datetime.factory.DateTimeConstants
import com.faltenreich.diaguard.measurement.type.MeasurementType
import com.faltenreich.diaguard.navigation.NavigateBackUseCase
import com.faltenreich.diaguard.shared.architecture.ViewModel
import com.faltenreich.diaguard.datetime.factory.DateTimeConstants
import com.faltenreich.diaguard.shared.di.inject
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collectLatest
Expand All @@ -24,6 +24,11 @@ class MeasurementTypeFormViewModel(

var typeName = MutableStateFlow("")
var unitName = MutableStateFlow("")
var minimumValue = MutableStateFlow("")
var lowValue = MutableStateFlow("")
var targetValue = MutableStateFlow("")
var highValue = MutableStateFlow("")
var maximumValue = MutableStateFlow("")

private val showDeletionDialog = MutableStateFlow(false)

Expand All @@ -49,24 +54,66 @@ class MeasurementTypeFormViewModel(
type.filterNotNull().distinctUntilChangedBy(MeasurementType::id).collectLatest { type ->
typeName.value = type.name
unitName.value = type.selectedUnit.name
minimumValue.value = type.minimumValue.toString()
lowValue.value = type.lowValue?.toString() ?: ""
targetValue.value = type.targetValue?.toString() ?: ""
highValue.value = type.highValue?.toString() ?: ""
maximumValue.value = type.maximumValue.toString()
}
}
// FIXME: Setting other flow at the same time cancels the first collector
// TODO: Format values accordingly, using MeasurementValueForDatabase/-User
// TODO: Validate input
scope.launch {
typeName.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { name ->
typeName.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { input ->
val type = (stateInScope.value as? MeasurementTypeFormViewState.Loaded)?.type
checkNotNull(type)
updateMeasurementType(type.copy(name = name))
updateMeasurementType(type.copy(name = input))
}
}
scope.launch {
unitName.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { name ->
unitName.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { input ->
val type = (stateInScope.value as? MeasurementTypeFormViewState.Loaded)?.type
checkNotNull(type)
// FIXME: Wrangles units
// updateMeasurementUnit(unit.copy(name = name))
}
}
scope.launch {
minimumValue.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { input ->
val type = (stateInScope.value as? MeasurementTypeFormViewState.Loaded)?.type
checkNotNull(type)
updateMeasurementType(type.copy(minimumValue = input.toDoubleOrNull() ?: 0.0))
}
}
scope.launch {
lowValue.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { input ->
val type = (stateInScope.value as? MeasurementTypeFormViewState.Loaded)?.type
checkNotNull(type)
updateMeasurementType(type.copy(lowValue = input.toDoubleOrNull()))
}
}
scope.launch {
targetValue.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { input ->
val type = (stateInScope.value as? MeasurementTypeFormViewState.Loaded)?.type
checkNotNull(type)
updateMeasurementType(type.copy(targetValue = input.toDoubleOrNull()))
}
}
scope.launch {
highValue.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { input ->
val type = (stateInScope.value as? MeasurementTypeFormViewState.Loaded)?.type
checkNotNull(type)
updateMeasurementType(type.copy(highValue = input.toDoubleOrNull()))
}
}
scope.launch {
maximumValue.debounce(DateTimeConstants.INPUT_DEBOUNCE).collectLatest { input ->
val type = (stateInScope.value as? MeasurementTypeFormViewState.Loaded)?.type
checkNotNull(type)
updateMeasurementType(type.copy(maximumValue = input.toDoubleOrNull() ?: 0.0))
}
}
}

override fun onIntent(intent: MeasurementTypeFormIntent) {
Expand Down
6 changes: 6 additions & 0 deletions shared/src/commonMain/moko-resources/base/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,12 @@
<string name="date_time_ago_minutes">%d minutes ago</string>
<string name="date_time_ago_hours">%d hours ago</string>
<string name="date_time_ago_days">%d days ago</string>
<string name="values">Values</string>
<string name="value_minimum">Minimum</string>
<string name="value_low">Lower bound</string>
<string name="value_target">Target</string>
<string name="value_high">Upper bound</string>
<string name="value_maximum">Maximum</string>
<string name="version">Version</string>
<string name="week">Week</string>
<string name="weight">Weight</string>
Expand Down

0 comments on commit ff4c602

Please sign in to comment.