From d9b3c22c529fc4df86e30b9e36973d660850f70c Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Fri, 8 Aug 2025 23:04:00 +0900 Subject: [PATCH 01/21] =?UTF-8?q?[ui]:=20=EC=9C=A0=EC=A0=80=EC=9D=98=20?= =?UTF-8?q?=EA=B5=AC=EB=8F=85=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=EB=8F=85=EC=9E=90=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0(#7?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/feed/component/FeedSubscribelistBar.kt | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt index 30e5022f..132f59ba 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt @@ -74,25 +74,27 @@ fun FeedSubscribeBarlist( Row( verticalAlignment = Alignment.CenterVertically ) { - followerProfileImageUrls.take(5).reversed().forEachIndexed { index, imageUrl -> - AsyncImage( - model = imageUrl, + if (followerProfileImageUrls.isNotEmpty()) { + 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, - modifier = Modifier - .size(24.dp) - .clip(CircleShape) - .background(Color.LightGray) + tint = colors.Grey ) - - 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 - ) } } } From 46302b6e66c10310a28622fef2fda0a53c72d064 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Fri, 8 Aug 2025 23:17:31 +0900 Subject: [PATCH 02/21] =?UTF-8?q?[ui]:=20=EB=82=B4=ED=94=BC=EB=93=9C=20-?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=EB=90=9C=20=EA=B8=80=20=EC=97=86=EB=8A=94?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/feed/screen/FeedScreen.kt | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt index d896e9b9..b4a2b39e 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt @@ -122,8 +122,7 @@ fun FeedScreen( selectedTabIndex = selectedIndex.value, onTabSelected = { selectedIndex.value = it } ) - - // 스크롤 영역 전체 + // 스크롤 영역 LazyColumn( modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(12.dp) @@ -168,13 +167,13 @@ fun FeedScreen( Box( modifier = Modifier .fillMaxWidth() - .padding(top = 110.dp), + .padding(top = 244.dp), contentAlignment = Alignment.TopCenter ) { Text( text = stringResource(R.string.create_feed), style = typography.smalltitle_sb600_s18_h24, - color = colors.Grey + color = colors.White ) } } @@ -190,7 +189,7 @@ fun FeedScreen( ) feedStateList[index] = updated }, - onContentClick = {} //FeedCommentScreen으로 + onContentClick = {} //TODO FeedCommentScreen으로 ) Spacer(modifier = Modifier.height(40.dp)) if (index != feeds.lastIndex) { @@ -253,7 +252,7 @@ fun FeedScreen( @Composable private fun FeedScreenPreview() { ThipTheme { - val mockFeeds = List(5) { + /*val mockFeeds = List(5) { FeedItem( id = it + 1, userProfileImage = R.drawable.character_literature, @@ -270,20 +269,23 @@ private fun FeedScreenPreview() { isLocked = it % 2 == 0, imageUrls = listOf(R.drawable.bookcover_sample) ) - } - val mockFollowerImages = listOf( + }*/ + /*val mockFollowerImages = listOf( "https://example.com/image1.jpg", "https://example.com/image2.jpg", "https://example.com/image3.jpg", "https://example.com/image4.jpg", "https://example.com/image5.jpg" - ) + )*/ + + val mockFeeds: List = emptyList() + val mockFollowerImages = emptyList() ThipTheme { FeedScreen( nickname = "ThipUser01", userRole = "문학 칭호", - selectedTabIndex = 0, + selectedTabIndex = 1, feeds = mockFeeds, totalFeedCount = mockFeeds.size, followerProfileImageUrls = mockFollowerImages From 604afd361027463f0429181abbec31e5319ed5f0 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Fri, 8 Aug 2025 23:19:07 +0900 Subject: [PATCH 03/21] =?UTF-8?q?[ui]:=20=EB=82=B4=ED=94=BC=EB=93=9C=20-?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=EB=90=9C=20=EA=B8=80=20=EC=97=86=EB=8A=94?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=20=ED=94=84=EB=A6=AC=EB=B7=B0=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/feed/screen/FeedScreen.kt | 24 +++++++++++++++---- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt index b4a2b39e..4e9b765c 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt @@ -252,7 +252,7 @@ fun FeedScreen( @Composable private fun FeedScreenPreview() { ThipTheme { - /*val mockFeeds = List(5) { + val mockFeeds = List(5) { FeedItem( id = it + 1, userProfileImage = R.drawable.character_literature, @@ -269,15 +269,31 @@ private fun FeedScreenPreview() { isLocked = it % 2 == 0, imageUrls = listOf(R.drawable.bookcover_sample) ) - }*/ - /*val mockFollowerImages = listOf( + } + val mockFollowerImages = listOf( "https://example.com/image1.jpg", "https://example.com/image2.jpg", "https://example.com/image3.jpg", "https://example.com/image4.jpg", "https://example.com/image5.jpg" - )*/ + ) + ThipTheme { + FeedScreen( + nickname = "ThipUser01", + userRole = "문학 칭호", + selectedTabIndex = 1, + feeds = mockFeeds, + totalFeedCount = mockFeeds.size, + followerProfileImageUrls = mockFollowerImages + ) + } + } +} +@Preview(showBackground = true) +@Composable +private fun FeedScreenWithoutDataPreview() { + ThipTheme { val mockFeeds: List = emptyList() val mockFollowerImages = emptyList() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4f70ba19..cf0573ec 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -293,7 +293,7 @@ 띱 하기 띱 취소 %d명이 띱 하는 중 - 피드에 글을 작성해 보세요 + 피드에 작성된 글이 없어요 모집을 마감하시겠습니까? 독서메이트 모집을 마감하면\n지금 바로 모임방 활동을 바로 시작할 수 있어요. From 2a1ab49ebb74b6fa5e75fabf2864078aa48c230c Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Fri, 8 Aug 2025 23:20:54 +0900 Subject: [PATCH 04/21] =?UTF-8?q?[ui]:=20=EB=82=B4=ED=94=BC=EB=93=9C=20-?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=EB=90=9C=20=EA=B8=80=20=EC=97=86=EB=8A=94?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=20=EB=A9=98=ED=8A=B8=20=EC=88=98=EC=A0=95?= =?UTF-8?q?(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cf0573ec..95b626b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -293,7 +293,7 @@ 띱 하기 띱 취소 %d명이 띱 하는 중 - 피드에 작성된 글이 없어요 + 피드에 글을 작성해보세요 모집을 마감하시겠습니까? 독서메이트 모집을 마감하면\n지금 바로 모임방 활동을 바로 시작할 수 있어요. From 6b23c85bd8c69b23e6a56203e4780c05121f1bbf Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 00:28:09 +0900 Subject: [PATCH 05/21] =?UTF-8?q?[ui]:=20=ED=94=BC=EB=93=9C=20-=20?= =?UTF-8?q?=EB=82=B4=EA=B0=80=20=EA=B5=AC=EB=8F=85=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EA=B0=80=20=EC=97=86=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/feed/component/MySubscribelistBar.kt | 121 +++++++++++++----- .../res/drawable/search_character_image.png | Bin 0 -> 920 bytes app/src/main/res/values/strings.xml | 2 + 3 files changed, 89 insertions(+), 34 deletions(-) create mode 100644 app/src/main/res/drawable/search_character_image.png diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt index d8b4125e..ca883a4e 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt @@ -2,6 +2,7 @@ package com.texthip.thip.ui.feed.component import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -12,6 +13,7 @@ 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.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -74,47 +76,82 @@ fun MySubscribeBarlist( Spacer(modifier = Modifier.height(4.dp)) - Row( - modifier = Modifier - .fillMaxWidth() - .height(58.dp) - .clickable { onClick() }, - verticalAlignment = Alignment.CenterVertically - ) { - subscriptions.take(maxVisibleCount).forEach { profile -> - Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.width(36.dp) - ) { - AsyncImage( - model = profile.profileImageUrl, - contentDescription = null, - modifier = Modifier - .size(36.dp) - .clip(CircleShape) - .background(Color.LightGray) - ) - Text( - text = profile.nickname, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - style = typography.view_r400_s11_h20, - color = colors.White, + if (subscriptions.isEmpty()) { + EmptyMySubscriptionBar() + } else { + Row( + modifier = Modifier + .fillMaxWidth() + .height(58.dp) + .clickable { onClick() }, + verticalAlignment = Alignment.CenterVertically + ) { + subscriptions.take(maxVisibleCount).forEach { profile -> + Column( + horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.width(36.dp) - ) + ) { + AsyncImage( + model = profile.profileImageUrl, + contentDescription = null, + modifier = Modifier + .size(36.dp) + .clip(CircleShape) + .background(Color.LightGray) + ) + Text( + text = profile.nickname, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = typography.view_r400_s11_h20, + color = colors.White, + modifier = Modifier.width(36.dp) + ) + } + Spacer(modifier = Modifier.width(12.dp)) } - Spacer(modifier = Modifier.width(12.dp)) + Spacer(modifier = Modifier.weight(1f)) + Icon( + painter = painterResource(id = R.drawable.ic_chevron), + contentDescription = null, + tint = colors.Grey + ) } - Spacer(modifier = Modifier.weight(1f)) - Icon( - painter = painterResource(id = R.drawable.ic_chevron), - contentDescription = null, - tint = colors.Grey - ) } } } } +@Composable +private fun EmptyMySubscriptionBar() { + Box( + modifier = Modifier + .fillMaxWidth() + .height(42.dp) + .clip(RoundedCornerShape(8.dp)) + .background(colors.DarkGrey02) + .clickable { } + ) { + Text( + modifier = Modifier + .align(Alignment.CenterStart) + .padding(start = 12.dp), + text = stringResource(R.string.find_thip_mate), + color = colors.White, + style = typography.view_m500_s12_h20 + ) + + Icon( + painter = painterResource(id = R.drawable.search_character_image), + contentDescription = null, + tint = Color.Unspecified, + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(end = 12.dp) + .width(32.dp) + .height(42.dp) + ) + } +} @Preview @Composable @@ -138,4 +175,20 @@ private fun MySubscribeBarlistPrev() { } } +} + +@Preview +@Composable +private fun MySubscribeBarlistWithoutDataPrev() { + ThipTheme { + val previewData = emptyList() + + Column { + MySubscribeBarlist( + subscriptions = previewData, + onClick = {} + ) + } + } + } \ No newline at end of file diff --git a/app/src/main/res/drawable/search_character_image.png b/app/src/main/res/drawable/search_character_image.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8a899c95dca599d65d3f3efda35a5832d8c506 GIT binary patch literal 920 zcmV;J184k+P)00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP?*`9NNIo$nN+4Ulu$q< zTp}eD=2Lhx@AmdM+XprnJ4O7Y)9vl&=FQBT-32=6po0$ncUX-~T3%MMav9M;0HaDF zWLXHYU)sN={Y#!hX&2II>jKY&Rmbq6{CL9{tot(y1)2Xa`HsbBqSP}nT(Y}qXb^lxNAVC<-=q82vmK4eof~*; z$F$-p0#v%Z7SI|*98En=K(K<=BIY<*OTY=wd$b-4z69>>9?ETC00@U`R}Ky7v1Z`t zp#s6`f#G2wkpNClfovAIy3+mA(|T-o7uegwi{Q7R84W~CM?Md%u4->nsRyq&Hnd?9 zA;G7>HH;XadIELV^dSgj+FOb`MibweSLN` zM1bh&(eJ@Q|8W}e5*Qr?mX?%DzF5@#V`Ge(0{1*2@uw~U3XmRhAyF#n_rwGcjl%Wr z=B9F8Jg$weuUqaKf?6t-luhFL+B#3CE7#c?kfXL>I+)|hNuak^f746mbaoaMp*=pX z^qzAlTCZ_~ogGbTZcg=8kJ$v?ys=L&*Pxd@g-6fWHW6WnO?43AuyWQue!8EWXs*@$ zrVQN(92{tY8Dj>l0(!~N`*}%FH`S@}jtOc+81S1+1Aa#6wO_yS+?ygV`ulZ-D5VO% z1iHIxnLP(g4^u}W(wGa{_<60%u~XA0KVl%2xMOG{Fw>}oQC?&|7# z2R!JFuw&<3M9$G9s1a^NBO{enbaZ4D=I3ppM$6^$VlWu|Zr0clklSuZO0j8BBa8$= z0v^2-5(z6M8psukfi2mvcvb6j35fBAZoSWeSFBQHGsz@(K`Ue;V_-B8K?~uWf}cFZ zewwkG)36;7LYt;-A`nHJz!OpOe`vk~4x_jDM+opf=yz3W6{v?~Qq8yoy!XL&L8|VX uv-cn%-p9~pI8~7&32LAn*Kt2YNa8Q`=rjdk-U|Q#0000띱 취소 %d명이 띱 하는 중 피드에 글을 작성해보세요 + 피드에 작성된 글이 없어요 + 관심있는 독서메이트를 찾아보세요! 모집을 마감하시겠습니까? 독서메이트 모집을 마감하면\n지금 바로 모임방 활동을 바로 시작할 수 있어요. From d73b6a3d640d66b5f3c181a929027674e74a1808 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 01:34:04 +0900 Subject: [PATCH 06/21] =?UTF-8?q?[ui]:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80-=EC=A0=80=EC=9E=A5=ED=94=BC=EB=93=9C->=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=97=86=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EC=B6=94=EA=B0=80(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/mypage/component/FeedContent.kt | 68 +++++++++++++++++++ .../ui/mypage/component/MypageSaveFeed.kt | 28 -------- .../ui/mypage/viewmodel/SavedFeedViewModel.kt | 14 +++- app/src/main/res/values/strings.xml | 4 ++ 4 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/mypage/component/FeedContent.kt delete mode 100644 app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveFeed.kt diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/component/FeedContent.kt b/app/src/main/java/com/texthip/thip/ui/mypage/component/FeedContent.kt new file mode 100644 index 00000000..078eba10 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/mypage/component/FeedContent.kt @@ -0,0 +1,68 @@ +package com.texthip.thip.ui.mypage.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.texthip.thip.R +import com.texthip.thip.ui.mypage.mock.FeedItem +import com.texthip.thip.ui.mypage.viewmodel.SavedFeedViewModel +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun FeedContent( + feedList: List, viewModel: SavedFeedViewModel + +) { + if (feedList.isEmpty()) { + EmptyFeedContent() + } else { + LazyColumn { + items(feedList, key = { it.id }) { feed -> + val profileImagePainter = feed.userProfileImage?.let { painterResource(it) } + + SavedFeedCard( + feedItem = feed, + profileImage = profileImagePainter, + onBookmarkClick = { viewModel.toggleBookmark(feed.id) }, + onLikeClick = { viewModel.toggleLike(feed.id) } + ) + } + } + } +} + +@Composable +fun EmptyFeedContent() { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(R.string.no_saved_feed), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Text( + text = stringResource(R.string.do_thip_feed), + style = typography.feedcopy_r400_s14_h20, + color = colors.Grey, + modifier = Modifier.padding(top = 8.dp) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveFeed.kt b/app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveFeed.kt deleted file mode 100644 index 970a7539..00000000 --- a/app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveFeed.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.texthip.thip.ui.mypage.component - -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.ui.res.painterResource -import androidx.lifecycle.viewmodel.compose.viewModel -import com.texthip.thip.ui.mypage.viewmodel.SavedFeedViewModel - -@Composable -fun FeedContent(viewModel: SavedFeedViewModel = viewModel()) { - val feedList by viewModel.feeds.collectAsState() - - LazyColumn { - items(feedList, key = { it.id }) { feed -> - val profileImagePainter = feed.userProfileImage?.let { painterResource(it) } - - SavedFeedCard( - feedItem = feed, - profileImage = profileImagePainter, - onBookmarkClick = { viewModel.toggleBookmark(feed.id) }, - onLikeClick = { viewModel.toggleLike(feed.id) } - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedFeedViewModel.kt b/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedFeedViewModel.kt index ff0756d4..c3c96fa3 100644 --- a/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedFeedViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedFeedViewModel.kt @@ -6,7 +6,7 @@ import com.texthip.thip.ui.mypage.mock.FeedItem import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -class SavedFeedViewModel: ViewModel() { +open class SavedFeedViewModel: ViewModel() { private val _feeds = MutableStateFlow( listOf( FeedItem( @@ -86,7 +86,9 @@ class SavedFeedViewModel: ViewModel() { ) ) - val feeds: StateFlow> = _feeds + + + open val feeds: StateFlow> = _feeds fun toggleBookmark(id: Int) { _feeds.value = _feeds.value.map { @@ -99,4 +101,12 @@ class SavedFeedViewModel: ViewModel() { if (it.id == id) it.copy(isLiked = !it.isLiked) else it } } +} + +class EmptySavedFeedViewModel : SavedFeedViewModel() { + + private val _feeds = MutableStateFlow>(emptyList()) + + override val feeds: StateFlow> = _feeds + } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f538c5e..f47c34b9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -125,6 +125,10 @@ texthip2025@gmail.com 이메일로 닉네임과 문의사항을 보내주시면\n빠른 시일 내로 해결해 드릴게요! + 아직 저장한 책이 없어요 + 아직 저장한 피드가 없어요 + 마음에 드는 책을 THIP 해보세요! + 마음에 드는 피드를 THIP 해보세요! 진행중 From 66dc72e5e1051c262395897d80c8d768e960db80 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 01:34:31 +0900 Subject: [PATCH 07/21] =?UTF-8?q?[ui]:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80-=EC=B1=85=ED=94=BC=EB=93=9C->=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/mypage/component/BookContent.kt | 70 +++++++++++++++++++ .../ui/mypage/component/MypageSaveBook.kt | 28 -------- .../thip/ui/mypage/screen/MypageSaveScreen.kt | 43 ++++++++++-- .../ui/mypage/viewmodel/SavedBookViewModel.kt | 29 ++++++-- 4 files changed, 131 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/mypage/component/BookContent.kt delete mode 100644 app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveBook.kt diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/component/BookContent.kt b/app/src/main/java/com/texthip/thip/ui/mypage/component/BookContent.kt new file mode 100644 index 00000000..51bcda64 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/mypage/component/BookContent.kt @@ -0,0 +1,70 @@ +package com.texthip.thip.ui.mypage.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.texthip.thip.R +import com.texthip.thip.ui.common.cards.CardBookList +import com.texthip.thip.ui.mypage.mock.BookItem +import com.texthip.thip.ui.mypage.mock.FeedItem +import com.texthip.thip.ui.mypage.viewmodel.SavedBookViewModel +import com.texthip.thip.ui.mypage.viewmodel.SavedFeedViewModel +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun BookContent( + bookList: List, viewModel: SavedBookViewModel +) { + //val books by viewModel.bookList.collectAsState() + + if (bookList.isEmpty()) { + EmptyBookContent() + } else { + LazyColumn { + items(bookList, key = { it.id }) { book -> + CardBookList( + title = book.title, + author = book.author, + imageRes = null, + publisher = book.publisher, + isBookmarked = book.isSaved, + onBookmarkClick = { viewModel.toggleBookmark(book.id) } + ) + } + } + } +} + +@Composable +fun EmptyBookContent() { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(R.string.no_saved_book), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Text( + text = stringResource(R.string.do_thip_book), + style = typography.feedcopy_r400_s14_h20, + color = colors.Grey, + modifier = Modifier.padding(top = 8.dp) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveBook.kt b/app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveBook.kt deleted file mode 100644 index bafb3dbf..00000000 --- a/app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveBook.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.texthip.thip.ui.mypage.component - -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.lifecycle.viewmodel.compose.viewModel -import com.texthip.thip.ui.common.cards.CardBookList -import com.texthip.thip.ui.mypage.viewmodel.SavedBookViewModel - -@Composable -fun BookContent(viewModel: SavedBookViewModel = viewModel()) { - val books by viewModel.bookList.collectAsState() - - LazyColumn { - items(items = books, key = { it.id }) { book -> - CardBookList( - title = book.title, - author = book.author, - imageRes = null, - publisher = book.publisher, - isBookmarked = book.isSaved, - onBookmarkClick = { viewModel.toggleBookmark(book.id) } - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt b/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt index e57cc60c..a2332524 100644 --- a/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt @@ -1,5 +1,6 @@ package com.texthip.thip.ui.mypage.screen +import android.annotation.SuppressLint import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -14,6 +15,7 @@ import androidx.compose.material3.TabRow import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable @@ -26,18 +28,31 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel import com.texthip.thip.R import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.mypage.component.BookContent +import com.texthip.thip.ui.mypage.component.EmptyBookContent import com.texthip.thip.ui.mypage.component.FeedContent +import com.texthip.thip.ui.mypage.viewmodel.EmptySavedBookViewModel +import com.texthip.thip.ui.mypage.viewmodel.EmptySavedFeedViewModel +import com.texthip.thip.ui.mypage.viewmodel.SavedBookViewModel +import com.texthip.thip.ui.mypage.viewmodel.SavedFeedViewModel +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.ui.theme.White @Composable -fun SavedScreen() { +fun SavedScreen( + feedViewModel: SavedFeedViewModel = viewModel(), + bookViewModel: SavedBookViewModel = viewModel() + +) { val tabs = listOf(stringResource(R.string.feed), stringResource(R.string.book)) var selectedTabIndex by rememberSaveable { mutableStateOf(0) } + val feedList by feedViewModel.feeds.collectAsState() + val bookList by bookViewModel.bookList.collectAsState() Column( Modifier @@ -52,7 +67,9 @@ fun SavedScreen() { modifier = Modifier .fillMaxSize() ) { - Box(modifier = Modifier.width(160.dp).padding(start = 20.dp)) { + Box(modifier = Modifier + .width(160.dp) + .padding(start = 20.dp)) { TabRow( selectedTabIndex = selectedTabIndex, containerColor = Color.Transparent, @@ -93,8 +110,8 @@ fun SavedScreen() { } Box(modifier = Modifier.fillMaxWidth()) { when (selectedTabIndex) { - 0 -> FeedContent() - 1 -> BookContent() + 0 -> FeedContent(feedList = feedList, viewModel = feedViewModel) + 1 -> BookContent(bookList = bookList, viewModel = bookViewModel) } } } @@ -102,8 +119,24 @@ fun SavedScreen() { } +@SuppressLint("ViewModelConstructorInComposable") @Preview @Composable private fun SavedScreenPrev() { - SavedScreen() + SavedScreen( + feedViewModel = SavedFeedViewModel(), + bookViewModel = SavedBookViewModel() + ) +} + +@SuppressLint("ViewModelConstructorInComposable") +@Preview +@Composable +private fun SavedScreenWithoutFeedPrev() { + ThipTheme { + SavedScreen( + feedViewModel = EmptySavedFeedViewModel(), + bookViewModel = EmptySavedBookViewModel() + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt b/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt index a0ff0759..1d1ad339 100644 --- a/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt @@ -2,20 +2,21 @@ package com.texthip.thip.ui.mypage.viewmodel import androidx.lifecycle.ViewModel import com.texthip.thip.ui.mypage.mock.BookItem +import com.texthip.thip.ui.mypage.mock.FeedItem import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -class SavedBookViewModel : ViewModel() { +open class SavedBookViewModel : ViewModel() { - private val _bookList = MutableStateFlow>(emptyList()) - val bookList: StateFlow> = _bookList + private val _books = MutableStateFlow>(emptyList()) + open val bookList: StateFlow> = _books init { loadMockBooks() } - private fun loadMockBooks() { - _bookList.value = listOf( + open fun loadMockBooks() { + _books.value = listOf( BookItem( id = 1, title = "이기적 유전자", @@ -83,9 +84,25 @@ class SavedBookViewModel : ViewModel() { ) } + open val books: StateFlow> = _books + fun toggleBookmark(id: Int) { - _bookList.value = _bookList.value.map { + _books.value = _books.value.map { if (it.id == id) it.copy(isSaved = !it.isSaved) else it } } +} + +class EmptySavedBookViewModel : SavedBookViewModel() { + init { + // + } + + override fun loadMockBooks() { + } + + private val _books = MutableStateFlow>(emptyList()) + + override val books: StateFlow> = _books + } \ No newline at end of file From f1d9636daecbaf5286e2a6b7cd70ed19386eb60a Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 02:17:49 +0900 Subject: [PATCH 08/21] =?UTF-8?q?[ui]:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20?= =?UTF-8?q?=EC=93=B0=EC=9D=B4=EB=8A=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/header/AuthorHeader.kt | 60 +++++++------ .../feed/component/LiveSearchPeopleResult.kt | 87 +++++++++++++++++++ 2 files changed, 122 insertions(+), 25 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt b/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt index f8731155..66bd4579 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt @@ -1,6 +1,7 @@ package com.texthip.thip.ui.common.header import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -41,7 +42,8 @@ fun AuthorHeader( showThipNum: Boolean = false, thipNum: Int? = null, profileImageSize: Dp = 54.dp, - onButtonClick: () -> Unit = {} + onButtonClick: () -> Unit = {}, + onThipNumClick: () -> Unit = {} ) { Row( modifier = modifier @@ -84,31 +86,36 @@ fun AuthorHeader( } if (showButton) { OutlinedButton( - modifier = Modifier - .then( - if (buttonWidth != null) - Modifier - .width(buttonWidth) - .height(33.dp) - else Modifier - ), - text = buttonText, - textStyle = typography.view_m500_s14, - onClick = onButtonClick + modifier = Modifier + .then( + if (buttonWidth != null) + Modifier + .width(buttonWidth) + .height(33.dp) + else Modifier + ), + text = buttonText, + textStyle = typography.view_m500_s14, + 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, - ) + if (showThipNum && thipNum != null) { + Row( + modifier = Modifier.clickable(onClick = onThipNumClick), + verticalAlignment = Alignment.CenterVertically + ) { + 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, + ) + } } } } @@ -131,7 +138,10 @@ fun PreviewAuthorHeader() { badgeText = "칭호칭호칭호", showButton = false, showThipNum = true, - thipNum = 10 + thipNum = 10, + onThipNumClick = { + + } ) } } diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt new file mode 100644 index 00000000..a9de11a5 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt @@ -0,0 +1,87 @@ +package com.texthip.thip.ui.feed.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.common.header.AuthorHeader +import com.texthip.thip.ui.feed.mock.MySubscriptionData +import com.texthip.thip.ui.theme.ThipTheme +import com.texthip.thip.ui.theme.ThipTheme.colors + +@Composable +fun SearchPeopleResult( + peopleList: List +) { + LazyColumn { + itemsIndexed(peopleList) { index, user -> + AuthorHeader( + profileImage = user.profileImageUrl, + nickname = user.nickname, + badgeText = user.role, + profileImageSize = 36.dp, + showButton = false, + showThipNum = true, + thipNum = user.subscriberCount, + ) + if (index < peopleList.size - 1) { + Spacer( + modifier = Modifier + .padding(vertical = 12.dp) + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun SearchPeopleResultPreview() { + ThipTheme { + Box( + modifier = Modifier + .fillMaxSize() + ) { + SearchPeopleResult( + peopleList = listOf( + MySubscriptionData( + profileImageUrl = null, + nickname = "Thiper_Official", + role = "공식 인플루언서", + roleColor = colors.NeonGreen, + subscriberCount = 50, + isSubscribed = false + ), + MySubscriptionData( + profileImageUrl = null, + nickname = "Thiper_Writer", + role = "작가", + roleColor = colors.Yellow, + subscriberCount = 120, + isSubscribed = true + ), + MySubscriptionData( + profileImageUrl = null, + nickname = "Thiper_Newbie", + role = "칭호칭호", + roleColor = colors.White, + subscriberCount = 0, + isSubscribed = false + ) + ) + ) + } + } +} From e29424817bf14304009dff6b846a5692997922ae Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 04:49:26 +0900 Subject: [PATCH 09/21] =?UTF-8?q?[ui]:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/component/LiveSearchPeopleResult.kt | 4 +- .../ui/feed/component/PeopleRecentSearch.kt | 105 ++++++++++ .../feed/component/SearchPeopleEmptyResult.kt | 46 ++++ .../thip/ui/feed/screen/SearchPeopleScreen.kt | 196 ++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/feed/component/PeopleRecentSearch.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/feed/component/SearchPeopleEmptyResult.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt index a9de11a5..7e775bd4 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt @@ -20,7 +20,8 @@ import com.texthip.thip.ui.theme.ThipTheme.colors @Composable fun SearchPeopleResult( - peopleList: List + peopleList: List, + onThipNumClick: (MySubscriptionData) -> Unit = {} ) { LazyColumn { itemsIndexed(peopleList) { index, user -> @@ -32,6 +33,7 @@ fun SearchPeopleResult( showButton = false, showThipNum = true, thipNum = user.subscriberCount, + onThipNumClick = { onThipNumClick(user) } ) if (index < peopleList.size - 1) { Spacer( diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/PeopleRecentSearch.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/PeopleRecentSearch.kt new file mode 100644 index 00000000..6d925f30 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/PeopleRecentSearch.kt @@ -0,0 +1,105 @@ +package com.texthip.thip.ui.feed.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.GenreChipButton +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 PeopleRecentSearch( + modifier: Modifier = Modifier, + recentSearches: List, + onSearchClick: (String) -> Unit, + onRemove: (String) -> Unit +) { + Column { + Text( + text = stringResource(R.string.group_recent_search), + color = colors.White, + style = typography.smalltitle_sb600_s18_h24 + ) + Spacer(modifier = Modifier.height(16.dp)) + if (recentSearches.isEmpty()) { + Text( + text = stringResource(R.string.group_no_recent_search), + color = colors.Grey01, + style = typography.menu_r400_s14_h24 + ) + } else { + FlowRow( + verticalArrangement = Arrangement.spacedBy(12.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + maxLines = 2, + ) { + recentSearches.take(9).forEach { keyword -> + GenreChipButton( + text = keyword, + onClick = { onSearchClick(keyword) }, + onCloseClick = { onRemove(keyword) } + ) + } + } + } + } +} + +@Preview +@Composable +fun PeopleRecentSearchPrev() { + ThipTheme { + Box( + modifier = Modifier + .padding(16.dp) + ) { + var searches by remember { + mutableStateOf(listOf("thip", "걔누구더라", "으아아아", "ㅇㅇ", "user.02")) + } + + PeopleRecentSearch( + recentSearches = searches, + onSearchClick = { keyword -> + }, + onRemove = { keyword -> + searches = searches.filter { it != keyword } + } + ) + } + } +} + +@Preview +@Composable +fun PeopleRecentSearchEmptyPrev() { + ThipTheme { + Box( + modifier = Modifier + .background(colors.Black) + .padding(16.dp) + ) { + PeopleRecentSearch( + recentSearches = emptyList(), + onSearchClick = { }, + onRemove = { } + ) + } + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/SearchPeopleEmptyResult.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/SearchPeopleEmptyResult.kt new file mode 100644 index 00000000..9e81505e --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/SearchPeopleEmptyResult.kt @@ -0,0 +1,46 @@ +package com.texthip.thip.ui.feed.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +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 SearchPeopleEmptyResult( + mainText: String +) { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = mainText, + color = colors.White, + style = typography.smalltitle_sb600_s18_h24 + ) + } +} + +@Preview(showBackground = true) +@Composable +fun SearchPeopleEmptyResultPrev() { + ThipTheme { + Box( + modifier = Modifier + .fillMaxSize() + ) { + SearchPeopleEmptyResult( + mainText = "검색 결과가 없습니다" + ) + } + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt new file mode 100644 index 00000000..40c39779 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt @@ -0,0 +1,196 @@ +package com.texthip.thip.ui.feed.screen + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.FilterButton +import com.texthip.thip.ui.common.forms.SearchBookTextField +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.feed.component.PeopleRecentSearch +import com.texthip.thip.ui.feed.component.SearchPeopleEmptyResult +import com.texthip.thip.ui.feed.component.SearchPeopleResult +import com.texthip.thip.ui.feed.mock.MySubscriptionData +import com.texthip.thip.ui.group.myroom.component.GroupRecentSearch +import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData +import com.texthip.thip.ui.group.search.component.GroupEmptyResult +import com.texthip.thip.ui.group.search.component.GroupFilteredSearchResult +import com.texthip.thip.ui.group.search.component.GroupLiveSearchResult +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 SearchPeopleScreen( + modifier: Modifier = Modifier, + allPeople: List +) { + var recentSearches by rememberSaveable { + mutableStateOf(listOf("메롱", "메메롱", "메메메롱", "메메메","메메루메루메루")) + } + var searchText by rememberSaveable { mutableStateOf("") } + var isSearched by rememberSaveable { mutableStateOf(false) } + val focusRequester = remember { FocusRequester() } + val focusManager = LocalFocusManager.current + + val liveSearchResults by remember(searchText, allPeople) { + derivedStateOf { + if (searchText.isBlank()) emptyList() + else allPeople.filter { person -> + person.nickname.contains(searchText, ignoreCase = true) + } + } + } + + val finalSearchResults by remember(searchText, isSearched, allPeople) { + derivedStateOf { + if (isSearched) { + if (searchText.isNotBlank()) { + allPeople.filter { person -> + person.nickname.contains(searchText, ignoreCase = true) + } + } else { + emptyList() + } + } else { + emptyList() + } + } + } + + LaunchedEffect(isSearched) { + if (isSearched) { + focusManager.clearFocus() + } + } + + Box( + modifier = modifier.fillMaxSize() + ) { + Column( + modifier = Modifier.fillMaxSize() + ) { + DefaultTopAppBar( + title = stringResource(R.string.group_room_search_topappbar), + onLeftClick = {}, + ) + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 20.dp) + ) { + Spacer(modifier = Modifier.height(16.dp)) + + SearchBookTextField( + modifier = Modifier + .fillMaxWidth() + .focusRequester(focusRequester), + hint = stringResource(R.string.group_room_search_hint), + text = searchText, + onValueChange = { + searchText = it + isSearched = false + }, + onSearch = { query -> + if (query.isNotBlank() && !recentSearches.contains(query)) { + recentSearches = listOf(query) + recentSearches + } + isSearched = true + } + ) + Spacer(modifier = Modifier.height(16.dp)) + + when { + isSearched && finalSearchResults.isNotEmpty() -> { //검색했는데 결과 있음 + Row( + modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource(R.string.group_searched_room_size, finalSearchResults.size), + color = colors.Grey, + style = typography.menu_m500_s14_h24 + ) + } + Spacer( + modifier = Modifier + .padding(top = 4.dp, bottom = 16.dp) + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + SearchPeopleResult( + peopleList = finalSearchResults, + onThipNumClick = { person -> /*프로필로 이동*/ } + ) + } + isSearched && finalSearchResults.isEmpty() -> { //검색했는데 결과 없음 + SearchPeopleEmptyResult( + mainText = stringResource(R.string.no_user_you_look_for) + ) + } + searchText.isNotBlank() && !isSearched -> { //검색중 + SearchPeopleResult( + peopleList = liveSearchResults, + onThipNumClick = { person -> /* 프로필 화면으로 이동 */ } + ) + } + + searchText.isBlank() && !isSearched -> { //최근검색어 보여주기 + PeopleRecentSearch( + recentSearches = recentSearches, + onSearchClick = { keyword -> + searchText = keyword + isSearched = true + }, + onRemove = { keyword -> + recentSearches = recentSearches.filterNot { it == keyword } + } + ) + } + } + } + } + } +} + + +@Preview +@Composable +fun PreviewGroupSearchScreen() { + ThipTheme { + SearchPeopleScreen( + allPeople = listOf( + MySubscriptionData(null, "메롱이", "인플루언서", colors.NeonGreen, 12, false), + MySubscriptionData(null, "메메롱이", "칭호", colors.NeonGreen, 1, false), + MySubscriptionData(null, "thip", "칭호칭호", colors.NeonGreen, 11, false), + MySubscriptionData(null, "Thip", "인플루언서", colors.NeonGreen, 111, false), + MySubscriptionData(null, "thip01", "작가", colors.NeonGreen, 0, false) + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f47c34b9..80e9f409 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -327,6 +327,7 @@ 삭제하기 이 피드를 삭제하시겠어요? 삭제 후에는 되돌릴 수 없어요. + 찾는 사용자가 없어요 가장 많이 검색된 책 From aa32dec5195cc0f13c51dc93a57b8e320f91b71e Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 04:52:27 +0900 Subject: [PATCH 10/21] =?UTF-8?q?[ui]:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt | 4 ++-- app/src/main/res/values/strings.xml | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt index 40c39779..97df1888 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt @@ -96,7 +96,7 @@ fun SearchPeopleScreen( modifier = Modifier.fillMaxSize() ) { DefaultTopAppBar( - title = stringResource(R.string.group_room_search_topappbar), + title = stringResource(R.string.search_user), onLeftClick = {}, ) Column( @@ -110,7 +110,7 @@ fun SearchPeopleScreen( modifier = Modifier .fillMaxWidth() .focusRequester(focusRequester), - hint = stringResource(R.string.group_room_search_hint), + hint = stringResource(R.string.search_user_you_look_for), text = searchText, onValueChange = { searchText = it diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 80e9f409..a7bcfb53 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -328,6 +328,9 @@ 이 피드를 삭제하시겠어요? 삭제 후에는 되돌릴 수 없어요. 찾는 사용자가 없어요 + 사용자 찾기 + 내가 찾는 사용자를 검색해보세요. + 가장 많이 검색된 책 From a53c0bb86f1ac10cd1777a447ed84e6c723bf5e8 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 13:57:19 +0900 Subject: [PATCH 11/21] =?UTF-8?q?[ui]:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=ED=8C=A8=EB=94=A9=EA=B0=92=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=93=B1=20=EC=9E=90=EC=9E=98=ED=95=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/component/LiveSearchPeopleResult.kt | 5 +-- .../ui/feed/component/PeopleRecentSearch.kt | 2 +- .../feed/component/SearchPeopleEmptyResult.kt | 1 + .../thip/ui/feed/screen/SearchPeopleScreen.kt | 33 +++++++++---------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt index 7e775bd4..438aeb9c 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/LiveSearchPeopleResult.kt @@ -20,10 +20,11 @@ import com.texthip.thip.ui.theme.ThipTheme.colors @Composable fun SearchPeopleResult( + modifier: Modifier = Modifier, peopleList: List, onThipNumClick: (MySubscriptionData) -> Unit = {} ) { - LazyColumn { + LazyColumn (modifier = modifier){ itemsIndexed(peopleList) { index, user -> AuthorHeader( profileImage = user.profileImageUrl, @@ -38,7 +39,7 @@ fun SearchPeopleResult( if (index < peopleList.size - 1) { Spacer( modifier = Modifier - .padding(vertical = 12.dp) + .padding(vertical = 12.dp, horizontal = 20.dp) .fillMaxWidth() .height(1.dp) .background(colors.DarkGrey02) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/PeopleRecentSearch.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/PeopleRecentSearch.kt index 6d925f30..51f54663 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/PeopleRecentSearch.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/PeopleRecentSearch.kt @@ -31,7 +31,7 @@ fun PeopleRecentSearch( onSearchClick: (String) -> Unit, onRemove: (String) -> Unit ) { - Column { + Column (modifier = modifier){ Text( text = stringResource(R.string.group_recent_search), color = colors.White, diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/SearchPeopleEmptyResult.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/SearchPeopleEmptyResult.kt index 9e81505e..611f946f 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/SearchPeopleEmptyResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/SearchPeopleEmptyResult.kt @@ -15,6 +15,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun SearchPeopleEmptyResult( + modifier: Modifier= Modifier, mainText: String ) { Column( diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt index 97df1888..31719c79 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt @@ -9,13 +9,11 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable @@ -29,18 +27,12 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R -import com.texthip.thip.ui.common.buttons.FilterButton import com.texthip.thip.ui.common.forms.SearchBookTextField import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.feed.component.PeopleRecentSearch import com.texthip.thip.ui.feed.component.SearchPeopleEmptyResult import com.texthip.thip.ui.feed.component.SearchPeopleResult import com.texthip.thip.ui.feed.mock.MySubscriptionData -import com.texthip.thip.ui.group.myroom.component.GroupRecentSearch -import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData -import com.texthip.thip.ui.group.search.component.GroupEmptyResult -import com.texthip.thip.ui.group.search.component.GroupFilteredSearchResult -import com.texthip.thip.ui.group.search.component.GroupLiveSearchResult import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -51,7 +43,7 @@ fun SearchPeopleScreen( allPeople: List ) { var recentSearches by rememberSaveable { - mutableStateOf(listOf("메롱", "메메롱", "메메메롱", "메메메","메메루메루메루")) + mutableStateOf(listOf("메롱", "메메롱", "메메메롱", "메메메", "메메루메루메루")) } var searchText by rememberSaveable { mutableStateOf("") } var isSearched by rememberSaveable { mutableStateOf(false) } @@ -102,14 +94,14 @@ fun SearchPeopleScreen( Column( modifier = Modifier .fillMaxSize() - .padding(horizontal = 20.dp) ) { Spacer(modifier = Modifier.height(16.dp)) SearchBookTextField( modifier = Modifier .fillMaxWidth() - .focusRequester(focusRequester), + .focusRequester(focusRequester) + .padding(horizontal = 20.dp), hint = stringResource(R.string.search_user_you_look_for), text = searchText, onValueChange = { @@ -118,7 +110,7 @@ fun SearchPeopleScreen( }, onSearch = { query -> if (query.isNotBlank() && !recentSearches.contains(query)) { - recentSearches = listOf(query) + recentSearches + recentSearches = (listOf(query) + recentSearches).take(10) } isSearched = true } @@ -128,7 +120,10 @@ fun SearchPeopleScreen( when { isSearched && finalSearchResults.isNotEmpty() -> { //검색했는데 결과 있음 Row( - modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + verticalAlignment = Alignment.CenterVertically ) { Text( text = stringResource(R.string.group_searched_room_size, finalSearchResults.size), @@ -142,26 +137,30 @@ fun SearchPeopleScreen( .fillMaxWidth() .height(1.dp) .background(colors.DarkGrey02) + .padding(horizontal = 20.dp) ) SearchPeopleResult( + modifier = Modifier.weight(1f), peopleList = finalSearchResults, - onThipNumClick = { person -> /*프로필로 이동*/ } + onThipNumClick = { person -> /*프로필로 이동*/ } ) } isSearched && finalSearchResults.isEmpty() -> { //검색했는데 결과 없음 SearchPeopleEmptyResult( + modifier = Modifier.padding(horizontal = 20.dp), mainText = stringResource(R.string.no_user_you_look_for) ) } searchText.isNotBlank() && !isSearched -> { //검색중 SearchPeopleResult( + modifier = Modifier.weight(1f), peopleList = liveSearchResults, onThipNumClick = { person -> /* 프로필 화면으로 이동 */ } ) } - searchText.isBlank() && !isSearched -> { //최근검색어 보여주기 PeopleRecentSearch( + modifier = Modifier.padding(horizontal = 20.dp), recentSearches = recentSearches, onSearchClick = { keyword -> searchText = keyword @@ -184,13 +183,13 @@ fun SearchPeopleScreen( fun PreviewGroupSearchScreen() { ThipTheme { SearchPeopleScreen( - allPeople = listOf( + allPeople = listOf( MySubscriptionData(null, "메롱이", "인플루언서", colors.NeonGreen, 12, false), MySubscriptionData(null, "메메롱이", "칭호", colors.NeonGreen, 1, false), MySubscriptionData(null, "thip", "칭호칭호", colors.NeonGreen, 11, false), MySubscriptionData(null, "Thip", "인플루언서", colors.NeonGreen, 111, false), MySubscriptionData(null, "thip01", "작가", colors.NeonGreen, 0, false) - ) + ) ) } } \ No newline at end of file From 360a4e28c3dcb65afbdfc95cd197d76d92bea4cd Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 16:08:02 +0900 Subject: [PATCH 12/21] =?UTF-8?q?[ui]:=20=EB=8B=A4=EB=A5=B8=20=EC=82=AC?= =?UTF-8?q?=EB=9E=8C=20=ED=94=BC=EB=93=9C=20=EC=A1=B0=ED=9A=8C=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/feed/screen/FeedOthersScreen.kt | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt new file mode 100644 index 00000000..accf9c62 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt @@ -0,0 +1,193 @@ +package com.texthip.thip.ui.feed.screen + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.header.AuthorHeader +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.feed.component.FeedSubscribeBarlist +import com.texthip.thip.ui.feed.component.MyFeedCard +import com.texthip.thip.ui.mypage.mock.FeedItem +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 FeedOthersScreen( + nickname: String, + userRole: String, + feeds: List = emptyList(), + totalFeedCount: Int = 0, + followerProfileImageUrls: List = emptyList() +) { + val feedStateList = remember { + mutableStateListOf().apply { + addAll(feeds) + } + } + Box(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier.fillMaxSize() + ) { + DefaultTopAppBar( + isRightIconVisible = false, + isTitleVisible = false, + onLeftClick = {}, + ) + // 스크롤 영역 + LazyColumn( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + item { + Spacer(modifier = Modifier.height(32.dp)) + AuthorHeader( + profileImage = null, + nickname = nickname, + badgeText = userRole, + buttonText = stringResource(R.string.thip), + onButtonClick = {}, + modifier = Modifier.padding(bottom = 20.dp) + ) + Spacer(modifier = Modifier.height(16.dp)) + FeedSubscribeBarlist( + modifier = Modifier.padding(horizontal = 20.dp), + followerProfileImageUrls = followerProfileImageUrls, + onClick = { + } + ) + Spacer(modifier = Modifier.height(40.dp)) + Text( + text = stringResource(R.string.whole_num, totalFeedCount), + style = typography.menu_m500_s14_h24, + color = colors.Grey, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp, start = 20.dp) + ) + HorizontalDivider( + color = colors.DarkGrey02, + thickness = 1.dp, + modifier = Modifier.padding(horizontal = 20.dp) + ) + } + if (totalFeedCount == 0) { + item { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(top = 244.dp), + contentAlignment = Alignment.TopCenter + ) { + Text( + text = stringResource(R.string.empty_feed), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + } + } + } else { + itemsIndexed(feedStateList, key = { _, item -> item.id }) { index, feed -> + Spacer(modifier = Modifier.height(if (index == 0) 20.dp else 40.dp)) + MyFeedCard( + feedItem = feed, + onLikeClick = { + val updated = feed.copy( + isLiked = !feed.isLiked, + likeCount = if (feed.isLiked) feed.likeCount - 1 else feed.likeCount + 1 + ) + feedStateList[index] = updated + }, + onContentClick = {} //TODO FeedCommentScreen으로 + ) + Spacer(modifier = Modifier.height(40.dp)) + if (index != feeds.lastIndex) { + HorizontalDivider( + color = colors.DarkGrey02, + thickness = 10.dp + ) + } + } + } + } + } + } +} + +@Preview +@Composable +private fun FeedOthersScreenPrev() { + ThipTheme { + val mockFeeds = List(5) { + FeedItem( + id = it + 1, + userProfileImage = R.drawable.character_literature, + userName = "user.$it", + userRole = "문학 칭호", + bookTitle = "책 제목 ", + authName = "한강", + timeAgo = "1시간 전", + content = "내용내용내용 입니다. 내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.내용내용내용 입니다.", + likeCount = it, + commentCount = it, + isLiked = false, + isSaved = false, + isLocked = it % 2 == 0, + imageUrls = listOf(R.drawable.bookcover_sample) + ) + } + val mockFollowerImages = listOf( + "https://example.com/image1.jpg", + "https://example.com/image2.jpg", + "https://example.com/image3.jpg", + "https://example.com/image4.jpg", + "https://example.com/image5.jpg" + ) + ThipTheme { + FeedOthersScreen( + nickname = "ThipUser01", + userRole = "문학 칭호", + feeds = mockFeeds, + totalFeedCount = mockFeeds.size, + followerProfileImageUrls = mockFollowerImages + ) + } + } +} + +@Preview +@Composable +private fun FeedOthersScreenWithoutFeedPrev() { + ThipTheme { + val mockFeeds: List = emptyList() + val mockFollowerImages = emptyList() + + ThipTheme { + FeedOthersScreen( + nickname = "ThipUser01", + userRole = "문학 칭호", + feeds = mockFeeds, + totalFeedCount = mockFeeds.size, + followerProfileImageUrls = mockFollowerImages + ) + } + } +} From 5d0cdb6f85383d68548cdcedc7c81e295d263f3f Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 16:08:20 +0900 Subject: [PATCH 13/21] =?UTF-8?q?[ui]:=20=EB=B0=98=EC=9D=91=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20-=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/mypage/screen/MypageReactionScreen.kt | 124 +++++++++++++++++- app/src/main/res/values/strings.xml | 3 + 2 files changed, 124 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt b/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt index 70c2324b..ad0ecae1 100644 --- a/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt @@ -11,11 +11,13 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -25,9 +27,11 @@ import com.texthip.thip.ui.common.buttons.OptionChipButton import com.texthip.thip.ui.common.cards.CardAlarm import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.mypage.mock.ReactionItem +import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography -@Composable +/*@Composable fun ReactionsScreen() { //추후 뷰모델로 수정 예정 val reactions = listOf( @@ -107,10 +111,124 @@ fun ReactionsScreen() { } } } +}*/ +@Composable +fun ReactionsScreen( + reactions : List +) { + var isLikesSelected by remember { mutableStateOf(false) } + var isCommentsSelected by remember { mutableStateOf(false) } + + val filteredReactions = remember(isLikesSelected, isCommentsSelected, reactions) { + val showAll = (isLikesSelected && isCommentsSelected) || (!isLikesSelected && !isCommentsSelected) + if (showAll) { + reactions + } else { + reactions.filter { item -> + if (isLikesSelected) item.type == "좋아요" else item.type == "댓글" + } + } + } + + Column( + Modifier + .background(colors.Black) + .fillMaxSize() + ) { + DefaultTopAppBar( + title = stringResource(R.string.reactions), + onLeftClick = {}, + ) + Column( + modifier = Modifier + .fillMaxSize() + ) { + Row(modifier = Modifier.padding(start = 20.dp, top = 20.dp, bottom = 20.dp)) { + OptionChipButton( + text = stringResource(R.string.likes), + isFilled = true, + onClick = { isLikesSelected = !isLikesSelected } + ) + Spacer(modifier = Modifier.width(12.dp)) + OptionChipButton( + text = stringResource(R.string.comments), + isFilled = true, + onClick = { isCommentsSelected = !isCommentsSelected } + ) + } + if (filteredReactions.isEmpty()) { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(R.string.no_saved_reation), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Text( + text = stringResource(R.string.save_first_reaction), + style = typography.feedcopy_r400_s14_h20, + color = colors.Grey, + modifier = Modifier.padding(top = 8.dp) + ) + } + } else { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 20.dp), + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + itemsIndexed (filteredReactions) { index, item -> + val isLastItem = index == filteredReactions.lastIndex + CardAlarm( + title = item.title, + message = item.message, + timeAgo = item.timeAgo, + isRead = true, + badgeText = item.type, + onClick = {}, + modifier = if (isLastItem) { + Modifier.padding(bottom = 20.dp) + } else { + Modifier + } + ) + } + } + } + } + } } @Preview @Composable private fun ReactionsScreenPrev() { - ReactionsScreen() -} \ No newline at end of file + val mockReactions = listOf( + ReactionItem("@user 1님의 피드 글","어쩌구 저쩌구 콘텐츠 내용입니다.","좋아요", "2"), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.","댓글","7"), + ReactionItem("@user 3님의 기록", "어쩌구 저쩌구 콘텐츠 내용입니다.","댓글", "17"), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "좋아요", "25"), + ReactionItem("@user 1님의 피드 글","어쩌구 저쩌구 콘텐츠 내용입니다.","좋아요", "2"), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.","댓글","7"), + ReactionItem("@user 3님의 기록", "어쩌구 저쩌구 콘텐츠 내용입니다.","댓글", "17"), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "좋아요", "25"), + ReactionItem("@user 1님의 피드 글","어쩌구 저쩌구 콘텐츠 내용입니다.","좋아요", "2"), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.","댓글","7"), + ReactionItem("@user 3님의 기록", "어쩌구 저쩌구 콘텐츠 내용입니다.","댓글", "17"), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "좋아요", "25") + ) + ThipTheme { + ReactionsScreen(reactions = mockReactions) + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000) +@Composable +private fun ReactionsScreenEmptyPrev() { + ThipTheme { + ReactionsScreen(reactions = emptyList()) + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a7bcfb53..2acc2063 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,6 +130,9 @@ 마음에 드는 책을 THIP 해보세요! 마음에 드는 피드를 THIP 해보세요! + 아직 저장한 반응이 없어요 + 첫 번째 반응을 저장해 보세요! + 진행중 모집중 From c30f3d3bdb2419f71c516f5a1ccc685dc95be816 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 17:03:56 +0900 Subject: [PATCH 14/21] =?UTF-8?q?[refactor]:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=B6=84=EA=B8=B0=20=EC=A0=9C=EA=B1=B0(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/common/header/AuthorHeader.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt b/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt index 66bd4579..3ed1b5e5 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt @@ -87,13 +87,8 @@ fun AuthorHeader( if (showButton) { OutlinedButton( modifier = Modifier - .then( - if (buttonWidth != null) - Modifier .width(buttonWidth) - .height(33.dp) - else Modifier - ), + .height(33.dp), text = buttonText, textStyle = typography.view_m500_s14, onClick = onButtonClick From 3d18451ec6ccfdbbc4ac1b3cd85f23708a37074c Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 17:04:37 +0900 Subject: [PATCH 15/21] =?UTF-8?q?[refactor]:=20=ED=95=98=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=94=A9=20=EC=A0=9C=EA=B1=B0,=20take(5)=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=9E=AC=EC=82=AC=EC=9A=A9(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/feed/component/FeedSubscribelistBar.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt index 132f59ba..ebed653d 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt @@ -19,6 +19,7 @@ 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.res.stringResource import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight @@ -57,14 +58,13 @@ fun FeedSubscribeBarlist( color = colors.White ) ) { - append("${followerProfileImageUrls.size}명") - } + append(stringResource(R.string.thip_num, followerProfileImageUrls.size)) } withStyle( style = SpanStyle( color = colors.Grey ) ) { - append("이 띱 하는중") + append(stringResource(R.string.thip_ing)) } }, style = typography.info_r400_s12, @@ -75,7 +75,8 @@ fun FeedSubscribeBarlist( verticalAlignment = Alignment.CenterVertically ) { if (followerProfileImageUrls.isNotEmpty()) { - followerProfileImageUrls.take(5).reversed().forEachIndexed { index, imageUrl -> + val previewList = followerProfileImageUrls.take(5) + previewList.reversed().forEachIndexed { index, imageUrl -> AsyncImage( model = imageUrl, contentDescription = null, @@ -85,7 +86,7 @@ fun FeedSubscribeBarlist( .background(Color.LightGray) ) - val isLast = index == followerProfileImageUrls.take(5).lastIndex + val isLast = index == previewList.lastIndex Spacer(modifier = Modifier.width(if (isLast) 15.dp else 4.dp)) } From d2e07f2b35365122b3ff904eba86a18e4fc72255 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 17:04:42 +0900 Subject: [PATCH 16/21] =?UTF-8?q?[refactor]:=20=ED=95=98=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=94=A9=20=EC=A0=9C=EA=B1=B0,=20take(5)=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=9E=AC=EC=82=AC=EC=9A=A9(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2acc2063..125bf2af 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -299,7 +299,8 @@ %1$s 님을 띱 취소했어요 띱 하기 띱 취소 - %d명이 띱 하는 중 + %1$d명 + 이 띱 하는 중 피드에 글을 작성해보세요 피드에 작성된 글이 없어요 관심있는 독서메이트를 찾아보세요! From 4670a92d8a613d500321a4466bfa6b994c9d6996 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 22:25:54 +0900 Subject: [PATCH 17/21] =?UTF-8?q?[refactor]:=20=EC=98=A4=ED=83=80=EC=88=98?= =?UTF-8?q?=EC=A0=95(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt | 2 +- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt b/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt index ad0ecae1..d4b33d78 100644 --- a/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt @@ -163,7 +163,7 @@ fun ReactionsScreen( verticalArrangement = Arrangement.Center ) { Text( - text = stringResource(R.string.no_saved_reation), + text = stringResource(R.string.no_saved_reaction), style = typography.smalltitle_sb600_s18_h24, color = colors.White ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 125bf2af..fbe71b26 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,7 +130,7 @@ 마음에 드는 책을 THIP 해보세요! 마음에 드는 피드를 THIP 해보세요! - 아직 저장한 반응이 없어요 + 아직 저장한 반응이 없어요 첫 번째 반응을 저장해 보세요! From cb8534da0de7ceb817daa90f6ab2ae6a197e9087 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 22:34:40 +0900 Subject: [PATCH 18/21] =?UTF-8?q?[refactor]:=20EmptySavedBookViewModel=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/mypage/screen/MypageSaveScreen.kt | 2 +- .../ui/mypage/viewmodel/SavedBookViewModel.kt | 18 +++--------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt b/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt index a2332524..25e498f2 100644 --- a/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt @@ -52,7 +52,7 @@ fun SavedScreen( val tabs = listOf(stringResource(R.string.feed), stringResource(R.string.book)) var selectedTabIndex by rememberSaveable { mutableStateOf(0) } val feedList by feedViewModel.feeds.collectAsState() - val bookList by bookViewModel.bookList.collectAsState() + val bookList by bookViewModel.books.collectAsState() Column( Modifier diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt b/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt index 1d1ad339..fec20fc2 100644 --- a/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt @@ -8,8 +8,8 @@ import kotlinx.coroutines.flow.StateFlow open class SavedBookViewModel : ViewModel() { - private val _books = MutableStateFlow>(emptyList()) - open val bookList: StateFlow> = _books + protected val _books = MutableStateFlow>(emptyList()) + open val books: StateFlow> = _books init { loadMockBooks() @@ -83,9 +83,6 @@ open class SavedBookViewModel : ViewModel() { ) ) } - - open val books: StateFlow> = _books - fun toggleBookmark(id: Int) { _books.value = _books.value.map { if (it.id == id) it.copy(isSaved = !it.isSaved) else it @@ -94,15 +91,6 @@ open class SavedBookViewModel : ViewModel() { } class EmptySavedBookViewModel : SavedBookViewModel() { - init { - // - } - - override fun loadMockBooks() { - } - - private val _books = MutableStateFlow>(emptyList()) - - override val books: StateFlow> = _books + override fun loadMockBooks() {} } \ No newline at end of file From 37e2fc8c47e354dfa9e37537a2cddf391a448ad5 Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 22:34:57 +0900 Subject: [PATCH 19/21] =?UTF-8?q?[refactor]:=20feedOthersScreen=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt index accf9c62..d39fcaff 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt @@ -89,7 +89,7 @@ fun FeedOthersScreen( modifier = Modifier.padding(horizontal = 20.dp) ) } - if (totalFeedCount == 0) { + if (feedStateList.isEmpty()) { item { Box( modifier = Modifier From 1d608c39cd6546d7f84d1aebcd55b8aec98e6bce Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 22:36:14 +0900 Subject: [PATCH 20/21] =?UTF-8?q?[refactor]:=20feedOthersScreen=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt index d39fcaff..c174f666 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt @@ -119,7 +119,7 @@ fun FeedOthersScreen( onContentClick = {} //TODO FeedCommentScreen으로 ) Spacer(modifier = Modifier.height(40.dp)) - if (index != feeds.lastIndex) { + if (index != feedStateList.lastIndex) { HorizontalDivider( color = colors.DarkGrey02, thickness = 10.dp From 5b508b1e2504dadb2a9d3155a3f2d3786a2a203d Mon Sep 17 00:00:00 2001 From: JJUYAAA Date: Sat, 9 Aug 2025 22:42:55 +0900 Subject: [PATCH 21/21] =?UTF-8?q?[refactor]:=20=ED=8C=A8=EB=94=A9=EA=B0=92?= =?UTF-8?q?,=20text=20=EC=88=98=EC=A0=95(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt | 2 +- .../java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt b/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt index 3ed1b5e5..36cef65b 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt @@ -100,7 +100,7 @@ fun AuthorHeader( verticalAlignment = Alignment.CenterVertically ) { Text( - text = stringResource(R.string.thip_num, thipNum), + text = stringResource(R.string.thip_num, thipNum)+ stringResource(R.string.thip_ing), style = typography.view_r400_s11_h20, color = colors.White ) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt index 31719c79..17a011f3 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/SearchPeopleScreen.kt @@ -134,10 +134,10 @@ fun SearchPeopleScreen( Spacer( modifier = Modifier .padding(top = 4.dp, bottom = 16.dp) + .padding(horizontal = 20.dp) .fillMaxWidth() .height(1.dp) .background(colors.DarkGrey02) - .padding(horizontal = 20.dp) ) SearchPeopleResult( modifier = Modifier.weight(1f),