From 1c09407583c7eb036e0622a25a416d3aee4e2a4a Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sat, 25 Jan 2025 16:20:35 +0900 Subject: [PATCH 01/15] =?UTF-8?q?[TNT-114]=20feat:=20TnTOutLinedTextField?= =?UTF-8?q?=EC=97=90=20=EA=B2=BD=EA=B3=A0=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tnt/designsystem/component/TextField.kt | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/TextField.kt b/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/TextField.kt index da29b6e5..0c53068c 100644 --- a/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/TextField.kt +++ b/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/TextField.kt @@ -235,6 +235,7 @@ fun TnTOutlinedTextField( placeholder: String? = stringResource(R.string.placeholder_content_input), maxLength: Int = 15, isError: Boolean = false, + warningMessage: String? = null, keyboardType: KeyboardType = KeyboardType.Text, ) { var isFocused by remember { mutableStateOf(false) } @@ -291,14 +292,24 @@ fun TnTOutlinedTextField( keyboardType = keyboardType, ), ) - Text( - text = "${value.length}/$maxLength", - style = TnTTheme.typography.label2Medium, - color = counterColor, - modifier = Modifier - .padding(vertical = 8.dp) - .align(Alignment.End), - ) + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(vertical = 8.dp), + ) { + if (isError && !warningMessage.isNullOrEmpty()) { + Text( + text = warningMessage, + style = TnTTheme.typography.body2Medium, + color = counterColor, + ) + } + Spacer(modifier = Modifier.weight(1f)) + Text( + text = "${value.length}/$maxLength", + style = TnTTheme.typography.label2Medium, + color = counterColor, + ) + } } } @@ -412,6 +423,7 @@ private fun TnTOutlinedTextFieldPreview() { onValueChange = { text = it }, maxLength = maxLength, isError = warningState, + warningMessage = "에러", modifier = Modifier .fillMaxWidth() .padding(10.dp), From 36c018fcd5566da7d749c8981c7ebecc60b1635c Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sat, 25 Jan 2025 17:01:29 +0900 Subject: [PATCH 02/15] =?UTF-8?q?[TNT-114]=20feat:=20=ED=8A=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EB=8B=88=20=EA=B8=B0=EB=B3=B8=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=97=90=EB=9F=AC=20=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 정책에 따라 키 정수로 변경 --- .../trainee/signup/TraineeBasicInfoScreen.kt | 41 +++++++++++-------- .../signup/src/main/res/values/strings.xml | 2 + 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt index 72ded3cb..0852a232 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt @@ -40,8 +40,8 @@ import java.time.LocalDate import java.time.ZoneId import java.time.format.DateTimeFormatter -// 000.0 (점 포함 5자리) -private const val MAX_LENGTH = 5 +private const val MAX_HEIGHT_LENGTH = 3 +private const val MAX_WEIGHT_LENGTH = 5 @Composable fun TraineeBasicInfoScreen() { @@ -51,8 +51,8 @@ fun TraineeBasicInfoScreen() { var weight by remember { mutableStateOf("") } var birthday by remember { mutableStateOf(null) } - val isHeightValid by remember { derivedStateOf { height.isNotEmpty() && validateInput(height) } } - val isWeightValid by remember { derivedStateOf { weight.isNotEmpty() && validateInput(weight) } } + val isHeightValid by remember { derivedStateOf { height.isNotEmpty() && validateHeight(height) } } + val isWeightValid by remember { derivedStateOf { weight.isNotEmpty() && validateWeight(weight) } } val isFormValid by remember { derivedStateOf { isHeightValid && isWeightValid } } @@ -104,16 +104,14 @@ fun TraineeBasicInfoScreen() { value = height, placeholder = "0", isSingleLine = true, + showWarning = !validateHeight(height), + warningMessage = stringResource(R.string.entered_wrong_number), isRequired = true, keyboardType = KeyboardType.Number, trailingComponent = { UnitLabel(R.string.height_unit) }, - onValueChange = { newHeight -> - if (validateInput(newHeight)) { - height = newHeight - } - }, + onValueChange = { height = it }, modifier = Modifier.weight(1f), ) TnTLabeledTextField( @@ -121,16 +119,14 @@ fun TraineeBasicInfoScreen() { value = weight, placeholder = "00.0", isSingleLine = true, + showWarning = !validateWeight(weight), + warningMessage = stringResource(R.string.entered_wrong_number), isRequired = true, keyboardType = KeyboardType.Number, trailingComponent = { UnitLabel(R.string.weight_unit) }, - onValueChange = { newWeight -> - if (validateInput(newWeight)) { - weight = newWeight - } - }, + onValueChange = { weight = it }, modifier = Modifier.weight(1f), ) } @@ -207,11 +203,20 @@ private fun UnitLabel(stringResId: Int) { } /** - * 유효한 입력값인지 검사 (정수 또는 실수 형식 확인) - * 형식: 5자 이하의 정수 또는 실수 + * 키가 유효한 입력값인지 검사 + * 형식: 정수 3자 + */ +private fun validateHeight(input: String): Boolean { + return input.isEmpty() || input.toIntOrNull() != null && !input.startsWith("0") && input.length <= MAX_HEIGHT_LENGTH +} + +/** + * 몸무게가 유효한 입력값인지 검사 + * 형식: 5자 이하의 실수 (000, 00, 00.0, 000.0) */ -private fun validateInput(input: String): Boolean { - return input.isEmpty() || (input.toDoubleOrNull() != null && !input.startsWith("0") && input.length <= MAX_LENGTH) +private fun validateWeight(input: String): Boolean { + val weightRegex = Regex("^(\\d{1,3}(\\.\\d)?)?\$") + return input.isEmpty() || input.matches(weightRegex) && !input.startsWith("0") && input.length <= MAX_WEIGHT_LENGTH } @Preview(showBackground = true) diff --git a/feature/trainee/signup/src/main/res/values/strings.xml b/feature/trainee/signup/src/main/res/values/strings.xml index 24fe904a..ae3c0f6a 100644 --- a/feature/trainee/signup/src/main/res/values/strings.xml +++ b/feature/trainee/signup/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ 체중 cm kg + 잘못된 수치를 입력했어요 이름이 어떻게 되세요? 이름을 입력해주세요 @@ -30,6 +31,7 @@ 트레이너가 꼭 알아야 할\n주의사항이 있나요? 트레이너에게 알려드릴게요. + 글자 수를 초과했어요 만나서 반가워요\n%s 트레이니님! 트레이너와 함께\n케미를 터뜨려보세요! 🧨 From 7665ac19e6f121145776cfd1aebd5cdf760f8374 Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sat, 25 Jan 2025 18:05:02 +0900 Subject: [PATCH 03/15] =?UTF-8?q?[TNT-114]=20refactor:=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=EA=B0=80=EC=9E=85=20=EC=99=84=EB=A3=8C=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=ED=8C=8C=EC=9D=BC=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...fileCompleteScreen.kt => TraineeSignUpCompleteScreen.kt} | 6 +++--- ...fileCompleteScreen.kt => TrainerSignUpCompleteScreen.kt} | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/{TraineeProfileCompleteScreen.kt => TraineeSignUpCompleteScreen.kt} (95%) rename feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/{TrainerProfileCompleteScreen.kt => TrainerSignUpCompleteScreen.kt} (95%) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileCompleteScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt similarity index 95% rename from feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileCompleteScreen.kt rename to feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt index 4a705a88..bd8a50e3 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileCompleteScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt @@ -24,7 +24,7 @@ import co.kr.tnt.ui.model.DefaultUserProfile import coil.compose.rememberAsyncImagePainter @Composable -fun TraineeProfileCompleteScreen( +fun TraineeSignUpCompleteScreen( modifier: Modifier = Modifier, ) { // TODO 이름, 프로필 사진 불러오기 @@ -76,8 +76,8 @@ fun TraineeProfileCompleteScreen( @Preview(showBackground = true) @Composable -private fun TraineeProfileCompleteScreenPreview() { +private fun TraineeSignUpCompleteScreenPreview() { TnTTheme { - TraineeProfileCompleteScreen() + TraineeSignUpCompleteScreen() } } diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileCompleteScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt similarity index 95% rename from feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileCompleteScreen.kt rename to feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt index 9b6e6204..8f463152 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileCompleteScreen.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt @@ -24,7 +24,7 @@ import co.kr.tnt.ui.model.DefaultUserProfile import coil.compose.rememberAsyncImagePainter @Composable -fun TrainerProfileCompleteScreen( +fun TrainerSignUpCompleteScreen( modifier: Modifier = Modifier, ) { // TODO 이름, 프로필 이미지 불러오기 @@ -76,8 +76,8 @@ fun TrainerProfileCompleteScreen( @Preview(showBackground = true) @Composable -private fun TrainerProfileCompleteScreenPreview() { +private fun TrainerSignUpCompleteScreenPreview() { TnTTheme { - TrainerProfileCompleteScreen() + TrainerSignUpCompleteScreen() } } From 0eb7cbaf947d8336b1e453f9577b5c667b9314ee Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sat, 25 Jan 2025 20:43:56 +0900 Subject: [PATCH 04/15] =?UTF-8?q?[TNT-114]=20feat:=20=ED=8A=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EB=8B=88=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20Nav?= =?UTF-8?q?igation=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TNT-115 머지되면 Home 대신 Connect화면으로 이동하게 수정 --- .../java/co/kr/tnt/navigation/RouteModel.kt | 6 ++ feature/main/build.gradle.kts | 1 + .../java/co/kr/tnt/main/ui/TnTAppState.kt | 2 +- .../main/java/co/kr/tnt/main/ui/TnTNavHost.kt | 5 ++ .../trainee/signup/TraineeBasicInfoScreen.kt | 16 ++-- .../signup/TraineeNoteForTrainerScreen.kt | 16 ++-- .../trainee/signup/TraineePTPurposeScreen.kt | 17 ++-- .../signup/TraineeProfileSetupScreen.kt | 16 +++- .../signup/TraineeSignUpCompleteScreen.kt | 88 +++++++++++-------- .../trainee/signup/TraineeSignUpContract.kt | 53 +++++++++++ .../tnt/trainee/signup/TraineeSignUpScreen.kt | 65 ++++++++++++++ .../trainee/signup/TraineeSignUpViewModel.kt | 46 ++++++++++ .../navigation/TraineeSignUpNavigation.kt | 31 +++++++ 13 files changed, 300 insertions(+), 62 deletions(-) create mode 100644 feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpContract.kt create mode 100644 feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt create mode 100644 feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpViewModel.kt create mode 100644 feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/navigation/TraineeSignUpNavigation.kt diff --git a/core/navigation/src/main/java/co/kr/tnt/navigation/RouteModel.kt b/core/navigation/src/main/java/co/kr/tnt/navigation/RouteModel.kt index 51d0fa6d..36585b41 100644 --- a/core/navigation/src/main/java/co/kr/tnt/navigation/RouteModel.kt +++ b/core/navigation/src/main/java/co/kr/tnt/navigation/RouteModel.kt @@ -12,6 +12,12 @@ sealed interface Route { @Serializable data object Login : Route + @Serializable + data object TrainerSignUp : Route + + @Serializable + data object TraineeSignUp : Route + @Serializable data object TrainerConnect : Route diff --git a/feature/main/build.gradle.kts b/feature/main/build.gradle.kts index f10fc2ae..e11356f5 100644 --- a/feature/main/build.gradle.kts +++ b/feature/main/build.gradle.kts @@ -13,6 +13,7 @@ dependencies { implementation(projects.feature.login) implementation(projects.feature.trainer.connect) implementation(projects.feature.trainee.connect) + implementation(projects.feature.trainee.signup) implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) diff --git a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt index 8b9c8bb3..510c95be 100644 --- a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt +++ b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt @@ -25,5 +25,5 @@ class TnTAppState( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - val startDestination = Route.TrainerConnect + val startDestination = Route.Login } diff --git a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt index 99079e17..d48cd146 100644 --- a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt +++ b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt @@ -8,6 +8,7 @@ import androidx.navigation.compose.NavHost import co.kr.tnt.home.navigation.homeNavGraph import co.kr.tnt.home.navigation.navigateToHome import co.kr.tnt.login.navigation.loginScreen +import co.kr.tnt.trainee.signup.navigation.traineeSignUpScreen import co.kr.tnt.trainee.connect.navigation.traineeConnectScreen import co.kr.tnt.trainer.connect.navigation.trainerConnectScreen @@ -29,6 +30,10 @@ fun TnTNavHost( navigateToHome = { }, navigateToSignup = { }, ) + traineeSignUpScreen( + navigateToPrevious = { navController.popBackStack() }, + navigateToHome = { navController.navigateToHome(false, clearBackStack = true) }, + ) trainerConnectScreen( navigateToPrevious = { navController.popBackStack() }, navigateToHome = { diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt index 0852a232..42bde7b3 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt @@ -44,7 +44,10 @@ private const val MAX_HEIGHT_LENGTH = 3 private const val MAX_WEIGHT_LENGTH = 5 @Composable -fun TraineeBasicInfoScreen() { +fun TraineeBasicInfoScreen( + onBackClick: () -> Unit, + onNextClick: () -> Unit, +) { // TODO 상태 관리 따로 빼기 val today = LocalDate.now() var height by remember { mutableStateOf("") } @@ -57,8 +60,7 @@ fun TraineeBasicInfoScreen() { val isFormValid by remember { derivedStateOf { isHeightValid && isWeightValid } } Scaffold( - // TODO 버튼 클릭 시 트레이니 이름 입력 화면으로 이동 - topBar = { TnTTopBarWithBackButton(onBackClick = {}) }, + topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -131,12 +133,11 @@ fun TraineeBasicInfoScreen() { ) } } - // TODO 트레이니 PT 목적 화면으로 이동 TnTBottomButton( text = stringResource(R.string.next), modifier = Modifier.align(Alignment.BottomCenter), enabled = isFormValid, - onClick = { }, + onClick = { onNextClick() }, ) } } @@ -223,6 +224,9 @@ private fun validateWeight(input: String): Boolean { @Composable private fun TraineeBasicInfoScreenPreview() { TnTTheme { - TraineeBasicInfoScreen() + TraineeBasicInfoScreen( + onBackClick = {}, + onNextClick = {}, + ) } } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt index ae23824f..cf44f81b 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt @@ -29,13 +29,15 @@ import co.kr.tnt.trainee.signup.component.ProgressSteps private const val MAX_LENGTH = 100 @Composable -fun TraineeNoteForTrainerScreen() { +fun TraineeNoteForTrainerScreen( + onBackClick: () -> Unit, + onNextClick: () -> Unit, +) { // TODO 상태 관리 따로 빼기 var text by remember { mutableStateOf("") } Scaffold( - // TODO 버튼 클릭 시 트레이니 PT 목적 화면으로 이동 - topBar = { TnTTopBarWithBackButton(onBackClick = {}) }, + topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -63,12 +65,11 @@ fun TraineeNoteForTrainerScreen() { maxLength = 100, ) } - // TODO 트레이니 PT 목적 화면으로 이동 TnTBottomButton( text = stringResource(R.string.next), modifier = Modifier.align(Alignment.BottomCenter), enabled = text.isNotBlank(), - onClick = { }, + onClick = { onNextClick() }, ) } } @@ -78,6 +79,9 @@ fun TraineeNoteForTrainerScreen() { @Composable private fun TraineeNoteForTrainerScreenPreview() { TnTTheme { - TraineeNoteForTrainerScreen() + TraineeNoteForTrainerScreen( + onBackClick = {}, + onNextClick = {}, + ) } } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt index cddc97a3..408515cc 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt @@ -1,6 +1,5 @@ package co.kr.tnt.trainee.signup -import android.util.Log import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -36,13 +35,15 @@ private const val COLUMNS_NUM = 2 @OptIn(ExperimentalLayoutApi::class) @Composable -fun TraineePTPurposeScreen() { +fun TraineePTPurposeScreen( + onBackClick: () -> Unit, + onNextClick: () -> Unit, +) { // TODO 리소스 id값 텍스트로 전환해 넘겨주기 var selectedPurposes by remember { mutableStateOf(setOf()) } Scaffold( - // TODO 버튼 클릭 시 트레이니 기본 정보 입력 화면으로 이동 - topBar = { TnTTopBarWithBackButton(onBackClick = {}) }, + topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -75,10 +76,9 @@ fun TraineePTPurposeScreen() { } } } - // TODO PT 주의사항 입력 화면으로 이동 TnTBottomButton( text = stringResource(R.string.next), - onClick = { Log.d("check", "선택된 값들\n${selectedPurposes.map { it.name }}") }, + onClick = { onNextClick() }, enabled = selectedPurposes.isNotEmpty(), modifier = Modifier.align(Alignment.BottomCenter), ) @@ -120,6 +120,9 @@ private fun toggleSelection( @Composable private fun TraineePTPurposeScreenPreview() { TnTTheme { - TraineePTPurposeScreen() + TraineePTPurposeScreen( + onBackClick = {}, + onNextClick = {}, + ) } } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt index b71e445c..e90ef111 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt @@ -1,6 +1,7 @@ package co.kr.tnt.trainee.signup import android.net.Uri +import androidx.activity.compose.BackHandler import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia @@ -41,7 +42,12 @@ import coil.compose.rememberAsyncImagePainter import coil.request.ImageRequest @Composable -fun TraineeProfileSetupScreen() { +fun TraineeProfileSetupScreen( + onBackClick: () -> Unit, + onNextClick: () -> Unit, +) { + BackHandler { onBackClick() } + val context = LocalContext.current // TODO 상태 관리 따로 빼기 @@ -111,11 +117,10 @@ fun TraineeProfileSetupScreen() { warningMessage = stringResource(R.string.text_length_warning, maxLength), ) } - // TODO 트레이니 기본 정보 입력 화면으로 이동 TnTBottomButton( text = stringResource(R.string.next), enabled = text.isNotBlank() && !isWarning, - onClick = { }, + onClick = { onNextClick() }, modifier = Modifier.align(Alignment.BottomCenter), ) } @@ -133,6 +138,9 @@ private fun validateInput(input: String): String { @Composable private fun TraineeProfileSetupScreenPreview() { TnTTheme { - TraineeProfileSetupScreen() + TraineeProfileSetupScreen( + onBackClick = {}, + onNextClick = {}, + ) } } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt index bd8a50e3..ff81fbe1 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainee.signup +import androidx.activity.compose.BackHandler import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -7,6 +8,7 @@ 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.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -25,52 +27,59 @@ import coil.compose.rememberAsyncImagePainter @Composable fun TraineeSignUpCompleteScreen( - modifier: Modifier = Modifier, + onBackClick: () -> Unit, + onNextClick: () -> Unit, ) { + BackHandler { onBackClick() } + // TODO 이름, 프로필 사진 불러오기 val name = "김헬짱" val profileImage = "https://buly.kr/7FQeS5M" - Box( - modifier = modifier - .fillMaxSize() - .background(TnTTheme.colors.commonColors.Common0), - contentAlignment = Alignment.Center, - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, + Scaffold( + containerColor = TnTTheme.colors.commonColors.Common0, + ) { innerPadding -> + Box( modifier = Modifier - .fillMaxWidth() - .padding(bottom = 66.dp), + .padding(innerPadding) + .fillMaxSize() + .background(TnTTheme.colors.commonColors.Common0), + contentAlignment = Alignment.Center, ) { - Text( - text = stringResource(R.string.nice_to_meet_you_trainee, name), - color = TnTTheme.colors.neutralColors.Neutral950, - style = TnTTheme.typography.h1, - textAlign = Center, - modifier = Modifier.padding(horizontal = 24.dp), - ) - Spacer(Modifier.padding(top = 10.dp)) - Text( - text = stringResource(R.string.chemistry_boom_with_trainer), - color = TnTTheme.colors.neutralColors.Neutral500, - style = TnTTheme.typography.body1Medium, - textAlign = Center, - ) - Spacer(Modifier.padding(top = 28.dp)) - TnTProfileImage( - defaultImage = painterResource(DefaultUserProfile.Trainee.image), - image = rememberAsyncImagePainter(profileImage), - imageSize = 200.dp, - showEditButton = false, + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 66.dp), + ) { + Text( + text = stringResource(R.string.nice_to_meet_you_trainee, name), + color = TnTTheme.colors.neutralColors.Neutral950, + style = TnTTheme.typography.h1, + textAlign = Center, + modifier = Modifier.padding(horizontal = 24.dp), + ) + Spacer(Modifier.padding(top = 10.dp)) + Text( + text = stringResource(R.string.chemistry_boom_with_trainer), + color = TnTTheme.colors.neutralColors.Neutral500, + style = TnTTheme.typography.body1Medium, + textAlign = Center, + ) + Spacer(Modifier.padding(top = 28.dp)) + TnTProfileImage( + defaultImage = painterResource(DefaultUserProfile.Trainee.image), + image = rememberAsyncImagePainter(profileImage), + imageSize = 200.dp, + showEditButton = false, + ) + } + TnTBottomButton( + text = stringResource(R.string.start), + onClick = { onNextClick() }, + modifier = Modifier.align(Alignment.BottomCenter), ) } - // TODO 연결코드 입력 화면으로 이동 - TnTBottomButton( - text = stringResource(R.string.start), - onClick = { }, - modifier = Modifier.align(Alignment.BottomCenter), - ) } } @@ -78,6 +87,9 @@ fun TraineeSignUpCompleteScreen( @Composable private fun TraineeSignUpCompleteScreenPreview() { TnTTheme { - TraineeSignUpCompleteScreen() + TraineeSignUpCompleteScreen( + onBackClick = {}, + onNextClick = {}, + ) } } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpContract.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpContract.kt new file mode 100644 index 00000000..98e62c91 --- /dev/null +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpContract.kt @@ -0,0 +1,53 @@ +package co.kr.tnt.trainee.signup + +import co.kr.tnt.ui.base.UiEvent +import co.kr.tnt.ui.base.UiSideEffect +import co.kr.tnt.ui.base.UiState + +internal class TraineeSignUpContract { + data class TraineeSignUpUiState( + val page: TraineeSignUpPage = TraineeSignUpPage.ProfileSetUp, + val name: String = "", + ) : UiState + + sealed interface TraineeSignUpUiEvent : UiEvent { + data object OnNextClick : TraineeSignUpUiEvent + data object OnBackClick : TraineeSignUpUiEvent + } + + sealed interface TraineeSignUpEffect : UiSideEffect { + data object NavigateToBack : TraineeSignUpEffect + data object NavigateToConnect : TraineeSignUpEffect + } + + enum class TraineeSignUpPage { + ProfileSetUp, + BasicInfo, + NoteForTrainer, + PTPurpose, + SignUpComplete, + ; + + companion object { + fun getPreviousPage(currentPage: TraineeSignUpPage): TraineeSignUpPage { + return when (currentPage) { + BasicInfo -> ProfileSetUp + NoteForTrainer -> BasicInfo + PTPurpose -> NoteForTrainer + SignUpComplete -> PTPurpose + else -> error("No previous page defined for $currentPage") + } + } + + fun getNextPage(currentPage: TraineeSignUpPage): TraineeSignUpPage { + return when (currentPage) { + ProfileSetUp -> BasicInfo + BasicInfo -> NoteForTrainer + NoteForTrainer -> PTPurpose + PTPurpose -> SignUpComplete + else -> error("No next page defined for $currentPage") + } + } + } + } +} diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt new file mode 100644 index 00000000..dc11a522 --- /dev/null +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt @@ -0,0 +1,65 @@ +package co.kr.tnt.trainee.signup + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import co.kr.tnt.trainee.signup.TraineeSignUpContract.TraineeSignUpEffect +import co.kr.tnt.trainee.signup.TraineeSignUpContract.TraineeSignUpPage +import co.kr.tnt.trainee.signup.TraineeSignUpContract.TraineeSignUpUiEvent +import co.kr.tnt.trainee.signup.TraineeSignUpContract.TraineeSignUpUiState + +@Composable +internal fun TraineeSignUpRoute( + navigateToPrevious: () -> Unit, + navigateToConnect: () -> Unit, + viewModel: TraineeSignUpViewModel = hiltViewModel(), +) { + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + TraineeSignUpScreen( + state = uiState, + onBackClick = { viewModel.setEvent(TraineeSignUpUiEvent.OnBackClick) }, + onNextClick = { viewModel.setEvent(TraineeSignUpUiEvent.OnNextClick) }, + ) + + LaunchedEffect(viewModel.effect) { + viewModel.effect.collect { effect -> + when (effect) { + TraineeSignUpEffect.NavigateToBack -> navigateToPrevious() + TraineeSignUpEffect.NavigateToConnect -> navigateToConnect() + } + } + } +} + +@Composable +private fun TraineeSignUpScreen( + state: TraineeSignUpUiState, + onNextClick: () -> Unit, + onBackClick: () -> Unit, +) { + when (state.page) { + TraineeSignUpPage.ProfileSetUp -> TraineeProfileSetupScreen( + onBackClick = onBackClick, + onNextClick = onNextClick, + ) + TraineeSignUpPage.BasicInfo -> TraineeBasicInfoScreen( + onBackClick = onBackClick, + onNextClick = onNextClick, + ) + TraineeSignUpPage.NoteForTrainer -> TraineeNoteForTrainerScreen( + onBackClick = onBackClick, + onNextClick = onNextClick, + ) + TraineeSignUpPage.PTPurpose -> TraineePTPurposeScreen( + onBackClick = onBackClick, + onNextClick = onNextClick, + ) + TraineeSignUpPage.SignUpComplete -> TraineeSignUpCompleteScreen( + onBackClick = onBackClick, + onNextClick = onNextClick, + ) + } +} diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpViewModel.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpViewModel.kt new file mode 100644 index 00000000..8c2d38d0 --- /dev/null +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpViewModel.kt @@ -0,0 +1,46 @@ +package co.kr.tnt.trainee.signup + +import co.kr.tnt.trainee.signup.TraineeSignUpContract.TraineeSignUpEffect +import co.kr.tnt.trainee.signup.TraineeSignUpContract.TraineeSignUpPage +import co.kr.tnt.trainee.signup.TraineeSignUpContract.TraineeSignUpUiEvent +import co.kr.tnt.trainee.signup.TraineeSignUpContract.TraineeSignUpUiState +import co.kr.tnt.ui.base.BaseViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +internal class TraineeSignUpViewModel @Inject constructor() : + BaseViewModel( + TraineeSignUpUiState(), + ) { + override suspend fun handleEvent(event: TraineeSignUpUiEvent) { + when (event) { + TraineeSignUpUiEvent.OnBackClick -> navigateToBack() + TraineeSignUpUiEvent.OnNextClick -> navigateToNext() + } + } + + private fun navigateToNext() { + val nextPage = when (currentState.page) { + TraineeSignUpPage.SignUpComplete -> { + sendEffect(TraineeSignUpEffect.NavigateToConnect) + return + } + + else -> TraineeSignUpPage.getNextPage(currentState.page) + } + updateState { copy(page = nextPage) } + } + + private fun navigateToBack() { + val previousPage = when (currentState.page) { + TraineeSignUpPage.ProfileSetUp -> { + sendEffect(TraineeSignUpEffect.NavigateToBack) + return + } + + else -> TraineeSignUpPage.getPreviousPage(currentState.page) + } + updateState { copy(page = previousPage) } + } + } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/navigation/TraineeSignUpNavigation.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/navigation/TraineeSignUpNavigation.kt new file mode 100644 index 00000000..b3524cec --- /dev/null +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/navigation/TraineeSignUpNavigation.kt @@ -0,0 +1,31 @@ +package co.kr.tnt.trainee.signup.navigation + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptionsBuilder +import androidx.navigation.compose.composable +import androidx.navigation.toRoute +import co.kr.tnt.navigation.Route +import co.kr.tnt.trainee.signup.TraineeSignUpRoute + +fun NavController.navigateToTraineeSignUp( + navOptions: NavOptionsBuilder.() -> Unit = {}, +) = navigate( + route = Route.TraineeSignUp, + builder = navOptions, +) + +fun NavGraphBuilder.traineeSignUpScreen( + navigateToPrevious: () -> Unit, + navigateToHome: () -> Unit, +) { + composable { backstackEntry -> + backstackEntry.toRoute().apply { + // TODO 115 머지되면 connect로 이동 + TraineeSignUpRoute( + navigateToPrevious = navigateToPrevious, + navigateToConnect = { navigateToHome() }, + ) + } + } +} From 37afaee445e483ae05292dba9e275831dab39ce7 Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sat, 25 Jan 2025 21:19:36 +0900 Subject: [PATCH 05/15] [TNT-114] chore: TNT-115 branch rebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - develop과 머지 된 TNT-115 branch --- feature/main/build.gradle.kts | 1 + .../main/java/co/kr/tnt/main/ui/TnTNavHost.kt | 6 ++ .../signup/TrainerProfileSetupScreen.kt | 15 ++-- .../signup/TrainerSignUpCompleteScreen.kt | 88 +++++++++++-------- .../trainer/signup/TrainerSignUpContract.kt | 44 ++++++++++ .../tnt/trainer/signup/TrainerSignUpScreen.kt | 51 +++++++++++ .../trainer/signup/TrainerSignUpViewModel.kt | 46 ++++++++++ .../navigation/TrainerSignUpNavigation.kt | 31 +++++++ 8 files changed, 239 insertions(+), 43 deletions(-) create mode 100644 feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpContract.kt create mode 100644 feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt create mode 100644 feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpViewModel.kt create mode 100644 feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/navigation/TrainerSignUpNavigation.kt diff --git a/feature/main/build.gradle.kts b/feature/main/build.gradle.kts index e11356f5..c6c09445 100644 --- a/feature/main/build.gradle.kts +++ b/feature/main/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { implementation(projects.feature.trainer.connect) implementation(projects.feature.trainee.connect) implementation(projects.feature.trainee.signup) + implementation(projects.feature.trainer.signup) implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) diff --git a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt index d48cd146..d5c39399 100644 --- a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt +++ b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt @@ -11,6 +11,7 @@ import co.kr.tnt.login.navigation.loginScreen import co.kr.tnt.trainee.signup.navigation.traineeSignUpScreen import co.kr.tnt.trainee.connect.navigation.traineeConnectScreen import co.kr.tnt.trainer.connect.navigation.trainerConnectScreen +import co.kr.tnt.trainer.signup.navigation.trainerSignUpScreen @Composable fun TnTNavHost( @@ -30,10 +31,15 @@ fun TnTNavHost( navigateToHome = { }, navigateToSignup = { }, ) + // TODO connect로 이동하게 수정 traineeSignUpScreen( navigateToPrevious = { navController.popBackStack() }, navigateToHome = { navController.navigateToHome(false, clearBackStack = true) }, ) + trainerSignUpScreen( + navigateToPrevious = { navController.popBackStack() }, + navigateToHome = { navController.navigateToHome(false, clearBackStack = true) }, + ) trainerConnectScreen( navigateToPrevious = { navController.popBackStack() }, navigateToHome = { diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt index a06a8f92..969c24c8 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt @@ -41,7 +41,10 @@ import coil.compose.rememberAsyncImagePainter import coil.request.ImageRequest @Composable -fun TrainerProfileSetupScreen() { +fun TrainerProfileSetupScreen( + onBackClick: () -> Unit, + onNextClick: () -> Unit, +) { val context = LocalContext.current // TODO 상태 관리 따로 빼기 @@ -63,7 +66,7 @@ fun TrainerProfileSetupScreen() { ) Scaffold( - topBar = { TnTTopBarWithBackButton(onBackClick = {}) }, + topBar = { TnTTopBarWithBackButton(onBackClick = {onBackClick()}) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -112,12 +115,11 @@ fun TrainerProfileSetupScreen() { warningMessage = stringResource(R.string.text_length_warning, maxLength), ) } - // TODO 트레이너 프로필 생성 완료 화면으로 이동 TnTBottomButton( text = stringResource(R.string.next), modifier = Modifier.align(Alignment.BottomCenter), enabled = text.isNotBlank() && !isWarning, - onClick = { }, + onClick = { onNextClick() }, ) } } @@ -134,6 +136,9 @@ private fun validateInput(input: String): String { @Composable private fun TrainerProfileSetupScreenPreview() { TnTTheme { - TrainerProfileSetupScreen() + TrainerProfileSetupScreen( + onBackClick = {}, + onNextClick = {}, + ) } } diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt index 8f463152..fa87ab62 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainer.signup +import androidx.activity.compose.BackHandler import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -7,6 +8,7 @@ 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.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -25,52 +27,59 @@ import coil.compose.rememberAsyncImagePainter @Composable fun TrainerSignUpCompleteScreen( - modifier: Modifier = Modifier, + onBackClick: () -> Unit, + onNextClick: () -> Unit, ) { + BackHandler { onBackClick() } + // TODO 이름, 프로필 이미지 불러오기 val name = "김헬짱" val profileImage = "https://buly.kr/7FQeS5M" - Box( - modifier = modifier - .fillMaxSize() - .background(TnTTheme.colors.commonColors.Common0), - contentAlignment = Alignment.Center, - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, + Scaffold( + containerColor = TnTTheme.colors.commonColors.Common0, + ) { innerPadding -> + Box( modifier = Modifier - .fillMaxWidth() - .padding(bottom = 66.dp), + .padding(innerPadding) + .fillMaxSize() + .background(TnTTheme.colors.commonColors.Common0), + contentAlignment = Alignment.Center, ) { - Text( - text = stringResource(R.string.nice_to_meet_you_trainer, name), - color = TnTTheme.colors.neutralColors.Neutral950, - style = TnTTheme.typography.h1, - textAlign = Center, - modifier = Modifier.padding(horizontal = 24.dp), - ) - Spacer(Modifier.padding(top = 10.dp)) - Text( - text = stringResource(R.string.chemistry_boom_with_trainee), - color = TnTTheme.colors.neutralColors.Neutral500, - style = TnTTheme.typography.body1Medium, - textAlign = Center, - ) - Spacer(Modifier.padding(top = 28.dp)) - TnTProfileImage( - defaultImage = painterResource(DefaultUserProfile.Trainer.image), - image = rememberAsyncImagePainter(profileImage), - imageSize = 200.dp, - showEditButton = false, + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 66.dp), + ) { + Text( + text = stringResource(R.string.nice_to_meet_you_trainer, name), + color = TnTTheme.colors.neutralColors.Neutral950, + style = TnTTheme.typography.h1, + textAlign = Center, + modifier = Modifier.padding(horizontal = 24.dp), + ) + Spacer(Modifier.padding(top = 10.dp)) + Text( + text = stringResource(R.string.chemistry_boom_with_trainee), + color = TnTTheme.colors.neutralColors.Neutral500, + style = TnTTheme.typography.body1Medium, + textAlign = Center, + ) + Spacer(Modifier.padding(top = 28.dp)) + TnTProfileImage( + defaultImage = painterResource(DefaultUserProfile.Trainer.image), + image = rememberAsyncImagePainter(profileImage), + imageSize = 200.dp, + showEditButton = false, + ) + } + TnTBottomButton( + text = stringResource(R.string.start), + onClick = { onNextClick() }, + modifier = Modifier.align(Alignment.BottomCenter), ) } - // TODO 연결코드 생성 화면으로 이동 - TnTBottomButton( - text = stringResource(R.string.start), - onClick = { }, - modifier = Modifier.align(Alignment.BottomCenter), - ) } } @@ -78,6 +87,9 @@ fun TrainerSignUpCompleteScreen( @Composable private fun TrainerSignUpCompleteScreenPreview() { TnTTheme { - TrainerSignUpCompleteScreen() + TrainerSignUpCompleteScreen( + onBackClick = {}, + onNextClick = {}, + ) } } diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpContract.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpContract.kt new file mode 100644 index 00000000..a77a5051 --- /dev/null +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpContract.kt @@ -0,0 +1,44 @@ +package co.kr.tnt.trainer.signup + +import co.kr.tnt.ui.base.UiEvent +import co.kr.tnt.ui.base.UiSideEffect +import co.kr.tnt.ui.base.UiState + +internal class TrainerSignUpContract { + data class TrainerSignUpUiState( + val page: TrainerSignUpPage = TrainerSignUpPage.ProfileSetUp, + val name: String = "", + ) : UiState + + sealed interface TrainerSignUpUiEvent : UiEvent { + data object OnNextClick : TrainerSignUpUiEvent + data object OnBackClick : TrainerSignUpUiEvent + } + + sealed interface TrainerSignUpEffect : UiSideEffect { + data object NavigateToBack : TrainerSignUpEffect + data object NavigateToConnect : TrainerSignUpEffect + } + + enum class TrainerSignUpPage { + ProfileSetUp, + SignUpComplete, + ; + + companion object { + fun getPreviousPage(currentPage: TrainerSignUpPage): TrainerSignUpPage { + return when (currentPage) { + SignUpComplete -> ProfileSetUp + else -> error("No previous page defined for $currentPage") + } + } + + fun getNextPage(currentPage: TrainerSignUpPage): TrainerSignUpPage { + return when (currentPage) { + ProfileSetUp -> SignUpComplete + else -> error("No next page defined for $currentPage") + } + } + } + } +} diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt new file mode 100644 index 00000000..7d05719b --- /dev/null +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt @@ -0,0 +1,51 @@ +package co.kr.tnt.trainer.signup + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import co.kr.tnt.trainer.signup.TrainerSignUpContract.TrainerSignUpUiEvent +import co.kr.tnt.trainer.signup.TrainerSignUpContract.TrainerSignUpUiState + +@Composable +internal fun TrainerSignUpRoute( + navigateToPrevious: () -> Unit, + navigateToConnect: () -> Unit, + viewModel: TrainerSignUpViewModel = hiltViewModel(), +) { + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + TrainerSignUpScreen( + state = uiState, + onNextClick = { viewModel.setEvent(TrainerSignUpUiEvent.OnNextClick) }, + onBackClick = { viewModel.setEvent(TrainerSignUpUiEvent.OnBackClick) }, + ) + + LaunchedEffect(viewModel.effect) { + viewModel.effect.collect { effect -> + when (effect) { + TrainerSignUpContract.TrainerSignUpEffect.NavigateToBack -> navigateToPrevious() + TrainerSignUpContract.TrainerSignUpEffect.NavigateToConnect -> navigateToConnect() + } + } + } +} + +@Composable +private fun TrainerSignUpScreen( + state: TrainerSignUpUiState, + onNextClick: () -> Unit, + onBackClick: () -> Unit, +) { + when (state.page) { + TrainerSignUpContract.TrainerSignUpPage.ProfileSetUp -> TrainerProfileSetupScreen( + onNextClick = onNextClick, + onBackClick = onBackClick, + ) + TrainerSignUpContract.TrainerSignUpPage.SignUpComplete -> TrainerSignUpCompleteScreen( + onNextClick = onNextClick, + onBackClick = onBackClick, + ) + } +} diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpViewModel.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpViewModel.kt new file mode 100644 index 00000000..0ec565cd --- /dev/null +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpViewModel.kt @@ -0,0 +1,46 @@ +package co.kr.tnt.trainer.signup + +import co.kr.tnt.trainer.signup.TrainerSignUpContract.TrainerSignUpEffect +import co.kr.tnt.trainer.signup.TrainerSignUpContract.TrainerSignUpPage +import co.kr.tnt.trainer.signup.TrainerSignUpContract.TrainerSignUpUiEvent +import co.kr.tnt.trainer.signup.TrainerSignUpContract.TrainerSignUpUiState +import co.kr.tnt.ui.base.BaseViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +internal class TrainerSignUpViewModel @Inject constructor() : + BaseViewModel( + TrainerSignUpUiState(), + ) { + override suspend fun handleEvent(event: TrainerSignUpUiEvent) { + when (event) { + TrainerSignUpUiEvent.OnNextClick -> navigateToNext() + TrainerSignUpUiEvent.OnBackClick -> navigateToBack() + } + } + + private fun navigateToNext() { + val nextPage = when (currentState.page) { + TrainerSignUpPage.SignUpComplete -> { + sendEffect(TrainerSignUpEffect.NavigateToConnect) + return + } + + else -> TrainerSignUpPage.getNextPage(currentState.page) + } + updateState { copy(page = nextPage) } + } + + private fun navigateToBack() { + val previousPage = when (currentState.page) { + TrainerSignUpPage.ProfileSetUp -> { + sendEffect(TrainerSignUpEffect.NavigateToBack) + return + } + + else -> TrainerSignUpPage.getPreviousPage(currentState.page) + } + updateState { copy(page = previousPage) } + } + } diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/navigation/TrainerSignUpNavigation.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/navigation/TrainerSignUpNavigation.kt new file mode 100644 index 00000000..65fe5ae4 --- /dev/null +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/navigation/TrainerSignUpNavigation.kt @@ -0,0 +1,31 @@ +package co.kr.tnt.trainer.signup.navigation + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptionsBuilder +import androidx.navigation.compose.composable +import androidx.navigation.toRoute +import co.kr.tnt.navigation.Route +import co.kr.tnt.trainer.signup.TrainerSignUpRoute + +fun NavController.navigateToTrainerSignUp( + navOptions: NavOptionsBuilder.() -> Unit = {}, +) = navigate( + route = Route.TrainerSignUp, + builder = navOptions, +) + +fun NavGraphBuilder.trainerSignUpScreen( + navigateToPrevious: () -> Unit, + navigateToHome: (Boolean) -> Unit, +) { + composable { backstackEntry -> + backstackEntry.toRoute().apply { + // TODO 115 머지되면 connect로 이동 + TrainerSignUpRoute( + navigateToPrevious = navigateToPrevious, + navigateToConnect = { navigateToHome(true) }, + ) + } + } +} From 337bdb0599f7ffbd2068099635aa5cb427bacf08 Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sun, 26 Jan 2025 22:28:06 +0900 Subject: [PATCH 06/15] =?UTF-8?q?[TNT-114]=20feat:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=ED=99=94=EB=A9=B4=EA=B3=BC=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=ED=99=94=EB=A9=B4=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - isFromMyPage를 추가해 TopBar와 뒤로가기 동작을 다르게 설정 --- .../java/co/kr/tnt/navigation/RouteModel.kt | 4 +- .../main/java/co/kr/tnt/main/ui/TnTNavHost.kt | 13 ++-- .../kr/tnt/trainee/connect/CodeEntryPage.kt | 64 ++++++++++--------- .../trainee/connect/TraineeConnectScreen.kt | 5 ++ .../navigation/TraineeConnectNavigation.kt | 4 +- .../navigation/TraineeSignUpNavigation.kt | 5 +- .../tnt/trainer/connect/CodeGenerationPage.kt | 44 +++++++++---- .../trainer/connect/TrainerConnectContract.kt | 2 +- .../trainer/connect/TrainerConnectScreen.kt | 5 +- .../navigation/TrainerConnectNavigation.kt | 6 +- .../navigation/TrainerSignUpNavigation.kt | 4 +- 11 files changed, 93 insertions(+), 63 deletions(-) diff --git a/core/navigation/src/main/java/co/kr/tnt/navigation/RouteModel.kt b/core/navigation/src/main/java/co/kr/tnt/navigation/RouteModel.kt index 36585b41..37d32a94 100644 --- a/core/navigation/src/main/java/co/kr/tnt/navigation/RouteModel.kt +++ b/core/navigation/src/main/java/co/kr/tnt/navigation/RouteModel.kt @@ -19,8 +19,8 @@ sealed interface Route { data object TraineeSignUp : Route @Serializable - data object TrainerConnect : Route + data class TrainerConnect(val isFromMyPage: Boolean) : Route @Serializable - data object TraineeConnect : Route + data class TraineeConnect(val isFromMyPage: Boolean) : Route } diff --git a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt index d5c39399..21db21e9 100644 --- a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt +++ b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt @@ -8,8 +8,10 @@ import androidx.navigation.compose.NavHost import co.kr.tnt.home.navigation.homeNavGraph import co.kr.tnt.home.navigation.navigateToHome import co.kr.tnt.login.navigation.loginScreen -import co.kr.tnt.trainee.signup.navigation.traineeSignUpScreen +import co.kr.tnt.trainee.connect.navigation.navigateToTraineeConnect import co.kr.tnt.trainee.connect.navigation.traineeConnectScreen +import co.kr.tnt.trainee.signup.navigation.traineeSignUpScreen +import co.kr.tnt.trainer.connect.navigation.navigateToTrainerConnect import co.kr.tnt.trainer.connect.navigation.trainerConnectScreen import co.kr.tnt.trainer.signup.navigation.trainerSignUpScreen @@ -31,14 +33,13 @@ fun TnTNavHost( navigateToHome = { }, navigateToSignup = { }, ) - // TODO connect로 이동하게 수정 - traineeSignUpScreen( + trainerSignUpScreen( navigateToPrevious = { navController.popBackStack() }, - navigateToHome = { navController.navigateToHome(false, clearBackStack = true) }, + navigateToConnect = { navController.navigateToTrainerConnect(isFromMyPage = false) }, ) - trainerSignUpScreen( + traineeSignUpScreen( navigateToPrevious = { navController.popBackStack() }, - navigateToHome = { navController.navigateToHome(false, clearBackStack = true) }, + navigateToConnect = { navController.navigateToTraineeConnect(isFromMyPage = false) }, ) trainerConnectScreen( navigateToPrevious = { navController.popBackStack() }, diff --git a/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt b/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt index 6cf1436e..a7b09213 100644 --- a/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt +++ b/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainee.connect +import androidx.activity.compose.BackHandler import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -10,16 +11,14 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable 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 co.kr.tnt.designsystem.component.TnTPopupDialog import co.kr.tnt.designsystem.component.TnTTopBar +import co.kr.tnt.designsystem.component.TnTTopBarWithBackButton import co.kr.tnt.designsystem.component.button.TnTBottomButton import co.kr.tnt.designsystem.component.button.TnTTextButton import co.kr.tnt.designsystem.component.button.model.ButtonSize @@ -33,28 +32,43 @@ import co.kr.tnt.core.ui.R as uiResource @Composable internal fun CodeEntryPage( state: TraineeConnectUiState, + isFromMyPage: Boolean, onSkipClick: () -> Unit, + onBackClick: () -> Unit, onNextClick: () -> Unit, onCodeChanged: (String) -> Unit, onValidateClick: (String) -> Unit, ) { - var showDialog by rememberSaveable { mutableStateOf(true) } + BackHandler { + if (isFromMyPage) { + onBackClick() + } else { + onSkipClick() + } + } Scaffold( topBar = { - TnTTopBar( - title = stringResource(uiResource.string.connect), - trailingComponent = { - Text( - text = stringResource(uiResource.string.skip), - color = TnTTheme.colors.neutralColors.Neutral400, - style = TnTTheme.typography.body2Medium, - modifier = Modifier.clickable { - onSkipClick() - }, - ) - }, - ) + if (isFromMyPage) { + TnTTopBarWithBackButton( + title = stringResource(uiResource.string.connect), + onBackClick = onBackClick, + ) + } else { + TnTTopBar( + title = stringResource(uiResource.string.connect), + trailingComponent = { + Text( + text = stringResource(uiResource.string.skip), + color = TnTTheme.colors.neutralColors.Neutral400, + style = TnTTheme.typography.body2Medium, + modifier = Modifier.clickable { + onSkipClick() + }, + ) + }, + ) + } }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> @@ -89,20 +103,6 @@ internal fun CodeEntryPage( modifier = Modifier.align(Alignment.BottomCenter), ) } - if (showDialog) { - TnTPopupDialog( - title = stringResource(R.string.enter_invite_code_from_trainer), - content = stringResource(R.string.not_connected_warning), - leftButtonText = stringResource(R.string.next_time), - rightButtonText = stringResource(uiResource.string.ok), - onLeftButtonClick = { - showDialog = false - onSkipClick() - }, - onRightButtonClick = { showDialog = false }, - onDismiss = { showDialog = false }, - ) - } } } @@ -111,11 +111,13 @@ internal fun CodeEntryPage( private fun CodeEntryPagePreview() { TnTTheme { CodeEntryPage( + isFromMyPage = false, onSkipClick = {}, onNextClick = {}, state = TODO(), onValidateClick = {}, onCodeChanged = TODO(), + onBackClick = {}, ) } } diff --git a/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/TraineeConnectScreen.kt b/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/TraineeConnectScreen.kt index 9a65d714..fdfe1208 100644 --- a/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/TraineeConnectScreen.kt +++ b/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/TraineeConnectScreen.kt @@ -13,6 +13,7 @@ import co.kr.tnt.trainee.connect.model.PTSessionFormData @Composable internal fun TraineeConnectRoute( + isFromMyPage: Boolean, navigateToPrevious: () -> Unit, navigateToHome: (Boolean) -> Unit, viewModel: TraineeConnectViewModel = hiltViewModel(), @@ -21,6 +22,7 @@ internal fun TraineeConnectRoute( TraineeConnectScreen( state = state, + isFromMyPage = isFromMyPage, onFormNextClick = { formData -> viewModel.setEvent(TraineeConnectUiEvent.UpdatePTSessionData(formData)) }, @@ -48,6 +50,7 @@ internal fun TraineeConnectRoute( @Composable private fun TraineeConnectScreen( state: TraineeConnectUiState, + isFromMyPage: Boolean, onCodeValidationClick: (String) -> Unit, onCodeChanged: (String) -> Unit, onFormNextClick: (PTSessionFormData) -> Unit, @@ -58,7 +61,9 @@ private fun TraineeConnectScreen( when (state.page) { TraineeConnectPage.CodeEntry -> CodeEntryPage( state = state, + isFromMyPage = isFromMyPage, onNextClick = onNextClick, + onBackClick = onBackClick, onSkipClick = onSkipClick, onCodeChanged = { code -> onCodeChanged(code) diff --git a/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/navigation/TraineeConnectNavigation.kt b/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/navigation/TraineeConnectNavigation.kt index bea90d87..88c9b4da 100644 --- a/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/navigation/TraineeConnectNavigation.kt +++ b/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/navigation/TraineeConnectNavigation.kt @@ -9,9 +9,10 @@ import co.kr.tnt.navigation.Route import co.kr.tnt.trainee.connect.TraineeConnectRoute fun NavController.navigateToTraineeConnect( + isFromMyPage: Boolean, navOptions: NavOptionsBuilder.() -> Unit = {}, ) = navigate( - route = Route.TraineeConnect, + route = Route.TraineeConnect(isFromMyPage), builder = navOptions, ) @@ -22,6 +23,7 @@ fun NavGraphBuilder.traineeConnectScreen( composable { backstackEntry -> backstackEntry.toRoute().apply { TraineeConnectRoute( + isFromMyPage = isFromMyPage, navigateToPrevious = navigateToPrevious, navigateToHome = { navigateToHome(false) }, ) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/navigation/TraineeSignUpNavigation.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/navigation/TraineeSignUpNavigation.kt index b3524cec..c5fde069 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/navigation/TraineeSignUpNavigation.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/navigation/TraineeSignUpNavigation.kt @@ -17,14 +17,13 @@ fun NavController.navigateToTraineeSignUp( fun NavGraphBuilder.traineeSignUpScreen( navigateToPrevious: () -> Unit, - navigateToHome: () -> Unit, + navigateToConnect: () -> Unit, ) { composable { backstackEntry -> backstackEntry.toRoute().apply { - // TODO 115 머지되면 connect로 이동 TraineeSignUpRoute( navigateToPrevious = navigateToPrevious, - navigateToConnect = { navigateToHome() }, + navigateToConnect = { navigateToConnect() }, ) } } diff --git a/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/CodeGenerationPage.kt b/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/CodeGenerationPage.kt index dc83c81f..7e3bd008 100644 --- a/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/CodeGenerationPage.kt +++ b/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/CodeGenerationPage.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import co.kr.tnt.designsystem.component.TnTToast import co.kr.tnt.designsystem.component.TnTTopBar +import co.kr.tnt.designsystem.component.TnTTopBarWithBackButton import co.kr.tnt.designsystem.component.button.TnTTextButton import co.kr.tnt.designsystem.component.button.model.ButtonSize import co.kr.tnt.designsystem.component.button.model.ButtonType @@ -42,30 +43,44 @@ import co.kr.tnt.core.ui.R as uiResource @Composable internal fun CodeGenerationPage( state: TrainerConnectUiState, + isFromMyPage: Boolean, onRegenerateClick: () -> Unit, onBackClick: () -> Unit, onSkipClick: () -> Unit, ) { - BackHandler { onBackClick() } + BackHandler { + if (isFromMyPage) { + onBackClick() + } else { + onSkipClick() + } + } val context = LocalContext.current var showToast by remember { mutableStateOf(false) } Scaffold( topBar = { - TnTTopBar( - title = stringResource(uiResource.string.connect), - trailingComponent = { - Text( - text = stringResource(uiResource.string.skip), - color = TnTTheme.colors.neutralColors.Neutral400, - style = TnTTheme.typography.body2Medium, - modifier = Modifier.clickable { - onSkipClick() - }, - ) - }, - ) + if (isFromMyPage) { + TnTTopBarWithBackButton( + title = stringResource(uiResource.string.connect), + onBackClick = onBackClick, + ) + } else { + TnTTopBar( + title = stringResource(uiResource.string.connect), + trailingComponent = { + Text( + text = stringResource(uiResource.string.skip), + color = TnTTheme.colors.neutralColors.Neutral400, + style = TnTTheme.typography.body2Medium, + modifier = Modifier.clickable { + onSkipClick() + }, + ) + }, + ) + } }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> @@ -166,6 +181,7 @@ private fun CodeGenerationPagePreview() { onBackClick = {}, onSkipClick = {}, onRegenerateClick = {}, + isFromMyPage = false, ) } } diff --git a/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/TrainerConnectContract.kt b/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/TrainerConnectContract.kt index c8e288b1..2ccf95aa 100644 --- a/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/TrainerConnectContract.kt +++ b/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/TrainerConnectContract.kt @@ -7,7 +7,7 @@ import co.kr.tnt.ui.base.UiState internal class TrainerConnectContract { data class TrainerConnectUiState( - val page: TrainerConnectPage = TrainerConnectPage.TrainerConnectComplete, + val page: TrainerConnectPage = TrainerConnectPage.CodeGeneration, val inviteCode: String = "", val trainerState: UserType.Trainer = UserType.Trainer(), val traineeState: UserType.Trainee = UserType.Trainee(), diff --git a/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/TrainerConnectScreen.kt b/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/TrainerConnectScreen.kt index 7be3e552..91cff532 100644 --- a/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/TrainerConnectScreen.kt +++ b/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/TrainerConnectScreen.kt @@ -12,6 +12,7 @@ import co.kr.tnt.trainer.connect.TrainerConnectContract.TrainerConnectUiState @Composable internal fun TrainerConnectRoute( + isFromMyPage: Boolean, navigateToPrevious: () -> Unit, navigateToHome: (Boolean) -> Unit, viewModel: TrainerConnectViewModel = hiltViewModel(), @@ -20,6 +21,7 @@ internal fun TrainerConnectRoute( TrainerConnectScreen( state = state, + isFromMyPage = isFromMyPage, onRegenerateClick = { viewModel.setEvent(TrainerConnectUiEvent.OnRegenerateClick) }, onBackClick = { viewModel.setEvent(TrainerConnectUiEvent.OnBackClick) }, onNextClick = { viewModel.setEvent(TrainerConnectUiEvent.OnNextClick) }, @@ -31,7 +33,6 @@ internal fun TrainerConnectRoute( when (effect) { TrainerConnectSideEffect.NavigateToBack -> navigateToPrevious() TrainerConnectSideEffect.NavigateToHome -> navigateToHome(true) - else -> {} } } } @@ -40,6 +41,7 @@ internal fun TrainerConnectRoute( @Composable private fun TrainerConnectScreen( state: TrainerConnectUiState, + isFromMyPage: Boolean, onRegenerateClick: () -> Unit, onBackClick: () -> Unit, onNextClick: () -> Unit, @@ -48,6 +50,7 @@ private fun TrainerConnectScreen( when (state.page) { TrainerConnectPage.CodeGeneration -> CodeGenerationPage( state = state, + isFromMyPage = isFromMyPage, onRegenerateClick = onRegenerateClick, onBackClick = onBackClick, onSkipClick = onSkipClick, diff --git a/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/navigation/TrainerConnectNavigation.kt b/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/navigation/TrainerConnectNavigation.kt index 62735145..f5782c30 100644 --- a/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/navigation/TrainerConnectNavigation.kt +++ b/feature/trainer/connect/src/main/java/co/kr/tnt/trainer/connect/navigation/TrainerConnectNavigation.kt @@ -8,10 +8,11 @@ import androidx.navigation.toRoute import co.kr.tnt.navigation.Route import co.kr.tnt.trainer.connect.TrainerConnectRoute -fun NavController.navigateToConnect( +fun NavController.navigateToTrainerConnect( + isFromMyPage: Boolean, navOptions: NavOptionsBuilder.() -> Unit = {}, ) = navigate( - route = Route.TrainerConnect, + route = Route.TrainerConnect(isFromMyPage), builder = navOptions, ) @@ -22,6 +23,7 @@ fun NavGraphBuilder.trainerConnectScreen( composable { backstackEntry -> backstackEntry.toRoute().apply { TrainerConnectRoute( + isFromMyPage = isFromMyPage, navigateToPrevious = navigateToPrevious, navigateToHome = { navigateToHome(true) }, ) diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/navigation/TrainerSignUpNavigation.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/navigation/TrainerSignUpNavigation.kt index 65fe5ae4..c17b09b2 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/navigation/TrainerSignUpNavigation.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/navigation/TrainerSignUpNavigation.kt @@ -17,14 +17,14 @@ fun NavController.navigateToTrainerSignUp( fun NavGraphBuilder.trainerSignUpScreen( navigateToPrevious: () -> Unit, - navigateToHome: (Boolean) -> Unit, + navigateToConnect: () -> Unit, ) { composable { backstackEntry -> backstackEntry.toRoute().apply { // TODO 115 머지되면 connect로 이동 TrainerSignUpRoute( navigateToPrevious = navigateToPrevious, - navigateToConnect = { navigateToHome(true) }, + navigateToConnect = { navigateToConnect() }, ) } } From cb749457db93d1770e69b42927f40b88f33d82b6 Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sun, 26 Jan 2025 22:29:25 +0900 Subject: [PATCH 07/15] =?UTF-8?q?[TNT-114]=20fix:=20=ED=8A=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EB=8B=88=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=88=9C=EC=84=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/tnt/trainee/signup/TraineeSignUpContract.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpContract.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpContract.kt index 98e62c91..d1b39255 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpContract.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpContract.kt @@ -23,8 +23,8 @@ internal class TraineeSignUpContract { enum class TraineeSignUpPage { ProfileSetUp, BasicInfo, - NoteForTrainer, PTPurpose, + NoteForTrainer, SignUpComplete, ; @@ -32,9 +32,9 @@ internal class TraineeSignUpContract { fun getPreviousPage(currentPage: TraineeSignUpPage): TraineeSignUpPage { return when (currentPage) { BasicInfo -> ProfileSetUp - NoteForTrainer -> BasicInfo - PTPurpose -> NoteForTrainer - SignUpComplete -> PTPurpose + PTPurpose -> BasicInfo + NoteForTrainer -> PTPurpose + SignUpComplete -> NoteForTrainer else -> error("No previous page defined for $currentPage") } } @@ -42,9 +42,9 @@ internal class TraineeSignUpContract { fun getNextPage(currentPage: TraineeSignUpPage): TraineeSignUpPage { return when (currentPage) { ProfileSetUp -> BasicInfo - BasicInfo -> NoteForTrainer - NoteForTrainer -> PTPurpose - PTPurpose -> SignUpComplete + BasicInfo -> PTPurpose + PTPurpose -> NoteForTrainer + NoteForTrainer -> SignUpComplete else -> error("No next page defined for $currentPage") } } From c6c62800e2ccb11707668b178d686319826c721e Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sun, 26 Jan 2025 22:36:59 +0900 Subject: [PATCH 08/15] =?UTF-8?q?[TNT-114]=20fix:=20core:ui=20=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A7=81=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/ui/src/main/res/values/strings.xml | 1 + .../kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt | 13 +++++++------ .../trainee/signup/TraineeNoteForTrainerScreen.kt | 3 ++- .../kr/tnt/trainee/signup/TraineePTPurposeScreen.kt | 3 ++- .../tnt/trainee/signup/TraineeProfileSetupScreen.kt | 8 ++++---- .../trainee/signup/TraineeSignUpCompleteScreen.kt | 3 ++- .../trainee/signup/src/main/res/values/strings.xml | 9 --------- .../tnt/trainer/signup/TrainerProfileSetupScreen.kt | 8 ++++---- .../trainer/signup/TrainerSignUpCompleteScreen.kt | 3 ++- .../trainer/signup/src/main/res/values/strings.xml | 4 ---- 10 files changed, 24 insertions(+), 31 deletions(-) diff --git a/core/ui/src/main/res/values/strings.xml b/core/ui/src/main/res/values/strings.xml index 3ddb2cc4..22116865 100644 --- a/core/ui/src/main/res/values/strings.xml +++ b/core/ui/src/main/res/values/strings.xml @@ -24,6 +24,7 @@ 시작하기 건너뛰기 + 이름 나이 체중 diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt index 42bde7b3..2c76d987 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt @@ -39,6 +39,7 @@ import co.kr.tnt.trainee.signup.component.ProgressSteps import java.time.LocalDate import java.time.ZoneId import java.time.format.DateTimeFormatter +import co.kr.tnt.core.ui.R as uiResource private const val MAX_HEIGHT_LENGTH = 3 private const val MAX_WEIGHT_LENGTH = 5 @@ -78,7 +79,7 @@ fun TraineeBasicInfoScreen( ) Spacer(Modifier.padding(top = 48.dp)) Text( - text = stringResource(R.string.birthday_placeholder), + text = stringResource(R.string.birthday_label), color = TnTTheme.colors.neutralColors.Neutral900, style = TnTTheme.typography.body1Bold, modifier = Modifier.padding(start = 20.dp, bottom = 8.dp), @@ -102,7 +103,7 @@ fun TraineeBasicInfoScreen( .padding(horizontal = 20.dp), ) { TnTLabeledTextField( - title = stringResource(R.string.height_label), + title = stringResource(uiResource.string.height_label), value = height, placeholder = "0", isSingleLine = true, @@ -111,13 +112,13 @@ fun TraineeBasicInfoScreen( isRequired = true, keyboardType = KeyboardType.Number, trailingComponent = { - UnitLabel(R.string.height_unit) + UnitLabel(uiResource.string.height_unit) }, onValueChange = { height = it }, modifier = Modifier.weight(1f), ) TnTLabeledTextField( - title = stringResource(R.string.weight_label), + title = stringResource(uiResource.string.weight_label), value = weight, placeholder = "00.0", isSingleLine = true, @@ -126,7 +127,7 @@ fun TraineeBasicInfoScreen( isRequired = true, keyboardType = KeyboardType.Number, trailingComponent = { - UnitLabel(R.string.weight_unit) + UnitLabel(uiResource.string.weight_unit) }, onValueChange = { weight = it }, modifier = Modifier.weight(1f), @@ -134,7 +135,7 @@ fun TraineeBasicInfoScreen( } } TnTBottomButton( - text = stringResource(R.string.next), + text = stringResource(uiResource.string.next), modifier = Modifier.align(Alignment.BottomCenter), enabled = isFormValid, onClick = { onNextClick() }, diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt index cf44f81b..c00291a3 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt @@ -25,6 +25,7 @@ import co.kr.tnt.designsystem.component.button.TnTBottomButton import co.kr.tnt.designsystem.theme.TnTTheme import co.kr.tnt.feature.trainee.signup.R import co.kr.tnt.trainee.signup.component.ProgressSteps +import co.kr.tnt.core.ui.R as uiResource private const val MAX_LENGTH = 100 @@ -66,7 +67,7 @@ fun TraineeNoteForTrainerScreen( ) } TnTBottomButton( - text = stringResource(R.string.next), + text = stringResource(uiResource.string.next), modifier = Modifier.align(Alignment.BottomCenter), enabled = text.isNotBlank(), onClick = { onNextClick() }, diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt index 408515cc..3c7f6971 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt @@ -29,6 +29,7 @@ import co.kr.tnt.designsystem.theme.TnTTheme import co.kr.tnt.feature.trainee.signup.R import co.kr.tnt.trainee.signup.component.ProgressSteps import co.kr.tnt.trainee.signup.model.PTPurpose +import co.kr.tnt.core.ui.R as uiResource private const val ROW_NUM = 3 private const val COLUMNS_NUM = 2 @@ -77,7 +78,7 @@ fun TraineePTPurposeScreen( } } TnTBottomButton( - text = stringResource(R.string.next), + text = stringResource(uiResource.string.next), onClick = { onNextClick() }, enabled = selectedPurposes.isNotEmpty(), modifier = Modifier.align(Alignment.BottomCenter), diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt index e90ef111..2343cbc2 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt @@ -40,6 +40,7 @@ import co.kr.tnt.ui.coil.ResizeTransformation import co.kr.tnt.ui.model.DefaultUserProfile import coil.compose.rememberAsyncImagePainter import coil.request.ImageRequest +import co.kr.tnt.core.ui.R as uiResource @Composable fun TraineeProfileSetupScreen( @@ -69,8 +70,7 @@ fun TraineeProfileSetupScreen( ) Scaffold( - // TODO 버튼 클릭 시 트레이너/트레이니 화면으로 이동 - topBar = { TnTTopBarWithBackButton(onBackClick = {}) }, + topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -102,7 +102,7 @@ fun TraineeProfileSetupScreen( ) Spacer(Modifier.padding(top = 60.dp)) TnTLabeledTextFieldWithCounter( - title = stringResource(R.string.name), + title = stringResource(uiResource.string.name), value = text, onValueChange = { newValue -> val filteredText = validateInput(newValue) @@ -118,7 +118,7 @@ fun TraineeProfileSetupScreen( ) } TnTBottomButton( - text = stringResource(R.string.next), + text = stringResource(uiResource.string.next), enabled = text.isNotBlank() && !isWarning, onClick = { onNextClick() }, modifier = Modifier.align(Alignment.BottomCenter), diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt index ff81fbe1..ddafb38e 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt @@ -24,6 +24,7 @@ import co.kr.tnt.designsystem.theme.TnTTheme import co.kr.tnt.feature.trainee.signup.R import co.kr.tnt.ui.model.DefaultUserProfile import coil.compose.rememberAsyncImagePainter +import co.kr.tnt.core.ui.R as uiResource @Composable fun TraineeSignUpCompleteScreen( @@ -75,7 +76,7 @@ fun TraineeSignUpCompleteScreen( ) } TnTBottomButton( - text = stringResource(R.string.start), + text = stringResource(uiResource.string.start), onClick = { onNextClick() }, modifier = Modifier.align(Alignment.BottomCenter), ) diff --git a/feature/trainee/signup/src/main/res/values/strings.xml b/feature/trainee/signup/src/main/res/values/strings.xml index ae3c0f6a..dc06f29f 100644 --- a/feature/trainee/signup/src/main/res/values/strings.xml +++ b/feature/trainee/signup/src/main/res/values/strings.xml @@ -1,15 +1,6 @@ - 다음 - 시작하기 - - - 이름 생년월일 - - 체중 - cm - kg 잘못된 수치를 입력했어요 이름이 어떻게 되세요? diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt index 969c24c8..591f7168 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt @@ -39,6 +39,7 @@ import co.kr.tnt.ui.coil.ResizeTransformation import co.kr.tnt.ui.model.DefaultUserProfile import coil.compose.rememberAsyncImagePainter import coil.request.ImageRequest +import co.kr.tnt.core.ui.R as uiResource @Composable fun TrainerProfileSetupScreen( @@ -66,7 +67,7 @@ fun TrainerProfileSetupScreen( ) Scaffold( - topBar = { TnTTopBarWithBackButton(onBackClick = {onBackClick()}) }, + topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -76,7 +77,6 @@ fun TrainerProfileSetupScreen( .imePadding() .verticalScroll(rememberScrollState()), ) { - // TODO 버튼 클릭 시 트레이너/트레이니 화면으로 이동 Text( text = stringResource(R.string.what_is_your_name), modifier = Modifier.padding(start = 24.dp), @@ -100,7 +100,7 @@ fun TrainerProfileSetupScreen( ) Spacer(Modifier.padding(top = 60.dp)) TnTLabeledTextFieldWithCounter( - title = stringResource(R.string.name), + title = stringResource(uiResource.string.name), value = text, onValueChange = { newValue -> val filteredText = validateInput(newValue) @@ -116,7 +116,7 @@ fun TrainerProfileSetupScreen( ) } TnTBottomButton( - text = stringResource(R.string.next), + text = stringResource(uiResource.string.next), modifier = Modifier.align(Alignment.BottomCenter), enabled = text.isNotBlank() && !isWarning, onClick = { onNextClick() }, diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt index fa87ab62..e2d27237 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt @@ -24,6 +24,7 @@ import co.kr.tnt.designsystem.theme.TnTTheme import co.kr.tnt.feature.trainer.signup.R import co.kr.tnt.ui.model.DefaultUserProfile import coil.compose.rememberAsyncImagePainter +import co.kr.tnt.core.ui.R as uiResource @Composable fun TrainerSignUpCompleteScreen( @@ -75,7 +76,7 @@ fun TrainerSignUpCompleteScreen( ) } TnTBottomButton( - text = stringResource(R.string.start), + text = stringResource(uiResource.string.start), onClick = { onNextClick() }, modifier = Modifier.align(Alignment.BottomCenter), ) diff --git a/feature/trainer/signup/src/main/res/values/strings.xml b/feature/trainer/signup/src/main/res/values/strings.xml index 70cf203e..251e91fb 100644 --- a/feature/trainer/signup/src/main/res/values/strings.xml +++ b/feature/trainer/signup/src/main/res/values/strings.xml @@ -1,9 +1,5 @@ - 다음 - 시작하기 - 이름 - 이름이 어떻게 되세요? 이름을 입력해주세요 %s자 이하로 입력해주세요 From be63a54a204533a4ec58c8ee174818db8708f67a Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sun, 26 Jan 2025 22:41:39 +0900 Subject: [PATCH 09/15] =?UTF-8?q?[TNT-114]=20fix:=20Page=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...aineeBasicInfoScreen.kt => TraineeBasicInfoPage.kt} | 6 +++--- ...orTrainerScreen.kt => TraineeNoteForTrainerPage.kt} | 6 +++--- ...aineePTPurposeScreen.kt => TraineePTPurposePage.kt} | 6 +++--- ...rofileSetupScreen.kt => TraineeProfileSetupPage.kt} | 6 +++--- ...pCompleteScreen.kt => TraineeSignUpCompletePage.kt} | 6 +++--- .../co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt | 10 +++++----- ...rofileSetupScreen.kt => TrainerProfileSetupPage.kt} | 6 +++--- ...pCompleteScreen.kt => TrainerSignUpCompletePage.kt} | 6 +++--- .../co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt | 4 ++-- 9 files changed, 28 insertions(+), 28 deletions(-) rename feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/{TraineeBasicInfoScreen.kt => TraineeBasicInfoPage.kt} (98%) rename feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/{TraineeNoteForTrainerScreen.kt => TraineeNoteForTrainerPage.kt} (96%) rename feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/{TraineePTPurposeScreen.kt => TraineePTPurposePage.kt} (97%) rename feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/{TraineeProfileSetupScreen.kt => TraineeProfileSetupPage.kt} (97%) rename feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/{TraineeSignUpCompleteScreen.kt => TraineeSignUpCompletePage.kt} (96%) rename feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/{TrainerProfileSetupScreen.kt => TrainerProfileSetupPage.kt} (97%) rename feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/{TrainerSignUpCompleteScreen.kt => TrainerSignUpCompletePage.kt} (96%) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt similarity index 98% rename from feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt rename to feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt index 2c76d987..55266f6d 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt @@ -45,7 +45,7 @@ private const val MAX_HEIGHT_LENGTH = 3 private const val MAX_WEIGHT_LENGTH = 5 @Composable -fun TraineeBasicInfoScreen( +fun TraineeBasicInfoPage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { @@ -223,9 +223,9 @@ private fun validateWeight(input: String): Boolean { @Preview(showBackground = true) @Composable -private fun TraineeBasicInfoScreenPreview() { +private fun TraineeBasicInfoPagePreview() { TnTTheme { - TraineeBasicInfoScreen( + TraineeBasicInfoPage( onBackClick = {}, onNextClick = {}, ) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt similarity index 96% rename from feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt rename to feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt index c00291a3..7d937eea 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt @@ -30,7 +30,7 @@ import co.kr.tnt.core.ui.R as uiResource private const val MAX_LENGTH = 100 @Composable -fun TraineeNoteForTrainerScreen( +fun TraineeNoteForTrainerPage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { @@ -78,9 +78,9 @@ fun TraineeNoteForTrainerScreen( @Preview(showBackground = true) @Composable -private fun TraineeNoteForTrainerScreenPreview() { +private fun TraineeNoteForTrainerPagePreview() { TnTTheme { - TraineeNoteForTrainerScreen( + TraineeNoteForTrainerPage( onBackClick = {}, onNextClick = {}, ) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt similarity index 97% rename from feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt rename to feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt index 3c7f6971..d1480b2e 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposeScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt @@ -36,7 +36,7 @@ private const val COLUMNS_NUM = 2 @OptIn(ExperimentalLayoutApi::class) @Composable -fun TraineePTPurposeScreen( +fun TraineePTPurposePage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { @@ -119,9 +119,9 @@ private fun toggleSelection( @Preview(showBackground = true) @Composable -private fun TraineePTPurposeScreenPreview() { +private fun TraineePTPurposePagePreview() { TnTTheme { - TraineePTPurposeScreen( + TraineePTPurposePage( onBackClick = {}, onNextClick = {}, ) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupPage.kt similarity index 97% rename from feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt rename to feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupPage.kt index 2343cbc2..f65cf81e 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupPage.kt @@ -43,7 +43,7 @@ import coil.request.ImageRequest import co.kr.tnt.core.ui.R as uiResource @Composable -fun TraineeProfileSetupScreen( +fun TraineeProfileSetupPage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { @@ -136,9 +136,9 @@ private fun validateInput(input: String): String { @Preview(showBackground = true) @Composable -private fun TraineeProfileSetupScreenPreview() { +private fun TraineeProfileSetupPagePreview() { TnTTheme { - TraineeProfileSetupScreen( + TraineeProfileSetupPage( onBackClick = {}, onNextClick = {}, ) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompletePage.kt similarity index 96% rename from feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt rename to feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompletePage.kt index ddafb38e..488dea23 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompleteScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompletePage.kt @@ -27,7 +27,7 @@ import coil.compose.rememberAsyncImagePainter import co.kr.tnt.core.ui.R as uiResource @Composable -fun TraineeSignUpCompleteScreen( +fun TraineeSignUpCompletePage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { @@ -86,9 +86,9 @@ fun TraineeSignUpCompleteScreen( @Preview(showBackground = true) @Composable -private fun TraineeSignUpCompleteScreenPreview() { +private fun TraineeSignUpCompletePagePreview() { TnTTheme { - TraineeSignUpCompleteScreen( + TraineeSignUpCompletePage( onBackClick = {}, onNextClick = {}, ) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt index dc11a522..c1a584bc 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpScreen.kt @@ -41,23 +41,23 @@ private fun TraineeSignUpScreen( onBackClick: () -> Unit, ) { when (state.page) { - TraineeSignUpPage.ProfileSetUp -> TraineeProfileSetupScreen( + TraineeSignUpPage.ProfileSetUp -> TraineeProfileSetupPage( onBackClick = onBackClick, onNextClick = onNextClick, ) - TraineeSignUpPage.BasicInfo -> TraineeBasicInfoScreen( + TraineeSignUpPage.BasicInfo -> TraineeBasicInfoPage( onBackClick = onBackClick, onNextClick = onNextClick, ) - TraineeSignUpPage.NoteForTrainer -> TraineeNoteForTrainerScreen( + TraineeSignUpPage.NoteForTrainer -> TraineeNoteForTrainerPage( onBackClick = onBackClick, onNextClick = onNextClick, ) - TraineeSignUpPage.PTPurpose -> TraineePTPurposeScreen( + TraineeSignUpPage.PTPurpose -> TraineePTPurposePage( onBackClick = onBackClick, onNextClick = onNextClick, ) - TraineeSignUpPage.SignUpComplete -> TraineeSignUpCompleteScreen( + TraineeSignUpPage.SignUpComplete -> TraineeSignUpCompletePage( onBackClick = onBackClick, onNextClick = onNextClick, ) diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt similarity index 97% rename from feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt rename to feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt index 591f7168..4adadf3d 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupScreen.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt @@ -42,7 +42,7 @@ import coil.request.ImageRequest import co.kr.tnt.core.ui.R as uiResource @Composable -fun TrainerProfileSetupScreen( +fun TrainerProfileSetupPage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { @@ -134,9 +134,9 @@ private fun validateInput(input: String): String { @Preview(showBackground = true) @Composable -private fun TrainerProfileSetupScreenPreview() { +private fun TrainerProfileSetupPagePreview() { TnTTheme { - TrainerProfileSetupScreen( + TrainerProfileSetupPage( onBackClick = {}, onNextClick = {}, ) diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompletePage.kt similarity index 96% rename from feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt rename to feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompletePage.kt index e2d27237..041d4437 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompleteScreen.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompletePage.kt @@ -27,7 +27,7 @@ import coil.compose.rememberAsyncImagePainter import co.kr.tnt.core.ui.R as uiResource @Composable -fun TrainerSignUpCompleteScreen( +fun TrainerSignUpCompletePage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { @@ -86,9 +86,9 @@ fun TrainerSignUpCompleteScreen( @Preview(showBackground = true) @Composable -private fun TrainerSignUpCompleteScreenPreview() { +private fun TrainerSignUpCompletePagePreview() { TnTTheme { - TrainerSignUpCompleteScreen( + TrainerSignUpCompletePage( onBackClick = {}, onNextClick = {}, ) diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt index 7d05719b..d0a6d447 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpScreen.kt @@ -39,11 +39,11 @@ private fun TrainerSignUpScreen( onBackClick: () -> Unit, ) { when (state.page) { - TrainerSignUpContract.TrainerSignUpPage.ProfileSetUp -> TrainerProfileSetupScreen( + TrainerSignUpContract.TrainerSignUpPage.ProfileSetUp -> TrainerProfileSetupPage( onNextClick = onNextClick, onBackClick = onBackClick, ) - TrainerSignUpContract.TrainerSignUpPage.SignUpComplete -> TrainerSignUpCompleteScreen( + TrainerSignUpContract.TrainerSignUpPage.SignUpComplete -> TrainerSignUpCompletePage( onNextClick = onNextClick, onBackClick = onBackClick, ) From 4c4fd5da605bb8e4854d5c05def8348007691208 Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sun, 26 Jan 2025 22:52:20 +0900 Subject: [PATCH 10/15] =?UTF-8?q?[TNT-114]=20fix:=20=ED=8A=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EB=8B=88=20=EC=BD=94=EB=93=9C=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=97=86=EC=9C=BC=EB=A9=B4=20=EC=9D=B8=EC=A6=9D=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt index 510c95be..442ea344 100644 --- a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt +++ b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt @@ -25,5 +25,5 @@ class TnTAppState( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - val startDestination = Route.Login + val startDestination = Route.TraineeConnect(false) } From 1be544361dcf0e2b50d7d15f3187df40964efb7e Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sun, 26 Jan 2025 23:03:50 +0900 Subject: [PATCH 11/15] =?UTF-8?q?[TNT-114]=20fix:=20=ED=8A=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EB=8B=88=20=EC=BD=94=EB=93=9C=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=97=86=EC=9C=BC=EB=A9=B4=20=EC=9D=B8=EC=A6=9D=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt b/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt index a7b09213..e11f96d1 100644 --- a/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt +++ b/feature/trainee/connect/src/main/java/co/kr/tnt/trainee/connect/CodeEntryPage.kt @@ -10,8 +10,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -91,6 +89,7 @@ internal fun CodeEntryPage( TnTTextButton( text = stringResource(R.string.verification), size = ButtonSize.Small, + enabled = state.inviteCode.isNotBlank(), onClick = { onValidateClick(state.inviteCode) }, ) }, From 6792cd3206d45a8130b698edb6f7fef12c1f649d Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Sun, 26 Jan 2025 23:05:51 +0900 Subject: [PATCH 12/15] =?UTF-8?q?[TNT-114]=20fix:=20startDestination=20Log?= =?UTF-8?q?in=EC=9C=BC=EB=A1=9C=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt index 442ea344..510c95be 100644 --- a/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt +++ b/feature/main/src/main/java/co/kr/tnt/main/ui/TnTAppState.kt @@ -25,5 +25,5 @@ class TnTAppState( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - val startDestination = Route.TraineeConnect(false) + val startDestination = Route.Login } From adc618163b9d25cbb87a8f2b9f830884ddf517d8 Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Mon, 27 Jan 2025 00:23:33 +0900 Subject: [PATCH 13/15] =?UTF-8?q?[TNT-114]=20fix:=20=EC=A3=BC=EC=9D=98?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=9E=85=EB=A0=A5=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=8C=20=EB=B2=84=ED=8A=BC=20enabled=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt index 7d937eea..e01e810d 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt @@ -69,7 +69,6 @@ fun TraineeNoteForTrainerPage( TnTBottomButton( text = stringResource(uiResource.string.next), modifier = Modifier.align(Alignment.BottomCenter), - enabled = text.isNotBlank(), onClick = { onNextClick() }, ) } From 01e87e7c8c0be142c3b2d97cd969830a73d9f726 Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Mon, 27 Jan 2025 00:47:15 +0900 Subject: [PATCH 14/15] =?UTF-8?q?[TNT-114]=20feat:=20BackHandler=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt | 3 +++ .../java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt | 3 +++ .../main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt | 3 +++ .../java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt | 3 +++ 4 files changed, 12 insertions(+) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt index 55266f6d..f26de4fb 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt @@ -1,6 +1,7 @@ package co.kr.tnt.trainee.signup import android.app.DatePickerDialog +import androidx.activity.compose.BackHandler import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -49,6 +50,8 @@ fun TraineeBasicInfoPage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { + BackHandler { onBackClick() } + // TODO 상태 관리 따로 빼기 val today = LocalDate.now() var height by remember { mutableStateOf("") } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt index e01e810d..a7121395 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainee.signup +import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -34,6 +35,8 @@ fun TraineeNoteForTrainerPage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { + BackHandler { onBackClick() } + // TODO 상태 관리 따로 빼기 var text by remember { mutableStateOf("") } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt index d1480b2e..d0601912 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt @@ -1,5 +1,6 @@ package co.kr.tnt.trainee.signup +import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -40,6 +41,8 @@ fun TraineePTPurposePage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { + BackHandler { onBackClick() } + // TODO 리소스 id값 텍스트로 전환해 넘겨주기 var selectedPurposes by remember { mutableStateOf(setOf()) } diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt index 4adadf3d..67e88e0f 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt @@ -1,6 +1,7 @@ package co.kr.tnt.trainer.signup import android.net.Uri +import androidx.activity.compose.BackHandler import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia @@ -46,6 +47,8 @@ fun TrainerProfileSetupPage( onBackClick: () -> Unit, onNextClick: () -> Unit, ) { + BackHandler { onBackClick() } + val context = LocalContext.current // TODO 상태 관리 따로 빼기 From 13ecc67b4d01cce9d4e60fd55d0649af55c0a030 Mon Sep 17 00:00:00 2001 From: SeonJeongk Date: Mon, 27 Jan 2025 05:44:41 +0900 Subject: [PATCH 15/15] =?UTF-8?q?[TNT-114]=20fix:=20PR=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/co/kr/tnt/designsystem/component/TextField.kt | 4 ++-- .../java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt | 4 ++-- .../co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt | 4 ++-- .../java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt | 4 ++-- .../java/co/kr/tnt/trainee/signup/TraineeProfileSetupPage.kt | 4 ++-- .../co/kr/tnt/trainee/signup/TraineeSignUpCompletePage.kt | 2 +- .../java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt | 4 ++-- .../co/kr/tnt/trainer/signup/TrainerSignUpCompletePage.kt | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/TextField.kt b/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/TextField.kt index 0c53068c..910cbb23 100644 --- a/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/TextField.kt +++ b/core/designsystem/src/main/java/co/kr/tnt/designsystem/component/TextField.kt @@ -296,9 +296,9 @@ fun TnTOutlinedTextField( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(vertical = 8.dp), ) { - if (isError && !warningMessage.isNullOrEmpty()) { + if (isError && warningMessage.isNullOrEmpty().not()) { Text( - text = warningMessage, + text = warningMessage ?: "", style = TnTTheme.typography.body2Medium, color = counterColor, ) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt index f26de4fb..0144da7a 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeBasicInfoPage.kt @@ -64,7 +64,7 @@ fun TraineeBasicInfoPage( val isFormValid by remember { derivedStateOf { isHeightValid && isWeightValid } } Scaffold( - topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, + topBar = { TnTTopBarWithBackButton(onBackClick = onBackClick) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -141,7 +141,7 @@ fun TraineeBasicInfoPage( text = stringResource(uiResource.string.next), modifier = Modifier.align(Alignment.BottomCenter), enabled = isFormValid, - onClick = { onNextClick() }, + onClick = onNextClick, ) } } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt index a7121395..9ae56d28 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeNoteForTrainerPage.kt @@ -41,7 +41,7 @@ fun TraineeNoteForTrainerPage( var text by remember { mutableStateOf("") } Scaffold( - topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, + topBar = { TnTTopBarWithBackButton(onBackClick = onBackClick) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -72,7 +72,7 @@ fun TraineeNoteForTrainerPage( TnTBottomButton( text = stringResource(uiResource.string.next), modifier = Modifier.align(Alignment.BottomCenter), - onClick = { onNextClick() }, + onClick = onNextClick, ) } } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt index d0601912..2c4be6c3 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineePTPurposePage.kt @@ -47,7 +47,7 @@ fun TraineePTPurposePage( var selectedPurposes by remember { mutableStateOf(setOf()) } Scaffold( - topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, + topBar = { TnTTopBarWithBackButton(onBackClick = onBackClick) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -82,7 +82,7 @@ fun TraineePTPurposePage( } TnTBottomButton( text = stringResource(uiResource.string.next), - onClick = { onNextClick() }, + onClick = onNextClick, enabled = selectedPurposes.isNotEmpty(), modifier = Modifier.align(Alignment.BottomCenter), ) diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupPage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupPage.kt index f65cf81e..5e79bf58 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupPage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeProfileSetupPage.kt @@ -70,7 +70,7 @@ fun TraineeProfileSetupPage( ) Scaffold( - topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, + topBar = { TnTTopBarWithBackButton(onBackClick = onBackClick) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -120,7 +120,7 @@ fun TraineeProfileSetupPage( TnTBottomButton( text = stringResource(uiResource.string.next), enabled = text.isNotBlank() && !isWarning, - onClick = { onNextClick() }, + onClick = onNextClick, modifier = Modifier.align(Alignment.BottomCenter), ) } diff --git a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompletePage.kt b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompletePage.kt index 488dea23..dd60f9c3 100644 --- a/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompletePage.kt +++ b/feature/trainee/signup/src/main/java/co/kr/tnt/trainee/signup/TraineeSignUpCompletePage.kt @@ -77,7 +77,7 @@ fun TraineeSignUpCompletePage( } TnTBottomButton( text = stringResource(uiResource.string.start), - onClick = { onNextClick() }, + onClick = onNextClick, modifier = Modifier.align(Alignment.BottomCenter), ) } diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt index 67e88e0f..0cfce9d9 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerProfileSetupPage.kt @@ -70,7 +70,7 @@ fun TrainerProfileSetupPage( ) Scaffold( - topBar = { TnTTopBarWithBackButton(onBackClick = { onBackClick() }) }, + topBar = { TnTTopBarWithBackButton(onBackClick = onBackClick) }, containerColor = TnTTheme.colors.commonColors.Common0, ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -122,7 +122,7 @@ fun TrainerProfileSetupPage( text = stringResource(uiResource.string.next), modifier = Modifier.align(Alignment.BottomCenter), enabled = text.isNotBlank() && !isWarning, - onClick = { onNextClick() }, + onClick = onNextClick, ) } } diff --git a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompletePage.kt b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompletePage.kt index 041d4437..c5c08406 100644 --- a/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompletePage.kt +++ b/feature/trainer/signup/src/main/java/co/kr/tnt/trainer/signup/TrainerSignUpCompletePage.kt @@ -77,7 +77,7 @@ fun TrainerSignUpCompletePage( } TnTBottomButton( text = stringResource(uiResource.string.start), - onClick = { onNextClick() }, + onClick = onNextClick, modifier = Modifier.align(Alignment.BottomCenter), ) }