Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[UI/#206] 프로필 수정 뷰 / UI 구현 #207

Merged
merged 45 commits into from
Sep 4, 2024
Merged

Conversation

leeeyubin
Copy link
Member

@leeeyubin leeeyubin commented Aug 27, 2024

⛳️ Work Description

  • 프로필 수정 뷰 UI
  • 네비게이션 전면 수정

📸 Screenshot

Screen_Recording_20240905_032900_.terning.mp4

➕추가 수정사항

  • 마이페이지와 네비게이션 연결
  • 이름 유효성 로직 검사를 회원가입과 통합
  • Regex 패턴 수정 (앞으로 패턴 쓰는 것들은 이 파일에다가 넣어두면 검사를 할 때마다 Regex 객체를 생성하지 않아도 될 것 같습니다!)
  • 디자인 GUI 수정사항 반영 (화면 전환 시 슬라이드 추가, 바텀시트 로직, 수정사항 로직)

📌확인해주세요

자세한 사항은 노션에 넣어뒀습니다! [터닝 노션 링크!!!]

  • 우선, 제가 마이페이지에서 화면 전환을 해야 하는데 이때 바텀 네비에 애니메이션이 자꾸 적용되어 불가피하게 미리 이를 수정해보았습니다. 보시고 의견 있으면 남겨주세요!
  • 화면 전환할 때 배경색을 지정 안 해주면, 어색하게 화면전환이 되어서(배경만 투명색으로 뜸) 홈 뷰 배경색을 흰색으로 바꾸어줬어요! 효빈언니 확인 부탁합니당
  • NavHost 안에다가 저렇게 넣어주면 지금처럼 모든 composable 안에 작성해줄 필요가 없을 것 같아서 바로 적용했습니다
 NavHost(
    enterTransition = {
        EnterTransition.None
    },
    exitTransition = {
        ExitTransition.None
    },
    popEnterTransition = {
        EnterTransition.None
    },
    popExitTransition = {
        ExitTransition.None
    },
    navController = navigator.navController,
    startDestination = navigator.startDestination
) 

Copy link
Member

@boiledEgg-s boiledEgg-s left a comment

Choose a reason for hiding this comment

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

역시 리드네요,, 본받아서 열심히 해야겠습니닷

Comment on lines +59 to +66
LaunchedEffect(viewModel.sideEffects, lifecycleOwner) {
viewModel.sideEffects.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle)
.collect { sideEffect ->
when (sideEffect) {
is ProfileEditSideEffect.NavigateUp -> navigateUp()
}
}
}
Copy link
Member

Choose a reason for hiding this comment

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

viewModel -> sideEffect -> navigate 식으로 탐색을 하는 건 리컴포지션을 줄이기 위한 이유도 있는건가요? 아니면 단순히 로직 분리를 위한건가요??

Copy link
Member Author

Choose a reason for hiding this comment

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

흠 처음에 의도한 건 로직분리를 위함이었습니다! navigateUp도 어떻게 보면 화면이 전환되는 것이기 때문에 sideEffect를 통해 처리해줘야 된다고 생각했어요!

RectangleButton(
style = TerningTheme.typography.button1,
paddingVertical = 20.dp,
text = R.string.profile_edit_save,
Copy link
Member

Choose a reason for hiding this comment

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

컴포넌트마다 문자열을 인자로 받는게 있고 리소스를 인자로 받는게 있는데, 이런 부분들은 통일성을 주는게 좋을 것 같아요!

.align(Alignment.CenterHorizontally),
index = profileEditState.character
)
Spacer(modifier = Modifier.height(48.dp))
Copy link
Member

Choose a reason for hiding this comment

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

Spacer는 새로운 Modifier객체를 사용하고 Scope 컴포저블에는 상위 컴포저블에서 넘겨받은 modifier를 사용하는 이유는 뭔가요??

그리고 들은 바론 같은 수정자를 반복해서 사용해야 하는 경우, 하나의 객체를 만들어놓고 재사용하는게 낫답니다!! 지금처럼 Spacer 마다 Modifier를 생성하면 새로운 객체가 생성되서 하나로 관리하는 것보다 비효율적이라네요,,

