Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
caab1d1
[refactor]: Feed data class 추가, FeedWriteScreen 적용(#45)
JJUYAAA Jul 28, 2025
8a59f33
충돌 해결
JJUYAAA Jul 28, 2025
909c541
[refactor]: FeedNavigation 수정(#45)
JJUYAAA Jul 28, 2025
b9ba48f
[refactor]: FeedCard 컴포넌트 이미지 1-3개로 수정(#61)
JJUYAAA Jul 29, 2025
eb35501
[refactor]: FeedCommentList data class로 대체(#61)
JJUYAAA Aug 1, 2025
28a294a
[refactor]: FeedCard 본문 클릭가능하도록 수정(#61)
JJUYAAA Aug 1, 2025
1d87174
[refactor]: FeedCard "..더보기" 버튼 구현중(#61)
JJUYAAA Aug 1, 2025
c7b5f97
[refactor]: FeedCard 아이콘 분기처리, 이미지 padding 수정, 가로 스크롤 가능하도록 처리 (#61)
JJUYAAA Aug 1, 2025
ef29411
[ui]: FeedCommentScreen 이미지 자세히 보기 모달 추가생성 및 적용 (#61)
JJUYAAA Aug 1, 2025
c50d884
[refactor]: loginScreen text 수정 (#61)
JJUYAAA Aug 1, 2025
0f44edc
[refactor]: 선택되지 않은 RoleCard 장르 텍스트 색상 수정 (#61)
JJUYAAA Aug 1, 2025
60ba367
[refactor]: RoleCard 변경된 디자인으로 수정 (그라데이션 효과 제거 및 색상 추가) (#61)
JJUYAAA Aug 1, 2025
54e9dcf
[refactor]: 마이페이지 변경된 디자인 반영하여 수정(#61)
JJUYAAA Aug 1, 2025
9116c68
[refactor]: 마이페이지 반응, 알림 페이지 ui 수정(#61)
JJUYAAA Aug 2, 2025
31e18d6
[refactor]: 내 띱 목록, 다른 유저 띱 목록 분리되도록 처리(#61)
JJUYAAA Aug 2, 2025
4e3bc4c
[ui]: 다른 유저 띱 목록 화면 추가(#61)
JJUYAAA Aug 2, 2025
50e47d9
[refactor]: 더보기 관련 컴포넌트 제거 & maxline 적용만(#61)
JJUYAAA Aug 2, 2025
0a11894
[refactor]: 컬러 thip의 colors로 일괄 수정(#61)
JJUYAAA Aug 8, 2025
a3a37a9
[refactor]: 피드 댓글 스크린 수정(#61)
JJUYAAA Aug 8, 2025
9da55fc
[refactor]: 피드 스크롤 범위 조정(#61)
JJUYAAA Aug 8, 2025
54b0fa9
[refactor]: 마이페이지 스크롤 범위(#61)
JJUYAAA Aug 8, 2025
c4edd46
[refactor]: 배경컬러 삭제(#61)
JJUYAAA Aug 8, 2025
3b9d668
[refactor]: commentList 파라미터에 상태 선언하는 부분 수정(#61)
JJUYAAA Aug 8, 2025
a3dfdf1
Merge branch 'develop' into ui/#61-feed_qa
JJUYAAA Aug 8, 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
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -66,16 +66,16 @@ dependencies {
implementation(libs.androidx.lifecycle.viewmodel.compose)
implementation(libs.androidx.navigation.runtime.android)
implementation(libs.kotlinx.serialization.json)
implementation(libs.accompanist.pager)
implementation(libs.accompanist.pager.indicators)
implementation(libs.coil.compose)
implementation(libs.foundation)

@coderabbitai coderabbitai Bot Aug 2, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

의존성 관리 개선 필요

Foundation 라이브러리가 중복으로 추가되어 있고 서로 다른 버전을 사용하고 있습니다:

  • libs.foundation (라인 61): 1.9.0-rc01 버전
  • 직접 구현 (라인 69): 1.5.0 버전

이는 클래스패스 충돌과 예측할 수 없는 동작을 야기할 수 있습니다.

다음과 같이 하나의 버전으로 통합하세요:

     implementation(libs.foundation)
-    implementation("androidx.compose.foundation:foundation:1.5.0")

또는 더 최신 버전이 필요하다면 libs.versions.toml에서 버전을 업데이트하고 버전 카탈로그만 사용하세요.

Also applies to: 69-69

🤖 Prompt for AI Agents
In app/build.gradle.kts at lines 61 and 69, the Foundation library is included
twice with different versions (1.9.0-rc01 and 1.5.0), causing potential
conflicts. Remove the direct implementation at line 69 and keep only the version
managed via libs.foundation at line 61. If a newer version is needed, update the
version in libs.versions.toml and use only the version catalog reference to
ensure consistent dependency management.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

그러게요 이거는 아래 implementation은 빼면 될듯요?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@rbqks529 맞습니다! 아래쪽의 직접 구현된 dependency를 제거하는 것이 정확한 해결책입니다.

// 이 라인을 제거하세요
implementation("androidx.compose.foundation:foundation:1.5.0")

libs.foundation (1.9.0-rc01)만 남겨두면 더 최신 버전을 사용하면서 버전 카탈로그를 통한 일관된 의존성 관리가 가능합니다. 중복 제거로 빌드 시간도 단축되고 잠재적인 충돌도 방지할 수 있어요.


🧠 Learnings used
Learnt from: rbqks529
PR: THIP-TextHip/THIP-Android#30
File: app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt:108-112
Timestamp: 2025-07-01T07:19:10.981Z
Learning: The user rbqks529 prefers to extract hardcoded UI strings to StringResource files (strings.xml) rather than keeping them inline in Compose components, which is a good practice for maintainability and localization in Android development.

testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
implementation("androidx.compose.foundation:foundation:1.5.0")

// Hilt
implementation(libs.hilt.android)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ fun ActionBarButton(
modifier = Modifier.clickable { onPinClick() },
painter = painterResource(R.drawable.ic_pin),
contentDescription = null,
tint = Color.White
tint = colors.White
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ fun CardItemRoom(
modifier = Modifier.size(20.dp),
painter = painterResource(id = R.drawable.ic_group),
contentDescription = "그룹 아이콘",
tint = Color.White
tint = colors.White
)
Spacer(modifier = Modifier.width(4.dp))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ fun CardItemRoomSmall(
modifier = Modifier.size(20.dp),
painter = painterResource(id = R.drawable.ic_group),
contentDescription = "그룹 아이콘",
tint = Color.White
tint = colors.White
)
Spacer(modifier = Modifier.width(4.dp))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ fun CardRoomBook(
Text(
text = title,
style = typography.menu_m500_s16_h24,
color = Color.White,
color = colors.White,
maxLines = 1,
modifier = Modifier.weight(1f),
)
Expand All @@ -77,7 +77,7 @@ fun CardRoomBook(
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_chevron_right),
contentDescription = "더보기",
tint = Color.White,
tint = colors.White,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,19 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
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.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.texthip.thip.R
import com.texthip.thip.ui.common.buttons.OutlinedButton
import com.texthip.thip.ui.theme.ThipTheme
import com.texthip.thip.ui.theme.ThipTheme.colors
Expand All @@ -34,6 +38,8 @@ fun AuthorHeader(
buttonText: String = "",
buttonWidth: Dp = 60.dp,
showButton: Boolean = true,
showThipNum: Boolean = false,
thipNum: Int? = null,
profileImageSize: Dp = 54.dp,
onButtonClick: () -> Unit = {}
) {
Expand Down Expand Up @@ -91,6 +97,19 @@ fun AuthorHeader(
onClick = onButtonClick
)
}
if(showThipNum && thipNum!=null){
Text(
text = stringResource(R.string.thip_num,thipNum),
style = typography.view_r400_s11_h20,
color = colors.White
)
Spacer(modifier = Modifier.width(18.dp))
Icon(
painter = painterResource(R.drawable.ic_chevron),
contentDescription = null,
tint = colors.White,
)
}
}
}

Expand All @@ -110,8 +129,9 @@ fun PreviewAuthorHeader() {
profileImage = null,
nickname = "열자자제한열열자제한",
badgeText = "칭호칭호칭호",
buttonWidth = 60.dp,
showButton = false
showButton = false,
showThipNum = true,
thipNum = 10
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ fun HeaderMenuBarTab(
titles: List<String>,
selectedTabIndex: Int,
onTabSelected: (Int) -> Unit,
indicatorColor: Color = Color.White,
indicatorColor: Color = colors.White,
) {
ScrollableTabRow(
selectedTabIndex = selectedTabIndex,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.texthip.thip.ui.common.modal

import androidx.compose.foundation.ScrollState
import androidx.compose.runtime.Composable
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.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Icon
import androidx.compose.material.Text
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
Expand Down Expand Up @@ -47,7 +47,7 @@ fun FeedSubscribeBarlist(
Icon(
painter = painterResource(id = R.drawable.ic_group),
contentDescription = null,
tint = Color.Unspecified
tint = colors.White
)
Text(
text = buildAnnotatedString {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
package com.texthip.thip.ui.feed.component

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
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.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import com.texthip.thip.R
import com.texthip.thip.ui.theme.ThipTheme
import com.texthip.thip.ui.theme.ThipTheme.colors
import com.texthip.thip.ui.theme.ThipTheme.typography

@Composable
fun ImageViewerModal(
images: List<Painter>,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

이거 혹시 Painter를 받아오게 되어있는데 이미지 자세히 보기 화면인가요? 또 Painter로 하신 이유가 있을까요?

initialIndex: Int = 0,
onDismiss: () -> Unit
) {
val pagerState = rememberPagerState(
initialPage = initialIndex,
pageCount = { images.size }
)

Box(
modifier = Modifier
.fillMaxSize()
.background(colors.Black)
.clickable { onDismiss() }
) {
// 닫기 버튼
Icon(
painter = painterResource(R.drawable.ic_x),
contentDescription = "닫기",
Comment on lines +52 to +54

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

하드코딩된 문자열을 리소스 파일로 추출하세요.

접근성을 위한 contentDescription에 하드코딩된 한국어 문자열이 있습니다. 다국어 지원과 유지보수를 위해 string resource로 추출해야 합니다.

         Icon(
             painter = painterResource(R.drawable.ic_x),
-            contentDescription = "닫기",
+            contentDescription = stringResource(R.string.close),
             tint = Color.White,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Icon(
painter = painterResource(R.drawable.ic_x),
contentDescription = "닫기",
Icon(
painter = painterResource(R.drawable.ic_x),
contentDescription = stringResource(R.string.close),
tint = Color.White,
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/feed/component/ImageViewerModal.kt
around lines 50 to 52, the contentDescription for the Icon uses a hardcoded
Korean string. To support localization and maintainability, move this string
into the strings resource file and reference it via stringResource or equivalent
method in the code.

tint = colors.White,
modifier = Modifier
.align(Alignment.TopEnd)
.padding(20.dp)
.size(24.dp)
.clickable { onDismiss() }
.zIndex(1f)
)

// 이미지 페이저
HorizontalPager(
state = pagerState,
modifier = Modifier
.fillMaxSize()
.clickable { /* HorizontalPager 내부 클릭 시 모달 닫기 방지 */ }
) { page ->
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Image(
painter = images[page],
contentDescription = null,
contentScale = ContentScale.Fit, // 원본 비율 유지하면서 화면에 맞춤
modifier = Modifier.fillMaxSize()
)
}
}

// 페이지 인디케이터 (이미지가 2개 이상일 때만 표시)
if (images.size > 1) {
Row(
modifier = Modifier
.align(Alignment.BottomCenter)
.padding(20.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
repeat(images.size) { index ->
Box(
modifier = Modifier
.size(8.dp)
.clip(CircleShape)
.background(
if (index == pagerState.currentPage) colors.White
else colors.White.copy(alpha = 0.4f)
)
)
}
}
}

// 이미지 카운터 (예: 1/3)
if (images.size > 1) {
Text(
text = stringResource(id = R.string.tag_count, images.size, 3),
style = typography.copy_r400_s14,
color = colors.White,
modifier = Modifier
.align(Alignment.TopCenter)
.padding(20.dp)
.background(
colors.Black.copy(alpha = 0.5f),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
)
.padding(horizontal = 12.dp, vertical = 6.dp)
)
}
}
}


@Preview
@Composable
private fun ImageViewerModalSingleImagePreview() {
ThipTheme {
val mockImages = listOf(
painterResource(R.drawable.bookcover_sample)
)

ImageViewerModal(
images = mockImages,
initialIndex = 0,
onDismiss = {}
)
}
}

@Preview
@Composable
private fun ImageViewerModalMultipleImagesPreview() {
ThipTheme {
val mockImages = listOf(
painterResource(R.drawable.character_art),
painterResource(R.drawable.character_literature),
painterResource(R.drawable.character_sociology)
)

ImageViewerModal(
images = mockImages,
initialIndex = 1,
onDismiss = { }
)
}
}
Loading