Skip to content

Commit

Permalink
Implemented feature:exercisesMuscle
Browse files Browse the repository at this point in the history
  • Loading branch information
bedirhansaricayir committed Aug 28, 2024
1 parent 2a3f10a commit 5436646
Show file tree
Hide file tree
Showing 19 changed files with 410 additions and 22 deletions.
1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ dependencies {
api(project(":feature:exercises"))
api(project(":feature:create-exercise"))
api((project(":feature:exercises-category")))
api((project(":feature:exercises-muscle")))

api(project(":core:navigation"))
api(project(":core:designsystem"))
Expand Down
17 changes: 9 additions & 8 deletions app/src/main/java/com/lifting/app/navigation/LiftingNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ import com.lifting.app.core.navigation.screens.NavBarScreen
import com.lifting.app.feature.create_exercise.navigation.createExerciseBottomSheetScreen
import com.lifting.app.feature.create_exercise.navigation.navigateToCreateExercise
import com.lifting.app.feature.exercises.navigation.exercisesScreen
import com.lifting.app.feature.exercises_category.navigation.SELECTED_EXERCISE_CATEGORY
import com.lifting.app.feature.exercises_category.navigation.exercisesCategoryBottomSheetScreen
import com.lifting.app.feature.exercises_category.navigation.navigateToExercisesCategory
import com.lifting.app.feature.exercises_muscle.navigation.exercisesMuscleBottomSheetScreen
import com.lifting.app.feature.exercises_muscle.navigation.navigateToExercisesMuscle

/**
* Created by bedirhansaricayir on 03.08.2024
Expand Down Expand Up @@ -127,6 +128,7 @@ private fun NavGraphBuilder.exercisesRoot(navController: NavController) {
exerciseDetail(navController)
createExercisesBottomSheet(navController)
exercisesCategoryBottomSheet(navController)
exercisesMuscleBottomSheet(navController)
}
}

Expand Down Expand Up @@ -254,20 +256,19 @@ private fun NavGraphBuilder.createExercisesBottomSheet(navController: NavControl
createExerciseBottomSheetScreen(
navController = navController,
onNavigateBack = navController::popBackStack,
onNavigateToCategories = { category ->
navController.currentBackStackEntry?.savedStateHandle?.set(
SELECTED_EXERCISE_CATEGORY,
value = category
)
navController.navigateToExercisesCategory()
}
onNavigateToCategories = navController::navigateToExercisesCategory,
onNavigateToMuscles = navController::navigateToExercisesMuscle

)
}

private fun NavGraphBuilder.exercisesCategoryBottomSheet(navController: NavController) {
exercisesCategoryBottomSheetScreen(navController)
}

private fun NavGraphBuilder.exercisesMuscleBottomSheet(navController: NavController) {
exercisesMuscleBottomSheetScreen(navController)
}

@Composable
private fun SampleScreen(text: String, onClick: () -> Unit) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.lifting.app.core.data.repository.muscles

import com.lifting.app.core.data.mapper.Mapper.toDomain
import com.lifting.app.core.database.model.MuscleEntity
import com.lifting.app.core.model.Muscle

/**
* Created by bedirhansaricayir on 21.08.2024
Expand All @@ -24,4 +26,7 @@ fun getPrePopulateMuscles(): List<MuscleEntity> = listOf(
MuscleEntity(tag = "shoulders", name = "Shoulders", isDeletable = false, isHidden = false),
MuscleEntity(tag = "traps", name = "Traps", isDeletable = false, isHidden = false),
MuscleEntity(tag = "triceps", name = "Triceps", isDeletable = false, isHidden = false),
)
)

fun String.parseToMuscle(): Muscle? =
getPrePopulateMuscles().find { it.tag == this }?.toDomain()
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,6 @@ sealed class LiftingScreen(
//<<!-- region BottomSheet -->
@Serializable data class CreateExercisesBottomSheet(val route: String = this.toString()) : LiftingScreen()
@Serializable data class ExercisesCategoryBottomSheet(val route: String = this.toString()) : LiftingScreen()
@Serializable data class ExercisesMuscleBottomSheet(val route: String = this.toString()) : LiftingScreen()
//<!-- endregion -->
}
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@ internal fun CreateExerciseScreenSuccess(

SingleSelectableCard(
name = "Primary Muscle",
value = state.selectedMuscle,
onClick = { }
value = state.selectedMuscle?.name,
onClick = { onEvent(CreateExerciseUIEvent.OnMuscleClicked(state.selectedMuscle?.tag)) }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ import com.lifting.app.core.base.viewmodel.Effect
sealed interface CreateExerciseUIEffect : Effect {
data object NavigateBack : CreateExerciseUIEffect
data class NavigateToCategories(val selectedCategory: String) : CreateExerciseUIEffect
data class NavigateToMuscles(val selectedMuscle: String?) : CreateExerciseUIEffect
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.lifting.app.feature.create_exercise

import com.lifting.app.core.base.viewmodel.Event
import com.lifting.app.core.model.ExerciseCategory

/**
* Created by bedirhansaricayir on 21.08.2024
Expand All @@ -11,7 +10,8 @@ sealed interface CreateExerciseUIEvent : Event {
data object OnActionClick : CreateExerciseUIEvent
data class OnExerciseNameChanged(val exerciseName: String) : CreateExerciseUIEvent
data class OnExerciseNotesChanged(val exerciseNotes: String) : CreateExerciseUIEvent
data class OnCategoryChanged(val category: ExerciseCategory) : CreateExerciseUIEvent
data class OnCategoryChanged(val category: String) : CreateExerciseUIEvent
data class OnSelectedMuscleChanged(val selectedMuscle: String) : CreateExerciseUIEvent
data class OnCategoryClicked(val selectedCategory: String) : CreateExerciseUIEvent
data class OnMuscleClicked(val selectedMuscle: String?) : CreateExerciseUIEvent
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ sealed interface CreateExerciseUIState : State {
val categories: List<ExerciseCategory>,
val selectedCategory: ExerciseCategory,
val muscles: List<Muscle>,
val selectedMuscle: String? = null
val selectedMuscle: Muscle? = null
) : CreateExerciseUIState

data class Error(val message: String?) : CreateExerciseUIState
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import androidx.lifecycle.viewModelScope
import com.lifting.app.core.base.viewmodel.BaseViewModel
import com.lifting.app.core.data.repository.exercises.ExercisesRepository
import com.lifting.app.core.data.repository.muscles.MusclesRepository
import com.lifting.app.core.data.repository.muscles.parseToMuscle
import com.lifting.app.core.model.ExerciseCategory
import com.lifting.app.core.model.allExerciseCategories
import com.lifting.app.core.model.parseToExerciseCategory
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.onStart
Expand Down Expand Up @@ -33,6 +35,7 @@ class CreateExerciseViewModel @Inject constructor(
is CreateExerciseUIEvent.OnExerciseNotesChanged -> updateExerciseNotes(event.exerciseNotes)
is CreateExerciseUIEvent.OnSelectedMuscleChanged -> updateSelectedMuscle(event.selectedMuscle)
is CreateExerciseUIEvent.OnCategoryClicked -> navigateToCategoriesEffect(event.selectedCategory)
is CreateExerciseUIEvent.OnMuscleClicked -> navigateToMusclesEffect(event.selectedMuscle)
}
}

Expand Down Expand Up @@ -74,7 +77,7 @@ class CreateExerciseViewModel @Inject constructor(
name = this.exerciseName,
notes = this.exerciseNotes,
category = this.selectedCategory,
primaryMuscleTag = this.selectedMuscle,
primaryMuscleTag = this.selectedMuscle?.tag,
)
}
}
Expand All @@ -89,9 +92,9 @@ class CreateExerciseViewModel @Inject constructor(
setEffect(CreateExerciseUIEffect.NavigateToCategories(selectedCategory))
}

private fun updateSelectedCategory(selectedCategory: ExerciseCategory) {
private fun updateSelectedCategory(selectedCategory: String) {
updateState { currentState ->
(currentState as CreateExerciseUIState.Success).copy(selectedCategory = selectedCategory)
(currentState as CreateExerciseUIState.Success).copy(selectedCategory = selectedCategory.parseToExerciseCategory())
}
}

Expand All @@ -109,7 +112,11 @@ class CreateExerciseViewModel @Inject constructor(

private fun updateSelectedMuscle(selectedMuscle: String) {
updateState { currentState ->
(currentState as CreateExerciseUIState.Success).copy(selectedMuscle = selectedMuscle)
(currentState as CreateExerciseUIState.Success).copy(selectedMuscle = selectedMuscle.parseToMuscle())
}
}

private fun navigateToMusclesEffect(selectedMuscle: String?) {
setEffect(CreateExerciseUIEffect.NavigateToMuscles(selectedMuscle))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import com.lifting.app.core.model.parseToExerciseCategory
import com.lifting.app.core.navigation.screens.LiftingScreen
import com.lifting.app.feature.create_exercise.CreateExerciseScreen
import com.lifting.app.feature.create_exercise.CreateExerciseUIEffect
Expand All @@ -21,13 +20,15 @@ import com.lifting.app.feature.create_exercise.CreateExerciseViewModel

val CREATE_EXERCISE_SCREEN = LiftingScreen.CreateExercisesBottomSheet().route
const val SELECTED_EXERCISE_CATEGORY = "SELECTED_EXERCISE_CATEGORY"
const val SELECTED_EXERCISE_MUSCLE = "SELECTED_EXERCISE_MUSCLE"

fun NavController.navigateToCreateExercise() = navigate(CREATE_EXERCISE_SCREEN)

fun NavGraphBuilder.createExerciseBottomSheetScreen(
navController: NavController,
onNavigateBack: () -> Unit,
onNavigateToCategories: (String) -> Unit
onNavigateToCategories: () -> Unit,
onNavigateToMuscles: () -> Unit,
) {
bottomSheet(CREATE_EXERCISE_SCREEN) {

Expand All @@ -39,7 +40,20 @@ fun NavGraphBuilder.createExerciseBottomSheetScreen(
effect.collect {
when(it) {
CreateExerciseUIEffect.NavigateBack -> onNavigateBack()
is CreateExerciseUIEffect.NavigateToCategories -> onNavigateToCategories(it.selectedCategory)
is CreateExerciseUIEffect.NavigateToCategories -> {
navController.currentBackStackEntry?.savedStateHandle?.set(
SELECTED_EXERCISE_CATEGORY,
value = it.selectedCategory
)
onNavigateToCategories()
}
is CreateExerciseUIEffect.NavigateToMuscles -> {
navController.currentBackStackEntry?.savedStateHandle?.set(
SELECTED_EXERCISE_MUSCLE,
value = it.selectedMuscle
)
onNavigateToMuscles()
}
}
}
}
Expand All @@ -49,9 +63,20 @@ fun NavGraphBuilder.createExerciseBottomSheetScreen(
?.getStateFlow<String?>(SELECTED_EXERCISE_CATEGORY, null)
?.collectAsState()

val selectedMuscle = navController.currentBackStackEntry
?.savedStateHandle
?.getStateFlow<String?>(SELECTED_EXERCISE_MUSCLE,null)
?.collectAsState()

LaunchedEffect(selectedCategory) {
selectedCategory?.value?.let {
viewModel.setEvent(CreateExerciseUIEvent.OnCategoryChanged(it.parseToExerciseCategory()))
viewModel.setEvent(CreateExerciseUIEvent.OnCategoryChanged(it))
}
}

LaunchedEffect(selectedMuscle) {
selectedMuscle?.value?.let {
viewModel.setEvent(CreateExerciseUIEvent.OnSelectedMuscleChanged(it))
}
}

Expand Down
52 changes: 52 additions & 0 deletions feature/exercises-muscle/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
plugins {
id(BuildPlugins.ANDROID_LIBRARY_PLUGIN)
id(BuildPlugins.KOTLIN_ANDROID_PLUGIN)
id(BuildPlugins.DAGGER_HILT)
id(BuildPlugins.KSP_PLUGIN)
}

android {
namespace = "com.lifting.app.feature.exercises_muscle"
compileSdk = AppConfig.COMPILE_SDK

defaultConfig {
minSdk = AppConfig.MIN_SDK

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}

buildFeatures {
compose = true
}

composeOptions {
kotlinCompilerExtensionVersion = Versions.kotlinCompilerExtensionVersion
}

kotlinOptions {
jvmTarget = "1.8"
}
}


dependencies {
api(project(":core:base"))
api(project(":core:navigation"))
api(project(":core:ui"))
api(project(":core:data"))


Kotlin.list.forEach(::api)

with(Di) {
implementation(hiltAndroid)
implementation(hiltNavigationCompose)
ksp(hiltCompiler)
ksp(hiltAndroidCompiler)
}
}
Loading

0 comments on commit 5436646

Please sign in to comment.