|
@@ -0,0 +1,164 @@
|
|
|
|
|
+package com.example.torus.ui
|
|
|
|
|
+
|
|
|
|
|
+import androidx.compose.foundation.border
|
|
|
|
|
+import androidx.compose.foundation.layout.Arrangement
|
|
|
|
|
+import androidx.compose.foundation.layout.Column
|
|
|
|
|
+import androidx.compose.foundation.layout.Row
|
|
|
|
|
+import androidx.compose.foundation.layout.fillMaxSize
|
|
|
|
|
+import androidx.compose.foundation.layout.fillMaxWidth
|
|
|
|
|
+import androidx.compose.foundation.layout.padding
|
|
|
|
|
+import androidx.compose.foundation.rememberScrollState
|
|
|
|
|
+import androidx.compose.foundation.shape.RoundedCornerShape
|
|
|
|
|
+import androidx.compose.foundation.verticalScroll
|
|
|
|
|
+import androidx.compose.material3.ButtonDefaults
|
|
|
|
|
+import androidx.compose.material3.MaterialTheme
|
|
|
|
|
+import androidx.compose.material3.OutlinedButton
|
|
|
|
|
+import androidx.compose.material3.Text
|
|
|
|
|
+import androidx.compose.runtime.Composable
|
|
|
|
|
+import androidx.compose.runtime.LaunchedEffect
|
|
|
|
|
+import androidx.compose.runtime.getValue
|
|
|
|
|
+import androidx.compose.runtime.mutableStateOf
|
|
|
|
|
+import androidx.compose.runtime.remember
|
|
|
|
|
+import androidx.compose.runtime.setValue
|
|
|
|
|
+import androidx.compose.ui.Alignment
|
|
|
|
|
+import androidx.compose.ui.Modifier
|
|
|
|
|
+import androidx.compose.ui.res.stringResource
|
|
|
|
|
+import androidx.compose.ui.tooling.preview.Preview
|
|
|
|
|
+import androidx.compose.ui.unit.dp
|
|
|
|
|
+import com.example.torus.R
|
|
|
|
|
+import com.example.torus.data.WorkoutRepository
|
|
|
|
|
+import com.example.torus.model.ExerciseType
|
|
|
|
|
+import com.example.torus.model.SavedExercise
|
|
|
|
|
+import com.example.torus.model.WorkoutDetail
|
|
|
|
|
+import com.example.torus.ui.theme.Sand
|
|
|
|
|
+import com.example.torus.ui.theme.TorusTheme
|
|
|
|
|
+
|
|
|
|
|
+@Composable
|
|
|
|
|
+fun WorkoutDetailScreen(
|
|
|
|
|
+ workoutId: String,
|
|
|
|
|
+ workoutRepository: WorkoutRepository,
|
|
|
|
|
+ modifier: Modifier = Modifier,
|
|
|
|
|
+ onBackToHome: () -> Unit = {}
|
|
|
|
|
+) {
|
|
|
|
|
+ var detail by remember(workoutId) { mutableStateOf<WorkoutDetail?>(null) }
|
|
|
|
|
+
|
|
|
|
|
+ LaunchedEffect(workoutId) {
|
|
|
|
|
+ detail = workoutRepository.getWorkoutDetail(workoutId)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ detail?.let { workout ->
|
|
|
|
|
+ WorkoutDetailContent(
|
|
|
|
|
+ workout = workout,
|
|
|
|
|
+ modifier = modifier,
|
|
|
|
|
+ onBackToHome = onBackToHome
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@Composable
|
|
|
|
|
+private fun WorkoutDetailContent(
|
|
|
|
|
+ workout: WorkoutDetail,
|
|
|
|
|
+ modifier: Modifier = Modifier,
|
|
|
|
|
+ onBackToHome: () -> Unit = {}
|
|
|
|
|
+) {
|
|
|
|
|
+ Column(modifier = modifier.fillMaxSize()) {
|
|
|
|
|
+ Column(
|
|
|
|
|
+ modifier = Modifier
|
|
|
|
|
+ .weight(1f)
|
|
|
|
|
+ .fillMaxWidth()
|
|
|
|
|
+ .verticalScroll(rememberScrollState())
|
|
|
|
|
+ .padding(horizontal = 16.dp, vertical = 8.dp),
|
|
|
|
|
+ verticalArrangement = Arrangement.spacedBy(16.dp)
|
|
|
|
|
+ ) {
|
|
|
|
|
+ Text(
|
|
|
|
|
+ text = workout.name.ifBlank { stringResource(R.string.untitled_workout) },
|
|
|
|
|
+ color = Sand,
|
|
|
|
|
+ style = MaterialTheme.typography.headlineMedium
|
|
|
|
|
+ )
|
|
|
|
|
+ workout.exercises.forEachIndexed { index, exercise ->
|
|
|
|
|
+ ExerciseRow(number = index + 1, exercise = exercise)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ OutlinedButton(
|
|
|
|
|
+ onClick = onBackToHome,
|
|
|
|
|
+ modifier = Modifier
|
|
|
|
|
+ .fillMaxWidth()
|
|
|
|
|
+ .padding(horizontal = 16.dp, vertical = 12.dp),
|
|
|
|
|
+ shape = RoundedCornerShape(50),
|
|
|
|
|
+ colors = ButtonDefaults.outlinedButtonColors(
|
|
|
|
|
+ contentColor = MaterialTheme.colorScheme.onBackground
|
|
|
|
|
+ )
|
|
|
|
|
+ ) {
|
|
|
|
|
+ Text(text = stringResource(R.string.back_to_home))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@Composable
|
|
|
|
|
+private fun ExerciseRow(
|
|
|
|
|
+ number: Int,
|
|
|
|
|
+ exercise: SavedExercise
|
|
|
|
|
+) {
|
|
|
|
|
+ val shape = RoundedCornerShape(14.dp)
|
|
|
|
|
+ Row(
|
|
|
|
|
+ modifier = Modifier
|
|
|
|
|
+ .fillMaxWidth()
|
|
|
|
|
+ .border(1.dp, MaterialTheme.colorScheme.outline, shape)
|
|
|
|
|
+ .padding(16.dp),
|
|
|
|
|
+ horizontalArrangement = Arrangement.SpaceBetween,
|
|
|
|
|
+ verticalAlignment = Alignment.CenterVertically
|
|
|
|
|
+ ) {
|
|
|
|
|
+ Column(
|
|
|
|
|
+ modifier = Modifier.weight(1f),
|
|
|
|
|
+ verticalArrangement = Arrangement.spacedBy(4.dp)
|
|
|
|
|
+ ) {
|
|
|
|
|
+ Text(
|
|
|
|
|
+ text = stringResource(exercise.type.labelRes),
|
|
|
|
|
+ color = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
|
|
|
+ style = MaterialTheme.typography.labelLarge
|
|
|
|
|
+ )
|
|
|
|
|
+ Text(
|
|
|
|
|
+ text = exercise.name.ifBlank { stringResource(R.string.untitled_exercise) },
|
|
|
|
|
+ color = MaterialTheme.colorScheme.onBackground,
|
|
|
|
|
+ style = MaterialTheme.typography.bodyLarge
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ Text(
|
|
|
|
|
+ text = number.toString(),
|
|
|
|
|
+ color = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
|
|
|
+ style = MaterialTheme.typography.labelSmall
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@Preview(showBackground = true, backgroundColor = 0xFF0C0F14)
|
|
|
|
|
+@Composable
|
|
|
|
|
+private fun WorkoutDetailContentPreview() {
|
|
|
|
|
+ TorusTheme {
|
|
|
|
|
+ Column {
|
|
|
|
|
+ AppHeader()
|
|
|
|
|
+ WorkoutDetailContent(
|
|
|
|
|
+ workout = WorkoutDetail(
|
|
|
|
|
+ id = "1",
|
|
|
|
|
+ name = "Push day",
|
|
|
|
|
+ exercises = listOf(
|
|
|
|
|
+ SavedExercise(
|
|
|
|
|
+ id = "a",
|
|
|
|
|
+ name = "Bench",
|
|
|
|
|
+ type = ExerciseType.Weights,
|
|
|
|
|
+ isActive = true,
|
|
|
|
|
+ notes = ""
|
|
|
|
|
+ ),
|
|
|
|
|
+ SavedExercise(
|
|
|
|
|
+ id = "b",
|
|
|
|
|
+ name = "Easy run",
|
|
|
|
|
+ type = ExerciseType.Run,
|
|
|
|
|
+ isActive = true,
|
|
|
|
|
+ notes = ""
|
|
|
|
|
+ )
|
|
|
|
|
+ )
|
|
|
|
|
+ )
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|