Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
a061195
rename : 클래스명 좀 더 명확하게 변경 #136
theBettor May 2, 2025
8b6dd2f
Merge remote-tracking branch 'origin/develop' into refactor/onboardin…
theBettor May 7, 2025
c1f9572
test
theBettor May 7, 2025
0d43734
test
theBettor May 8, 2025
e8089c9
1. 왜자꾸 NavHost에서 파라미터를 요구하는지 이해할 수가 없었다. GraphBuilder에서 Screen이 아닌 Ro…
theBettor May 8, 2025
c851fbd
Merge branch 'refactor/test-onboarding' into refactor/onboarding_fini…
theBettor May 8, 2025
30147f3
refactor: 프로필 세팅화면 끼워넣기 #157
theBettor May 9, 2025
00710aa
feat: 기기 내의 이미지를 선택하면 바로 UI에 반영 그 과정에 Route를 만들고 다음 화면에 넘기기 #134
theBettor May 9, 2025
f02b20e
refactor: 저장된 uri 다른 뷰모델로 보내서 화면에 띄우기 #133
theBettor May 11, 2025
0a374d7
Merge branch 'refactor/0510_onboarding' into refactor/onboarding_fini…
theBettor May 11, 2025
0434cc8
fix: textfield placeholder:할머니 제거 #168
theBettor May 15, 2025
4ca914b
refactor: 초대코드공유화면 순서변경 #132
theBettor May 15, 2025
4cf9d7e
refactor: 이미지 처리된 Layout 수정(SpeechBubble 구조변경) #117
theBettor May 15, 2025
1c6d068
fix: 테스트 코드 삭제
theBettor May 15, 2025
6bcbb01
Merge remote-tracking branch 'origin/refactor/onboarding_finishing' i…
theBettor May 15, 2025
7f91cb1
revert: unintended change of SocialLoginHelper.kt
theBettor May 15, 2025
b0b1e09
Merge remote-tracking branch 'origin/develop' into refactor/onboardin…
theBettor May 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 22 additions & 6 deletions app/src/main/java/com/teampatch/harmony/MainNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@ import com.teampatch.feature.memorycard.registration.addMemoryCardRegistrationSc
import com.teampatch.feature.memorycard.registration.navigateToMemoryCardRegistrationScreen
import com.teampatch.feature.memorystorage.addMemoryStorageScreen
import com.teampatch.feature.onboarding.enter.addOnboardingEnterInvitationCodeScreen
import com.teampatch.feature.onboarding.enter.addOnboardingEnterProfileSettingsScreen
import com.teampatch.feature.onboarding.enter.addOnboardingEnterRelationScreen
import com.teampatch.feature.onboarding.enter.addOnboardingEnterSpaceScreen
import com.teampatch.feature.onboarding.enter.navigateToEnterInvitationCodeScreen
import com.teampatch.feature.onboarding.enter.navigateToEnterProfileSettingsScreen
import com.teampatch.feature.onboarding.enter.navigateToEnterRelationScreen
import com.teampatch.feature.onboarding.enter.navigateToEnterSpaceScreen
import com.teampatch.feature.onboarding.login.ui.OnboardingRoute
import com.teampatch.feature.onboarding.login.ui.OnboardingStartRoute
Expand All @@ -31,12 +35,14 @@ import com.teampatch.feature.onboarding.login.ui.addOnboardingScreen
import com.teampatch.feature.onboarding.login.ui.addOnboardingStartScreen
import com.teampatch.feature.onboarding.login.ui.navigateToPermissionNotificationScreen
import com.teampatch.feature.onboarding.login.ui.navigateToStartScreen
import com.teampatch.feature.onboarding.make.addOnboardingMakeInviteGrandParentsScreen
import com.teampatch.feature.onboarding.make.addOnboardingMakeParentsNameScreen
import com.teampatch.feature.onboarding.make.addOnboardingMakeProfileSettingsScreen
import com.teampatch.feature.onboarding.make.addOnboardingMakeRelationScreen
import com.teampatch.feature.onboarding.make.navigateToMakeGroupScreen
import com.teampatch.feature.onboarding.make.navigateToMakeProfileSettingsScreen
import com.teampatch.feature.onboarding.make.navigateToMakeRelationScreen
import com.teampatch.feature.onboarding.make.navigateToShareInvitationScreen
import com.teampatch.feature.profile.edit.addProfileEditScreen
import com.teampatch.feature.profile.edit.navigateToProfileEditScreen
import com.teampatch.feature.question.addQuestionScreen
Expand Down Expand Up @@ -104,17 +110,17 @@ fun MainNavHost(
onShareInvitationScreenRequest = navController::navigateToMakeRelationScreen
)

