Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d8e0220
[ui]: 회원가입-장르선택 페이지 구현 (#45)
JJUYAAA Jul 14, 2025
108c38c
[fix]: 마이페이지 수정 - lazygrid로 변경 (#45)
JJUYAAA Jul 14, 2025
f5c57f4
[fix]: 프로필이미지 크기 수정 (#45)
JJUYAAA Jul 14, 2025
839d2fd
[fix]: showButton 인자 추가 및 간단한 수정 (#45)
JJUYAAA Jul 14, 2025
5a5109f
[ui]: 내피드_프로필 헤더 추가 (#45)
JJUYAAA Jul 14, 2025
f8b330d
[fix]: 헤더_이미지 painter->String 변경 (#45)
JJUYAAA Jul 14, 2025
365b1e2
[ui]: 피드_내피드 구현중(#45)
JJUYAAA Jul 14, 2025
4c6a07f
[ui]: 내 띱 리스트 디자인 수정 반영(#45)
JJUYAAA Jul 14, 2025
b88d1b2
[ui]: 띱 리스트 컴포넌트 생성(#45)
JJUYAAA Jul 21, 2025
9c53c60
[ui]: 나의 피드 페이지 완성(#45)
JJUYAAA Jul 21, 2025
e8f945b
[ui]: 나의 피드 상세 페이지(#45)
JJUYAAA Jul 21, 2025
bd412ab
[ui]: 내 구독 리스트 컴포너트(#45)
JJUYAAA Jul 21, 2025
ddfe631
[ui]: 홈/피드 -> 피드 item 추가(#45)
JJUYAAA Jul 21, 2025
c100d85
[ui]: 새 글 작성 페이지(#45)
JJUYAAA Jul 21, 2025
894f0db
[ui]: 새 글 작성 페이지 - 서브 장르 칩 구현 (#45)
JJUYAAA Jul 22, 2025
29d5fc4
[ui]: 새 글 작성 페이지 - 사진 추가 기능 구현 (#45)
JJUYAAA Jul 22, 2025
23c0314
[ui]: 새 글 작성 페이지 - 사진 추가 기능 구현 (#45)
JJUYAAA Jul 22, 2025
38dfa10
[ui]: 새 글 작성 페이지 - 바텀시트, 다이얼로그 (#45)
JJUYAAA Jul 22, 2025
8955792
[ui]: 새 글 작성 페이지 - 바텀시트, 다이얼로그 (#45)
JJUYAAA Jul 22, 2025
dbc7a69
[refactor]: AsyncImage로 통일 (#45)
JJUYAAA Jul 27, 2025
ca8c947
[refactor]: AsyncImage로 통일 (#45)
JJUYAAA Jul 27, 2025
5747691
[refactor]: 필요없는 주석, import 정리 및 modifier 정리(#45)
JJUYAAA Jul 27, 2025
3ddcdce
[refactor]: FeedCommentScreen 댓글 여백 수정(#45)
JJUYAAA Jul 27, 2025
9c0496a
[refactor]: FeedWriteScreen 블러 처리 추가(#45)
JJUYAAA Jul 27, 2025
346446c
Merge branch 'develop' into ui/#45-feed
JJUYAAA Jul 28, 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
2 changes: 1 addition & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ dependencies {
implementation(libs.kotlinx.serialization.json)
implementation(libs.accompanist.pager)
implementation(libs.accompanist.pager.indicators)
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
@@ -0,0 +1,58 @@
package com.texthip.thip.ui.common.buttons

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.texthip.thip.ui.theme.ThipTheme

@Composable
fun SubGenreChipGrid(
subGenres: List<String>,
selectedGenres: List<String>,
onGenreToggle: (String) -> Unit
) {
FlowRow(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
subGenres.forEach { genre ->
OptionChipButton(
text = genre,
isSelected = selectedGenres.contains(genre),
isFilled = false,
onClick = { onGenreToggle(genre) }
)
}
}
}

@Preview(showBackground = true)
@Composable
fun PreviewSubGenreChipGrid() {
ThipTheme {
val previewSubGenres = listOf(
"태그1", "태그2", "태그3", "태그4", "태그5",
"태그6", "태그7", "태그8", "태그9", "태그10"
)
val selectedGenres = remember { mutableStateListOf<String>() }

SubGenreChipGrid(
subGenres = previewSubGenres,
selectedGenres = selectedGenres,
onGenreToggle = { genre ->
if (selectedGenres.contains(genre)) {
selectedGenres.remove(genre)
} else {
selectedGenres.add(genre)
}
}
)
}
}
59 changes: 32 additions & 27 deletions app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.texthip.thip.ui.common.header

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
Expand All @@ -14,33 +11,30 @@ 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.foundation.shape.RoundedCornerShape
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.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.ui.common.buttons.OutlinedButton
import com.texthip.thip.ui.theme.ThipTheme
import com.texthip.thip.ui.theme.ThipTheme.colors
import com.texthip.thip.ui.theme.ThipTheme.typography
import com.texthip.thip.R
import com.texthip.thip.ui.common.buttons.OutlinedButton
import com.texthip.thip.ui.theme.Grey02

@Composable
fun AuthorHeader(
modifier: Modifier = Modifier,
profileImage: Painter?,
profileImage: String?,
nickname: String,
badgeText: String,
buttonText: String,
buttonWidth: Dp? = null,
buttonText: String = "",
buttonWidth: Dp = 60.dp,
showButton: Boolean = true,
profileImageSize: Dp = 54.dp,
onButtonClick: () -> Unit = {}
) {
Row(
Expand All @@ -50,17 +44,17 @@ fun AuthorHeader(
verticalAlignment = Alignment.CenterVertically
) {
if (profileImage != null) {
Image(
painter = profileImage,
contentDescription = "작성자 장르이미지",
AsyncImage(
model = profileImage,
contentDescription = null,
modifier = Modifier
.size(48.dp)
.size(profileImageSize)
.clip(CircleShape)
)
} else {
Box(
modifier = Modifier
.size(48.dp)
.size(profileImageSize)
.clip(CircleShape)
.background(colors.Grey)
)
Expand All @@ -82,7 +76,8 @@ fun AuthorHeader(
maxLines = 1
)
}
OutlinedButton(
if (showButton) {
OutlinedButton(
modifier = Modifier
.then(
if (buttonWidth != null)
Expand All @@ -94,20 +89,30 @@ fun AuthorHeader(
text = buttonText,
textStyle = typography.view_m500_s14,
onClick = onButtonClick
)
)
}
}
}

@Preview(showBackground = true)
@Composable
fun PreviewAuthorHeader() {
ThipTheme {
AuthorHeader(
profileImage = null,
nickname = "열자자제한열열자제한",
badgeText = "칭호칭호칭호",
buttonText = "구독",
buttonWidth = 60.dp
)
Column {
AuthorHeader(
profileImage = null,
nickname = "열자자제한열열자제한",
badgeText = "칭호칭호칭호",
buttonText = "구독",
modifier = Modifier.padding(bottom = 20.dp)
)
AuthorHeader(
profileImage = null,
nickname = "열자자제한열열자제한",
badgeText = "칭호칭호칭호",
buttonWidth = 60.dp,
showButton = false
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors

@Composable
fun LogoTopAppBar(
modifier: Modifier = Modifier,
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

modifier 매개변수가 사용되지 않고 있습니다.

modifier 매개변수가 추가되었지만 실제로 컴포저블 내에서 사용되지 않고 있습니다. 이로 인해 호출자가 컴포넌트의 모양이나 동작을 수정할 수 없습니다.

다음과 같이 수정하여 modifier를 적용해주세요:

 Box(
-    modifier = Modifier
+    modifier = modifier
         .fillMaxWidth()
         .background(color = colors.Black)
         .padding(horizontal = 20.dp, vertical = 16.dp),
     contentAlignment = Alignment.CenterStart
 ) {

Also applies to: 38-43

🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt at
lines 26 and 38-43, the modifier parameter is declared but not applied within
the composable function. To fix this, ensure that the modifier parameter is
passed to the root composable element inside the function so that callers can
customize the component's appearance and behavior. Update the composable to
include the modifier in the UI hierarchy accordingly.

leftIcon: Painter,
hasNotification: Boolean,
onLeftClick: () -> Unit = {},
Expand All @@ -35,7 +36,7 @@ fun LogoTopAppBar(
}

Box(
modifier = Modifier
modifier = modifier
.fillMaxWidth()
.background(color = colors.Black)
.padding(horizontal = 20.dp, vertical = 16.dp),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package com.texthip.thip.ui.feed.component

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
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.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.res.painterResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
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 FeedSubscribeBarlist(
modifier: Modifier = Modifier,
followerProfileImageUrls: List<String>,
onClick: () -> Unit
) {
Row(
modifier = modifier
.fillMaxWidth()
.height(24.dp)
.clickable { onClick() },
verticalAlignment = Alignment.CenterVertically
) {
Icon(
painter = painterResource(id = R.drawable.ic_group),
contentDescription = null,
tint = Color.Unspecified
)
Text(
text = buildAnnotatedString {
Copy link
Collaborator

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.

텍스트 내부에 서로 다른 스타일을 적용시키기 위한 함수입니당
디자인 상 'N명이 띱 하는중'이라는 스트링에서 'N명'만 bold 체이기 때문에 해당 함수로 개별 스타일을 적용시킨 겁니다!

withStyle(
style = SpanStyle(
fontWeight = FontWeight.Bold,
color = colors.White
)
) {
append("${followerProfileImageUrls.size}명")
}
withStyle(
style = SpanStyle(
color = colors.Grey
)
) {
append("이 띱 하는중")
}
},
style = typography.info_r400_s12,
modifier = Modifier.padding(start = 2.dp)
)
Spacer(modifier = Modifier.weight(1f))
Row(
verticalAlignment = Alignment.CenterVertically
) {
followerProfileImageUrls.take(5).reversed().forEachIndexed { index, imageUrl ->
AsyncImage(
model = imageUrl,
contentDescription = null,
modifier = Modifier
.size(24.dp)
.clip(CircleShape)
.background(Color.LightGray)
)

val isLast = index == followerProfileImageUrls.take(5).lastIndex
Spacer(modifier = Modifier.width(if (isLast) 15.dp else 4.dp))
}

Icon(
painter = painterResource(id = R.drawable.ic_chevron),
contentDescription = null,
tint = colors.Grey
)
}
}
}

@Preview
@Composable
private fun FeedSubscribelistBarPreview() {
ThipTheme {
Column {
// Case 1: 팔로워 0
FeedSubscribeBarlist(
followerProfileImageUrls = emptyList(),
onClick = {}
)

// Case 2: 팔로워 3
FeedSubscribeBarlist(
followerProfileImageUrls = listOf(
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg"
),
onClick = {}
)

// Case 3: 팔로워 6
FeedSubscribeBarlist(
followerProfileImageUrls = List(6) {
"https://example.com/profile$it.jpg"
},
onClick = {}
)
}
}

}
Loading