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

[Feature/#873] 오늘의 솝마디 콕찌르기 추천 기능 구현 #881

Merged
merged 39 commits into from
Oct 4, 2024

Conversation

s9hn
Copy link
Contributor

@s9hn s9hn commented Oct 1, 2024

What is this issue?

To Reviewer

  • 콕찌르기 대시보드 구현했읍니다.
  • 멀티모듈 구조에 대해 궁금한게 있는데, 프로필 기본 이미지 svg파일이 poke 모듈에도 있는데, 해당 모듈의 리소스를 가져올 방법이 있나용?
  • 프로필 기본이미지 ... 구현을 좀 고민을 했는데요.
    • AsyncImage는 가장 basic한 컴포넌트이고, 이를 한번 wrapping한 url이미지 컴포넌트.. 이 두곳에서 ImageLoader 및 ImageRequest를 주입 혹은 구현하는 게 어색해보입니다. (사실 AsyncImage로 local svg를 박는것부터 어색하긴함)
    • 그래서 그냥 Image를 하나 구현했고, url.isEmpty로 구분되게 해놓았습니다.
    • 더 좋은 방법 있으면 개추.
  • 자잘한 디자인 디테일(아직 답변기다리는중..) 제외하곤 기능은 모두 구현되었습니다.

s9hn added 30 commits September 25, 2024 16:23
- di 모듈 추가
- network api 구현
- mapper 구현
- 레포지토리 인터페이스 생성 및 적용
- 힐트모듈 수정
@s9hn s9hn added the enhancement New feature or request label Oct 1, 2024
@s9hn s9hn self-assigned this Oct 1, 2024
@s9hn s9hn requested a review from a team as a code owner October 1, 2024 09:43
Copy link

height bot commented Oct 1, 2024

Link Height tasks by mentioning a task ID in the pull request title or commit messages, or description and comments with the keyword link (e.g. "Link T-123").

💡Tip: You can also use "Close T-X" to automatically close a task when the pull request is merged.

@s9hn s9hn changed the title Feature/873 [Feat] 오늘의 솝마디 콕찌르기 추천 기능 구현 Oct 1, 2024
@s9hn s9hn changed the title [Feat] 오늘의 솝마디 콕찌르기 추천 기능 구현 [Feature/#873] 오늘의 솝마디 콕찌르기 추천 기능 구현 Oct 1, 2024
@@ -60,7 +60,7 @@ internal fun TodayFortuneDashboard(
) {
Spacer(modifier = Modifier.height(height = 32.dp))
Image(
painter = painterResource(R.drawable.img_fortune_title),
painter = painterResource(img_fortune_title),
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

Choose a reason for hiding this comment

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

그냥 문득 든 생각인데, PokeRepository 함수 수 왤케 많냐...이거 완전 갓 인터페이스 느낌인데ㅋㅋㅋㅋㅋㅋㅋ

Comment on lines +51 to +55
onProfileClick = { userId ->
context.startActivity(
Intent(Intent.ACTION_VIEW, Uri.parse("https://playground.sopt.org/members/${userId}"))
)
},
Copy link
Member

Choose a reason for hiding this comment

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

외부 뷰로 빠지는건가? 우리 WebViewActivity 활용하는 스펙은 아닌거?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

넵 그냥 외부 뷰로 이동한다고 하더라구욥

Copy link
Member

Choose a reason for hiding this comment

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

기존에 콕찌르기에서 저렇게 되어있어서 세훈햄한테 외부 뷰로 빠진다고 이야기했었습니다!
근데 음... 협의만 된다면 WebVIewActivity 쓰는것도 좋을 것 같네용

isEmptyProfile = false,
onPokeClick = { },
onProfileClick = { },
userDescription = "1100기 iOS",
Copy link
Member

Choose a reason for hiding this comment

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

?

Comment on lines 18 to 35
when (isEmptyProfile) {
true -> {
Image(
painter = painterResource(ic_empty_profile),
contentDescription = "profileImageEmpty",
modifier = modifier,
)
}

false -> {
UrlImage(
url = profile,
contentDescription = "profileImage",
modifier = modifier,
)
}
}
}
Copy link
Member

Choose a reason for hiding this comment

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

음? 이거 이렇게 구현한 이유가 있을까?

차라리 profile: String = ""

Suggested change
when (isEmptyProfile) {
true -> {
Image(
painter = painterResource(ic_empty_profile),
contentDescription = "profileImageEmpty",
modifier = modifier,
)
}
false -> {
UrlImage(
url = profile,
contentDescription = "profileImage",
modifier = modifier,
)
}
}
}
when (profile.isBlankOrEmpty()) {
true -> {
Image(
painter = painterResource(ic_empty_profile),
contentDescription = "profileImageEmpty",
modifier = modifier,
)
}
false -> {
UrlImage(
url = profile,
contentDescription = "profileImage",
modifier = modifier,
)
}
}
}

정도로 줄이고 isEmptyProfile은 빼도 되지 않을까? 상태가 이원화되어서 관리가 복잡한것 같아.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

처음에 아래처럼 했었는데, 모델에서 로직 적용 후 결과값을 넘겨주는게 맞나..해서 위처럼 구현했습니다.
저도 확신은 없었어서 누누씨 의견대로 가겠읍니다

Comment on lines +34 to +36
data class Success(
val todaySentence: TodaySentence,
val userInfo: UserInfo,
Copy link
Member

Choose a reason for hiding this comment

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

그냥 UI는 서버 상태에 의존된다는거 인정하는거?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

?? 저는 원래 인정파엿는데요 ㅋㅋ 뷰싸개는 도메인도 필요업다..
아무리 생각해도 ui의 state 키는 서버에서 내려주는 data이고 success를 대체할만한 워딩이 떠오르지않음 .. :(

Copy link
Member

@l2hyunwoo l2hyunwoo left a comment

Choose a reason for hiding this comment

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

리뷰 한번 확인좀

Copy link
Member

@chattymin chattymin 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 +51 to +55
onProfileClick = { userId ->
context.startActivity(
Intent(Intent.ACTION_VIEW, Uri.parse("https://playground.sopt.org/members/${userId}"))
)
},
Copy link
Member

Choose a reason for hiding this comment

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

기존에 콕찌르기에서 저렇게 되어있어서 세훈햄한테 외부 뷰로 빠진다고 이야기했었습니다!
근데 음... 협의만 된다면 WebVIewActivity 쓰는것도 좋을 것 같네용

Comment on lines +77 to +78
onPokeClick = { onPokeClick(uiState.userInfo.userId) },
onProfileClick = { onProfileClick(uiState.userInfo.userId) }
Copy link
Member

Choose a reason for hiding this comment

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

onPokeClick 함수에서 userId 값을 넘겨준다면 아래처럼 간단하게 쓸 수 있어요.
아래처럼 작성한다면 코드가 간단해지고, 캡쳐되기 때문에 약간의 성능 향상이 있지만, id라는 값을 넘겨주는 것 때문에 너무 강한 결합이 생기지 않을까?? 라는 고민을 요즘 하고있습니다. 혹시 어떻게 생각하시나용???

Suggested change
onPokeClick = { onPokeClick(uiState.userInfo.userId) },
onProfileClick = { onProfileClick(uiState.userInfo.userId) }
onPokeClick = onPokeClick,
onProfileClick = onProfileClick

Copy link
Contributor Author

Choose a reason for hiding this comment

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

오호~ 킹치만 호이스팅된 onXXXClick 함수들은 인자로 아무것도 넘겨주지 않아서 아래코드처럼 쓸 수 없습니당!
본 함수 람다에서 무엇을 넘겨줘야할지 구현해줘야해서 위처럼 작성했습니다

실제 onPokeClick, onProfileClick 등을 생성자로 받고있는 하위 컴포넌트들은 클릭 시 id를 넘겨줘야함!과 같은 구체적인 구현사항에 의존하지 않고, 호이스팅 된 상위 컴포넌트에서 위처럼 람다를 구현해서 상위로 전달해줍니다.
람다와 id가 강한결합.. 사실 그렇게 와닿지 않아서 잘 이해가 가진 않아요! 결국 필연적인 로직이라 생각하거든요 :)

Copy link
Member

Choose a reason for hiding this comment

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

아 코드를 제가 잘못 이해했었네요.
PokeRecommendationDashboard에 userInfo의 id도 같이 넘겨주고 있는 것으로 착각했습니다!

}
IconButton(
onClick = onPokeClick,
modifier = Modifier.size(size = 44.dp).background(
Copy link
Member

Choose a reason for hiding this comment

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

여기서 size를 명시적으로 작성해주신 이유가 있을까요??
iconButton의 디폴트가 44라서 해당 컴포넌트를 사용했다는 것 자체로 사이즈가 44라는 것을 나타내고 있다고 생각해요

Copy link
Contributor Author

Choose a reason for hiding this comment

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

오.. 휴먼 컴포넌트의 defaultSize까지 외우고 계십니까..? ㄷㄷ
처음안 사실이라 내부를 봤는데 44는 아니고 40인 것 같습니다!

Copy link
Member

Choose a reason for hiding this comment

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

앗 잘못외우고 있었네요 ㅋㅋㅋㅋ
머쓱

Comment on lines 118 to 121
Icon(
painter = painterResource(ic_poke),
contentDescription = "콕 찌르기",
)
Copy link
Member

Choose a reason for hiding this comment

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

혹시 ic_poke가 svg로 설정되어있다면 ImageVector로 바꾸는건 어떨까요??
painter가 Stable하지 않아 리컴포지션의 대상이 된다고 하더라구요

Copy link
Contributor Author

Choose a reason for hiding this comment

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

오 새로 알게된 사실이네요! svg 사용중인 부분 모두 벡터리소스로 바꿨습니다!

@s9hn s9hn merged commit 38f22cd into develop Oct 4, 2024
1 check passed
@s9hn s9hn deleted the feature/873 branch October 4, 2024 09:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request size/XXL
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feat] 오늘의 솝마디 콕찌르기 추천 기능 구현
4 participants