// addOnboardingMakeInviteGrandParentsScreen(
// onBackRequest = navController::navigateUp,
// onRelationScreenRequest = { navController.navigateToMakeRelationScreen() }
// )

addOnboardingMakeRelationScreen(
onBackRequest = navController::navigateUp,
onProfileSettingsScreenRequest = navController::navigateToMakeProfileSettingsScreen
)

addOnboardingMakeProfileSettingsScreen(
onBackRequest = navController::navigateUp,
onHomeRouteRequest = { navController.navigateToShareInvitationScreen() }
)

addOnboardingMakeInviteGrandParentsScreen(
onBackRequest = navController::navigateUp,
onHomeRouteRequest = { navController.navigateToHomeScreen() }
)
Expand All @@ -123,7 +129,17 @@ fun MainNavHost(

addOnboardingEnterInvitationCodeScreen(
onBackRequest = navController::navigateUp,
onEnterSpaceScreenRequest = { navController.navigateToEnterSpaceScreen() }
onEnterRelationScreenRequest = navController::navigateToEnterRelationScreen
)

addOnboardingEnterRelationScreen(
onBackRequest = navController::navigateUp,
onEnterProfileSettingsScreenRequest = navController::navigateToEnterProfileSettingsScreen
)

addOnboardingEnterProfileSettingsScreen(
onBackRequest = navController::navigateUp,
onEnterSpaceScreenRequest = navController::navigateToEnterSpaceScreen
)

addOnboardingEnterSpaceScreen(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.text.TextStyle
Expand All @@ -31,6 +32,8 @@ import com.teampatch.core.designsystem.theme.PretendardFontFamily
@Composable
fun SpeechBubble(
modifier: Modifier = Modifier,
backgroundColor: Color = G1,
borderColor: Color = G3,
contentAlignment: Alignment = Alignment.Center,
propagateMinConstraints: Boolean = false,
content: @Composable (BoxScope.() -> Unit),
Expand All @@ -43,12 +46,12 @@ fun SpeechBubble(
.padding(top = 32.dp, start = 20.dp, end = 20.dp)
.drawBehind {
drawRoundRect(
color = G1,
color = backgroundColor,
size = size,
cornerRadius = CornerRadius(20.dp.toPx())
)
drawRoundRect(
color = G3,
color = borderColor,
size = size,
cornerRadius = CornerRadius(20.dp.toPx()),
style = Stroke(1.dp.toPx())
Expand All @@ -60,16 +63,16 @@ fun SpeechBubble(
lineTo((size.width / 2) - 24.dp.toPx(), size.height - 20.dp.toPx())
close()
},
color = G1
color = backgroundColor
)
drawLine(
color = G3,
color = borderColor,
start = Offset(size.width / 2, size.height + 20.dp.toPx()),
end = Offset((size.width / 2) + 12.dp.toPx(), size.height),
strokeWidth = 1.dp.toPx()
)
drawLine(
color = G3,
color = borderColor,
start = Offset(size.width / 2, size.height + 20.dp.toPx()),
end = Offset((size.width / 2) - 12.dp.toPx(), size.height),
strokeWidth = 1.dp.toPx()
Expand Down
Copy link
Member

@agvber agvber May 15, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 파일은 수정되지 않았는데 같이 수정된 것 같습니다
깔끔한 commit 기록이 남기기 위해서 수정된 부분 복구 부탁드려요!

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import javax.inject.Singleton
class SocialLoginHelper @Inject constructor() {

private lateinit var socialUserId: String

fun getSocialUserId(): String = socialUserId

fun setSocialUserId(userId: String) {
Expand Down
2 changes: 2 additions & 0 deletions feature/onboarding-enter/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ dependencies {
implementation(libs.androidx.paging.runtime)
implementation(libs.androidx.paging.compose)

implementation(libs.coil.compose)

testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ private const val MAX_LENGTH = 5
@Composable
internal fun OnboardingEnterInvitationCodeRoute(
onBackRequest: () -> Unit,
onEnterSpaceScreenRequest: () -> Unit,
onEnterRelationScreenRequest: () -> Unit,
viewModel: OnboardingEnterInvitationCodeViewModel = hiltViewModel(),
) {
val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
Expand All @@ -70,7 +70,7 @@ internal fun OnboardingEnterInvitationCodeRoute(

OnboardingEnterInvitationCodeScreen(
onBackRequest = onBackRequest,
onEnterSpaceScreenRequest = { viewModel.joinGroup() },
onEnterSpaceScreenRequest = onEnterRelationScreenRequest,
onInviteCodeChange = viewModel::updateInviteCode,
uiState = uiState
)
Expand All @@ -85,7 +85,7 @@ internal fun OnboardingEnterInvitationCodeRoute(
}

OnboardingEnterInvitationCodeEvent.Success -> {
onEnterSpaceScreenRequest()
onEnterRelationScreenRequest()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,54 @@ fun NavController.navigateToEnterInvitationCodeScreen(

fun NavGraphBuilder.addOnboardingEnterInvitationCodeScreen(
onBackRequest: () -> Unit,
onEnterSpaceScreenRequest: () -> Unit,
onEnterRelationScreenRequest: () -> Unit,
) {
composable<OnboardingEnterInvitationCodeRoute> {
OnboardingEnterInvitationCodeRoute(
onBackRequest = onBackRequest,
onEnterRelationScreenRequest = onEnterRelationScreenRequest
)
}
}

@Serializable
data object OnboardingEnterRelationRoute

fun NavController.navigateToEnterRelationScreen(
navOptions: NavOptions? = null,
navigatorExtras: Navigator.Extras? = null,
) {
navigate(OnboardingEnterRelationRoute, navOptions, navigatorExtras)
}

fun NavGraphBuilder.addOnboardingEnterRelationScreen(
onBackRequest: () -> Unit,
onEnterProfileSettingsScreenRequest: () -> Unit,
) {
composable<OnboardingEnterRelationRoute> {
OnboardingEnterRelationRoute(
onBackRequest = onBackRequest,
onEnterProfileSettingsScreenRequest = onEnterProfileSettingsScreenRequest
)
}
}

@Serializable
data object OnboardingEnterProfileRoute

fun NavController.navigateToEnterProfileSettingsScreen(
navOptions: NavOptions? = null,
navigatorExtras: Navigator.Extras? = null,
) {
navigate(OnboardingEnterProfileRoute, navOptions, navigatorExtras)
}

fun NavGraphBuilder.addOnboardingEnterProfileSettingsScreen(
onBackRequest: () -> Unit,
onEnterSpaceScreenRequest: () -> Unit,
) {
composable<OnboardingEnterProfileRoute> {
OnboardingEnterProfileSettingsScreen(
onBackRequest = onBackRequest,
onEnterSpaceScreenRequest = onEnterSpaceScreenRequest
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
package com.teampatch.feature.onboarding.enter

import android.util.Log
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringArrayResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import coil.compose.rememberAsyncImagePainter
import com.teampatch.core.designsystem.component.DefaultButton
import com.teampatch.core.designsystem.component.OnBoardingLayout
import com.teampatch.core.designsystem.theme.BL
import com.teampatch.core.designsystem.theme.HarmonyTheme
import com.teampatch.core.designsystem.theme.MainGreen
import com.teampatch.core.designsystem.theme.WH
import com.teampatch.core.designsystem.utils.noRippleClickable
import com.teampatch.core.designsystem.utils.previewPlaceholder
import com.teampatch.feature.onboarding.enter.R.array.title_onboarding_enter_profile
import com.teampatch.feature.onboarding.enter.R.string.subtext_onboarding_enter_name
import com.teampatch.feature.onboarding.enter.R.string.text_onboarding_enter_enter_space
import com.teampatch.feature.onboarding.enter.viewmodel.OnboardingEnterInvitationCodeViewModel

@Composable
internal fun OnboardingEnterProfileSettingsScreen(
viewModel: OnboardingEnterInvitationCodeViewModel = hiltViewModel(), // ViewModel 주입
onBackRequest: () -> Unit,
onEnterSpaceScreenRequest: () -> Unit,
) {
val profileImageUri = viewModel.profileImageUri

val photoPicker = rememberLauncherForActivityResult(
contract = ActivityResultContracts.PickVisualMedia(),
onResult = { uri ->
if (uri != null) {
viewModel.updateProfileImage(uri) // ViewModel에서 관리
}
}
)

val titles = stringArrayResource(title_onboarding_enter_profile)

OnBoardingLayout(
title = buildAnnotatedString {
if (titles.size >= 3) {
withStyle(style = SpanStyle(color = BL)) {
append(titles[0])
}
withStyle(style = SpanStyle(color = MainGreen)) {
append(titles[1])
}
withStyle(style = SpanStyle(color = BL)) {
append(titles[2])
}
} else {
Log.e("TitleCheck", "Error: Missing Strings")
}
},
subtext = stringResource(subtext_onboarding_enter_name),
onBackRequest = { onBackRequest() },
bottomBar = {
DefaultButton(
onClick = { onEnterSpaceScreenRequest() },
modifier = Modifier
.fillMaxWidth()
.padding(20.dp)
) {
Text(stringResource(text_onboarding_enter_enter_space))
}
}
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.fillMaxWidth()
.padding(top = 44.dp)
.noRippleClickable {
val pickerRequest =
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)
photoPicker.launch(pickerRequest)
}
) {
// 이미지를 감싸는 Box 추가 (아이콘을 정렬하기 위해)
Box(
modifier = Modifier.size(144.dp) // 이미지 크기와 동일한 크기
) {
Image(
painter = rememberAsyncImagePainter(
model = profileImageUri
?: com.teampatch.core.designsystem.R.drawable.ic_my_appbar, // 기본 이미지 설정
placeholder = previewPlaceholder(com.teampatch.core.designsystem.R.drawable.ic_my_appbar)
),
contentDescription = "profile",
contentScale = ContentScale.Crop,
modifier = Modifier
.size(144.dp)
.clip(CircleShape)
)

// 카메라 아이콘을 이미지의 오른쪽 아래에 정렬
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.size(60.dp)
.background(MainGreen, CircleShape)
.align(Alignment.BottomEnd) // ✅ 이미지 기준으로 오른쪽 아래 정렬
) {
Icon(
painter = painterResource(com.teampatch.core.designsystem.R.drawable.ic_camera_profile),
contentDescription = "camera",
tint = WH
)
}
}
}
}
}

@Preview
@Composable
private fun OnboardingMakeProfileSettingsScreenPreview() {
HarmonyTheme {
OnboardingEnterProfileSettingsScreen(
onBackRequest = {},
onEnterSpaceScreenRequest = {}
)
}
}
Loading