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

[#428] refactor joinstep1fragment compose 적용 #429

Open
wants to merge 6 commits into
base: improve
Choose a base branch
from

Conversation

ums1212
Copy link
Collaborator

@ums1212 ums1212 commented Jan 23, 2025

#️⃣연관된 이슈

#428

📝작업 내용

회원가입 첫 번째 화면을 xml뷰에서 Compose로 변경했습니다.
JoinStep1Fragment에 대해서만 수정을 했기에 뷰페이저 안의 내용만 변경이 되었습니다.
JoinStep1Fragment에서 데이터바인딩을 더 이상 사용하지 않으므로 뷰바인딩으로 변경했습니다.
-> 컴포즈뷰를 직접 반환하기 때문에 프래그먼트에서 더이상 뷰바인딩을 하지 않습니다.(베이스 프래그먼트 미사용)

스크린샷 (선택)

💬리뷰 요구사항(선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

ex) 메서드 XXX의 이름을 더 잘 짓고 싶은데 혹시 좋은 명칭이 있을까요?

@ums1212 ums1212 added the 리팩터링 아키텍처 구조 변경 등 리팩터링 작업 label Jan 23, 2025
@ums1212 ums1212 self-assigned this Jan 23, 2025
@ums1212 ums1212 linked an issue Jan 23, 2025 that may be closed by this pull request
4 tasks
Copy link
Collaborator

@language7606 language7606 left a comment

Choose a reason for hiding this comment

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

전반적으로 잘 이해하고 쓰시는 것 같아서 놀랐네요 ㅎㅎ 수고하셨습니다!

if(textValue.isEmpty()) return@OutlinedTextField
IconButton(
onClick = {
onValueChange("")
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기 ("") 부분도 strings.xml을 활용하면 좋을 것 같아요!
팁을 드리자면,

<string name="sign_in_email_default_value" />

이런식으로 ""와 같은 값을 표현할 수 있어요!

imeAction: ImeAction = ImeAction.Default
){
var passwordVisible by rememberSaveable { mutableStateOf(false) }
val image = if (passwordVisible){
Copy link
Collaborator

Choose a reason for hiding this comment

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

어떤 이미지인지 이름이 명확하면 더 좋을 것 같네요 ㅎㅎ

Comment on lines 32 to 50
@Composable
fun EmailTextInputField(
inputTitle: String,
textValue: String,
onValueChange: (String) -> Unit,
isError: Boolean,
errorMessage: String,
modifier: Modifier = Modifier,
imeAction: ImeAction = ImeAction.Default,
){
Column(
modifier = modifier
) {
Text(
text = inputTitle,
style = TextStyle(
fontSize = 16.sp,
)
)
Copy link
Collaborator

Choose a reason for hiding this comment

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

inputTitle을 매개변수로 넘겨서 상위 컴포넌트에서 조작할 수 있게 해주셨네요! 좋습니다 ㅎㅎ
현재는 딱 필요한 만큼 타이틀만 지정하셨는데, 혹시 추후에 확장성을 더 높이기 위해서라면 해당 Text 컴포저블을 통째로 넘기는 방법도 있습니다! (만약 Text컴포저블이 아닌 다른 요소가 들어가야한다던가...)

title: @Composable () -> Unit

위와 같이 구현하면 됩니다! 이러면 스크린에서 직접 Text컴포저블을 주입할 수 있어요 ㅎ
아래 content 부분에는 같은 위치에 title() 이런식으로 넣어주면 동일하게 작동할거에요!
(지금은 텍스트만으로도 괜찮은 것 같으니 참고만 해주세요 ㅎㅎ)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

컴포저블을 직접 인자로 넣는건 생각못했네요! 참고해보겠습니다

import kr.co.lion.modigm.R

@Composable
fun EmailTextInputField(
Copy link
Collaborator

Choose a reason for hiding this comment

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

한 파일에 이메일과 비밀번호 텍스트필드 모두 있군요 ㅎㅎ
추후 단위테스트라던가 프리뷰구현을 위해서는 한 파일에 하나의 컴포저블 함수로 이름도 파일명과 똑같이해서 각각 구현하면 좋을 것 같아요!
그것도 아니라면 JoinTextInputField 하나를 공통 컴포넌트로 잡고 모든 텍스트필드를 그 컴포넌트 하나로 만들 수 있게 구현하는 것도 방법이겠구요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

사실 하나의 공통 컴포넌트로 만들어보려했는데 그게 어려워서 공부를 좀 더 해봐야할것같네요;;

Comment on lines 1 to 22
package kr.co.lion.modigm.ui.join.component

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kr.co.lion.modigm.R
import kr.co.lion.modigm.ui.join.vm.JoinStep1EmailAndPwViewModel

@Composable
fun JoinStep1EmailAndPwScreen(
Copy link
Collaborator

Choose a reason for hiding this comment

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

Screen으로 구현한 부분은 공통 컴포넌트라기보단 최상위 컴포넌트에 가까우니 패키지도 컴포넌트가 아닌 join 아래에 들어가면 더 좋을 것 같습니다! 추후 xml이 정리되고 컴포즈로 다 전환된다면, 싱글액티비티에서 프래그먼트 없이 스크린으로 모든 화면전환이 이루어지게 될거에요!

Comment on lines 25 to 32
binding.composeViewJoinStep1EmailAndPw.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
JoinStep1EmailAndPwScreen(joinStep1EmailAndPwViewModel)
}
}
return binding.root
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

xml의 각 요소를 단계별로 전환하는 게 아니라 한 번에 변경한 것이라면 (지금처럼 컴포즈 뷰가 하나라면) return에다가 컴포즈 뷰를 리턴해서 xml을 삭제할 수 있습니다! 뷰바인딩도 필요없어지니 베이스프래그먼트 상속도 없앨 수 있어요!

Comment on lines 306 to 312
// 계정 중복 확인
val isDup = joinViewModel.registerEmailUserToFirebaseAuth()
if(isDup.isNotEmpty()){
step1EmailAndPwViewModel.userInputEmailValidation.value = isDup
step1EmailAndPwViewModel.setUserInputEmailValidationMessage(isDup)
hideLoading()
return@launch
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

duplication으로 풀어쓰면 조금 더 가독성이 좋을 것 같아요!

Comment on lines 167 to 168
keyboardOptions = KeyboardOptions(
imeAction = imeAction
Copy link
Collaborator

Choose a reason for hiding this comment

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

이부분도 imeAction 만 넘기셨는데, 확장성을 생각해서 keyboardOptions를 통째로 넘기는 것도 고려해보면 좋겠네요!
앞으로 사용에서 진짜 필요없다 생각되면 넘기셔도 됩니다! ㅎㅎ

<string name="JOIN_STEP1_PASSWORD_LABEL">비밀번호</string>
<string name="JOIN_STEP1_PASSWORD_GUIDE">8~20자리, 영문, 숫자, 특수문자 포함 입력</string>
<string name="JOIN_STEP1_PASSWORD_CHECK_LABEL">비밀번호 확인</string>
<string name="JOIN_STEP1_INPUT_PLACEHOLDER_TEXT">%1$s 입력</string>
Copy link
Collaborator

Choose a reason for hiding this comment

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

%1$s
이런식으로 파라미터를 지정할 수 있는 건 처음알았네요! ㅎㅎ 배워갑니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
리팩터링 아키텍처 구조 변경 등 리팩터링 작업
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Refactor] JoinStep1Fragment compose 적용
2 participants