Copy link
Member Author

Choose a reason for hiding this comment

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

아하 좋은 의견 감사합니당 ㅎㅎ

Comment on lines 73 to 75
onInputChange = { editName ->
viewModel.isInputValid(editName)
},
Copy link
Member

Choose a reason for hiding this comment

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

이렇게 하나의 함수만 사용하고, 람다 내 변수의 타입이 함수 매개변수 타입과 같으면 참조 연산자 (::)를 사용할 수 있답니다!

Suggested change
onInputChange = { editName ->
viewModel.isInputValid(editName)
},
onInputChange = viewModel::isInputValid,

취향따라 사용하면 되지만 저는 이게 더 깔끔해보이더라요ㅎㅎ

.addFocusCleaner(focusManager)
) {
BackButtonTopAppBar(
onBackButtonClick = { onBackButtonClick() },
Copy link
Member

Choose a reason for hiding this comment

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

이런 부분에도 중괄호는 굳이 없어도 될 것 같아요!

Copy link
Member Author

Choose a reason for hiding this comment

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

얼른 습관화를 들여야겠어요,,

}

companion object {
const val NAME_ERROR = "[!@#\$%^&*(),.?\":{}|<>\\[\\]\\\\/\\-=+~`\\p{S}\\p{P}]"
Copy link
Member

Choose a reason for hiding this comment

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

👽

Copy link
Member Author

Choose a reason for hiding this comment

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

이거 관련해서 수정해봤는데 확인부탁드려요!!

@@ -44,6 +45,8 @@ fun SignUpRoute(
val context = LocalContext.current
val lifecycleOwner = LocalLifecycleOwner.current

var showBottomSheet by remember { mutableStateOf(false) }
Copy link
Member

Choose a reason for hiding this comment

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

이렇게 바텀시트, 다이얼로그 등이 부가적인 화면을 표현하는 경우, 컴포저블 내부의 remember로 관리하는게 더 효율적인가요??
뷰모델에서 관리해야하는지 여기 방법처럼 관리해야하는지 항상 헷갈려요ㅠ

Copy link
Member Author

Choose a reason for hiding this comment

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

음 저도 이 부분에 대해서 고민이 되더라구요
이전까진 아무 생각 없이 사용하긴 했는데 다시 생각해보니까 뷰모델에서 한번에 관리하는 게 좋을 것 같아서 이젠 바꿔서 사용하려구 했습니당
요 부분은 수정해놓을게요!

Copy link
Contributor

@arinming arinming left a comment

Choose a reason for hiding this comment

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

복잡한 부분 easy하게 하는 짱리드.., 고생하셨어용 !!!!!!

Comment on lines +43 to +47
Image(
painter = painterResource(id = R.drawable.ic_sign_up_button),
contentDescription = "plus button",
modifier = Modifier.align(Alignment.BottomEnd)
)
Copy link
Contributor

Choose a reason for hiding this comment

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

여기는 터닝이미지 적용이 안되는 건가욥?

Copy link
Member Author

Choose a reason for hiding this comment

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

지난번 회의 때 나눴던 내용인데 Image에서 contentDescription 사용을 지향하자는 방향으로 얘기가 나왔어요!
확인해보구 궁금한 점 있으면 말해주세요!!

) {
val focusManager = LocalFocusManager.current
val keyboardController = LocalSoftwareKeyboardController.current

val nameErrorRegex = NAME_ERROR_REGEX
val trimmedName: String
var outOfBoundName = false
Copy link
Contributor

Choose a reason for hiding this comment

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

outOfBoundName보다 좀 더 boolean 타입스러운 네이밍이면 좋을 것 같아용!

@leeeyubin leeeyubin merged commit 171dac8 into develop Sep 4, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
UI 💐 UI 작업 유빈💙 유빈
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[UI] 프로필 수정 뷰 / UI 구현
3 participants