diff --git a/composeApp/src/commonMain/composeResources/values-es/strings.xml b/composeApp/src/commonMain/composeResources/values-es/strings.xml index 47bf383..cd64a06 100644 --- a/composeApp/src/commonMain/composeResources/values-es/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-es/strings.xml @@ -1,27 +1,27 @@ - - Agregar intervalo - Nombre del intervalo - Duración - Descanso - Agregar intervalo al entrenamiento - Siguiente - Intervalos en el entrenamiento - Crear y agregar entrenamiento - Disminuir repeticiones - Aumentar repeticiones - Escoge el número de repeticiones - Siguiente - Nombre del entrenamiento - Nombre del entrenamiento - Agregar entrenamiento - + + Agregar intervalo + Nombre del intervalo + Duración + Descanso + Agregar intervalo al entrenamiento + Siguiente + Intervalos en el entrenamiento + Crear entrenamiento + Disminuir repeticiones + Aumentar repeticiones + Escoge el número de repeticiones + Siguiente + Nombre del entrenamiento + Nombre del entrenamiento + Crear entrenamiento + - - Agregar entrenamiento - Siguiente - Entrenamientos - + + Crear entrenamiento + Siguiente + Elegir entrenamiento + Cancelar @@ -29,7 +29,7 @@ - [Launch BuildWorkoutsScreen] + [Choose Workout] diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 974cc7b..abf320e 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -1,27 +1,27 @@ - - Add Interval - Interval Name - Duration - Rest - Add Interval to Workout - Next - Intervals in Workout - Create and Add Workout - Decrease repetitions - Increase repetitions - Choose Number of Repetitions - Next - Name Workout - Workout Name - Add Workout - + + Add Interval + Interval Name + Duration + Rest + Add Interval to Workout + Next + Intervals in Workout + Create Workout + Decrease repetitions + Increase repetitions + Choose Number of Repetitions + Next + Name Workout + Workout Name + Create Workout + - - Add Workout - Go - Workouts - + + Create Workout + Go + Choose Workout + Cancel @@ -29,7 +29,7 @@ - Launch BuildWorkoutsScreen + Choose Workout diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutDestination.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutDestination.kt deleted file mode 100644 index 83d1fc7..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutDestination.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.majotyler.hiittimer.presentation.addWorkoutScreen - -import com.majotyler.hiittimer.domain.model.Workout - -sealed interface AddWorkoutDestination { - data class AddWorkout(val workout: Workout) : AddWorkoutDestination - data object NavigateUp : AddWorkoutDestination -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutPage.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutPage.kt deleted file mode 100644 index 0a1d265..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutPage.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.majotyler.hiittimer.presentation.addWorkoutScreen - -enum class AddWorkoutPage { - ADD_INTERVAL, - NAME_WORKOUT, - SELECT_REPS, -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewEvent.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewEvent.kt deleted file mode 100644 index 3129938..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewEvent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.majotyler.hiittimer.presentation.addWorkoutScreen - -sealed interface AddWorkoutViewEvent { - data class ChangedIntervalDuration(val seconds: String) : AddWorkoutViewEvent - data class ChangedIntervalRest(val seconds: String) : AddWorkoutViewEvent - data class ChangedIntervalName(val name: String) : AddWorkoutViewEvent - data class ChangedWorkoutName(val name: String) : AddWorkoutViewEvent - data object ClickedAddIntervalToWorkout : AddWorkoutViewEvent - data object ClickedAdvance : AddWorkoutViewEvent - data class ClickedDeleteInterval(val index: Int) : AddWorkoutViewEvent - data object ClickedNavigateUp : AddWorkoutViewEvent - data object WorkoutRepetitionsDecreased : AddWorkoutViewEvent - data object WorkoutRepetitionsIncreased : AddWorkoutViewEvent -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsDestination.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsDestination.kt deleted file mode 100644 index b59a668..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsDestination.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.majotyler.hiittimer.presentation.buildWorkouts - -import com.majotyler.hiittimer.domain.model.Workout -import com.majotyler.hiittimer.presentation.common.navigation.Destination - -sealed interface BuildWorkoutsDestination : Destination { - data object NavigateToAddWorkout : BuildWorkoutsDestination - data class NavigateToPlayWorkout( - val workouts: List, - ) : BuildWorkoutsDestination -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsScreen.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsScreen.kt deleted file mode 100644 index b4b0965..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsScreen.kt +++ /dev/null @@ -1,171 +0,0 @@ -package com.majotyler.hiittimer.presentation.buildWorkouts - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.safeDrawingPadding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Add -import androidx.compose.material3.Button -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.majotyler.hiittimer.domain.model.Workout -import com.majotyler.hiittimer.presentation.common.RowClickable -import com.majotyler.hiittimer.presentation.common.TableCard -import hiittimer.composeapp.generated.resources.Res -import hiittimer.composeapp.generated.resources.build_workouts_button_label_add_workout -import hiittimer.composeapp.generated.resources.build_workouts_button_label_go -import hiittimer.composeapp.generated.resources.build_workouts_card_header_workouts -import org.jetbrains.compose.resources.stringResource -import org.jetbrains.compose.ui.tooling.preview.Preview - - -@Preview(showBackground = true) -@Composable -fun BuildWorkoutsScreen_Preview() { - val viewModel = BuildWorkoutsViewModel( - router = {}, - ) - - BuildWorkoutsScreen(viewModel = viewModel) -} - - -@Composable -fun BuildWorkoutsScreen(viewModel: BuildWorkoutsViewModel) { - val state by viewModel.state.collectAsStateWithLifecycle() - - Column( - modifier = Modifier - .background(color = MaterialTheme.colorScheme.background) - .fillMaxSize() - .safeDrawingPadding() - .padding(horizontal = 8.dp), - verticalArrangement = Arrangement.spacedBy(space = 4.dp), - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .weight(weight = 1F), - verticalAlignment = Alignment.Top, - horizontalArrangement = Arrangement.spacedBy(space = 8.dp), - ) { - Workouts( - list = state.workouts, - modifier = Modifier - .weight(weight = 1F) - .fillMaxHeight(), - onClickedAdd = { viewModel.onEvent(event = BuildWorkoutsViewEvent.ClickedAddWorkout) }, - onDelete = { - viewModel.onEvent(event = BuildWorkoutsViewEvent.ClickedDeleteWorkout(index = it)) - }, - ) - } - StartButton( - enabled = state.enabledButtonPlayWorkouts, - ) { viewModel.onEvent(BuildWorkoutsViewEvent.ClickedGo) } - } -} - -@Composable -fun StartButton( - enabled: Boolean, - onClickedGo: () -> Unit, -) { - Button( - enabled = enabled, - shape = RoundedCornerShape(size = 12.dp), - modifier = Modifier.fillMaxWidth(), - onClick = { onClickedGo() }, - ) { - Text( - text = stringResource(resource = Res.string.build_workouts_button_label_go), - fontSize = 30.sp, - ) - } -} - -@Composable -fun Workouts( - list: List, - modifier: Modifier = Modifier, - onClickedAdd: () -> Unit, - onDelete: (index: Int) -> Unit, -) { - Column( - modifier = modifier, - ) { - TableCard( - header = stringResource(resource = Res.string.build_workouts_card_header_workouts), - content = { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - ) { - LazyColumn( - modifier = Modifier - .fillMaxWidth() - .weight(weight = 1F), - ) { - itemsIndexed(list) { index, item -> - RowClickable( - entryNo = index + 1, - text = item.name, - lines = listOf( - item.intervals.joinToString { "$it " }, - item.repetitions.toString(), - ), - onClickedRow = null, - onClickedRemove = { onDelete(index) }, - showDivider = index != list.lastIndex, - ) - } - } - HorizontalDivider() - TextButton( - onClick = onClickedAdd, - ) { - Icon( - imageVector = Icons.Default.Add, - contentDescription = null, - ) - Spacer( - modifier = Modifier.width(width = 2.dp), - ) - Text( - text = stringResource(resource = Res.string.build_workouts_button_label_add_workout), - fontWeight = FontWeight.SemiBold, - style = MaterialTheme.typography.titleLarge, - ) - } - } - }, - ) - } -} - - - diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewEvent.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewEvent.kt deleted file mode 100644 index cfa73da..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewEvent.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.majotyler.hiittimer.presentation.buildWorkouts - -import androidx.compose.runtime.Immutable -import com.majotyler.hiittimer.domain.model.Workout - -@Immutable -sealed interface BuildWorkoutsViewEvent { - data class AddedWorkout(val workout: Workout) : BuildWorkoutsViewEvent - data object ClickedAddWorkout : BuildWorkoutsViewEvent - data class ClickedDeleteWorkout(val index: Int) : BuildWorkoutsViewEvent - data object ClickedGo: BuildWorkoutsViewEvent -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewModel.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewModel.kt deleted file mode 100644 index d2a62bc..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewModel.kt +++ /dev/null @@ -1,85 +0,0 @@ -package com.majotyler.hiittimer.presentation.buildWorkouts - -import androidx.lifecycle.ViewModel -import com.majotyler.hiittimer.domain.model.Interval -import com.majotyler.hiittimer.domain.model.Workout -import com.majotyler.hiittimer.presentation.common.navigation.Router -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update - -class BuildWorkoutsViewModel( - private val router: Router, -) : ViewModel() { - - private val _state = MutableStateFlow( - value = BuildWorkoutsViewState( - enabledButtonPlayWorkouts = true, - workouts = listOf( - Workout( - intervals = listOf( - Interval( - duration = 10, - name = "Interval 1", - rest = 5, - ), - Interval( - duration = 20, - name = "Interval 2", - rest = 30, - ), - ), - name = "Workout 1", - repetitions = 1, - ) - ) - ) - ) - val state = _state.asStateFlow() - - fun onEvent(event: BuildWorkoutsViewEvent) { - when (event) { - is BuildWorkoutsViewEvent.AddedWorkout -> onAddedWorkout(event = event) - is BuildWorkoutsViewEvent.ClickedAddWorkout -> onClickedAddWorkout() - is BuildWorkoutsViewEvent.ClickedDeleteWorkout -> onClickedDeleteWorkout(event = event) - is BuildWorkoutsViewEvent.ClickedGo -> onClickedGo() - } - } - - private fun onAddedWorkout(event: BuildWorkoutsViewEvent.AddedWorkout) { - _state.update { - it.copy( - enabledButtonPlayWorkouts = true, - workouts = it.workouts + event.workout, - ) - } - } - - private fun onClickedAddWorkout() { - router.routeTo(destination = BuildWorkoutsDestination.NavigateToAddWorkout) - } - - private fun onClickedDeleteWorkout(event: BuildWorkoutsViewEvent.ClickedDeleteWorkout) { - _state.update { - val workoutsNew = it.workouts - .toMutableList() - .apply { - removeAt(event.index) - } - - it.copy( - enabledButtonPlayWorkouts = workoutsNew.isNotEmpty(), - workouts = workoutsNew, - ) - } - } - - private fun onClickedGo() { - router.routeTo( - destination = BuildWorkoutsDestination.NavigateToPlayWorkout( - workouts = _state.value.workouts, - ), - ) - } -} - \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewState.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewState.kt deleted file mode 100644 index 0ddc76a..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewState.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.majotyler.hiittimer.presentation.buildWorkouts - -import com.majotyler.hiittimer.domain.model.Workout - -data class BuildWorkoutsViewState( - val enabledButtonPlayWorkouts: Boolean, - val workouts: List, -) \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutDestination.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutDestination.kt new file mode 100644 index 0000000..97ae2d7 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutDestination.kt @@ -0,0 +1,11 @@ +package com.majotyler.hiittimer.presentation.chooseWorkout + +import com.majotyler.hiittimer.domain.model.Workout +import com.majotyler.hiittimer.presentation.common.navigation.Destination + +sealed interface ChooseWorkoutDestination : Destination { + data object NavigateToCreateWorkout : ChooseWorkoutDestination + data class NavigateToPlayWorkout( + val workout: Workout, + ) : ChooseWorkoutDestination +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutScreen.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutScreen.kt new file mode 100644 index 0000000..92645bd --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutScreen.kt @@ -0,0 +1,121 @@ +package com.majotyler.hiittimer.presentation.chooseWorkout + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.Button +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.majotyler.hiittimer.domain.model.Workout +import com.majotyler.hiittimer.presentation.common.RowClickable +import com.majotyler.hiittimer.presentation.common.TableCard +import hiittimer.composeapp.generated.resources.Res +import hiittimer.composeapp.generated.resources.choose_workout_button_label_create_workout +import hiittimer.composeapp.generated.resources.choose_workout_button_label_go +import hiittimer.composeapp.generated.resources.choose_workout_card_header_workout +import org.jetbrains.compose.resources.stringResource + + +@Composable +fun ChooseWorkoutScreen(viewModel: ChooseWorkoutViewModel) { + val state by viewModel.state.collectAsStateWithLifecycle() + + Column( + modifier = Modifier + .background(color = MaterialTheme.colorScheme.background) + .fillMaxSize() + .safeDrawingPadding() + .padding(horizontal = 8.dp), + verticalArrangement = Arrangement.spacedBy(space = 4.dp), + ) { + WorkoutCard( + workout = state.workout, + modifier = Modifier + .weight(weight = 1F) + .fillMaxWidth(), + onClickedCreate = { + viewModel.onEvent(event = ChooseWorkoutViewEvent.ClickedCreateWorkout) + }, + onClickedRemove = { + viewModel.onEvent(event = ChooseWorkoutViewEvent.ClickedRemoveWorkout) + }, + ) + Button( + enabled = state.workout != null, + shape = RoundedCornerShape(size = 12.dp), + modifier = Modifier.fillMaxWidth(), + onClick = { viewModel.onEvent(ChooseWorkoutViewEvent.ClickedGo) }, + ) { + Text( + text = stringResource(resource = Res.string.choose_workout_button_label_go), + fontSize = 30.sp, + ) + } + } +} + +@Composable +private fun WorkoutCard( + workout: Workout?, + modifier: Modifier = Modifier, + onClickedCreate: () -> Unit, + onClickedRemove: () -> Unit, +) { + Column(modifier = modifier) { + TableCard( + header = stringResource(resource = Res.string.choose_workout_card_header_workout), + content = { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + ) { + if (workout != null) { + RowClickable( + entryNo = 1, + text = workout.name, + lines = listOf( + workout.intervals.joinToString { it.name }, + workout.repetitions.toString(), + ), + onClickedRow = null, + onClickedRemove = onClickedRemove, + showDivider = false, + ) + } + HorizontalDivider() + TextButton(onClick = onClickedCreate) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + ) + Spacer(modifier = Modifier.width(width = 2.dp)) + Text( + text = stringResource(resource = Res.string.choose_workout_button_label_create_workout), + fontWeight = FontWeight.SemiBold, + style = MaterialTheme.typography.titleLarge, + ) + } + } + }, + ) + } +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewEvent.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewEvent.kt new file mode 100644 index 0000000..7deac0d --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewEvent.kt @@ -0,0 +1,12 @@ +package com.majotyler.hiittimer.presentation.chooseWorkout + +import androidx.compose.runtime.Immutable +import com.majotyler.hiittimer.domain.model.Workout + +@Immutable +sealed interface ChooseWorkoutViewEvent { + data class CreatedWorkout(val workout: Workout) : ChooseWorkoutViewEvent + data object ClickedCreateWorkout : ChooseWorkoutViewEvent + data object ClickedRemoveWorkout : ChooseWorkoutViewEvent + data object ClickedGo : ChooseWorkoutViewEvent +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewModel.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewModel.kt new file mode 100644 index 0000000..01f39a6 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewModel.kt @@ -0,0 +1,49 @@ +package com.majotyler.hiittimer.presentation.chooseWorkout + +import androidx.lifecycle.ViewModel +import com.majotyler.hiittimer.presentation.common.navigation.Router +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update + +class ChooseWorkoutViewModel( + private val router: Router, +) : ViewModel() { + + private val _state = MutableStateFlow( + value = ChooseWorkoutViewState( + workout = null, + ) + ) + val state = _state.asStateFlow() + + fun onEvent(event: ChooseWorkoutViewEvent) { + when (event) { + is ChooseWorkoutViewEvent.CreatedWorkout -> onCreatedWorkout(event = event) + is ChooseWorkoutViewEvent.ClickedCreateWorkout -> onClickedCreateWorkout() + is ChooseWorkoutViewEvent.ClickedRemoveWorkout -> onClickedRemoveWorkout() + is ChooseWorkoutViewEvent.ClickedGo -> onClickedGo() + } + } + + private fun onCreatedWorkout(event: ChooseWorkoutViewEvent.CreatedWorkout) { + _state.update { + it.copy(workout = event.workout) + } + } + + private fun onClickedRemoveWorkout() { + _state.update { it.copy(workout = null) } + } + + private fun onClickedCreateWorkout() { + router.routeTo(destination = ChooseWorkoutDestination.NavigateToCreateWorkout) + } + + private fun onClickedGo() { + val workout = _state.value.workout ?: return + router.routeTo( + destination = ChooseWorkoutDestination.NavigateToPlayWorkout(workout = workout), + ) + } +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewModelFactory.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewModelFactory.kt similarity index 63% rename from composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewModelFactory.kt rename to composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewModelFactory.kt index 84eb4ec..2b6d1dd 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/buildWorkouts/BuildWorkoutsViewModelFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewModelFactory.kt @@ -1,16 +1,16 @@ -package com.majotyler.hiittimer.presentation.buildWorkouts +package com.majotyler.hiittimer.presentation.chooseWorkout import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.CreationExtras import kotlin.reflect.KClass -class BuildWorkoutsViewModelFactory( - private val router: (BuildWorkoutsDestination) -> Unit, +class ChooseWorkoutViewModelFactory( + private val router: (ChooseWorkoutDestination) -> Unit, ) : ViewModelProvider.Factory { override fun create(modelClass: KClass, extras: CreationExtras): T { - return BuildWorkoutsViewModel( + return ChooseWorkoutViewModel( router = router, ) as T } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewState.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewState.kt new file mode 100644 index 0000000..03051a1 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/chooseWorkout/ChooseWorkoutViewState.kt @@ -0,0 +1,7 @@ +package com.majotyler.hiittimer.presentation.chooseWorkout + +import com.majotyler.hiittimer.domain.model.Workout + +data class ChooseWorkoutViewState( + val workout: Workout?, +) diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/common/navigation/NavigationRoot.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/common/navigation/NavigationRoot.kt index 62c69fc..7c6f532 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/common/navigation/NavigationRoot.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/common/navigation/NavigationRoot.kt @@ -12,14 +12,14 @@ import com.majotyler.hiittimer.data.repository.StravaTokenStorageRepository import com.majotyler.hiittimer.domain.model.Workout import com.majotyler.hiittimer.platform.UrlOpener import com.majotyler.hiittimer.presentation.common.ui.HiitAppTheme -import com.majotyler.hiittimer.presentation.buildWorkouts.BuildWorkoutsDestination -import com.majotyler.hiittimer.presentation.buildWorkouts.BuildWorkoutsViewEvent -import com.majotyler.hiittimer.presentation.buildWorkouts.BuildWorkoutsViewModel -import com.majotyler.hiittimer.presentation.buildWorkouts.BuildWorkoutsViewModelFactory -import com.majotyler.hiittimer.presentation.addWorkoutScreen.CreateWorkoutScreen -import com.majotyler.hiittimer.presentation.addWorkoutScreen.AddWorkoutDestination -import com.majotyler.hiittimer.presentation.addWorkoutScreen.AddWorkoutViewModelFactory -import com.majotyler.hiittimer.presentation.buildWorkouts.BuildWorkoutsScreen +import com.majotyler.hiittimer.presentation.chooseWorkout.ChooseWorkoutDestination +import com.majotyler.hiittimer.presentation.chooseWorkout.ChooseWorkoutViewEvent +import com.majotyler.hiittimer.presentation.chooseWorkout.ChooseWorkoutViewModel +import com.majotyler.hiittimer.presentation.chooseWorkout.ChooseWorkoutViewModelFactory +import com.majotyler.hiittimer.presentation.chooseWorkout.ChooseWorkoutScreen +import com.majotyler.hiittimer.presentation.createWorkoutScreen.CreateWorkoutScreen +import com.majotyler.hiittimer.presentation.createWorkoutScreen.CreateWorkoutDestination +import com.majotyler.hiittimer.presentation.createWorkoutScreen.CreateWorkoutViewModelFactory import com.majotyler.hiittimer.presentation.homeScreen.HomeDestination import com.majotyler.hiittimer.presentation.homeScreen.HomeScreen import com.majotyler.hiittimer.presentation.homeScreen.HomeViewModelFactory @@ -61,16 +61,16 @@ private fun HiitNavDisplay( this.serializersModule = SerializersModule { polymorphic(NavKey::class) { subclass( - subclass = Route.AddWorkout::class, - serializer = Route.AddWorkout.serializer(), + subclass = Route.CreateWorkout::class, + serializer = Route.CreateWorkout.serializer(), ) subclass( subclass = Route.Home::class, serializer = Route.Home.serializer(), ) subclass( - subclass = Route.BuildWorkouts::class, - serializer = Route.BuildWorkouts.serializer(), + subclass = Route.ChooseWorkout::class, + serializer = Route.ChooseWorkout.serializer(), ) } } @@ -81,15 +81,15 @@ private fun HiitNavDisplay( NavDisplay( backStack = backStack, entryProvider = entryProvider { - entry { navEntry -> - val viewModelFactory = AddWorkoutViewModelFactory( + entry { navEntry -> + val viewModelFactory = CreateWorkoutViewModelFactory( router = { destination -> when (destination) { - is AddWorkoutDestination.AddWorkout -> { + is CreateWorkoutDestination.CreatedWorkout -> { resultBus.sendResult(result = destination.workout) backStack.removeLast() } - AddWorkoutDestination.NavigateUp -> backStack.removeLast() + CreateWorkoutDestination.NavigateUp -> backStack.removeLast() } } ) @@ -106,8 +106,8 @@ private fun HiitNavDisplay( val viewModelFactory = HomeViewModelFactory( router = { destination -> when (destination) { - HomeDestination.NavigateToBuildWorkouts -> { - backStack.add(element = Route.BuildWorkouts) + HomeDestination.NavigateToChooseWorkout -> { + backStack.add(element = Route.ChooseWorkout) } } }, @@ -120,33 +120,34 @@ private fun HiitNavDisplay( viewModel = viewModel(factory = viewModelFactory), ) } - entry { - val viewModelFactory = BuildWorkoutsViewModelFactory( + + entry { + val viewModelFactory = ChooseWorkoutViewModelFactory( router = { destination -> when (destination) { - is BuildWorkoutsDestination.NavigateToAddWorkout -> - backStack.add(element = Route.AddWorkout) + is ChooseWorkoutDestination.NavigateToCreateWorkout -> + backStack.add(element = Route.CreateWorkout) - is BuildWorkoutsDestination.NavigateToPlayWorkout -> { + is ChooseWorkoutDestination.NavigateToPlayWorkout -> { backStack.add( - element = Route.PlayWorkout(workouts = destination.workouts), + element = Route.PlayWorkout(workout = destination.workout), ) } } } ) - val viewModel: BuildWorkoutsViewModel = viewModel( + val viewModel: ChooseWorkoutViewModel = viewModel( factory = viewModelFactory, ) ResultEffect(resultBus) { workout -> viewModel.onEvent( - event = BuildWorkoutsViewEvent.AddedWorkout(workout = workout) + event = ChooseWorkoutViewEvent.CreatedWorkout(workout = workout) ) } - BuildWorkoutsScreen( + ChooseWorkoutScreen( viewModel = viewModel(factory = viewModelFactory), ) } @@ -158,7 +159,7 @@ private fun HiitNavDisplay( PlayWorkoutDestination.NavigateUp -> backStack.removeLast() } }, - workouts = route.workouts, + workout = route.workout, ) PlayWorkoutScreen( @@ -170,4 +171,4 @@ private fun HiitNavDisplay( } } ) -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/common/navigation/Route.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/common/navigation/Route.kt index d947370..523b53f 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/common/navigation/Route.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/common/navigation/Route.kt @@ -13,16 +13,16 @@ import kotlinx.serialization.Serializable @Serializable sealed interface Route : NavKey { @Serializable - data object AddWorkout : Route + data object CreateWorkout : Route @Serializable - data object BuildWorkouts : Route + data object ChooseWorkout : Route @Serializable data object Home : Route @Serializable data class PlayWorkout( - val workouts: List, + val workout: Workout, ) : Route -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createRepeaterScreen/CreateRepeaterScreen.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createRepeaterScreen/CreateRepeaterScreen.kt deleted file mode 100644 index 227f586..0000000 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createRepeaterScreen/CreateRepeaterScreen.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.majotyler.hiittimer.presentation.createRepeaterScreen - -import androidx.compose.runtime.Composable - -@Composable -fun CreateRepeaterScreen() { - -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutDestination.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutDestination.kt new file mode 100644 index 0000000..0937e46 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutDestination.kt @@ -0,0 +1,8 @@ +package com.majotyler.hiittimer.presentation.createWorkoutScreen + +import com.majotyler.hiittimer.domain.model.Workout + +sealed interface CreateWorkoutDestination { + data class CreatedWorkout(val workout: Workout) : CreateWorkoutDestination + data object NavigateUp : CreateWorkoutDestination +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutPage.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutPage.kt new file mode 100644 index 0000000..171aec3 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutPage.kt @@ -0,0 +1,7 @@ +package com.majotyler.hiittimer.presentation.createWorkoutScreen + +enum class CreateWorkoutPage { + ADD_INTERVAL, + NAME_WORKOUT, + SELECT_REPS, +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutScreen.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutScreen.kt similarity index 63% rename from composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutScreen.kt rename to composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutScreen.kt index eae6cd7..907e69b 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutScreen.kt @@ -1,4 +1,4 @@ -package com.majotyler.hiittimer.presentation.addWorkoutScreen +package com.majotyler.hiittimer.presentation.createWorkoutScreen import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.Arrangement @@ -14,6 +14,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Add @@ -35,7 +36,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -45,21 +45,21 @@ import com.majotyler.hiittimer.presentation.common.TableCard import com.majotyler.hiittimer.presentation.common.expect.BackHandler import com.majotyler.hiittimer.presentation.common.ui.HiitAppTheme import hiittimer.composeapp.generated.resources.Res -import hiittimer.composeapp.generated.resources.add_workout_add_interval_button_label_add_interval -import hiittimer.composeapp.generated.resources.add_workout_add_interval_button_label_advance -import hiittimer.composeapp.generated.resources.add_workout_add_interval_duration_label -import hiittimer.composeapp.generated.resources.add_workout_add_interval_interval_name_label -import hiittimer.composeapp.generated.resources.add_workout_add_interval_rest_label -import hiittimer.composeapp.generated.resources.add_workout_add_interval_title -import hiittimer.composeapp.generated.resources.add_workout_add_interval_workout_preview_title -import hiittimer.composeapp.generated.resources.add_workout_create_reps_button_label_advance -import hiittimer.composeapp.generated.resources.add_workout_create_reps_content_description_decrease_repetitions -import hiittimer.composeapp.generated.resources.add_workout_create_reps_content_description_increase_repetitions -import hiittimer.composeapp.generated.resources.add_workout_create_reps_title -import hiittimer.composeapp.generated.resources.add_workout_name_workout_button_label_advance -import hiittimer.composeapp.generated.resources.add_workout_name_workout_label -import hiittimer.composeapp.generated.resources.add_workout_name_workout_title -import hiittimer.composeapp.generated.resources.add_workout_toolbar_title +import hiittimer.composeapp.generated.resources.create_workout_add_interval_button_label_add_interval +import hiittimer.composeapp.generated.resources.create_workout_add_interval_button_label_advance +import hiittimer.composeapp.generated.resources.create_workout_add_interval_duration_label +import hiittimer.composeapp.generated.resources.create_workout_add_interval_interval_name_label +import hiittimer.composeapp.generated.resources.create_workout_add_interval_rest_label +import hiittimer.composeapp.generated.resources.create_workout_add_interval_title +import hiittimer.composeapp.generated.resources.create_workout_add_interval_workout_preview_title +import hiittimer.composeapp.generated.resources.create_workout_create_reps_button_label_advance +import hiittimer.composeapp.generated.resources.create_workout_create_reps_content_description_decrease_repetitions +import hiittimer.composeapp.generated.resources.create_workout_create_reps_content_description_increase_repetitions +import hiittimer.composeapp.generated.resources.create_workout_create_reps_title +import hiittimer.composeapp.generated.resources.create_workout_name_workout_button_label_advance +import hiittimer.composeapp.generated.resources.create_workout_name_workout_label +import hiittimer.composeapp.generated.resources.create_workout_name_workout_title +import hiittimer.composeapp.generated.resources.create_workout_toolbar_title import hiittimer.composeapp.generated.resources.content_description_navigate_up import hiittimer.composeapp.generated.resources.interval_duration_label import hiittimer.composeapp.generated.resources.interval_rest_label @@ -74,7 +74,7 @@ import org.jetbrains.compose.ui.tooling.preview.PreviewParameterProvider @OptIn(ExperimentalComposeUiApi::class) @Composable fun CreateWorkoutScreen( - viewModel: AddWorkoutViewModel, + viewModel: CreateWorkoutViewModel, ) { val enabledAddExercise = viewModel.enabledAddInterval.collectAsStateWithLifecycle() val enabledAdvance = viewModel.enabledAdvance.collectAsStateWithLifecycle() @@ -105,34 +105,34 @@ fun CreateWorkoutScreen( secondsDuration = secondsDuration.value, secondsRest = secondsRest.value, onIntervalNameChanged = { - viewModel.onEvent(event = AddWorkoutViewEvent.ChangedIntervalName(name = it)) + viewModel.onEvent(event = CreateWorkoutViewEvent.ChangedIntervalName(name = it)) }, onWorkoutNameChanged = { - viewModel.onEvent(event = AddWorkoutViewEvent.ChangedWorkoutName(name = it)) + viewModel.onEvent(event = CreateWorkoutViewEvent.ChangedWorkoutName(name = it)) }, onIntervalDurationChanged = { - viewModel.onEvent(event = AddWorkoutViewEvent.ChangedIntervalDuration(seconds = it)) + viewModel.onEvent(event = CreateWorkoutViewEvent.ChangedIntervalDuration(seconds = it)) }, onIntervalRestChanged = { - viewModel.onEvent(event = AddWorkoutViewEvent.ChangedIntervalRest(seconds = it)) + viewModel.onEvent(event = CreateWorkoutViewEvent.ChangedIntervalRest(seconds = it)) }, onRepetitionsDecreased = { - viewModel.onEvent(event = AddWorkoutViewEvent.WorkoutRepetitionsDecreased) + viewModel.onEvent(event = CreateWorkoutViewEvent.WorkoutRepetitionsDecreased) }, onRepetitionsIncreased = { - viewModel.onEvent(event = AddWorkoutViewEvent.WorkoutRepetitionsIncreased) + viewModel.onEvent(event = CreateWorkoutViewEvent.WorkoutRepetitionsIncreased) }, onClickedAddInterval = { - viewModel.onEvent(event = AddWorkoutViewEvent.ClickedAddIntervalToWorkout) + viewModel.onEvent(event = CreateWorkoutViewEvent.ClickedAddIntervalToWorkout) }, onClickedBottomBarButton = { - viewModel.onEvent(event = AddWorkoutViewEvent.ClickedAdvance) + viewModel.onEvent(event = CreateWorkoutViewEvent.ClickedAdvance) }, onClickedNavigateUp = { - viewModel.onEvent(event = AddWorkoutViewEvent.ClickedNavigateUp) + viewModel.onEvent(event = CreateWorkoutViewEvent.ClickedNavigateUp) }, onClickedRemoveInterval = { - viewModel.onEvent(event = AddWorkoutViewEvent.ClickedDeleteInterval(index = it)) + viewModel.onEvent(event = CreateWorkoutViewEvent.ClickedDeleteInterval(index = it)) } ) } @@ -147,7 +147,7 @@ private fun CreateWorkoutScreenContent( nameInterval: String, nameWorkout: String, workoutRepetitions: Int, - page: AddWorkoutPage, + page: CreateWorkoutPage, secondsDuration: Int, secondsRest: Int, onClickedAddInterval: () -> Unit, @@ -168,12 +168,10 @@ private fun CreateWorkoutScreenContent( topBar = { TopAppBar( title = { - Text(text = stringResource(resource = Res.string.add_workout_toolbar_title)) + Text(text = stringResource(resource = Res.string.create_workout_toolbar_title)) }, navigationIcon = { - IconButton( - onClick = onClickedNavigateUp, - ) { + IconButton(onClick = onClickedNavigateUp) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource( @@ -185,40 +183,29 @@ private fun CreateWorkoutScreenContent( ) }, bottomBar = { - BottomAppBar( - content = { - Box( - contentAlignment = Alignment.Center, - modifier = Modifier.fillMaxWidth(), + BottomAppBar { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.fillMaxWidth(), + ) { + Button( + enabled = bottomBarButtonIsEnabled, + onClick = onClickedBottomBarButton, ) { - Button( - enabled = bottomBarButtonIsEnabled, - onClick = onClickedBottomBarButton, - ) { - Text( - text = stringResource( - resource = when (page) { - AddWorkoutPage.ADD_INTERVAL -> Res - .string - .add_workout_add_interval_button_label_advance - - AddWorkoutPage.NAME_WORKOUT -> Res - .string - .add_workout_name_workout_button_label_advance - - AddWorkoutPage.SELECT_REPS -> Res - .string - .add_workout_create_reps_button_label_advance - } - ), - ) - } + Text( + text = stringResource( + resource = when (page) { + CreateWorkoutPage.ADD_INTERVAL -> Res.string.create_workout_add_interval_button_label_advance + CreateWorkoutPage.NAME_WORKOUT -> Res.string.create_workout_name_workout_button_label_advance + CreateWorkoutPage.SELECT_REPS -> Res.string.create_workout_create_reps_button_label_advance + } + ), + ) } - }, - ) + } + } } ) { innerPadding -> - Column( modifier = Modifier .fillMaxSize() @@ -228,7 +215,7 @@ private fun CreateWorkoutScreenContent( val pagerState = rememberPagerState( initialPage = page.ordinal, - pageCount = { AddWorkoutPage.entries.size }, + pageCount = { CreateWorkoutPage.entries.size }, ) LaunchedEffect(page) { @@ -242,8 +229,7 @@ private fun CreateWorkoutScreenContent( userScrollEnabled = false, state = pagerState, ) { pageOrdinal -> - - val page = AddWorkoutPage.entries.get(index = pageOrdinal) + val page = CreateWorkoutPage.entries[pageOrdinal] Column( modifier = Modifier @@ -252,7 +238,7 @@ private fun CreateWorkoutScreenContent( verticalArrangement = Arrangement.spacedBy(space = 8.dp), ) { when (page) { - AddWorkoutPage.ADD_INTERVAL -> CreateWorkoutPageAddIntervals( + CreateWorkoutPage.ADD_INTERVAL -> CreateWorkoutPageAddIntervals( addIntervalButtonIsEnabled = addIntervalButtonIsEnabled, intervals = intervals, nameInterval = nameInterval, @@ -265,12 +251,12 @@ private fun CreateWorkoutScreenContent( onIntervalNameChanged = onIntervalNameChanged, ) - AddWorkoutPage.NAME_WORKOUT -> CreateWorkoutPageNameWorkout( + CreateWorkoutPage.NAME_WORKOUT -> CreateWorkoutPageNameWorkout( nameWorkout = nameWorkout, onWorkoutNameChanged = onWorkoutNameChanged, ) - AddWorkoutPage.SELECT_REPS -> CreateWorkoutPageRepetitions( + CreateWorkoutPage.SELECT_REPS -> CreateWorkoutPageRepetitions( enabledWorkoutDecreaseRepetitions = enabledWorkoutDecreaseRepetitions, numberOfReps = workoutRepetitions, onRepetitionsDecreased = onRepetitionsDecreased, @@ -283,7 +269,6 @@ private fun CreateWorkoutScreenContent( } } -//region Pages @Composable private fun ColumnScope.CreateWorkoutPageAddIntervals( addIntervalButtonIsEnabled: Boolean, @@ -298,7 +283,7 @@ private fun ColumnScope.CreateWorkoutPageAddIntervals( onIntervalNameChanged: (String) -> Unit, ) { Text( - text = stringResource(resource = Res.string.add_workout_add_interval_title), + text = stringResource(resource = Res.string.create_workout_add_interval_title), style = MaterialTheme.typography.titleLarge, ) @@ -308,58 +293,36 @@ private fun ColumnScope.CreateWorkoutPageAddIntervals( onValueChange = onIntervalNameChanged, modifier = Modifier.fillMaxWidth(), label = { - Text( - text = stringResource( - resource = Res.string.add_workout_add_interval_interval_name_label, - ), - ) + Text(text = stringResource(resource = Res.string.create_workout_add_interval_interval_name_label)) }, ) - Row( - horizontalArrangement = Arrangement.spacedBy(space = 8.dp), - ) { + Row(horizontalArrangement = Arrangement.spacedBy(space = 8.dp)) { TextField( maxLines = 1, label = { - Text( - text = stringResource( - resource = Res.string.add_workout_add_interval_duration_label, - ), - ) + Text(text = stringResource(resource = Res.string.create_workout_add_interval_duration_label)) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), value = secondsDuration.toString(), onValueChange = { onIntervalDurationChanged(it) }, modifier = Modifier.weight(weight = 1F), suffix = { - Text( - text = stringResource( - resource = Res.string.seconds_short_label, - ), - ) + Text(text = stringResource(resource = Res.string.seconds_short_label)) }, ) TextField( maxLines = 1, label = { - Text( - text = stringResource( - resource = Res.string.add_workout_add_interval_rest_label, - ), - ) + Text(text = stringResource(resource = Res.string.create_workout_add_interval_rest_label)) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), value = secondsRest.toString(), onValueChange = { onIntervalRestChanged(it) }, modifier = Modifier.weight(weight = 1F), suffix = { - Text( - text = stringResource( - resource = Res.string.seconds_short_label, - ), - ) + Text(text = stringResource(resource = Res.string.seconds_short_label)) }, ) } @@ -369,17 +332,11 @@ private fun ColumnScope.CreateWorkoutPageAddIntervals( modifier = Modifier.fillMaxWidth(), onClick = onClickedAddInterval, ) { - Text( - text = stringResource( - resource = Res.string.add_workout_add_interval_button_label_add_interval, - ), - ) + Text(text = stringResource(resource = Res.string.create_workout_add_interval_button_label_add_interval)) } TableCard( - header = stringResource( - resource = Res.string.add_workout_add_interval_workout_preview_title, - ), + header = stringResource(resource = Res.string.create_workout_add_interval_workout_preview_title), modifier = Modifier .fillMaxWidth() .weight(weight = 1F), @@ -391,30 +348,20 @@ private fun ColumnScope.CreateWorkoutPageAddIntervals( quantity = interval.duration, formatArgs = arrayOf(interval.duration), ) - val restSeconds = pluralStringResource( resource = Res.plurals.seconds_long, quantity = interval.rest, formatArgs = arrayOf(interval.rest), ) - RowClickable( entryNo = index + 1, text = interval.name, - onClickedRemove = { - onClickedRemoveInterval(index) - }, + onClickedRemove = { onClickedRemoveInterval(index) }, onClickedRow = null, showDivider = index != intervals.lastIndex, lines = listOf( - stringResource( - resource = Res.string.interval_duration_label, - formatArgs = arrayOf(durationSeconds), - ), - stringResource( - resource = Res.string.interval_rest_label, - formatArgs = arrayOf(restSeconds), - ), + stringResource(resource = Res.string.interval_duration_label, formatArgs = arrayOf(durationSeconds)), + stringResource(resource = Res.string.interval_rest_label, formatArgs = arrayOf(restSeconds)), ) ) } @@ -429,9 +376,7 @@ private fun ColumnScope.CreateWorkoutPageNameWorkout( onWorkoutNameChanged: (String) -> Unit, ) { Text( - text = stringResource( - resource = Res.string.add_workout_name_workout_title, - ), + text = stringResource(resource = Res.string.create_workout_name_workout_title), style = MaterialTheme.typography.titleLarge, ) @@ -441,11 +386,7 @@ private fun ColumnScope.CreateWorkoutPageNameWorkout( onValueChange = onWorkoutNameChanged, modifier = Modifier.fillMaxWidth(), label = { - Text( - text = stringResource( - resource = Res.string.add_workout_name_workout_label, - ), - ) + Text(text = stringResource(resource = Res.string.create_workout_name_workout_label)) }, ) } @@ -458,59 +399,40 @@ private fun ColumnScope.CreateWorkoutPageRepetitions( onRepetitionsIncreased: () -> Unit, ) { Text( - text = stringResource( - resource = Res.string.add_workout_create_reps_title, - ), + text = stringResource(resource = Res.string.create_workout_create_reps_title), style = MaterialTheme.typography.titleLarge, ) Row( horizontalArrangement = Arrangement.Center, - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { IconButton( onClick = onRepetitionsDecreased, - content = { - Icon( - contentDescription = stringResource( - resource = Res - .string - .add_workout_create_reps_content_description_decrease_repetitions, - ), - imageVector = Icons.Default.Remove, - ) - }, enabled = enabledWorkoutDecreaseRepetitions, - ) + ) { + Icon( + contentDescription = stringResource(resource = Res.string.create_workout_create_reps_content_description_decrease_repetitions), + imageVector = Icons.Default.Remove, + ) + } - Text( - text = numberOfReps.toString(), - ) + Text(text = numberOfReps.toString()) - IconButton( - onClick = onRepetitionsIncreased, - content = { - Icon( - contentDescription = stringResource( - resource = Res - .string - .add_workout_create_reps_content_description_increase_repetitions, - ), - imageVector = Icons.Default.Add, - ) - } - ) + IconButton(onClick = onRepetitionsIncreased) { + Icon( + contentDescription = stringResource(resource = Res.string.create_workout_create_reps_content_description_increase_repetitions), + imageVector = Icons.Default.Add, + ) + } } } -//endregion Pages -//region Previews @Preview @Composable private fun CreateWorkoutScreenContent_Preview( - @PreviewParameter(AddWorkoutPagePreviewParameterProvider::class) page: AddWorkoutPage, + @PreviewParameter(CreateWorkoutPagePreviewParameterProvider::class) page: CreateWorkoutPage, ) { HiitAppTheme { CreateWorkoutScreenContent( @@ -538,7 +460,6 @@ private fun CreateWorkoutScreenContent_Preview( } } -class AddWorkoutPagePreviewParameterProvider : PreviewParameterProvider { - override val values: Sequence = AddWorkoutPage.entries.toList().asSequence() +class CreateWorkoutPagePreviewParameterProvider : PreviewParameterProvider { + override val values: Sequence = CreateWorkoutPage.entries.toList().asSequence() } -//endregion Previews \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewEvent.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewEvent.kt new file mode 100644 index 0000000..7ae531b --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewEvent.kt @@ -0,0 +1,14 @@ +package com.majotyler.hiittimer.presentation.createWorkoutScreen + +sealed interface CreateWorkoutViewEvent { + data class ChangedIntervalDuration(val seconds: String) : CreateWorkoutViewEvent + data class ChangedIntervalRest(val seconds: String) : CreateWorkoutViewEvent + data class ChangedIntervalName(val name: String) : CreateWorkoutViewEvent + data class ChangedWorkoutName(val name: String) : CreateWorkoutViewEvent + data object ClickedAddIntervalToWorkout : CreateWorkoutViewEvent + data object ClickedAdvance : CreateWorkoutViewEvent + data class ClickedDeleteInterval(val index: Int) : CreateWorkoutViewEvent + data object ClickedNavigateUp : CreateWorkoutViewEvent + data object WorkoutRepetitionsDecreased : CreateWorkoutViewEvent + data object WorkoutRepetitionsIncreased : CreateWorkoutViewEvent +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewModel.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewModel.kt similarity index 62% rename from composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewModel.kt rename to composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewModel.kt index 238bbca..6239043 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewModel.kt @@ -1,4 +1,4 @@ -package com.majotyler.hiittimer.presentation.addWorkoutScreen +package com.majotyler.hiittimer.presentation.createWorkoutScreen import androidx.lifecycle.ViewModel import com.majotyler.hiittimer.domain.model.Interval @@ -7,7 +7,7 @@ import com.majotyler.hiittimer.presentation.common.navigation.Router import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -class AddWorkoutViewModel(private val router: Router) : ViewModel() { +class CreateWorkoutViewModel(private val router: Router) : ViewModel() { private val _nameInterval = MutableStateFlow(value = "") val nameInterval = _nameInterval.asStateFlow() @@ -26,7 +26,7 @@ class AddWorkoutViewModel(private val router: Router) : V private val _intervals = MutableStateFlow(value = emptyList()) val intervals = _intervals.asStateFlow() - private val _page = MutableStateFlow(value = AddWorkoutPage.entries.first()) + private val _page = MutableStateFlow(value = CreateWorkoutPage.entries.first()) val page = _page.asStateFlow() private val _workoutRepetitions = MutableStateFlow(value = 1) @@ -38,39 +38,38 @@ class AddWorkoutViewModel(private val router: Router) : V private val _secondsRest = MutableStateFlow(value = 0) val secondsRest = _secondsRest.asStateFlow() - fun onEvent(event: AddWorkoutViewEvent) { + fun onEvent(event: CreateWorkoutViewEvent) { when (event) { - is AddWorkoutViewEvent.ChangedIntervalDuration -> onChangedIntervalDuration(event = event) - is AddWorkoutViewEvent.ChangedIntervalName -> onChangedIntervalName(event = event) - is AddWorkoutViewEvent.ChangedIntervalRest -> onChangedIntervalRest(event = event) - is AddWorkoutViewEvent.ChangedWorkoutName -> onChangedWorkoutName(event = event) - is AddWorkoutViewEvent.ClickedAddIntervalToWorkout -> onClickedAddIntervalToWorkout() - is AddWorkoutViewEvent.ClickedAdvance -> onClickedAdvance() - is AddWorkoutViewEvent.ClickedDeleteInterval -> onClickedDeleteInterval(event = event) - is AddWorkoutViewEvent.ClickedNavigateUp -> onClickedNavigateUp() - is AddWorkoutViewEvent.WorkoutRepetitionsDecreased -> onWorkoutRepetitionsDecreased() - is AddWorkoutViewEvent.WorkoutRepetitionsIncreased -> onWorkoutRepetitionsIncreased() + is CreateWorkoutViewEvent.ChangedIntervalDuration -> onChangedIntervalDuration(event = event) + is CreateWorkoutViewEvent.ChangedIntervalName -> onChangedIntervalName(event = event) + is CreateWorkoutViewEvent.ChangedIntervalRest -> onChangedIntervalRest(event = event) + is CreateWorkoutViewEvent.ChangedWorkoutName -> onChangedWorkoutName(event = event) + is CreateWorkoutViewEvent.ClickedAddIntervalToWorkout -> onClickedAddIntervalToWorkout() + is CreateWorkoutViewEvent.ClickedAdvance -> onClickedAdvance() + is CreateWorkoutViewEvent.ClickedDeleteInterval -> onClickedDeleteInterval(event = event) + is CreateWorkoutViewEvent.ClickedNavigateUp -> onClickedNavigateUp() + is CreateWorkoutViewEvent.WorkoutRepetitionsDecreased -> onWorkoutRepetitionsDecreased() + is CreateWorkoutViewEvent.WorkoutRepetitionsIncreased -> onWorkoutRepetitionsIncreased() } } - private fun onChangedIntervalDuration(event: AddWorkoutViewEvent.ChangedIntervalDuration) { + private fun onChangedIntervalDuration(event: CreateWorkoutViewEvent.ChangedIntervalDuration) { _secondsDuration.value = secondsStringToInteger(seconds = event.seconds) checkAddExerciseButtonEnabled() } - private fun onChangedIntervalName(event: AddWorkoutViewEvent.ChangedIntervalName) { + private fun onChangedIntervalName(event: CreateWorkoutViewEvent.ChangedIntervalName) { _nameInterval.value = event.name checkAddExerciseButtonEnabled() } - private fun onChangedIntervalRest(event: AddWorkoutViewEvent.ChangedIntervalRest) { + private fun onChangedIntervalRest(event: CreateWorkoutViewEvent.ChangedIntervalRest) { _secondsRest.value = secondsStringToInteger(seconds = event.seconds) checkAddExerciseButtonEnabled() } - private fun onChangedWorkoutName(event: AddWorkoutViewEvent.ChangedWorkoutName) { + private fun onChangedWorkoutName(event: CreateWorkoutViewEvent.ChangedWorkoutName) { _nameWorkout.value = event.name - checkAdvanceButtonEnabled() } @@ -92,11 +91,11 @@ class AddWorkoutViewModel(private val router: Router) : V private fun onClickedAdvance() { val nextPageOrdinal = page.value.ordinal + 1 - val wasOnLastPage = nextPageOrdinal > AddWorkoutPage.entries.lastIndex + val wasOnLastPage = nextPageOrdinal > CreateWorkoutPage.entries.lastIndex if (wasOnLastPage) { router.routeTo( - destination = AddWorkoutDestination.AddWorkout( + destination = CreateWorkoutDestination.CreatedWorkout( workout = Workout( intervals = intervals.value, name = nameWorkout.value, @@ -105,13 +104,13 @@ class AddWorkoutViewModel(private val router: Router) : V ) ) } else { - _page.value = AddWorkoutPage.entries[nextPageOrdinal] + _page.value = CreateWorkoutPage.entries[nextPageOrdinal] } checkAdvanceButtonEnabled() } - private fun onClickedDeleteInterval(event: AddWorkoutViewEvent.ClickedDeleteInterval) { + private fun onClickedDeleteInterval(event: CreateWorkoutViewEvent.ClickedDeleteInterval) { val newList = _intervals.value.toMutableList() newList.removeAt(index = event.index) _intervals.value = newList @@ -124,49 +123,37 @@ class AddWorkoutViewModel(private val router: Router) : V val wasOnFirstPage = nextPageOrdinal < 0 if (wasOnFirstPage) { - router.routeTo(destination = AddWorkoutDestination.NavigateUp) + router.routeTo(destination = CreateWorkoutDestination.NavigateUp) } else { - _page.value = AddWorkoutPage.entries[nextPageOrdinal] + _page.value = CreateWorkoutPage.entries[nextPageOrdinal] } } private fun onWorkoutRepetitionsDecreased() { _workoutRepetitions.value -= 1 - checkWorkoutRepetitionsDecreasedButtonEnabled() } private fun onWorkoutRepetitionsIncreased() { _workoutRepetitions.value += 1 - checkWorkoutRepetitionsDecreasedButtonEnabled() } - //region Utility functions private fun checkAddExerciseButtonEnabled() { val exerciseHasAName = _nameInterval.value.isNotBlank() val durationAndRestAreNonZero = _secondsDuration.value != 0 && _secondsRest.value != 0 - _enabledAddInterval.value = exerciseHasAName && durationAndRestAreNonZero } private fun checkAdvanceButtonEnabled() { - fun onAddInterval(): Boolean { - return intervals.value.isNotEmpty() - } - - fun onNameWorkout(): Boolean { - return nameWorkout.value.isNotBlank() - } - - fun onSelectReps(): Boolean { - return true - } + fun onAddInterval(): Boolean = intervals.value.isNotEmpty() + fun onNameWorkout(): Boolean = nameWorkout.value.isNotBlank() + fun onSelectReps(): Boolean = true _enabledAdvance.value = when (_page.value) { - AddWorkoutPage.ADD_INTERVAL -> onAddInterval() - AddWorkoutPage.NAME_WORKOUT -> onNameWorkout() - AddWorkoutPage.SELECT_REPS -> onSelectReps() + CreateWorkoutPage.ADD_INTERVAL -> onAddInterval() + CreateWorkoutPage.NAME_WORKOUT -> onNameWorkout() + CreateWorkoutPage.SELECT_REPS -> onSelectReps() } } @@ -177,5 +164,4 @@ class AddWorkoutViewModel(private val router: Router) : V private fun secondsStringToInteger(seconds: String): Int { return seconds.toIntOrNull()?.coerceAtLeast(minimumValue = 0) ?: 0 } - //endregion Utility functions -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewModelFactory.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewModelFactory.kt similarity index 62% rename from composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewModelFactory.kt rename to composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewModelFactory.kt index de1a885..8010acd 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/addWorkoutScreen/AddWorkoutViewModelFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/createWorkoutScreen/CreateWorkoutViewModelFactory.kt @@ -1,16 +1,16 @@ -package com.majotyler.hiittimer.presentation.addWorkoutScreen +package com.majotyler.hiittimer.presentation.createWorkoutScreen import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.CreationExtras import kotlin.reflect.KClass -class AddWorkoutViewModelFactory( - private val router: (AddWorkoutDestination) -> Unit, +class CreateWorkoutViewModelFactory( + private val router: (CreateWorkoutDestination) -> Unit, ) : ViewModelProvider.Factory { override fun create(modelClass: KClass, extras: CreationExtras): T { - return AddWorkoutViewModel( + return CreateWorkoutViewModel( router = router, ) as T } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeDestination.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeDestination.kt index d697ea0..58c0ac6 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeDestination.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeDestination.kt @@ -3,5 +3,5 @@ package com.majotyler.hiittimer.presentation.homeScreen import com.majotyler.hiittimer.presentation.common.navigation.Destination sealed interface HomeDestination : Destination { - data object NavigateToBuildWorkouts : HomeDestination -} \ No newline at end of file + data object NavigateToChooseWorkout : HomeDestination +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeScreen.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeScreen.kt index 161f425..2531ebf 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeScreen.kt @@ -23,7 +23,7 @@ import com.majotyler.hiittimer.platform.UrlOpener import hiittimer.composeapp.generated.resources.Res import hiittimer.composeapp.generated.resources.btn_strava_connect_with_orange import hiittimer.composeapp.generated.resources.content_description_connect_with_strava -import hiittimer.composeapp.generated.resources.home_button_label_launch_build_workouts +import hiittimer.composeapp.generated.resources.home_button_label_launch_choose_workout import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource @@ -49,10 +49,10 @@ fun HomeScreen( ) { Button( onClick = { - viewModel.onEvent(event = HomeViewEvent.ClickedLaunchBuildWorkouts) + viewModel.onEvent(event = HomeViewEvent.ClickedLaunchChooseWorkout) }, ) { - Text(text = stringResource(resource = Res.string.home_button_label_launch_build_workouts)) + Text(text = stringResource(resource = Res.string.home_button_label_launch_choose_workout)) } Image( painter = painterResource(Res.drawable.btn_strava_connect_with_orange), diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeViewEvent.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeViewEvent.kt index 03a2315..4bba02c 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeViewEvent.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeViewEvent.kt @@ -5,5 +5,5 @@ sealed interface HomeViewEvent { // TODO This is temporary just to demonstrate data object ClickedCreateStravaActivity : HomeViewEvent - data object ClickedLaunchBuildWorkouts : HomeViewEvent -} \ No newline at end of file + data object ClickedLaunchChooseWorkout : HomeViewEvent +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeViewModel.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeViewModel.kt index d28ff02..4c72876 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/homeScreen/HomeViewModel.kt @@ -84,7 +84,7 @@ class HomeViewModel( when (event) { is HomeViewEvent.ClickedConnectWithStrava -> onClickedConnectWithStrava() is HomeViewEvent.ClickedCreateStravaActivity -> onClickedCreateStravaActivity() - is HomeViewEvent.ClickedLaunchBuildWorkouts -> onClickedLaunchBuildWorkouts() + is HomeViewEvent.ClickedLaunchChooseWorkout -> onClickedLaunchChooseWorkout() } } @@ -110,8 +110,8 @@ class HomeViewModel( } } - private fun onClickedLaunchBuildWorkouts() { - router.routeTo(destination = HomeDestination.NavigateToBuildWorkouts) + private fun onClickedLaunchChooseWorkout() { + router.routeTo(destination = HomeDestination.NavigateToChooseWorkout) } private fun getAuthUri() = URLBuilder(STRAVA_BASE_AUTH_URL).apply { diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/playWorkoutScreen/PlayWorkoutVIewModel.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/playWorkoutScreen/PlayWorkoutVIewModel.kt index 77b29c1..d3c19a3 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/playWorkoutScreen/PlayWorkoutVIewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/playWorkoutScreen/PlayWorkoutVIewModel.kt @@ -17,7 +17,7 @@ import kotlin.time.TimeSource class PlayWorkoutVIewModel( private val router: Router, - private val workouts: List, + private val workout: Workout, ) : ViewModel() { private val _state = MutableStateFlow( value = PlayWorkoutViewState( @@ -39,9 +39,9 @@ class PlayWorkoutVIewModel( private var currentStepProgressMs: Long = 0L private val currentStepTotalMs: Long - get() = currentWorkoutInterval + get() = currentInterval ?.run { - val seconds = when (currentWorkoutIntervalState) { + val seconds = when (currentIntervalState) { PlayWorkoutStateOfInterval.EXERCISING -> duration PlayWorkoutStateOfInterval.RESTING -> rest } @@ -49,16 +49,10 @@ class PlayWorkoutVIewModel( milliseconds } ?: 0L - /** The index of the current [Workout] in [workouts]. */ - private var currentWorkoutIndex: Int = 0 - private val currentWorkout: Workout? - get() = workouts.getOrNull(index = currentWorkoutIndex) - - /** The index of the current [Interval] of [currentWorkout] */ - private var currentWorkoutIntervalIndex: Int = 0 - private var currentWorkoutIntervalState = PlayWorkoutStateOfInterval.EXERCISING - private val currentWorkoutInterval: Interval? - get() = currentWorkout?.intervals?.getOrNull(index = currentWorkoutIntervalIndex) + private var currentIntervalIndex: Int = 0 + private var currentIntervalState = PlayWorkoutStateOfInterval.EXERCISING + private val currentInterval: Interval? + get() = workout.intervals.getOrNull(index = currentIntervalIndex) private var pollProgressJob: Job? = null private var runningMark: TimeMark? = null @@ -158,15 +152,12 @@ class PlayWorkoutVIewModel( val hasReachedEndOfCurrentStep: Boolean = newState.progress >= 1F if (hasReachedEndOfCurrentStep) { - val lastIndexOfIntervalsInCurrentWorkout = - currentWorkout?.intervals?.lastIndex - val isResting = - currentWorkoutIntervalState == PlayWorkoutStateOfInterval.RESTING - val currentIntervalIsLastInWorkout = - currentWorkoutIntervalIndex == lastIndexOfIntervalsInCurrentWorkout - val hasFinishedAllWorkouts = isResting && currentIntervalIsLastInWorkout - - if (hasFinishedAllWorkouts) { + val lastIndexOfIntervals = workout.intervals.lastIndex + val isResting = currentIntervalState == PlayWorkoutStateOfInterval.RESTING + val currentIntervalIsLast = currentIntervalIndex == lastIndexOfIntervals + val hasFinished = isResting && currentIntervalIsLast + + if (hasFinished) { _play.value = false _workoutPlayState.value = WorkoutPlayState.PAUSED _enabled.value = false @@ -182,16 +173,14 @@ class PlayWorkoutVIewModel( } private fun nextStep() { - when (currentWorkoutIntervalState) { + when (currentIntervalState) { PlayWorkoutStateOfInterval.EXERCISING -> { - currentWorkoutIntervalState = - PlayWorkoutStateOfInterval.RESTING + currentIntervalState = PlayWorkoutStateOfInterval.RESTING } PlayWorkoutStateOfInterval.RESTING -> { - currentWorkoutIntervalIndex++ - currentWorkoutIntervalState = - PlayWorkoutStateOfInterval.EXERCISING + currentIntervalIndex++ + currentIntervalState = PlayWorkoutStateOfInterval.EXERCISING } } currentStepProgressMs = 0L @@ -203,4 +192,4 @@ class PlayWorkoutVIewModel( private const val MILLISECONDS_IN_MINUTE = 60_000L private const val MILLISECONDS_IN_SECOND = 1_000L } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/playWorkoutScreen/PlayWorkoutViewModelFactory.kt b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/playWorkoutScreen/PlayWorkoutViewModelFactory.kt index 68b7d08..32f696b 100644 --- a/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/playWorkoutScreen/PlayWorkoutViewModelFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/majotyler/hiittimer/presentation/playWorkoutScreen/PlayWorkoutViewModelFactory.kt @@ -4,18 +4,16 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.CreationExtras import com.majotyler.hiittimer.domain.model.Workout -import com.majotyler.hiittimer.presentation.addWorkoutScreen.AddWorkoutDestination -import com.majotyler.hiittimer.presentation.addWorkoutScreen.AddWorkoutViewModel import kotlin.reflect.KClass class PlayWorkoutViewModelFactory( private val router: (PlayWorkoutDestination) -> Unit, - private val workouts: List, + private val workout: Workout, ) : ViewModelProvider.Factory { override fun create(modelClass: KClass, extras: CreationExtras): T { return PlayWorkoutVIewModel( router = router, - workouts = workouts, + workout = workout, ) as T } -} \ No newline at end of file +}