From 05c109d2d5d55fdef1284754c4e37c4c117139e8 Mon Sep 17 00:00:00 2001 From: juyeon Date: Fri, 27 Jun 2025 15:00:35 +0900 Subject: [PATCH 01/41] =?UTF-8?q?[chore]:=20deploymentTargetSelector.xml?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=20gitignore=EC=97=90=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .idea/deploymentTargetSelector.xml | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index aa724b77..64ef9d56 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ .externalNativeBuild .cxx local.properties +.idea/deploymentTargetSelector.xml \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef36..75b3c473 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -2,7 +2,29 @@ - + + + + + From 100ffc83fbef8ca48360495cb6524507d722869d Mon Sep 17 00:00:00 2001 From: juyeon Date: Sun, 29 Jun 2025 03:04:59 +0900 Subject: [PATCH 02/41] =?UTF-8?q?[refactor]:=20AuthorHeader=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/header/AuthorHeader.kt | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 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 8f98f717..06becf45 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 @@ -28,6 +28,7 @@ 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 @@ -36,7 +37,7 @@ fun AuthorHeader( profileImage: Painter?, nickname: String, badgeText: String, - onSubscribeClick: () -> Unit + buttonText: String ) { Row( modifier = modifier @@ -77,21 +78,13 @@ fun AuthorHeader( maxLines = 1 ) } - - Box( + OutlinedButton( modifier = Modifier - .clip(RoundedCornerShape(20.dp)) - .border(1.dp, Grey02, RoundedCornerShape(20.dp)) - .background(Color.Transparent) - .clickable { onSubscribeClick() } - .padding(horizontal = 12.dp, vertical = 8.dp) - ) { - Text( - text = stringResource(R.string.subscribe), - style = typography.menu_m500_s14_h24, - color = colors.White - ) - } + .size(width = 51.dp, height = 35.dp), + text = buttonText, + textStyle = typography.menu_m500_s14_h24, + onClick = {} + ) } } @@ -103,7 +96,7 @@ fun PreviewAuthorHeader() { profileImage = null, nickname = "열자자제한열열자제한", badgeText = "칭호칭호칭호", - onSubscribeClick = { println("구독") } + buttonText = "구독" ) } } \ No newline at end of file From 565b51dca230ad45affb3f99d9ed2fd9d8158847 Mon Sep 17 00:00:00 2001 From: juyeon Date: Sun, 29 Jun 2025 03:05:53 +0900 Subject: [PATCH 03/41] =?UTF-8?q?[ui]:=20MenuItemButton=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=83=9D=EC=84=B1(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/buttons/MenuItemButton.kt | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/buttons/MenuItemButton.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/MenuItemButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/MenuItemButton.kt new file mode 100644 index 00000000..34abd394 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/MenuItemButton.kt @@ -0,0 +1,89 @@ +package com.texthip.thip.ui.common.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +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.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun MenuItemButton( + text: String, + icon: Painter? = null, + contentColor: Color, + backgroundColor: Color, + hasRightIcon: Boolean = false, + modifier: Modifier = Modifier, + onClick: () -> Unit = {}, +) { + val hasLeftIcon = icon != null + + Row( + modifier = modifier + .fillMaxWidth() + .height(56.dp) + .background(color = backgroundColor, shape = RoundedCornerShape(12.dp)) + .clickable(onClick = onClick) + .padding(horizontal = 12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + if (hasLeftIcon) { + Icon( + painter = icon, + contentDescription = null, + tint = contentColor, + ) + Spacer(modifier = Modifier.width(12.dp)) + } + Text( + text = text, + color = contentColor, + style = typography.smalltitle_sb600_s16_h24, + ) + } + if (hasRightIcon) { + Icon( + painter = painterResource(R.drawable.ic_chevron), + contentDescription = null, + tint = contentColor, + ) + } + + } +} + +@Preview +@Composable +private fun MenuItemButtonPreview() { + MenuItemButton( + text = stringResource(R.string.saved), + icon = painterResource(R.drawable.ic_save), + contentColor = colors.White, + backgroundColor = colors.DarkGrey02, + hasRightIcon = true, + modifier = Modifier + .fillMaxWidth(), + onClick = {} + ) +} \ No newline at end of file From 1add505528b09df7350c6080aa0b83561bb41759 Mon Sep 17 00:00:00 2001 From: juyeon Date: Sun, 29 Jun 2025 03:06:20 +0900 Subject: [PATCH 04/41] =?UTF-8?q?[ui]:=20MyPageScreen=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/modal/DialogPopup.kt | 1 - .../texthip/thip/ui/myPage/MyPageScreen.kt | 166 +++++++++++++++++- .../texthip/thip/ui/navigator/MainNavHost.kt | 8 +- app/src/main/res/values/strings.xml | 13 ++ 4 files changed, 177 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt b/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt index e920b072..9abb5372 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt @@ -61,7 +61,6 @@ fun DialogPopup( ) } - //TODO: 추후 버튼 공통 컴포넌트로 변경 Row( horizontalArrangement = Arrangement.spacedBy(20.dp), modifier = Modifier.fillMaxWidth() diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt index 0f35fe9a..7b0a7d03 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt @@ -1,19 +1,167 @@ -package com.texthip.thip.ui.myPage +package com.texthip.thip.ui.myPage.screen -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.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable -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.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.MenuItemButton +import com.texthip.thip.ui.common.header.AuthorHeader +import com.texthip.thip.ui.common.topappbar.LeftNameTopAppBar +import com.texthip.thip.ui.theme.Black +import com.texthip.thip.ui.theme.DarkGrey02 +import com.texthip.thip.ui.theme.Red +import com.texthip.thip.ui.theme.ThipTheme.typography +import com.texthip.thip.ui.theme.White @Composable -fun MyPageScreen(navController: NavController) { - Box( - modifier = Modifier.Companion.fillMaxSize(), - contentAlignment = Alignment.Companion.Center - ) { - Text(text = "MyPage Screen") +fun MyPageScreen( + navController: NavController? = null, + nickname: String, + badgeText: String +) { + Scaffold( + containerColor = Black, + topBar = { + LeftNameTopAppBar( + title = stringResource(R.string.my_page), + leftIcon = painterResource(R.drawable.ic_search), + rightIcon = painterResource(R.drawable.ic_plus) + ) + } + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .fillMaxSize() + ) { + Spacer(modifier = Modifier.height(40.dp)) + AuthorHeader( + profileImage = null, + nickname = nickname, + badgeText = badgeText, + buttonText = stringResource(R.string.edit) + ) + Spacer(modifier = Modifier.height(40.dp)) + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp) + ) { + Text( + text = stringResource(R.string.my_activity), + style = typography.smalltitle_sb600_s18_h24, + color = White, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 16.dp) + ) + MenuItemButton( + text = stringResource(R.string.saved), + icon = painterResource(R.drawable.ic_save), + contentColor = White, + backgroundColor = DarkGrey02, + hasRightIcon = true, + modifier = Modifier.fillMaxWidth(), + onClick = {} + ) + Spacer(modifier = Modifier.height(16.dp)) + MenuItemButton( + text = stringResource(R.string.reactions), + icon = painterResource(R.drawable.ic_heart), + contentColor = White, + backgroundColor = DarkGrey02, + hasRightIcon = true, + modifier = Modifier.fillMaxWidth(), + onClick = {} + ) + } + Spacer(modifier = Modifier.height(40.dp)) + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp) + ) { + Text( + text = stringResource(R.string.menu), + style = typography.smalltitle_sb600_s18_h24, + color = White, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 16.dp) + ) + MenuItemButton( + text = stringResource(R.string.alert_settings), + icon = painterResource(R.drawable.ic_notice), + contentColor = White, + backgroundColor = DarkGrey02, + hasRightIcon = true, + modifier = Modifier.fillMaxWidth(), + onClick = {} + ) + Spacer(modifier = Modifier.height(16.dp)) + MenuItemButton( + text = stringResource(R.string.guide), + icon = painterResource(R.drawable.ic_guide), + contentColor = White, + backgroundColor = DarkGrey02, + hasRightIcon = true, + modifier = Modifier.fillMaxWidth(), + onClick = {} + ) + Spacer(modifier = Modifier.height(16.dp)) + MenuItemButton( + text = stringResource(R.string.customer_service), + icon = painterResource(R.drawable.ic_center), + contentColor = White, + backgroundColor = DarkGrey02, + hasRightIcon = true, + modifier = Modifier.fillMaxWidth(), + onClick = {} + ) + Spacer(modifier = Modifier.height(16.dp)) + MenuItemButton( + text = stringResource(R.string.delete_account), + icon = painterResource(R.drawable.ic_bye), + contentColor = White, + backgroundColor = DarkGrey02, + hasRightIcon = true, + modifier = Modifier.fillMaxWidth(), + onClick = {} + ) + Spacer(modifier = Modifier.height(16.dp)) + MenuItemButton( + text = stringResource(R.string.log_out), + icon = painterResource(R.drawable.ic_logout), + contentColor = Red, + backgroundColor = DarkGrey02, + hasRightIcon = false, + modifier = Modifier.fillMaxWidth(), + onClick = {} + ) + } + + } } +} + +@Preview +@Composable +private fun MyPagePrev() { + MyPageScreen( + nickname = "ThipUser01", + badgeText = "문학가" + ) } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt b/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt index 19102a72..2ac4aaed 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt @@ -15,6 +15,12 @@ fun MainNavHost(navController: NavHostController) { composable(Routes.Feed.route) { FeedScreen(navController) } composable(Routes.Group.route) { GroupScreen(navController) } composable(Routes.BookSearch.route) { BookSearchScreen(navController) } - composable(Routes.MyPage.route) { MyPageScreen(navController) } + composable(Routes.MyPage.route) { + MyPageScreen( + navController, + nickname = "ThipUser01", + badgeText = "문학가" + ) + } } } \ 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 18e266ad..35a89d41 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -60,6 +60,19 @@ 다음 페이지명 + + 마이페이지 + 편집 + 내 활동 + 저장 + 반응 + 알림설정 + 가이드 + 고객센터 + 회원탈퇴 + 로그아웃 + 메뉴 + 진행중 From bc199ea1b6f253088d2f31508425e57dc75140c1 Mon Sep 17 00:00:00 2001 From: juyeon Date: Sun, 29 Jun 2025 17:27:25 +0900 Subject: [PATCH 05/41] =?UTF-8?q?[ui]:=20=EC=BA=90=EB=A6=AD=ED=84=B0=20png?= =?UTF-8?q?=20drawable=20=ED=8F=B4=EB=8D=94=EC=97=90=20=EC=B6=94=EA=B0=80(?= =?UTF-8?q?#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/character_art.png | Bin 0 -> 14985 bytes .../main/res/drawable/character_humanities.png | Bin 0 -> 17626 bytes .../main/res/drawable/character_literature.png | Bin 0 -> 4378 bytes app/src/main/res/drawable/character_science.png | Bin 0 -> 14916 bytes .../main/res/drawable/character_sociology.png | Bin 0 -> 17983 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/src/main/res/drawable/character_art.png create mode 100644 app/src/main/res/drawable/character_humanities.png create mode 100644 app/src/main/res/drawable/character_literature.png create mode 100644 app/src/main/res/drawable/character_science.png create mode 100644 app/src/main/res/drawable/character_sociology.png diff --git a/app/src/main/res/drawable/character_art.png b/app/src/main/res/drawable/character_art.png new file mode 100644 index 0000000000000000000000000000000000000000..eacd810e4089e7089ca7dce6b27b825e19631dfd GIT binary patch literal 14985 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

i5%XBuJrot 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 WwmnA&Ca-@GM}WGD7On_u9`b*RE`h%Q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/character_humanities.png b/app/src/main/res/drawable/character_humanities.png new file mode 100644 index 0000000000000000000000000000000000000000..e3a9d2219e0869741bac01c536937764441f12b3 GIT binary patch literal 17626 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 UAJ!nckN^Mx07*qoM6N<$f+db#DgXcg literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/character_science.png b/app/src/main/res/drawable/character_science.png new file mode 100644 index 0000000000000000000000000000000000000000..03a25583da6a0a2643a971b2709e865a8d03b732 GIT binary patch literal 14916 zcmY*=cQ~BS7w_y^tiFie77;BvQKBqXPn77LAVKt!5N&md5;chuy?3HT?=2BMgalC% zB?%Hj2=43qyU%@|`-jInGiT16IdjgLnKPe#qN}Y&M$AYI03g#)$KC+|j)MO5kpxhU z={q4U=pT`Xx~Vq+B-EFGFp!Z&4^_gv@2Dw(>i5iBPyumY@wOrWb1DFxP_aDocT>Ux7@yGj@eT&y}GDc5!2bT+JU5%}pIlkS?zVRF0O@u&# zqRExoh3EIz1}+NMkz_Ybo-Tj=QJ$3naYA5RktjfHtmHBO-YE>B%LYf_l$=78wbo~k zqgl!b6yc>X7#w38yk9TJz~HaAt(XY-usEO_LsBzOS9!bX`gVi;+!|_M+1m`HJ_Rrv zmv7?>Z;n5EdJ@hebM2wQ?L38L3rkf2*HZ*g_4!g6r2UDMqTJ3*w0ZwNLRXj%1yu7% zUeown$>#QzwpRSYYZAw;qR?Qy${;`9T1RX5y8GxZ*M~2i5#V6hG_g-jIi~)nn6bRfcpPk-@ z4T=4hliK)cwP)$naI_>eeEojl&RyIZllOJ7j>U&}>yq66Uil<>TRHLI<^2Fd)|+0v z*GX`v0JVqq|xTQliKt~FS8n9Iv{yTuXJb|Adob7 zAdiA2qA_5;AA7#sWSY!7eGLnEp%u+c9+(`iv`N&Sd2WmkAbsU5#b?fkYFF5+BD!6( zzzxSkcEL$&D*LI%Uj<#K_kZUDG8KF{Mklr^R+fWPXj9@FT>J{uFRUQ*Z@RiwQ5n^3 z6&ye_=}fUGT8)g5Rs%I^NDxQK8PA?l84Fm#wfrYkj#3%iv5NX!8BxTD2_JDC+OT3x zaWWYEzj`~4^a6;BA`UQqAA7SNR+^B@!y?A(4Ht*xbF4kI^tz*ao&WW%ax66pjUy0K zWu>_?KB{rTj*@{RCUh+pEd`@)vHKv9xp^&3Z9e)3%4qv{p&r9yC23CtbRr+rH<;W1 z9VU8x9RquLrpwML#2PgEPaW5dLOUlSBAec2RNorX34OM3tf5l>BKgJYnPE^s#RK~h z6Vp!}*J2|`*7FwWiU+1W4PA^`GyNCdk)Tj;tV%;3UvOPcqSeQiy*GdNLjpv|IkX;H z1~0gdta1*$%LjN_3J)4jCMXRYoV*MZPzRJ$aO{(VuvfE9vP?qXhl)HOEMDkcAV`w(cJ)*5F)bo&)!LO57hKE^FfSPSUX@N+H674mymJ!I=Nv7EAE3VTzK3eG(PrO12 z$C3{sLwX3?Xs(Jo_Audaq$lwEjgzdv;8-I{*j?;_`i#9De;MbV zCUbkvW#p#q_C&cp*4CPf(n{E4*`B9u562;&X3BDl1 z`oYO#q&|1}kP(4}5^gxRQ5EMws+j*Q_#afCfvX~w3I|C&CvNbF0wk5l*)jfDj}ZZL zkM9!0D}@JD-Gn9occ&?YiA(7PITjX;7)pDsM|}B0(3l5L(qm>5Bng~&8EQcHex4gi z5kFu=;H-wvQE;rW%R%Stzt!+#R7*@J)1OFPRJgp^cal=v=wIWRiKF%69wALkT&vL% z)$wM_ll8_H4o}|n6cp&iyOTAFc?HQoFdMBBIxbVp<;{3iu>Je)OBc)QNQ%uqXar^4 zaH)fX1}ZE;V&vs_tDFe6&)*pz8!dS0K?Fl(q%#q$F>$oPR4?M&yfjexMaM$DTR+R& z*SELgCEqV>Js+-6^6UO1l@>Y*8C^_{NzK6SygO-nn!jsns&D!uu3P_B9Rfr}HPSO` ze~w>`S)=SMLP*AVGj8l+UlVq9q@>cwm07q2}NZZO~rfY@&cAlq%pz(Wn=DEa&V+OhWtpk8FR zQ#oyNuYep6K0Jq9xJa0kY`Y*>A%d6_!26N6jKAW8e|eH`-V^Dfq4L55Xq#K|R}#8M zor^xe#Kp)X0jpV4g;)RVgPkvQd??O*3OFvh_}x{AH^HS3DuTV_G*gHj0^T3984gw| zhKEVqvl?A`?p{a4P;$MPp;tlxg+{E^h9mc&B95N$=q}i!)8`YRh4<69(Ba|cDzn-> z2Ibkikw}!?d<&hODd^U}k^Cl7dXW;%4H4ZqLAO|t;KrpEo+P2rgEK!yb?`ypJ%>O4 z`2XO;ywI4q5fkV*0mmpHyzZv@!rtdJ&aFOTj)t$?RJG(3<3p*`#x)Y4BFaj~0+II0 zI3A2KJr6#b^s&Z@ruk-cx2}ur6`L>IO?Itb8UT&jU)}q6^ekOJY{8LhGs^9mjyiYn zr`^qQQ-1wH@_Er`_PpDpUdBTtl_PgPn(HBA!mhWwyogKcgM-i*wz%NEvl24A-_6=G`S)07h<(MQUHH+ermhxHkd92a$hqbCdzUe}u1}HQ!6=BS@C(ch5 zpqbz9a6FUqdgrlF2}ZiBo8A>GvY(fkmUY5Hc!M*aDby&i9{twD@eKEx2FM1BFbu-c z;#v<4S=a1UStn)niGE5Z@l`uhMLbB;j>pDntw%iYeA{ z%X0hxg?1g@sUD@sFnZz#h1?rP_c%40IPMkAtDXlPAj&TIJP$XQPE_xjMHI5z>y1{dba zcW8Pdxo5(F-d=i1=wh;z<)81~x_yLqT+-Td$Y{II;y4Mh3L63!CCy^Ysr|+vzQt9F z+Sb-(F%k*w&@TyLxuFdoe_BxXJ^3~9R7sqDdgmHB$qk01%90gv9v?*H>(73R+fHIR z=VGvY8))i|Ee>_{^fiKSr_$b9az1Xi3~5jOx4kfU%Hp#qO5?lc+%tGavEQ{QVkRg2 zEA6;T!Zjc*A|cl~GvOB%TC-ag2{19MeEnrD#QW{%FL&DCiU>jXn?dX^zY{w+mVp!o z2dKiWNU?`TA<)4<8H)oTV&so@0}4GV{M+6ut8D-GDhw!Q%wDi#QU}x>)Y1Vc)hzUu zhyZ%5{O&{meA(I@hQqNMw_ZR#iFxT319hFU;>1ALE{UW#Vl@VzJ1-i&OaVZ~x$1@T zq){^R!oU}i2Z)$ErdpT7Jpp?8F~kUf)~%(%#`URD;NhR^&S0VGytKdDO_;uh*^aJRIvRh;9{HVMt3_E z;JP<`$q+HgTd~)fHxMAgPU9jP=)oRr*uelA7(J#_p+fU@7nuQ^Za>92)V1PmfK;Pv5WptrH4fXBTEpGdJ7ZL;COwwKxfIX8rm(DpzX`zQim%QB1)TC%G znUG5SZb;v~xDN@;v4w;NHT!fzjfmm%fy4tfl;~|6j!P|_*K^dkpGjX%iv|gBU9AS_ zZQD3zS^)kvIKdsBLX2Au!~_8FbKF6UUV-J?yT3Q>#RJ{u=G?l)(0aV4K2U&&XI)4B zJyg)a@ubJw8$n{tWYfU0a+QI`(D(Fe67@a*HfuB{bxb!DV)ejtLI{P{Z15O-58chP z7u;|L&_LHXhoI}Vj_;#V%q^s*U7Rc*0LR0_Q=B>sO~U0(bwQJq0Lae#a8tnWso;1> z7U=-!8rwaHg%-0m2nP1jB@i*A0{>#=1YN8lks5#Co1H-t3JdsaLsA&bk;`|cb6~E- zeboRM@HP630P?}Oyc4KxvG$x0VyQcI+P&!vaLZAD6nNm+(9Ix70zs{daH!XMuW7}X zJWfdZ>q}1+UThpuqKRvT@82|9_lJRQ@0*`PCZDwl6Wc8O$^c-cjs3{_pa3p%tw|7o zJo<+hDhkjR;qw*GoDQ-p`yU~YbyGSmhd;50L_?~G2cGv;EkFH~yf?8EunDb}tx1;u z)OClmG3cm!d5#!`5pa{?o)(b{M@O**tr@F|I3)3RMTAc^vlqF#>w z<0;z}Z?xz{b~MdnR>%>avL#q6K)2Lye<9V9?hl&Yyxn&dpdCL4&O)=E?-8um6vGP;?*_lj?Msnct62q z;o7KJXDb^_sZ<64#_OZY7rBfq=;WlCw$&AzOIvVcBM{(3n{ytTGi|g1IUJM#?HO~ZX_BH#5P;LKQ_uA4yxVqnOKzD%{e$uHqUl4G2H{xxDo zcQST`nAp1-uBY&G%q`i8R6LE64EmuzS92&&h>&T?jakbq(}W|2L_(c!{oIL+p23>0 zSJxaZ8MGz}bg8}MdD|n<_BMdxU`gDdGLSZed==$+XxWP>H=cp!Q3m7qSp72fTjgzS zBf#^qWBKFXxx+1!<@JCL?lpxjt(QE>1TAfBpT5lP#)OXmxEE_m50-V1Q+AMJiW+>*C*tC6ha+?b3ewN5JNWvf8bl9Dtf{~1*215; z7ZcZDEc^yKyPxChcC@i2D;+4%bRF^2)>o2$k_`6KHDk~W&n1v9r{akaXgbLyCP6Li z)=trqQ4HZ@ikfcd(EeI(FKA9I3OL-oc#5t|kzJ(oKhHdQ?j{oCr-4hFuWrAJ&u>p+ zXV=vCz-aRk*xp;2^rEe;nqQjFCTQ6jD)MnMj6sLCC$Ne|HeZjk3`NU=L;ltiVf71Y z&(@Am=iW@s3ZI%<*2Bwh1DpvL#CUU%3GsZ9#inrcu0i0qwHu_{IeZp#FLpG zCG+X1>G7kWkZBS@1Q99q94oP0XF4N4#zp*=JUejKH~78Ia}wU)_AT>G49%>p^wV>6 z&j$j6r%&B;4FnjHSZCuT4YKJ#<7CHC-*U>rmQryF?csRA5NfU~b+ARDy6fjhp+-&a zgrze~%~qN|)8=cb->H8U?u4nU<|^kyNgX84j4V^uR3eD#!@b^sE`j*mPz`=mwR*tS z&NH131tzqmzon+=9h|VM|7|c+UH)~Xy`i#NIj#IBS*e-fSc?CTn-e5nM;8K$`CFB# z(-*m3?zT`az_<5m5Cvw;$FutNh3(6RO4eUZQLH($&!!C@v3@sHpa0-kxse`nqIf{_D;xV=KjNY z<+0ShO$W=6I0eE7WHJKN*c-`&_p-&c?j(PQLDw`HZLx7A;NGGx)=^yTxIp<|xDrKm z{yaHpTQGT(M)2lQ@E|DHHBFkkpO9|Kt5*yZ4`F+1W=S505vpA%x;k<7&2K%?!jJx5 zJPF)0SF~|4)*h2}&3-}Ukcs`6YzkY!e??s8E{`Dk5kC?1cllg4OCQb{<-=DJMOdZE z960dhgt=0ly?w5o<%1- zCg^_deKcUy_sp|C2!>D$?_bsV+GJA zSt42PZwP5KRnpYc#ELUYiuVWA$Y_O1fr|qb=OI8zc#!~**@9N?7Zt;VU6du_T-X-o zbtGkQU2(<_l14k6Nlxww5Rd$$Y;j%`P$D6Y{WrU;#o1yO-*ORffc5KvP8d*f&fw~@ zgBb{W!FuZBL^*9ro0t85zPyX^i)KoNm1%VvI>Aroy^(Q{?qz~igHA-Q?90=_kHX#3 zl;MSon$-s3$*7(zWQn0~pcr(N6V??4BY6U3uc$r8B@0CkeCJU6lL4y;xz)e%T@+p1 z1IC6d%eQ{eqs<;r4f{L>1)9y`7DSXXb@dvj`>pZ&Z8>fFWK-E!emudM9~^&8qAs42 z2>5nw^fNSi$6hYG(tWWOOioy)k>;FpB0sxQb4rE*(J#d`DCXWIh)L%jO9nWXh?tx= zlpGDIOR2@9!HgU}Eh!`!MnqngmsH9D=v4!6Q-FEA;bW{6k^RnbRlim{%7+U(LGdN# zDHKtomLu8k{ADA?wOJ5T-VP%EfZ9K`*8I^xb?{=Da%RlPI!L!q$F_e&734mPidjDY z6hAl`eXlU-{D4XFF-Pa0+TmB$G&7~!(C+hvCdN%}gaEfFF6$Um8Ze)fP3$-o7!$le z{iT<3JUXF1O|PW*s-h|ASUMuIMO`_ZSL;GVh6Cf`{ z7&_;Z<`*5b=7jlb-lf)Y;Hd&zGZU>_Mg%3I<;D=1!3T}h-*A9u;kB|vAeS~d)8WVR zXQTIac{GEt;Tsvq$m;Qt%Fr^sj3T6K5|tsd>TbwOM$HLJK&#?FjA}F9;ZFj4;cgCr zzwVc%-7sJc#4u{~U3#GNBeo9IY~7*!r~AYxjc@`(Bv5YgsH`0!dAYP=`be3}FlO5k zuV{wnw``)B5?Mw8Ex1m&jsBeG}#{c7K%qKA(^>gxyj zJ+X?3GO0Z6EPn^%_#0jy53@niY2%6e!>0E<#zMc`F<{sHP!(c~4!~EM9|Xc#f;PUA z`sLSzY|J7{Goz%6^`8%Eo<%cx;Uk+wfc^d!O_^m1oiLrCjDB<{FVD!k>3der&-pR6 z@h~(Alp-lFBY9~QYJsGbxyw9IaeAP_XN}MC;l~H>9Xb%w@(WRE7*l-mDRewEfxaZY z-p@Co=I4u>nD2i@KMs~|tdfJ^32qy@>XQ#(az?Akg2?mHXKtRCb$1pIMuOkqVMPr_ zr*0A1+~1L4wb0xePfDZksc6~2fWmKx)yP`2;D2D+NJImf;<=F;Ok%|^d{4%TU%k*Bwy2x z$@oxtt%JG%fscc^#4sE4$J~+pe(-8K!`$BMbN)d`Mx2C5*W!lfoUg#Axqf2o+dBM! zaahkwi|r6yPQsW72T?BEk2gMnUdy3hw7*@u_y+dj4yYy|HDcgGslj1iUBcK~bRu-m93aYBFU?AaQBBCN|bLB|CWcq*bbH!^W_m zZa=(L|BRwM5hT4_QRfCp%F9={-QgMOWTP^k5r-O6?!bf<{@?U>K}Bn2AO52tIuj{E9o6Sb#X(zaGr z(6>yDD1Wd~FIAoj@(ht{9?o!K`6^ji`rS9n8=FZz*CzJ%R^t5ZTn!UbDxjG|RIR-> zyl4ZnrypEN<}$A-7cbJvM-n!k7ooWqoo#S0rSECSCUL<~SLFCgzw`_(3K%QU?G~l6 zH3?+&m_3@CB;wU;=2u9FYe$3j5|S4WPfjN)>G;Up9~(^1Wv8S8xW%kRTW_0n8SL)( z3$MpT0^JO`K5>K*lTU?u z&FWGBCT#uWTepNKe(xJ5snax8^c6#7x15>NymziKqr$Px@tmb~*R}T_Z_bjqm^mS< z7HVJZXbVOE^!$q~DZh%*jRc=^4Wl}k@)Vb&Ss72>)JEpzx$;#Df6sJQb=*066ApXt zd+!x7HjEFUTh-7zG1FaZ$U^ecP3x0?DIGm|V8_QtinT!^VG_;vc@1gNrAlC9dpUW+ z%dhlwv*08@4CI+pG1C7DX*`m4^s-qT9T2!WH%OA=`$uu9GK6>ezbb)&DZaku3tp@C^QgVr6rE~yC-RG`Ve1Rd zFShgv9$%ZTCRB)Hc&e0Q2uFxLUPTeI{OUJc=u4YDtEo{a=!l*sMsW-O@(hYeEtkEV z@?goB-|}&e0ZTn!0X#2_u$=s3sws>(t1>4z z3y7`;E;YZmWM55_lN#edg z4L+GIo;?dB_u_4Z&s=#Jc5Rf!iAE{z9rXPCN5oR}MSf0j`p@*`5(BjA>WLhE`4Tbq z-K9S!YNYJmp&yuiRHW-_bzyOEDC7<2*)|M-!ob2i{YX%63wx{GEc8@fULE%~`bX@f zFDD-=9a2ZVt%t$G-3v`!PBITf%%n;MBIXt(Cr@&MwqU_&4l(v2qGeB-^3t?`$|SdS z5L{L6pz+)BSHFkeO!preu!Ad+CCiVU{LtO;YTP$s*RqIEPx%lyPp5Aorm=Lfs~#te zlq(rMWuQ(k(u4{u-i0luvoc)w-Z!(RA@w}$I+k%IE`dkXKj%XTBbQ%3`qOiBqf@p0 z{H9hpg*ypj?;9xa8@_)+IL3)#F_Nby)g4&%{rs2Y`Od%xmDf^q=;VsdwqJHI4<_2$ zo+UYX1}b7|}`l;=*!57b1vAn}*v^f8M#zq`cm75t9=f z!r5rUR6xhta1#F2O9msn#5li{mO-m+9C%>W@teShsceK@yE!iS)cb@r>HE)Tn5M8!mrBqoOOa;JpMw@cwL}lzWv zjjc)v!LfJ4IA3)?^r2NM)#-u4=pkRMU~QgJ*wiQmS;~BZB<${2jo1B2+BN}QB;VCv z88I#WO;<2h-tnlJ_!%}ql)}g=RsKZrUl|6eCKIaI5WzYs8BkT+eil;E#$3U(FvF-6 zqYkCNdkZTTRXxIuVH^zCRm8Yzt9)t}=1_UDX>LQu|3r>iIi~hhyOhsbUDK(C{Ativ z#!|a&TK787YR)a)3PYBf-$zcO%Gs4l#7|~S(j&%m>Kwi#mulg7n45jzH>V@DGEagp zv^=xr_qThCLY5LoHx{V#6yF~Xm{@yPy*zGlh&W-`pZIJ1{lQ%aBk1RKI0$pjKp*2G~6m5l6*Ug$8X_OQQ8LyR>tBXst{H=blp%!v9KDZ?iAjFT- z%;a6;>-UDE#Vj$&D(itlSmqXE`(;ax0Ft;>vqSaskkysie}qcP3PG+7wg$_8ST`e| z;2j+XTNva{&zTb{I5|!qMGz=3?40A(H^cI2M&49ISPVVOQ{~;;TdR#n)k{h@-ZUTC z73qvr{rNg@o38Y5_E;b|WbO6Rvl^iz+94eUw6J|qY+I)jTbQQR>CMNsf<#w-ESW!; z`!V~pL0W&gCa`JW%KCyoD<2uTpWFNM2W?b-Iu$^b{s+%l72Zwo{Im0LqXbGS@_qBg z&9{7I0=Qh0B*K1AD?(()*G!ToDElhHVNE&Y&w@^E{FMv5W5Tw9y&h3D9v2k{+i`&`N;zncJqrY=MZw^RT?B`s> z>ZrH{QgsDA4zQuWMnuKLwwQh9797X(Vn@=8AkA}aZ?6?X8SQ?WH*uWCe{`j7P36z~ z@Qz5MoUc2%?20wx=l{%vFmb2Ln!RfOn*IgvezQ2H*JGg`vGp`Df#vgmTc!I4Wg*&q z>dp@Oto%bPw(eH^jG_B@bGQ0uncSI)d}ngkRHE9&(90;Ij`PeP3BtZr%&2JmLx<*o z+qA|DBc9sd2tB~ft3aB^1w>5u%jP8)Mw5RxF?v{9b_1vWTtnSlF?JMzHj$BF# z@@GEPw9!w<&Im}UXq{Y~olZ9M4Cc{1$)_`^%CP7#7#|W-XJF%Y zZuB{L>G{X#{R*-5Lrbe?%_8^kanuJR7Ds!H?bdWvs*VH7baQ7%!}H>#mVYfp%!O1m z`GpWqY<&7{d)|d^iV1JAZe`+0H*o#V}8{l4tpZ95l$tXfj8Uw!MY=sfgDtjkIF_LSGsqLE_l0mZivC7nLy*)#HjDXWxmNj@R7G+aol z>!W~^unNqk$pcR4@pe1kF#70XdTcLo3itbb@h_wF;qs&_iFL0sACdQN>zj?RFL9oa zm^k|d;(S;UIO46|a*{MR>f_qs?dMT~<&1vydqJ=dwS}|PRo&fe_r^XGV-riF*FYWp zr+un!+t%9FB|2esD!)}>5#QaF<=6j~j>GdT5{)=JV=9zGJQaR(wqx+~&8iHWgmLAY zDOGN!$NzkSf1H_5vo=pX+gVf4(rqCAa{8^3*CJb$!5%lyReu#|mgszy|AX(MrriH< zk>TVwdtjh>{1jo>_8ZxF(P5AmpZa0c0j8VrOz`NMa1^##>_j<&pfE9jU`jqwah7gI zNc5Mbr$Oya8zyd%ELJ??W6h&UWlIwYY+(;i|7hRCWIiqCYd>49S6CA~jow2JcI7sm zfj~g?(nt;4ef?f#&HJj3!V%uZg6~bam9e!jjwMMmDiAq|Z>VDy;lT)7)XLyrcC+&H z`h3`w$t@B_h7y1ybm@DQy^n><+ng*|uF<&Qgds#gE;1teD?3)ISPNG=bK+)73+&is z#b1o~^(axB!m&k{Nj z-a|`}7@pvHP1c6nScsBidu8={%tQbh*cWa%v8<7j7O;n%ij~t;wapPyK7_7Ux+KF& zM=ghUxX=}^sxfN&F6&FL=nc@gD6RW)9tITtlpN)2t5sRhyuLIr-}dV+MN-agnn|M* z*fD^tm|L*g+la_+3bjvpCRUUW*OL&OffG!vbUz`v61mf@HAguFJ+(2aH(!_X49(x# z6CtCtAhb%jL@Pu?Q93HmiOOLLm1k`o5wrSHqdCEg3aXqO#rpzt(5%7Z#$I_>_n?Ca zg$ef3HT1h+7_+Op!r{mOO4TIR7?$}ugC?iEP?Y`nOTtE)7YI&HN0$}1` zxm%B032Q4O_<5AU2PaJao}94!&!j`AXF+g8%-t3r{`;GA{?zCR$H#ICoema0w~bu+P2tIcTS)@Hy&~1Skl_Ygha+xTp#D?gP2*`wMNa|8?5Xs|n8L!(j-_ zDXUu`2kxl4LnnrQFfHkWZBDQ7Pv%Fk(Oxc7BpLf%o+e=s7p+x~;#2BRkXgmq;PvK&Kic0;7!ijOnMfsh;f&9OHj||1h^!Uah26%)%rC`1IcdJM>K$qXGD53@{6H?3 z7fIRtItu7z#E5)A8a#>*5S)-@@RRA$L*e4VxTb?Pu z;JM#YBFxOt0K2j^O|j;lZ;WuP9GAa}y?Wi8zDUFXjiRrTsih!Aaom^*=2mT?K@$Fn z#&KBM?Z8`}p!68QD0Tm&z#~k@VF@h6>mE!bpqRm2|ka zwhD{OPPOBRh*Ev+XSjt0n*_HTPqmXe2v^-dPr3v-tgLsaQ#h=j<(!erPmnNrC^K>}HoVf?(TGFiA?zwC;Z1_&bdA`b zPjYN7Ry~?Z=5OvMbgwS2QUFwQGkr2c-*c&-h-J^DZV7$T8au1;nMIGeU7e80Z z`_N|bQXbYdcRhy``KSaP@5Bg8EIpz8s-48@O7s`U7k0G#?q5xu5qa^?ABQ*Ml*9W! zQ~W7c%^8C2rBG}pm8L|+RJ_2FpQRzH9&88Lkc(mH`A~Z=tft34s7N$y=f-vlo~uk= zJddIbIz4b^zFK`iD`ud>@83$}w_-(P^h!-SJWyMbBN~4XHRofjTtWWm^YV^0kEpCm zksMWPV_pyq^oq3Y#Kp5$6_=1Lo63kV4Xx#%pojhQj@PFvnx>{b!J2L8Dg3CIkUYCM zTTQVFiG81f`P;g)|9r}e`74~C;NX-8WWY(oKY6I7^z;Oaor%EC@a4r zvSfAv+A}%o$H^QGJ6@-vyUF!CJiRPpBJm+r62m)RBi>V}X>_Y&m@i#y+UDzZHa zR_fz9IMiekosJYg(9I)jIFTq&F39+ENX6i9z(+fy<-+Zl8^K1;*eDkiwsdpW9C7W4 zit%ZaWvMPB-;{7&>%LvkZ`KW!Fh0{mc@|RT zcIXO%KsK+>RjFL5aATvewRYFYp8->J4_cW9(yQFU5a1F}SOn_G?~2Z?f{_og@RMzJKVP zJt%fJpvLVPd{k$+gM%b(FCg)|2qGxIaQyVaR(`94!JHo<`K-$|0-n$TiNJGrh&P_ipvU5BFOf2drOvlWIWY7D>M-cLJV`VL=p7zI zC=g~L5oiM7rhn4cIG4hcjv)fwe@3&_w|w!#h%Sk0zN-amqyin?zIIq-NM%=m!+5k655#7q?QSlcp8{<>V#9gi%?S6<1s>7dccA3Ol4~SThIe|0TAV_N}8Gzh`XGHa@yg< z4+kjtoI_ZSdY+1;sc~WiXC({_7gnlj?!xO2@kUWGhn}Oh`e}=F2z8~)M-9$D`+Q1L7*fuivQF*UU}tR1*mI^{R_#t zPLn2l-dzC{FYo~1OgDS^nuRyfS`KwdDV$+cXBg-XNBm|3fc_QlG5e=X(DM%xZg7I{ zAxDuUEbLO!K^rEsP*figDfFr9$XP@OyIXJpO((9PTUApC9`R(I2rAj})+bFp1MCA7 z-4NKrGk^7i{x`gcpK~T(5YTk+H`NtC)nFPNvk@Q{tq$B{|?b8UQNu?`&QzH$sYkeDk2JqH@l#e9Y_h@(g! z7PgfFfWa_9edPbDCA>I`#Qs-1W79wV?56=bju}F9>GF!L&Mv)2Ae)3B5KvD{e5y7g zM)F%_aZUm>khAGCe$?k1m(Z^n`$APsZaCt_eHhR!fN+ElC{PyJ_yE(P>Qq=Mhncq| zeFg`)Mx5ezKCnX2(zmZ6erbo5@SZ=A9cjOOyjD5Z$U4V}p6`TUb!3yR$JGD#)1Qg= z0SW37L$;F0v#cI@0s)GxmY`MEoE-U`2{q|yWz#^7Pc7n88~-P$hfcQYs2Lnl0tx;9 zed{JXNlhdCZ!#XKzHi_nJ+q$ykmCD2y98BJ*Fm^7+-uPU(^7FvyYvfYic6@T$DI$V zqnddACxX(D4?$>YCSHCrlxO*f#5L$wY6kCQj6zMM?CwYYAOXPQMOjjPD{;h^187q6 zwJCiSs5IyW5E5fgxk3KlRaGw7YA-`YLB&ldNs=`u(Kq*96OR2y_~j?mS(Y;W3%5vI z>i5;GSN|bz0a$uzk%p(H{c=OG%jz-ys%q>u1u(*`j1Yn^okja@Dixace1MhiKe-pQIjgjYQ161Fxrf|j*|;8<+IYj_Ws?OJ zr1K6%&MJ}`jPNO>HxCPU_pW$7Kb*}UNXRcSADZ0@uZ#b$t(H{giJl97*hk2x5DpU> zalP>V0qL7GC0DeebwwpAa*IGHAW1WE$Y4>q3A98_=k~TR4(CZ($O&THVp6HmK7Ybl zynb*)nw+`u=_D{{BM_{f?->C0#BMo#MM{lA;T=_8`VFu zA?-}?XprtL z^(B(N?@*}AC=a2`}(6E*S?JJJD- z4?RXwZ)AEu%m{!C4mb5=<|Nn=XR^%24H2Oq+SxJL4S}9XXgjPO!Mgvy!o+x!D71OE z5&>{hv{p$-fJ|_M1DqlO0n+U=6cL+6ZXRGfcAz*jKhgy2rT?#WFTvVkzlvwj zB6J%i1r{B-RapLNhj4V?ZS-+A9uP`z_^v)KW+4Kai}0snV5^dFNs5xhLxdMV!W#X* u59$*I87aP{&X(&Pl91r8ru^<(rxz4!3WYMIN-v;+0nkv<##SrYg#90-p#yaQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/character_sociology.png b/app/src/main/res/drawable/character_sociology.png new file mode 100644 index 0000000000000000000000000000000000000000..8913147a530d7ebaa9250dee7b2756b25507d942 GIT binary patch literal 17983 zcmYg%by$_n^Y?w|PHCk>L0Uv4JTxLAAl(g8(nudb;1EhkcPic8Qc8C>(y1UIQoqIL zd%f5D2YT+!nc11y+1>esC@IR~<51&35QP6+PD%xWP>|s7J{ATj*-@ib1^;2&%V{}5 z5H9KM9}G%Lp#+66Cly%1NZ*LM~)*h#>b-G|f8Z2O}~U$Xb%ys&)bWVS!-C$8_btw#U^9X5sDWKY>5gz#z#W5RuR*$?fW`s@Cga6#BAxK8Po+!n}EL zZ?OOD(!G@^DCSWGGl8`CACXP>kHiq1WiN2!w`kNG??(Ojpq9s4o7Gk{iH~cJf9Q=J zd~0nv@f{YOEb?r!vOWJ<+g`Y$7)la_HsNd+e550x^&4TJM?rp6M~mO(Gtr|Qr{B_U=g;b(TS>p@ zaMfMsC5%uP8(*F-c^ZT(@{FW#9OO`?-8m^ z1ZY7?sD>eJ9>|0IYMJ}Xs&rOUCkkDH=_dpuM$~#th*Mx$yxc&^RL6WnYT|q}ESF0R z*!d|(i^XO(SdD5?p`d@KARsT{LQ{9xkCK9tB93)!XPlQjkO?163X0vX4rlo!G{q;z zn0g$5Xmv)9h$`f;t*?mgLGdFlXQW4=EWCItXfbb*rbU5ekYg5(RV7sz{^H1*JsgP* zBW{x`E+m;;L-Qk29^(&JFOk#XQoQ_jjt)bShNJN~H&?#rx|5b6k2Kvb=CReX_xm+f zl}${I!idQHURpTE!gf6AU~z?q5O7{*AqSulv>WdgxodpdYYy#1l{j}XyZ#i&u}^&43L8Ax7F&iN9@*4 zJXUB@^bXW`bB*gPXEPbktBJ6B&o3BDN$&9CfEs0w_0$VA`{>7fL^X?AT|E>VL%2N5 zpn|uM!^)BgwY+C;2(Q|Z5(^1u#0rA*X+IrzT>3ur=9!5SXyk|{N&hD0btfED=U@dv zll1qq?w~LdQTa0DnDW5I}#@0-VMiZq2x!c&N#XNZs~nrMI?jeZLW3|qm3}jdV4MU^VGTFWlK5vrQ`S=$5DZrJHOI=cgST_j zy9>L^D>kY-zJ?4RJxRv`)8eEmmQ1YQ-8Y3y;B!I_Xi{xX+5%OtxhS<0Ng+z^*};%r zG(>IO(wo8hxFfdrk`UP&g;1{w$9#9~$UE#vL~ui)^~ ztrtCL>yw$3Km;1esxR86nMqK=p*&WZj|i-H^sTI~*6w=Z!_YSH1j{=^5Ll`TI=wUR zb(fPwAO=2lE+4bCI}@FC_87!@k!kBaJC2F=SoErs-{*6_ujjrP&=P+HW+EGYupYbM z=oiO__&)6T5e-I6$uIiWazSHm9*IIPQp9Elq_guLpy&R-L zk&`kR?Zxz+yG@nt@Lh{An1NkGbJZrG{mgHP`+vthlI{)`0+ z0}Rh_7JDqT(klWDuf!H^a0pp_9OA}ll7*wmz^A6C^&DrY6M+{b?BMVN7APt61Px(J zOoG}LiNhlW#IaSFDOfu1+t{=DJVIFH7Q~{drCaXkd=z+Ih;pa|3K6%3REZ^2 z_5CGM&xncq7|LEde!MMoabw{!c7O+@4uy_ajA zZM%kg_S{Arf;wd7itbtv`H?)js~yz`h^A!F^ZV2j*m&Snl0kwdm4RlxR)mYhhe6@m zK0k06%Beva{XKc3RD390%_Ke+*MrK>um~tOY~kgN1scSo?t$&Mz_N*E0w(`E>=c}6 z&4~+TkZ>^%Zs(%;mjh?%U4%^eG0y<0_RAk%3%}%Ir6dL1;ETFhN|~cWO7%&*8xQrY z261FQiXz*{kGz8!)3Km7I(70x8h7)ZX|ESNe5yo#oNE^ZFvy3OuXy)uf(c@iUvADjc{CL{3!bFdvcP?QQHHHFVJvWKBAL}gx>%ujq?Gy6#4ulnPF)!Lj zvcF<1hfaj?8luNIIQ}ydVseb@e=pk~OHK^iO$LI*$BvPEvUdqk7^A;TNSds@haib5 z%U2F@UcgVt(N0K0NM!8Bk??@f*N;H!pa0lnfTWNYNp9gdjL|iWd>jy>jxy2wWMGhp zDC&{P8Vd}P3Z4)YmJFlnX}EE9`W)ATi2@->i#Pm~#ic5APk!b=(5iHyyCIqsGe_SV zh%~Zf3f+0C5~7$t$HV9us*+x0`y-iooADs*%n4m;81b75upP*S)Ff$T=-q`8Kkvoc zB!tlmbbr@6u;L0rAlJ6eCC_3_B_Sw(rDVe&kUbb0O9g{+dgPt9Rh-nzfXJgwsFYxc zoQe1B#?QdS-zd*ZASk-auJal+|A>pMN`TQjXiJ+KnpuPDE`8T@yrQ4jFi6G1)WcmR zkI~K#fy{Y$Lki>pmyPS$Zj4XD|0)Ukh86?Y4iVaS^lsdK8Qm~IhWPh1jrIpRZokU` z>1`fG&F++da9#nS`w&zlPWHe9#u8b$6kptR;tm+a zT9ufNo}Q8F^UD(=s7#;$NeCp2_ZloZRHIRO6pcV2ovQ#>&~Kv;{SLDHFk)<8ygUfP zS^j8_!boC_MMKv?h!IT-}!bz$PZ{RH6~O-{=Z zkfkYQMp2mOc-xSW z5z1iJb7#T^9v*Nc9;~Kf!%uoUVNKMkq7>lHklU%06*A;`a3IA@&xn8a#1{*qR0y>N zWI_;}F26bv`<4XnoJn)m+cAC{75C?i|L?a6Sb*AoImUlfN;5kP0!ASy1M%?1=3T~r zKNGrdLo#Nt@c`14Y*oxzU_j~+!e2M}9QnWENMiQeDKxo5oRI%2NmQN$%fZng=>FI0 z#B76vm;Zie#`Ud6D~z;`ztq%JTL>&KY5ss1*2}KTZ$dtMhQ5JTd25yhStW~pLzK9`pUW^ z6eCvOEUN5@?nT;SRaX=BG>vTM&V|>$6BG`@py#}@n-m&c0_bfRB_5W#VfA#CXG+&u zSYaKxu(Csw-$IVDdc_ANL0yw%QNrmsJPN?rzxBHCIx0a$JJp|FT%}YSji5{0O7|5< zprH=qtYl-#U&VYd8u7X0GP)-z2}eVW*Jtp`!FBtJ@Y%K1ntsvv%VTdWA6Jl4lMk%W zZM@yIkSR6DME`IPNKB0p&beaG-j&d&gQ4@@yrzw2MwE$yj zm^Y_CV@))6WI|1D7haxnx;KY>fboWZme3IeBa0ghqj(k35*H-Z9IQj&{R#pW)It`8+4anOMvcrjQe(<^^99_1!>RR)NFLogb)^*BZ)bTBSfllabc5vuOar^V?_Nn|>54l9E15!02kuAh_Yau-Mp(92oj{@2HZ*9*KR zYY$*5&YQ2J8q>qvJFfy-cX_e>W<2j3oIb1-BN<5+mzdNiFC?9#zC(v=a{t@bVYP$Q zUbN?uuQ;lC_TIC>R>ml!8O-RaOU2_RTqGNsoG#ltQ5r?*KJ=KHlFs_;G%4}9s{762({h+`0mPgXjk*-dvJ~FmoDMr8(1GZlbk$Xpf9$9dY-Jb9F!G&^gkg}LQHvu! zNgayGwp}>v51Db(^fJ}a=)Atp>QpG*;`bm+3pRTAj3R0Jr+g#lv-EdHEf1nH{gKWN z$v8^-g3urBf!?`P4{6;_FT1PKnoBx-lhz-RQZrG&6Y9->M!~bG-rrt9vlc@yvRK`D zO;W7CdvmyW#GSXxp7mZLO8~fDcGo~0# zFr$F0tuOtnjbgZ|`{Xxo&Kkon;WtHwzxeXlNJxN7k1CJynZQ)-`W6{oo6Pj=Q(f=3 zj78iK;#Y!mkHN7^o_t%w8=m_p=W;>ExYU5yU`?Y#x&g(4-(Bfunc^DFg@VLH-;duR zot&SDtWg1-m@*`{(b(5*q|k-`JgqZe=mnpheji(^H+IN*vEb0PdW#ReOSd8sy>W>kG;Na7wEBE{JLJ^GRG+F)e%1gO%1nnPFA;5>qm*7u=WucQZ4 zksleyQKnQl*gVT0()>i=vYk!}sZ9tgmJhxx1$pF;P@g2si~SScH;_MoLA z4u>%kqpyIbjfTvid5W}Ms4lARhj^IQr5J8f`zbC8V+QcG(4Vit{Pw+PPWIUq&QoEJ zTZb&fO$;2ev5<(h&F5JyuSu~&P8d?;W^Fe_m_6F|Jhi>Y7Vb8|IIa4145MKVeyds=I9jchyvFLTB7uvvQ-%n{9CLNqcASx{?MX7cBfm) zql}nsXi1e+F#0#mN1>;!_vd@?{(P+sO|>8^D*w4H^mFg7F%E|vu&u4GjcULT&y%YXTXJShKI!1;*pk68vcz1Pa~6zqGs5=41Y=;`lU#-uABEKKfi&Q~@D$ ziCS7Rb*yaF=!lJMqpnGv)Ih@5s~k_})58w4O6;soCcjNQPJ905AHf2;xPE3cZFO~_ zvF;n+s^SXA-=*!?ia&VC!vPN3GFIsjf<5t>qwT=>fzWA>p9PEOPF+RkM?F-a|GWZ*dNsk2@UG#cy{Mb%=9hO#cq$%GkE8z_^%4@{a+T*`OG!z zxM!Q-*s=@xc<0o4e2f@~4PVI_6f-Wp7>tM^w9YPq{WE}xRVO|&Y@7UGdP-ins509^2g$e!C z6}iCYAV89S+n~552{Ao&-BpAe;H1*0ALC+y@y&R$rKR0Fl_ep9dW;#k1?)vKD&F72g_w1-yO5#$1N2d-0 zff97=fpZS6&n{+vRBpr$ku$5f&ZrTcC&QdAp>g(13}Srd2a8@u>-hQO*-IqnL7q#8 zLgVhKtIS8KuX6dcJb>l+VsON0;I=+KkA9)|@|VyZJJrff-NN%kO`U<0hAPdt52o8f zHTq`q22QVz-p%z{qt*vGoV8m~pWRiZ9F1ogC?SEBqqtX>=?m{Kro<9$?<8M*qP7~6 zd*5GvKG~c58R{8^J1*B(X?L5=Uu(+9FKsqRiR8vPP(961nTU*x?aF_a{Pwv&7Sd!i zpZwtIw%D}(&K^0QE-QDv`tiA?8xwexC~6SjGuAW|CCIjU>)5E^>sC-m`}tj$J|WDZ zlh%q!mj52jxm~A%m|Hp(77`g>!*!x)>i^t;>CM}niz{KL=r`-+a~0Vo%XVkhY@pjK zR!VIApwj{GFM1O{Nhv-L%E?*ag(X*)9wvXnnsIF~5MYG8?^u0w_hUx$o9iu1i6;-Y zPU&*kALy4)NuoP^_rE7XrONuWtb%B+E!3LhVFeDc@@UNw|1;LR? z`Ht{h+c7;)8FUBa9?g=-gNVJq^sAvOth$Bn?o)3wI;bMcxzay8a6>v9`o)rmB0 zW;;UBI$?FLM_Tz)Tx_$7i`xIxUOAaW%}0`K5#fzVFCAW z(lb-EZ{>=;zcvdoO}|f!%YDA^;hnB=TZK($PK%C`e@$Gl=vM_e_ojK^zS$R_2y%X$ zE!_xir4-cg9aQ#EhFJVP>oNTNS81R}WmOEO#phf* z0Ykc2I0(4pBGbGJ>zWfA3JQbSPhe#0F7SQ|bjHCM~VKJ0=M*b@N#cb8k-2r7#qsLm-&++g?S**i4etu<8~Bjc-75%GCv;!zdJNu z%_uYVy{>i&KQQ6aci~3zKHrF6EV`2wZ(XZR!^1{S@J=_;L9D=ic0IQ>6pR=|7=N2a zHKxU2tJKoKzO)m>64RuSJPnI1JmT7QdG9EXlHFIK!R3HP7Db=&+syX@m+FBx0j2s( zbdVF>?1j1|cVQG}r-0v2q&4=Cd?~x7Tmbf)*(utaYWMX@bZmS;GPdXD>lTb98Cu1l zW=hW=rR84nn}#$kRcBO6+ms&gy%d_Fp{;h)d^5K9a4fZddON&TVe4R*E@C1lNo-_crV?rM0#;nd?o5q zXmJOltMl#C?LG0?#Yz|)gjwsmW{j(c+FQY(MY}zPUXOs5rPL$B( zEy4jeGS`k{brD>3zz)2yik6f_1~#8ZB?QQ#>HVSZ z;L|OyEqDvprNCop{ggn?=la=v2z|_|X8yB3^5FtYhVz^Cg3ws@s>H@Bj|<_O10_qH zP!v%e3@LvGnQl4BgI5^khGpH4Xc)6?H^yfsJtx#kF6$oTXmj1&*d*{yE^?Uha~6hum_pDy@U1S6{iCbQ?Pn zy&k(LS=Rx!z*Px7GqJ3jqRci0YCjaR*{^)?L&_@}|324U4_@A6d%2+@Z;yt9U|8&l zI;ye$K>kc$`%mm{i^rwv7m9CR!;GVi;oE_duY#Oa@V2Q5yv0!av@1_&Rfz=dst9z} zQ8`Us_>ncgL`N#<_dGYtnyIu;7>i6B)|X%E$XpF=J~=`pXgFX6=e@TU;68lHNjo;D ziiRAhbA!}77yo?lT`4OJ6%aPrTs+)w_2fWqpZ^s_S=CO(F}BziP>TIL)kusVz>fT6 zs~6G`8vBaF;NtLFT|Qp--Do5wN2>buTy1-u@o;aJ&|umKirW zBe@w_AG*XsxyDJABg3rKb+hjU!aVra#^gB6jddF^@iN3uz+-^)qA*kiYE)EXQ zXH^J3=hpji9T12y@6=DWwYx`vpaX5!88u6fD8tcQ+iJgZm8wKvf<%HKq~TIKAfzS+ zHLagOhahV;we-L*W)nvnqMleWu(gd20;!_K8Q3*Dw$U1`)7HLk4uZ~N)|3*V4?~w;BzJEk>GM`0-4H_s&Rb4W{vydQFlL7B!98)VFeCqRT0l zCRLv)35ZKehG2BOx1*i8z4|HY%f>X_Bf;935uNFv?L6u4J}i5?pG<0vqDdQw_AnuR zUWA?2o~)Bl7d>j{X>>ehEb36GrRH5Se1@m*9Cw+@eQ$i8YM_uC(mKI@EgxqS?mmt3 z8bf#VCLpP+ZFIF+#G0J>eXreJ>Rm^Tuc^;p!p&UczPEzhNg(+EDm;p;IO|cg94X_o zba{cvcTfj^cR`qHm}hN;73jTw=;oci>y&Zmd*$jaFF$rxjnVGwEdF!wOKPa?o(5zG zhkH%O9THt^_}B`(<`wS(M(T4DQh=!ro~6?SW$L0yra$7cZA3MvMrQe$wKta>>fa=+ zd!9QUOt2dr+Tuym-qBb(`zx~N{zu%ck>8CgX4ff7n{r;N551EOZFju(n%F7j7@3!r z7`LwHfxq-1Kaxyqt?xw!p=crba`aBZno&esFvItnzc8nr$~ejkCRo8#k(VGNxHN;O z;H57KezH9a*jU%0SP(wgL{Tlad-Wo)E`kbLHJv*OTxQT}#Y~8Q`*?xF6*cppO}qq; zHcV53^c%lLvXuO#yZAh3tCMI{V7GTl2*-%`pNOp383 z<8Nh@c|>7uyGvbc{P=b<$_ryR`J6i`w!8R*%f!4sf=Vtd=;ODR*wT-@o&+xX6w|^9 zgxg!a2}92Yzf?(UoEg4*l;Ha#GC{VH!-sZ;`M%wIbfV8UAxxX?%L`0Ii)t6}`CR=lQn?;o7$OOJuBAz_4h< z-xP2N$rNFe4`{mjeRU~Re&cl^e>JpWfxa8FIB&ExU#ixr1uHPtYjj&JwCJv<8PT^> ztUUxTHS}WCZ~|{%%S?L?cg-eu&epyJ9CfR6bDt8)nyLr7Uc$|PldnmTmPAKw0}=G~Ndf+LRHAYVfmWA@5= zX*|_AMOG?yFYBSjP@THdi*8eJirXyl=%J8-Z&j)M8P{d`YR}|vtWo{dK0A)+4z42a zTSK3t8I%iRWlnxh7f;3R5IrsU^rLro|E8Jx9#v4RC?$f|j#j!WZcl7~0Ot$k^YxMI!BmYql+%k%- zEb9Bq}T#S5qpWz>6yW^rww} z=8@1{_F}7~&1+pLHdm7`ehXJxqJ+T(45?PexwY5thX}3`rVI8<~D_Of< zMY%7h(;Mu&^Q}@MJE2`FB?!abT42Zmn(G1`N|h4k`gB3TI<=y{4` zEuRBkGnub9Kv>^a=+-u8C1P$`Oz=Xq2PW(_4Y%up&FA~pRV9owlU4tM?&01}t&<@Z z=y?*N+&A1<(0%-1%(PFLBlm)ubyOY;F(qKqdXE%LM;63Vlg#}MQWW~u7ARS~K`@a@ zlS-o!cOcgEeqNN&J=W2a9Tkh@NuQp5F7?UEO6xrv&uDaho9r}QADkeBqB*slm z-nx>8dzP|Bx+h#{_?X!*vM&3<#)s($q}2yk!PQaWf%AU*3Fc)1QK!03H5IsbYfjQU z>-kcwe>qc1x?Q}{oEN|U#`n^$j-lLb!+yB8K#a}zrUi++d#=|jnXwxfj$15@_fumb zEU5E-uuCvCQ7mqV#rzHbBZQTv=g8&nNjZ!!af^0oJ$x%BG(RU4+cVWa>q28)6WP(h zB%&Hm43%tlaZ-q{uVu1?i$%5)J4A}CpU{rnn>=6pff@3VjR=aAWW+=BR9l^ zWARmq%w(gRuMDM)yF^~V^2s>SDA>GZs0oe@zFnQo9o|f|wJM&D&nxO=n+V!JagJ?2 zU8>()JEM>xCx}&NKBdC~K3iZMex86YdE2ku) z$)znN`5Bh!<~EqU~>t37(7$-R;`J+7^u25WxxS#5TcHiox~8Z*R= ze@3EK=xz#APE23pkR?Z>6#i%DP^UG5KAJGg^2H3r3pZiT%?bwPA*R0tzr5;0?F8?t zyJJ@OtSvXZrO7_ewPCBGdR^$A1LM_5A9b{Sf%uhNeH%^} zkv~oEWJ_@#j%lCL-`$w4u=wFtANfwdH@MTX0Les%+)%ZS0=rK*uLYGRj8T;jIju9* zgdZ$=dPeag^?Co78c`a}2QFfx)qk3?fhBzG*zKZN2aFSmjF+4XqmSnV8m&h~;(4J0b$7{o=QN zyJ^oa>+eu>wF;SFBSQfZN}m>xaH-#WMj`a8U2u8jS;vV;&Bzh<0yecyzD@CC*Ve)v zkB;wE&BOC0bIvlMbn(`mO44_A;QbD?#A^AqLpX^0G5NGsM87`EtHmtx>pD+_ajQw; z?@O~49_v_NTAwYE&hXK@mX2{a>2m$C*7`dO*`KiA?I-x8sU zap0DATgC7uci4j|uWu3;qg@J881ap%&@@fV*R(%+q*UH+L0J8AcZ{kQHa!{JzVG0) ztd*~jIIREZw|d+3HLQHjitDvB-s#c@c@$$i%+2pOaN zd&ubYUWtunuBGMBnTUrM?f9KSdiHw_oGQ}ezWj>v8SJ=7uw$56o!)IE_Jj7lE2e+6 zG_BauR2GS-k_m<7*_!L6iQ3KTe`KyoR%p@La#$}wa?58F6#iR$;vX&YP0xDTaEKDx zV+(c7w&_mdl(X3!+l)){T(o4?zyR zhLq;};F3t|&xrYP<5O6;{t8QftyuJZGCa-CmVIuNzb{v^(NT;k_t$kBL1u~9*KcG` z=eB5`u_G%yXv_Npr`rapoZ|e*=%FaJg5HYS8>KzJh>s3RAZ8--(3Io6>AyqhwD9MbbVuIwcLip0i<>rn>~Bnk~2cyN_l?uTUcfV~Mf&n71b3R8i|BsBc_d@VP2#WL&}K#dYEX&$=pS~`p>Pa#VE^9O;uu38j`i|Sc{ zs+j>FL#tO7ud*=Y^g^=tR|Gssi-U%855iiC5BnO^`)X)EloiZzrHY2C62)Q+#i4aJ zBJwtg_h~RchH14tY&SLz57@sT%Wj@ev0EaA)b4BNhgLN=?F@dn*4R10P&*Zy!Jhd0 zNA|P?Hz1i;$E!7HRD|c$^@Wu{8AWH9x{IW-sWw~UmybiWIM?BU{t?!4hL>O$-xSFL z8*-ZL-9Oro3=`sRo}2S=-_$_Zd52u5bqMW5)CZI`w@Duz6|*v~;$x4V4#YL7?6w<6 zkvk#P7G`t$<$u9qvO22qvBNbih^AJ7VdYI6!amCg(By?acvmvWC0(;ympXLA60yx8IdM0o+|Hpt5{zr!aMg2nDW+!> zhMEf3WJ~#jT2uSmXqCgp7zoptCP(gGE{i8liPic1CEh=?%IJuNo%C!jvc|2CrP+f+ z!BEP>uB9ctBaNw^7X+TVG)oE!qMCZyq`lHQ7sM5h(@k46f37IICitIQa4$u?JN=bi zVe^dWlqu_e@tu-sgRmZQQ)%*kjxLFnr&`w`C{X*zoL-*W>!s_u%AvA|U~(I4%khjn z?g*d4${f#d!D`j~xIlN`BOY`$ijh#l3*vH4{P(u!!_6)C`!-hLe)d0n`8d1{soHqR z?l}*KYV-%NzwW{?vfULer)zCIJ`21!KX=?aKsgeD?}XAUguGjxxqi{u7(qy!%z+{l zP)EK=T#ju^(-?v6q-td#YUJbLr2b4Xh?rnM*SrG@JcMGAZr4an)w|d_i_ZkQfI#|9 z>y1X2&j+Qs@pTNfwEI63UNQ3+r4<21DAJ`ekG1FE;JQlm8U)B8Fts8PxMFz#P zH_&^q*Xebx-@(^0!9lv)A0B&-D$(q04i`B!ZC$!Xluwe|N@EIc-`%q@_o4mu;oGZ_ z@=df~J8C%ATz6WUo=mnH_QfZ$ajIEmcu1qZ`ii4dM$7qglg0wQ`g>_EjBmIy6Fq`L zASa=aBw=}wzQoMu?~MB(lZ>2X=Jy9059TX9(teJwPPhIY-N}T0O8W5_hvL0ND^dz` zPl5eXyy@A}t^3++#Qo^P<$*;mB|Fk&N+=@F%#fTaSV8CejDTvhxjWQi!4J`z(_u9D`osvH@r%@?-a*~O5{|_SXh=#XFhy_d1XCT%6L>%|L68%@_sDYq`wQc=F zsL8nXvT7RjLXAqY`o=ypct-d~A^pbdercT>zmmr7N*+)3P_0NvnwW@elNfbaSSPO$ zr&?R{Ykhn1me40~NnughfEygw^R7*p+6$-ZqszogXN}Hn$DJ%xb`$+$6PHb6*tzjO zq(y;JD-`@r;&!kumyU;<#8)w|7-^=&PQR#3XOl_3jvuqVl8^L$jA;FRz0Cdg_uFbk zg>|D&ecxBcMg-oa!#@h1Y{sYKi)t=Yrm4eGy%po!HWQ7(wWP~jU!}B93$M92${jWM z-hr&hppVq6chq<%g9kQ{Go9K1_SJm$csv-b2#uBe_qPsVmiO{?Cw_lsd(rhPpZzkBuY zcZCli+5axs4~^5FE}l7v2SA%02$*w&UtH?6mLbvEt@$0T}t%s(m zhn8LpT-q}%!Q1+#snD>QnKHd}pS1DtO}W8b>B4Majf;VhmR5q7QA>2s+NJJF&PDGl zjzFzN3D!F(e*7Sz@a?>Po2e? zX@rnidU~=OOxbNM?ZKbdXLaOGkvi&Gh4iPlmk#^M7eWzF2uKY`FZO+tF*|5&7be4T z%~+QnOgk=BmyHevtCoCZ=h^AnA^pU++rAxcO-DB(zp|qNPvJ&eRVo{}D@|5zd7@Om zW2LrN9MO5llD|-?5ZUa6T-aIZ@qf1OmA9fKO+)0=KnH@@>`yO|3%;6rg4ZssvXAHc zo@;!5mcOLwUR!TjtXmD-8TFe)vNKoKFw(PyxrNf$DL~76Vm-uU$YO+i(UoYQXrF!5K z($39dIC7(7wKOaE&AoGFOv&=>9(n%D@5rjhUX2V8eJZ=^$WPN}K2yz?AKuG!6hEjN zQ`YID9%et8hV@*ptxFJ2&}jPO9>|oKF9{c3#DyL7*w*i?kdl;Hp3>WOHF@oVttnV; zuIJSyX8Fxgge(<-nn?#PwANcx))QcADd=u#UBA`-7GFm#Sn_23L%W*7Ck@%K;)7q^ z2hFp_Vj8O!P3(SQV)X2y5nKA`ZiHEHtE{HQoNX4gK!$yz-HXcm#og$YB8>{xT2DFM z3}W)fle(ia?3%YRW@WwxTc7-FLgNYnaaYU6*AJyuSWw{flEK6ItbPu4-%FEUX}IO* zF|H$D?-bM4lpqD29h*95+V}E>q8J4`RbNItiovb?szIp6_wQOj;Ran>6I>QR+;7Or zrJjtgAe*AM%2igB8pwo)27kqBS7+BQTH15}vY>73K8}vf+mdIVkc?GCAK`s=ZsT{1 zMBjdYRC{wzO%ht{9b$~D^L$c@a_({ZGFXL{L;2)6h~EQ2}+)rjX<;w7yGzFS(4Q7qIrsvn8y z&;4Lo&JAdcU{K}=MvwO`{pF+~YV({qT9?WK+<;=4K3jDuA0@HYG2Y8c=x??qXR+oE z9hiS%tE{g6bd#O%I+^O?=Bf{K*X!Ws_2x;h_gTf7Sk$!v?}79|V|-(J;}F*i!W%1X zflG>;+3MKzEGvMs+7NaMbp2VJJJm5m=%dX39Zye?GBNtAoKBxvfpe@q=aqt_0abIG zL07Dwb$!H_qP1_IoYgBuNso;8K144(uvzl*n!NHI@s`OpF;$*D%6ws?aSU1NQtI}W zBx(HaH+ASce6$%JwR%CTXZh&N&aFKw=`v}$R8)}%jVLW7e~_T1Lj1*CCbe9F=4{j9 z8(!bvlDuYL3KtIRz1O)}&;rohCMJLCbREd!@6GPe*>H}M@~RQ4jm9g6U$tx~QZ}uM zUFt+928#PHtH&+A8MFv$`~qVx=*-&qaO4>-5E-7Gl*hUL%#lHgoBIBXj?9|4!Xl42 z)9c@6yr>H7n=9TazUosdlP419WiE214fgM37(ZPWo1P9_X-lWXj@Waqo=R)PHL`P5 z@D%aXCFa&918|ulF2pSFwu|r4GJG1uAyciP6c8LlbR|kq_i5z%l)|{st~GAGz;T9P zkm93A)1h|-DITW5=aNl=WD*9HRr?_(F|7BbXIx3I!%T$347mkpY@=SGK_qcECanR_ z&E}E`CNrLdD;-VO>I$Ei?J-ksw3ZSL-m{Y~Y@{Y}JKCJe$Q$b0fA;<3_TdkZd7!3S zS*hb%(qR85T#Ef1k%u7`F)jSeaxLp&a#(f|5&1~Vc$1B+20l819?#>{mPzk#ipJjc zFB6bKOn&j4TI|uC9dL&3`{+x@5ZsZ*@LnnxCT8%x*yvZ^tFS}Al-V(N#j5I?50b(- zyLy~wj*n`bf~|>(8uw@-((jmDELA21x1Vx%jdRIgElxP7V_#$r;6eA!%f3dII`+NA z)@qo`e^`Rg+I+g5joG`;_wdNNn~1=3{x}NXU8`O(dvhpIjLn*(g&Jb}{8X@7q{5BT z?wGy~IW|_&RWAfty*;F_zisM};Z%7wb{pni;K5Qp~81hx2ozcDrecrjpIiazSU_Jw%V;phfs2EVAVf9-Ygl|yAbe) zcwF^sQuO*puS;7)YIEl!zHn}ORe!WTc`NuJb>WjJcpQH;wOcG5CM2<6a~Z9p1}z)8 z_sv{&lrlI>za9)ID?WQVk)O4zZ9LvA#wr+k>>?rS z2-eia-n_^c84>`T-4^fTQI zFNUWZjihyAJp|H&h_t^8$7!7Y_Ri;YFMhalT(;RWXpJ8}7bxQ`_WLwh_&{jHGv%b7 z%2CNJ_HnbWi8!MqIk1}1OuekmKkdafRl87cOW2!5WL8u0R?z? z3a=v=ukCx+quVcCZ$SX!KsXG)G55@*>bf=pefvkwr87fs`vXNfvP+D@A|fIkw&TwO zsE#L{qX759if{sGm2laIK%0$GtlF9RA;=_itpC%>AwbZuwgGTTIS&nl_?2g|QVYN{ zA@(e9fu%v=eq@RG&0t=I&d^vwfWi*%8s!pt0Ar$O^%p0Dpzbd~g|R7Nyu|w;uNaVp z{a@owrcn|ABzfHTX*32-Ohg*BlxGaC*C9lCo|&T*0L&^N&2GUQ-igYw|QO^t~k=pS$# zK049g2tWb!bo3gZ#)=pLw4ywH9zAQ&b8}FrFxUUdNR1d9na@koufYvLompu;*w|Pw zUS8WwfN^Q73v@l91z#Xd27=g$M<+bdIy=jDFd&4LserpOia1;WB!EFs9x^sj$rXT~ zNKHNta`OTC!lhAWLge5I$~rAXfMM6fC{hNzLLmN5uG^uE|6z@gn^?#PSzQ35VrIqo zrOOGe6RjS{_yvF}u}Dnc_KpN8ln|uabCwDg|BjY6;PrnWXw|pS870mkx7%4CMFBJ= zl;KEwDD}vnxmedq8@#VglvgBpv%E_9alA-omq-7(7vx2PQeM91N81);QMZU5r6>

>9 zO%=IVq%v`f90RO;iDS!sKn7A;L6d?4qgx~qgeYaF21MQ#6`6lCkp6FgqR{`<4pj{_ zy-@6>yanb#A{v56S>eRDNUAocS##RWvVRaQdNkX_PrU!eK%?h(G}ir(GXzn%gXS$n z3L-)}{7+&inH}tBOLl|bk^crnF*g1Ezs3kt^WPeW#6+*n*D?TAWm{#v$lHYn)1tg4 z72;$9dAbmU6;4nX?#T8Jt40sMH8El!;9l^C2`bSz3P0HWuTDzcTt)!M^|p_i=cC&t z57E|-3j#xD00dsR@&71eUkG_3bjkkTfQBauir*uF0h;Xq3?qd6djD48Zz&MmyH!uA z8Ia@vLB>%)@Gv%~sTmlGvA;qp4p>#?xs_W(Mw|KPnx?6!nnHoCMXe-> z0`e`2`tciXsiZ%HjRDgos=arsmQNJ_14@v z)i=1eK5{(fb`v2rdHA9N2FbmgdCU(ykBljR&cYpgt3bPaqvwwy=sEk?t>f+n*Dw&2 zlc#V?0QDfy(a55#TQ4qg(7KT00S0dmy&W8z*R~)SG%T|G=O1-`TrvRos!mc&y-x(t zj?OY>;NI6J_=QFeL89z?N~R^?z9S!5n|(I;*MWjaC;$w$qf4u~*nCyak76wU&;l$w zVr=mmz#@5xi|T;zMH6TKzpp~wWOsmvbuFX=g!+>S0&HPwO~2jAt)nSh#Q?}uwZ66Q z>d$203TPa_eYR=OEffGVfBz323$;Df`S*!v-fMYUhL;c2@+90wAI?b6YIvTWM~ea> zg3S_}>bB2tv%aB$9cx>;dV}MGHWmR{QfPFkWNb za!d#c)fTRWgQn(FbWecBPlxu<&gV(M|8G4Kpv1DE<*FmFnXp7602rRBz+rEWj)_UY zM8h!U>a=sbIly(*h6{iWICaVgv>nwj2($yYVN=gbkr_aRr>^-Z0kw%-dbedpuY%RL zpv@P>egg9VgV(8dC*`y{1fvqGfC0gikr^b#a)cxDAt)6{_@r@k1fDXo1m+0_=8Wi> zY6@;`tT%zNrQQ?Z*u%#SOos=6OIG=W1d=Bg{sU%)Hx9EkpS_ScCl8E*xdw9_d-@VV z;rpgR+pKnOgT%z8`}59m0prup;HZowSe2rJf?LaHU;<2#*wJk%wCn$dT7Nrnpv&iG z20Hc}ITd^BG*HgsRg=bxYsJ}5yMQivzopr0ApKw A`2YX_ literal 0 HcmV?d00001 From 85aa25988d71a3226da1ee2ac6fbb89f6e696457 Mon Sep 17 00:00:00 2001 From: juyeon Date: Sun, 29 Jun 2025 17:28:05 +0900 Subject: [PATCH 06/41] =?UTF-8?q?[ui]:=20=EB=B0=98=EC=9D=91=20screen=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/myPage/ReactionsScreen.kt | 91 +++++++++++++++++++ .../thip/ui/myPage/data/ReactionItem.kt | 8 ++ 2 files changed, 99 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/data/ReactionItem.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt new file mode 100644 index 00000000..18410549 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt @@ -0,0 +1,91 @@ +package com.texthip.thip.ui.myPage.screen + +import androidx.compose.foundation.layout.Arrangement +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.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +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.HeaderButton +import com.texthip.thip.ui.common.cards.NotificationCard +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.myPage.data.ReactionItem +import com.texthip.thip.ui.theme.Black + +@Composable +fun ReactionsScreen() { + //추후 뷰모델로 수정 예정 + val reactions = listOf( + ReactionItem("@user 1님의 피드 글","어쩌구 저쩌구 콘텐츠 내용입니다.어쩌구 저쩌구 콘텐츠 내용입니다.어쩌구 저쩌구 콘텐츠 내용입니다.", "2",false), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 3님의 기록", "어쩌구 저쩌구 콘텐츠 내용입니다.", "17", false), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), + ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true) + ) + Scaffold( + containerColor = Black, + topBar = { + DefaultTopAppBar( + title = stringResource(R.string.reactions), + onLeftClick = {}, + ) + } + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .fillMaxSize() + ) { + Row(modifier = Modifier.padding(start = 20.dp, top = 20.dp, bottom = 20.dp)) { + HeaderButton( + text = stringResource(R.string.likes), + enabled = false + ) + Spacer(modifier = Modifier.width(12.dp)) + HeaderButton( + text = stringResource(R.string.comments), + enabled = false + ) + } + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 20.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + items(reactions) { item -> + NotificationCard( + title = item.title, + message = item.message, + timeAgo = item.timeAgo, + isRead = item.isRead, + onClick = {} + ) + } + } + } + } +} + +@Preview +@Composable +private fun ReactionsScreenPrev() { + ReactionsScreen() +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/ReactionItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/data/ReactionItem.kt new file mode 100644 index 00000000..fc79a4ba --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/data/ReactionItem.kt @@ -0,0 +1,8 @@ +package com.texthip.thip.ui.myPage.data + +data class ReactionItem( + val title: String, + val message: String, + val timeAgo: String, + val isRead: Boolean +) \ No newline at end of file From 0c4f8ddf8414a9ff602a10b4e4bc45b5bcb75e06 Mon Sep 17 00:00:00 2001 From: juyeon Date: Sun, 29 Jun 2025 17:29:34 +0900 Subject: [PATCH 07/41] =?UTF-8?q?[ui]:=20=ED=8E=B8=EC=A7=91=20screen=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84,=20=EC=B9=AD=ED=98=B8=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8,data=20class=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/myPage/EditProfileScreen.kt | 133 +++++++++++++++++ .../com/texthip/thip/ui/myPage/RoleCard.kt | 137 ++++++++++++++++++ .../texthip/thip/ui/myPage/data/RoleItem.kt | 10 ++ 3 files changed, 280 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/RoleCard.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/data/RoleItem.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt new file mode 100644 index 00000000..64c70b3c --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt @@ -0,0 +1,133 @@ +package com.texthip.thip.ui.myPage.screen + + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.FlowRow +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.layout.width +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +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.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.forms.BaseInputTextField +import com.texthip.thip.ui.common.topappbar.InputTopAppBar +import com.texthip.thip.ui.myPage.RoleCard +import com.texthip.thip.ui.myPage.data.RoleItem +import com.texthip.thip.ui.theme.Black +import com.texthip.thip.ui.theme.Lavendar +import com.texthip.thip.ui.theme.NeonGreen +import com.texthip.thip.ui.theme.Orange +import com.texthip.thip.ui.theme.Pink +import com.texthip.thip.ui.theme.Skyblue +import com.texthip.thip.ui.theme.ThipTheme.typography +import com.texthip.thip.ui.theme.White + +@Composable +fun EditProfileScreen() { + var selectedIndex by rememberSaveable { mutableStateOf(-1) } + val roleCards = listOf( + RoleItem(stringResource(R.string.literature),stringResource(R.string.literary_person), R.drawable.character_literature,NeonGreen), + RoleItem(stringResource(R.string.science_it),stringResource(R.string.scientist), R.drawable.character_science,Lavendar), + RoleItem(stringResource(R.string.social_science),stringResource(R.string.sociologist), R.drawable.character_sociology,Orange), + RoleItem(stringResource(R.string.art),stringResource(R.string.artist), R.drawable.character_art, Pink), + RoleItem(stringResource(R.string.humanities),stringResource(R.string.philosopher), R.drawable.character_humanities, Skyblue) + ) + Scaffold( + containerColor = Black, + topBar = { + InputTopAppBar( + title = stringResource(R.string.edit_profile), + isRightButtonEnabled = true, + onLeftClick = {}, + onRightClick = {} + ) + } + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .padding(horizontal = 20.dp) + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Spacer(modifier = Modifier.height(40.dp)) + Text( + text = stringResource(R.string.change_nickname), + style = typography.smalltitle_sb600_s18_h24, + color = White, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) + //TODO 컴포넌트 수정 필요 -> text count 추가, boolean 값으로 icon, limit 설정가능하도록 + BaseInputTextField( + hint = stringResource(R.string.change_nickname) + ) + Spacer(modifier = Modifier.height(40.dp)) + Text( + text = stringResource(R.string.edit_role), + style = typography.smalltitle_sb600_s18_h24, + color = White, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 8.dp) + ) + Text( + text = stringResource(R.string.role_description), + style = typography.copy_r400_s14, + color = White, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) + Text( + text = stringResource(R.string.choice_one), + style = typography.info_r400_s12, + color = NeonGreen, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) + + + FlowRow( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(20.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + roleCards.forEachIndexed { index, RoleItem -> + RoleCard( + genre = RoleItem.genre, + role = RoleItem.role, + imageResId = RoleItem.imageResId, + genreColor = White, + roleColor = RoleItem.roleColor, + selected = selectedIndex == index, + onClick = { selectedIndex = index } + ) + } + } + + } + } +} + +@Preview +@Composable +private fun EditProfileScreenPrev() { + EditProfileScreen() +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/RoleCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/RoleCard.kt new file mode 100644 index 00000000..8e96204f --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/RoleCard.kt @@ -0,0 +1,137 @@ +package com.texthip.thip.ui.myPage + +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.Arrangement +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.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +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.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +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.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.DarkGrey +import com.texthip.thip.ui.theme.NeonGreen +import com.texthip.thip.ui.theme.Pink +import com.texthip.thip.ui.theme.ThipTheme.typography +import com.texthip.thip.ui.theme.White + +@Composable +fun RoleCard( + modifier: Modifier = Modifier, + genre: String, + role: String, + imageResId: Int, + genreColor: Color, + roleColor: Color, + selected: Boolean, + onClick: () -> Unit +) { + val borderColor = if (selected) White else DarkGrey + val bgAlpha = if (selected) 1f else 0.3f + val backgroundBrush = if (selected) { + Brush.verticalGradient( + colors = listOf( + Color.Black.copy(alpha = 0.6f), //상단은 어둡게 + Color.White.copy(alpha = 0.3f) //하단은 밝게 + ) + ) + } else { + SolidColor(Color.Black.copy(alpha = 0.3f)) + } + Box( + modifier = modifier + .width(162.dp) + .height(100.dp) + .clip(RoundedCornerShape(12.dp)) + .background(brush = backgroundBrush, shape = RoundedCornerShape(16.dp)) + .border( + width = 1.dp, + color = borderColor, + shape = RoundedCornerShape(16.dp) + ) + .clickable { onClick() } + ) { + Image( + painter = painterResource(id = imageResId), + contentDescription = null, + modifier = Modifier + .align(Alignment.BottomStart) + .size(80.dp), + contentScale = ContentScale.Fit, + alpha = bgAlpha + ) + Column( + modifier = Modifier + .align(Alignment.TopEnd) + .padding(20.dp), + horizontalAlignment = Alignment.End + ) { + Text( + text = genre, + style = typography.smalltitle_m500_s18_h24, + color = genreColor + ) + Text( + text = role, + style = typography.info_r400_s12, + color = roleColor + ) + } + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000) +@Composable +fun RoleCardPreview() { + var selected1 by rememberSaveable { mutableStateOf(true) } + var selected2 by rememberSaveable { mutableStateOf(false) } + + Row( + modifier = Modifier.padding(20.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + RoleCard( + genre = "문학", + role = "문학가", + imageResId = R.drawable.character_literature, + genreColor = White, + roleColor = NeonGreen, + selected = selected1, + onClick = { selected1 = !selected1 } + ) + + RoleCard( + genre = "예술", + role = "예술가", + imageResId = R.drawable.character_art, + genreColor = White, + roleColor = Pink, + selected = selected2, + onClick = { selected2 = !selected2 } + ) + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/RoleItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/data/RoleItem.kt new file mode 100644 index 00000000..90813f09 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/data/RoleItem.kt @@ -0,0 +1,10 @@ +package com.texthip.thip.ui.myPage.data + +import androidx.compose.ui.graphics.Color + +data class RoleItem( + val genre: String, + val role: String, + val imageResId: Int, + val roleColor: Color +) From b887bf629742c4009f40b5db88e4e1fd79ed468e Mon Sep 17 00:00:00 2001 From: juyeon Date: Sun, 29 Jun 2025 21:21:11 +0900 Subject: [PATCH 08/41] =?UTF-8?q?[ui]:=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20screen=20=EA=B5=AC=ED=98=84(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + .../thip/ui/common/modal/DialogPopup.kt | 4 +- .../thip/ui/myPage/DeleteAccountScreen.kt | 140 ++++++++++++++++++ .../thip/ui/myPage/EditProfileScreen.kt | 1 - .../texthip/thip/ui/myPage/MyPageScreen.kt | 30 +++- .../java/com/texthip/thip/ui/theme/Color.kt | 1 + app/src/main/res/values/strings.xml | 28 ++++ gradle/libs.versions.toml | 2 + 8 files changed, 202 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b679eeb7..cb95dc5b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) implementation(libs.androidx.navigation.compose) + implementation(libs.androidx.foundation) implementation(libs.androidx.navigation.runtime.android) implementation(libs.accompanist.pager) implementation(libs.accompanist.pager.indicators) diff --git a/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt b/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt index 9abb5372..39f683e3 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt @@ -70,14 +70,14 @@ fun DialogPopup( contentColor = colors.White, backgroundColor = colors.Grey02, modifier = Modifier.weight(1f), - onClick = {}, + onClick = onCancel, ) ActionMediumButton( text = stringResource(R.string.yes), contentColor = colors.White, backgroundColor = colors.Purple, modifier = Modifier.weight(1f), - onClick = {}, + onClick = onConfirm, ) } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt new file mode 100644 index 00000000..f325c3b7 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt @@ -0,0 +1,140 @@ +package com.texthip.thip.ui.myPage.screen + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +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.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.withStyle +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.CheckboxButton +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.theme.* +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun DeleteAccountScreen() { + var isChecked by rememberSaveable { mutableStateOf(false) } + val backgroundColor = if (isChecked) Purple else Grey02 + + Scaffold( + containerColor = Black, + topBar = { + DefaultTopAppBar( + title = stringResource(R.string.delete_account), + onLeftClick = {}, + ) + }, + bottomBar = { + Row( + modifier = Modifier + .fillMaxWidth() + .height(56.dp) + .background(backgroundColor) + .clickable(onClick = { + //TODO 탈퇴 로직 + }), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(R.drawable.ic_bye), + contentDescription = null, + tint = colors.White + ) + Text( + text = stringResource(R.string.leave_thip), + color = colors.White, + style = typography.smalltitle_sb600_s18_h24, + modifier = Modifier.padding(horizontal = 8.dp) + ) + } + } + ) { innerPadding -> + Column( + modifier = Modifier + .padding(20.dp) + .padding(innerPadding) + .fillMaxSize() + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .weight(1f) + .background(DarkGrey02, shape = RoundedCornerShape(12.dp)) + .padding(20.dp) + ) { + Column { + Text( + text = stringResource(R.string.leave_thip_notice_title), + style = typography.menu_m500_s16_h24, + color = White + ) + Spacer(modifier = Modifier.height(40.dp)) + Text( + text = buildAnnotatedString { + append(stringResource(R.string.leave_thip_notice_1) + " ") + withStyle(style = SpanStyle(color = Red)) { + append(stringResource(R.string.leave_thip_notice_2)) + } + append(" ") + append(stringResource(R.string.leave_thip_notice_3)) + }, + style = typography.copy_r400_s14, + color = colors.White + ) + Spacer(modifier = Modifier.height(20.dp)) + Text( + text = stringResource(R.string.leave_thip_notice_4), + style = typography.copy_r400_s14, + color = White + ) + Spacer(modifier = Modifier.height(20.dp)) + Text( + text = stringResource(R.string.leave_thip_notice_5), + style = typography.copy_r400_s14, + color = White + ) + } + } + Spacer(modifier = Modifier.height(29.dp)) + Row (verticalAlignment = Alignment.CenterVertically){ + Text( + text = stringResource(R.string.leave_thip_agree), + style = typography.copy_r400_s14, + color = White, + modifier = Modifier.weight(1f) + ) + CheckboxButton( + isChecked = isChecked, + onCheckedChange = { + isChecked = it + + } + ) + } + } + } +} + +@Preview +@Composable +private fun DeleteAccountScreenPrev() { + DeleteAccountScreen() +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt index 64c70b3c..7ba2b26e 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt @@ -9,7 +9,6 @@ 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.layout.width import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt index 7b0a7d03..18a21446 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt @@ -1,5 +1,7 @@ package com.texthip.thip.ui.myPage.screen +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -9,15 +11,21 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold 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.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog import androidx.navigation.NavController import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.MenuItemButton import com.texthip.thip.ui.common.header.AuthorHeader +import com.texthip.thip.ui.common.modal.DialogPopup import com.texthip.thip.ui.common.topappbar.LeftNameTopAppBar import com.texthip.thip.ui.theme.Black import com.texthip.thip.ui.theme.DarkGrey02 @@ -31,6 +39,7 @@ fun MyPageScreen( nickname: String, badgeText: String ) { + var showLogoutDialog by remember { mutableStateOf(false) } Scaffold( containerColor = Black, topBar = { @@ -149,10 +158,27 @@ fun MyPageScreen( backgroundColor = DarkGrey02, hasRightIcon = false, modifier = Modifier.fillMaxWidth(), - onClick = {} + onClick = { + showLogoutDialog = true + } ) } - + if (showLogoutDialog) { + Dialog(onDismissRequest = { showLogoutDialog = false }) { + DialogPopup( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + title = stringResource(R.string.log_out), + description = stringResource(R.string.logout_description), + onCancel = { showLogoutDialog = false }, + onConfirm = { + showLogoutDialog = false + // TODO: 로그아웃 로직 + } + ) + } + } } } } diff --git a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt index 945fd384..85d97d93 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt +++ b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt @@ -20,6 +20,7 @@ val OrangeSub = Color(0xFFFF8B17) val genreColor = Color(0xFFB5B35D) val Skyblue = Color(0xFFA1D5FF) val SkyblueSub = Color(0xFF6DB5EE) +val Pink = Color(0xFFFF8BAC) val Lavendar = Color(0xFFC8A5FF) val LavendaSub = Color(0xFFA76FFF) val Yellow = Color(0xFFFFECA7) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 35a89d41..9d5a4898 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -72,6 +72,34 @@ 회원탈퇴 로그아웃 메뉴 + 좋아요 + 댓글 + 프로필 편집 + 닉네임 변경 + 칭호 편집 + 장르는 칭호와 연결돼요. + 아래에서 하나를 선택해주세요. + + 문학 + 문학가 + 과학·IT + 과학자 + 사회과학 + 사회학자 + 예술 + 예술가 + 인문학 + 철학자 + 또 THIP 해주실거죠? + + THIP 떠나기 + 탈퇴 주의사항 + 회원탈퇴 시 계정정보는 + 복구 불가능 + 하며 90일 이후 재가입이 가능합니다. + -을 사유로 개인정보를 -개월 간 보존합니다. + 등록된 기록 및 게시물은 자동으로 삭제되지 않습니다.(or 삭제됩니다.) + 주의사항을 확인하였으며 이에 동의합니다. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e91013f9..6872b5bc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,6 +9,7 @@ lifecycleRuntimeKtx = "2.8.7" activityCompose = "1.10.1" composeBom = "2024.09.00" navigationCompose = "2.9.0" +foundation = "1.9.0-beta01" navigationRuntimeAndroid = "2.9.0" accompanistPager = "0.36.0" accompanistPagerIndicators = "0.36.0" @@ -29,6 +30,7 @@ androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-man androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } +androidx-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "foundation" } androidx-navigation-runtime-android = { group = "androidx.navigation", name = "navigation-runtime-android", version.ref = "navigationRuntimeAndroid" } accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanistPager" } accompanist-pager-indicators = { group = "com.google.accompanist", name = "accompanist-pager-indicators", version.ref = "accompanistPagerIndicators" } From 384794cf7d7522d5742921b4a7f03c09386d1b60 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 14:31:28 +0900 Subject: [PATCH 09/41] =?UTF-8?q?[fix]:=20push=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=ED=86=A0?= =?UTF-8?q?=EA=B8=80=20=EC=8A=A4=EC=9C=84=EC=B9=98=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/ToggleSwitchButton.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt index 97e4854b..5e70609c 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/ToggleSwitchButton.kt @@ -20,15 +20,15 @@ import com.texthip.thip.R import com.texthip.thip.ui.theme.ThipTheme.colors @Composable -fun ToggleSwitchButton() { - var isChecked by remember { mutableStateOf(true) } - +fun ToggleSwitchButton( + isChecked: Boolean, + onToggleChange: (Boolean) -> Unit +) { + //var isChecked by remember { mutableStateOf(true) } Switch( modifier = Modifier.padding(4.dp), checked = isChecked, - onCheckedChange = { - isChecked = it - }, + onCheckedChange = onToggleChange, colors = SwitchDefaults.colors( checkedThumbColor = colors.White, checkedTrackColor = colors.Purple, @@ -49,11 +49,16 @@ fun ToggleSwitchButton() { @Preview @Composable private fun ToggleSwitchButtonPreview() { + var isChecked by remember { mutableStateOf(true) } + Column( modifier = Modifier .fillMaxSize() .padding(30.dp) ) { - ToggleSwitchButton() + ToggleSwitchButton( + isChecked = isChecked, + onToggleChange = { isChecked = it } + ) } } From de340a37f40c18a97a5be1bcee5beaadd1d2841c Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 14:33:34 +0900 Subject: [PATCH 10/41] =?UTF-8?q?[ui]:=20Toast=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=83=9D=EC=84=B1(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/common/modal/Toast.kt | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt b/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt new file mode 100644 index 00000000..bb1e196a --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt @@ -0,0 +1,69 @@ +package com.texthip.thip.ui.common.modal + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +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.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.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun Toast( + modifier: Modifier = Modifier, + message: String, + date: String +) { + Box( + modifier = modifier + .clip(RoundedCornerShape(12.dp)) + .background(color = colors.DarkGrey02) + .border( + width = 2.dp, + color = colors.Grey02, + shape = RoundedCornerShape(12.dp) + ) + .padding(horizontal = 15.dp, vertical = 15.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = message, + color = colors.White, + style = typography.view_m500_s12_h20 + ) + Text( + text = date, + color = colors.Grey02, + style = typography.timedate_r400_s11 + ) + } + } +} + +@Preview(showBackground = true) +@Composable +fun ToastPrev() { + Toast( + message = stringResource(R.string.push_off), + date = "2025년 6월 29일 22시 30분", + modifier = Modifier.fillMaxWidth() + ) +} \ No newline at end of file From 37177502494877889a65711d1dbcc94c742eea50 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 14:35:42 +0900 Subject: [PATCH 11/41] =?UTF-8?q?[ui]:=20=EC=95=8C=EB=A6=BC=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B5=AC=ED=98=84(#2?= =?UTF-8?q?6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/myPage/MyPageScreen.kt | 2 +- .../thip/ui/myPage/NotificationScreen.kt | 132 ++++++++++++++++++ 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt index 18a21446..8edc6101 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt @@ -112,7 +112,7 @@ fun MyPageScreen( .padding(bottom = 16.dp) ) MenuItemButton( - text = stringResource(R.string.alert_settings), + text = stringResource(R.string.notification_settings), icon = painterResource(R.drawable.ic_notice), contentColor = White, backgroundColor = DarkGrey02, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt new file mode 100644 index 00000000..cf2c8307 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt @@ -0,0 +1,132 @@ +package com.texthip.thip.ui.myPage.screen + +import android.R.attr.text +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.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.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +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.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.ToggleSwitchButton +import com.texthip.thip.ui.common.forms.BaseInputTextField +import com.texthip.thip.ui.common.modal.Toast +import com.texthip.thip.ui.common.topappbar.InputTopAppBar +import com.texthip.thip.ui.myPage.RoleCard +import com.texthip.thip.ui.myPage.data.RoleItem +import com.texthip.thip.ui.theme.Black +import com.texthip.thip.ui.theme.Lavendar +import com.texthip.thip.ui.theme.NeonGreen +import com.texthip.thip.ui.theme.Orange +import com.texthip.thip.ui.theme.Pink +import com.texthip.thip.ui.theme.Skyblue +import com.texthip.thip.ui.theme.ThipTheme.typography +import com.texthip.thip.ui.theme.White +import kotlinx.coroutines.delay + +@Composable +fun NotificationScreen() { + var isChecked by rememberSaveable { mutableStateOf(true) } + var toastMessage by rememberSaveable { mutableStateOf(null) } + + LaunchedEffect(toastMessage) { + if (toastMessage != null) { + delay(2000) + toastMessage = null + } + } + Box(modifier = Modifier.fillMaxSize()) { + toastMessage?.let { message -> + Box( + modifier = Modifier + .fillMaxWidth() + .zIndex(1f) + .align(Alignment.TopCenter) + .padding(horizontal = 15.dp, vertical = 15.dp), + contentAlignment = Alignment.TopCenter + ) { + Toast( + message = stringResource( + if (message == "push_on") R.string.push_on else R.string.push_off + ), + date = "2025년 6월 29일 22시 30분", + modifier = Modifier.fillMaxWidth() + ) +// Spacer(modifier = Modifier.height(37.dp)) + } + } + Scaffold( + containerColor = Black, + topBar = { + InputTopAppBar( + title = stringResource(R.string.notification_settings), + isRightButtonEnabled = true, + onLeftClick = {}, + onRightClick = {} + ) + } + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .padding(horizontal = 20.dp) + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = stringResource(R.string.push_notification), + style = typography.smalltitle_sb600_s18_h24, + color = White, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = stringResource(R.string.notification_description), + style = typography.menu_r400_s14_h24, + color = White, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 8.dp) + .weight(1f) + ) + ToggleSwitchButton( + isChecked = isChecked, + onToggleChange = { + isChecked = it + toastMessage = if (it) "push_on" else "push_off" + } + ) + } + + } + + + } + } +} + +@Preview +@Composable +private fun NotificationScreenPrev() { + NotificationScreen() +} \ No newline at end of file From d2b7661b07b4e7b75d2c1837356c1f3ad40b4ca2 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 15:19:35 +0900 Subject: [PATCH 12/41] =?UTF-8?q?[ui]:=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=ED=8E=98=EC=9D=B4=EC=A7=80=20dialog=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/myPage/DeleteAccountScreen.kt | 37 +++++++++++++++++-- app/src/main/res/values/strings.xml | 11 +++++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt index f325c3b7..132df8bf 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt @@ -21,8 +21,10 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.CheckboxButton +import com.texthip.thip.ui.common.modal.DialogPopup import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.theme.* import com.texthip.thip.ui.theme.ThipTheme.colors @@ -32,6 +34,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography fun DeleteAccountScreen() { var isChecked by rememberSaveable { mutableStateOf(false) } val backgroundColor = if (isChecked) Purple else Grey02 + var isDialogVisible by rememberSaveable { mutableStateOf(false) } Scaffold( containerColor = Black, @@ -47,9 +50,11 @@ fun DeleteAccountScreen() { .fillMaxWidth() .height(56.dp) .background(backgroundColor) - .clickable(onClick = { - //TODO 탈퇴 로직 - }), + .clickable( + enabled = isChecked, + onClick = { + isDialogVisible = true + }), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically ) { @@ -114,7 +119,7 @@ fun DeleteAccountScreen() { } } Spacer(modifier = Modifier.height(29.dp)) - Row (verticalAlignment = Alignment.CenterVertically){ + Row(verticalAlignment = Alignment.CenterVertically) { Text( text = stringResource(R.string.leave_thip_agree), style = typography.copy_r400_s14, @@ -130,6 +135,30 @@ fun DeleteAccountScreen() { ) } } + if (isDialogVisible) { + Dialog(onDismissRequest = { isDialogVisible = false }) { + Box( + modifier = Modifier + .fillMaxSize() + .background(colors.Black.copy(alpha = 0.5f)) + .padding(20.dp), + contentAlignment = Alignment.Center + ) { + DialogPopup( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + title = stringResource(R.string.ask_account_deletion), + description = stringResource(R.string.delete_account_description), + onCancel = { isDialogVisible = false }, + onConfirm = { + isDialogVisible = false + // TODO: 회원탈퇴 로직 + } + ) + } + } + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d5a4898..f482b949 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,7 +66,7 @@ 내 활동 저장 반응 - 알림설정 + 알림설정 가이드 고객센터 회원탈퇴 @@ -80,6 +80,10 @@ 장르는 칭호와 연결돼요. 아래에서 하나를 선택해주세요. + 정말로 탈퇴하시겠어요? + \'예\'를 누르면 모든 기록이 사라져요. + + 문학 문학가 과학·IT @@ -101,6 +105,11 @@ 등록된 기록 및 게시물은 자동으로 삭제되지 않습니다.(or 삭제됩니다.) 주의사항을 확인하였으며 이에 동의합니다. + 푸시 알림 + 알림센터의 모든 알림을 포함해요 + 푸시 알림이 해제되었어요. + 푸시 알림이 설정되었어요. + 진행중 From aa65071380bcc20f92b50279f39a80ea43afaeaa Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 16:49:34 +0900 Subject: [PATCH 13/41] =?UTF-8?q?[chore]:=20=EC=95=88=20=EC=93=B0=EB=8A=94?= =?UTF-8?q?=20import=20=EC=A0=95=EB=A6=AC(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + .../com/texthip/thip/ui/common/modal/DialogPopup.kt | 2 -- .../java/com/texthip/thip/ui/common/modal/Toast.kt | 2 -- .../java/com/texthip/thip/ui/myPage/MyPageScreen.kt | 2 -- .../texthip/thip/ui/myPage/NotificationScreen.kt | 13 ------------- gradle/libs.versions.toml | 2 ++ 6 files changed, 3 insertions(+), 19 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cb95dc5b..a7b39ef7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -53,6 +53,7 @@ dependencies { implementation(libs.androidx.material3) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.foundation) + implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.navigation.runtime.android) implementation(libs.accompanist.pager) implementation(libs.accompanist.pager.indicators) diff --git a/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt b/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt index 39f683e3..d310ba62 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt @@ -12,8 +12,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier diff --git a/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt b/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt index bb1e196a..651b8020 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt @@ -2,13 +2,11 @@ package com.texthip.thip.ui.common.modal import androidx.compose.foundation.background import androidx.compose.foundation.border -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt index 8edc6101..9dae1403 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt @@ -1,7 +1,5 @@ package com.texthip.thip.ui.myPage.screen -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt index cf2c8307..d83fa982 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt @@ -1,15 +1,10 @@ package com.texthip.thip.ui.myPage.screen -import android.R.attr.text -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.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.Scaffold import androidx.compose.material3.Text @@ -27,17 +22,9 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.ToggleSwitchButton -import com.texthip.thip.ui.common.forms.BaseInputTextField import com.texthip.thip.ui.common.modal.Toast import com.texthip.thip.ui.common.topappbar.InputTopAppBar -import com.texthip.thip.ui.myPage.RoleCard -import com.texthip.thip.ui.myPage.data.RoleItem import com.texthip.thip.ui.theme.Black -import com.texthip.thip.ui.theme.Lavendar -import com.texthip.thip.ui.theme.NeonGreen -import com.texthip.thip.ui.theme.Orange -import com.texthip.thip.ui.theme.Pink -import com.texthip.thip.ui.theme.Skyblue import com.texthip.thip.ui.theme.ThipTheme.typography import com.texthip.thip.ui.theme.White import kotlinx.coroutines.delay diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6872b5bc..f596e68f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,6 +10,7 @@ activityCompose = "1.10.1" composeBom = "2024.09.00" navigationCompose = "2.9.0" foundation = "1.9.0-beta01" +lifecycleViewmodelCompose = "2.9.1" navigationRuntimeAndroid = "2.9.0" accompanistPager = "0.36.0" accompanistPagerIndicators = "0.36.0" @@ -31,6 +32,7 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } androidx-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "foundation" } +androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" } androidx-navigation-runtime-android = { group = "androidx.navigation", name = "navigation-runtime-android", version.ref = "navigationRuntimeAndroid" } accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanistPager" } accompanist-pager-indicators = { group = "com.google.accompanist", name = "accompanist-pager-indicators", version.ref = "accompanistPagerIndicators" } From 185c3afbb33c87d4205c3d962f383935870f3584 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 16:50:07 +0900 Subject: [PATCH 14/41] =?UTF-8?q?[feat]:=20=ED=94=BC=EB=93=9C,=20=EC=B1=85?= =?UTF-8?q?=20data=20class=20=EC=83=9D=EC=84=B1(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/data/BookItem.kt | 10 ++++++++++ .../com/texthip/thip/ui/myPage/data/FeedItem.kt | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/data/BookItem.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/BookItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/data/BookItem.kt new file mode 100644 index 00000000..b76cd3dd --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/data/BookItem.kt @@ -0,0 +1,10 @@ +package com.texthip.thip.ui.myPage.data + +data class BookItem( + val id: Int, + val title: String, + val author: String, + val publisher: String, + val imageUrl: String? = null, + val isSaved: Boolean +) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt new file mode 100644 index 00000000..bec3e91a --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt @@ -0,0 +1,17 @@ +package com.texthip.thip.ui.myPage.data + +data class FeedItem( + val id: Int, + val username: String, + val user_role: String, + val book_name: String, + val auth_name: String, + val timedate: String, + val content: String, + val like_count: Int, + val comment_count: Int, + val is_like: Boolean, + val is_saved: Boolean, + val imageUrl: String? = null +) + From 6a30f479dd58b9ee51414cbb4ca22ae37d5cc105 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 16:50:31 +0900 Subject: [PATCH 15/41] =?UTF-8?q?[feat]:=20=EC=B1=85=20Viewmodel=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/myPage/viewmodel/SavedBookViewModel.kt | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/viewmodel/SavedBookViewModel.kt 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 new file mode 100644 index 00000000..fa3f6b59 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/viewmodel/SavedBookViewModel.kt @@ -0,0 +1,92 @@ +package com.texthip.thip.ui.myPage.viewmodel + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import com.texthip.thip.R +import com.texthip.thip.ui.myPage.data.BookItem + +class SavedBookViewModel : ViewModel() { + + var bookList by mutableStateOf>(emptyList()) + private set + init { + loadMockBooks() + } + + private fun loadMockBooks() { + bookList = listOf( + BookItem( + id = 1, + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageUrl = null, + isSaved = true + ), + BookItem( + id = 2, + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageUrl = null, + isSaved = true + ), + BookItem( + id = 3, + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageUrl = null, + isSaved = true + ), + BookItem( + id = 4, + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageUrl = null, + isSaved = true + ), + BookItem( + id = 5, + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageUrl = null, + isSaved = true + ), + BookItem( + id = 6, + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageUrl = null, + isSaved = true + ), + BookItem( + id = 7, + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageUrl = null, + isSaved = true + ), + BookItem( + id = 8, + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageUrl = null, + isSaved = true + ) + ) + } + + fun toggleBookmark(id: Int) { + bookList = bookList.map { + if (it.id == id) it.copy(isSaved = !it.isSaved) else it + } + } +} \ No newline at end of file From 570459535f4320c4ee0e1bc7a313e217909c948c Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 16:51:18 +0900 Subject: [PATCH 16/41] =?UTF-8?q?[ui]:=20=EC=A0=80=EC=9E=A5=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20-=20BookContent=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/SavedScreen.kt | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt new file mode 100644 index 00000000..eb4c9e4f --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -0,0 +1,140 @@ +package com.texthip.thip.ui.myPage.screen + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +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.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Tab +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.getValue +import androidx.compose.runtime.mutableStateOf +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.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +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.cards.CardBookList +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.myPage.viewmodel.SavedBookViewModel +import com.texthip.thip.ui.theme.Black +import com.texthip.thip.ui.theme.Grey02 +import com.texthip.thip.ui.theme.ThipTheme.typography +import com.texthip.thip.ui.theme.White + +@Composable +fun SavedScreen() { + val tabs = listOf("피드", "책") + var selectedTabIndex by rememberSaveable { mutableStateOf(0) } + + Scaffold( + containerColor = Black, + topBar = { + DefaultTopAppBar( + title = stringResource(R.string.saved), + onLeftClick = {}, + ) + } + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .fillMaxSize() + ) { + Box(modifier = Modifier.width(160.dp)) { + TabRow( + selectedTabIndex = selectedTabIndex, + containerColor = Color.Transparent, + contentColor = White, + indicator = { tabPositions -> + val tabPosition = tabPositions[selectedTabIndex] + + Box( + modifier = Modifier + .tabIndicatorOffset(tabPosition) + .width(10.dp) + .height(1.dp) + .align(Alignment.BottomCenter) + .clip(RoundedCornerShape(1.5.dp)) + .background(White) + ) + }, + divider = {}) { + + tabs.forEachIndexed { index, title -> + val selected = selectedTabIndex == index + Tab( + modifier = Modifier.width(80.dp), + selected = selected, + onClick = { selectedTabIndex = index }, + selectedContentColor = White, + unselectedContentColor = Grey02, + text = { + Box( + modifier = Modifier.width(60.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = title, + style = typography.smalltitle_sb600_s18_h24 + ) + } + } + ) + } + } + } + Box(modifier = Modifier.fillMaxWidth()) { + when (selectedTabIndex) { + 0 -> FeedContent() + 1 -> BookContent() + } + } + } + } +} + +@Composable +fun FeedContent() { + Text("피드 항목들 보여주는 Composable") +} + +@Composable +fun BookContent(viewModel: SavedBookViewModel = viewModel()) { + val books = viewModel.bookList + + 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) } + ) + } + } +} + +@Preview +@Composable +private fun SavedScreenPrev() { + SavedScreen() +} \ No newline at end of file From f7ad94f35a5b15fbfdec828a2ef8f3d48f0341d9 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 19:16:54 +0900 Subject: [PATCH 17/41] =?UTF-8?q?[ui]:=20=EC=A0=80=EC=9E=A5=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20-=20=ED=94=BC=EB=93=9C=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=83=9D=EC=84=B1(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/header/ProfileBar.kt | 1 + .../texthip/thip/ui/myPage/SavedFeedCard.kt | 120 ++++++++++++++++++ .../texthip/thip/ui/myPage/data/FeedItem.kt | 10 +- 3 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt b/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt index 20c08449..c1a2b8cc 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt @@ -45,6 +45,7 @@ fun ProfileBar( Row( modifier = modifier .fillMaxWidth() + .padding( vertical = 12.dp), .clickable { onClick() }, verticalAlignment = Alignment.CenterVertically ) { diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt new file mode 100644 index 00000000..d3e2ff73 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt @@ -0,0 +1,120 @@ +package com.texthip.thip.ui.myPage + +import android.R.attr.top +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.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.ActionBookButton +import com.texthip.thip.ui.common.header.ProfileBar +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 SavedFeedCard( + modifier: Modifier = Modifier, + user_name: String, + user_role: String, + book_title: String, + auth_name: String, + imageRes: Painter? = null, + time_ago: Int, + content: String, + like_count: Int, + comment_count: Int, + is_like: Boolean, + is_saved: Boolean = true, + onBookmarkClick: () -> Unit = {} +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp) + ) { + ProfileBar( + profileImage = imageRes, + topText = user_name, + bottomText = user_role, + showSubscriberInfo = false, + hoursAgo = time_ago + ) + ActionBookButton( + bookTitle = book_title, + bookAuthor = auth_name, + onClick = {} + ) + Text( + text = content, + style = typography.feedcopy_r400_s14_h20, + color = White, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp,bottom = 16.dp) + ) + Row ( + verticalAlignment = Alignment.CenterVertically + ){ + Icon( + painter = painterResource(R.drawable.ic_heart), + contentDescription = null, + tint = colors.White + ) + Text( + text = like_count.toString(), + style = typography.feedcopy_r400_s14_h20, + color = White, + modifier = Modifier.padding(start = 5.dp,end = 12.dp) + ) + Icon( + painter = painterResource(R.drawable.ic_comment), + contentDescription = null, + tint = colors.White + ) + Text( + text = comment_count.toString(), + style = typography.feedcopy_r400_s14_h20, + color = White, + modifier = Modifier.padding(start = 5.dp,end = 12.dp) + ) + Spacer(modifier = Modifier.weight(1f)) + Icon( + modifier = Modifier.clickable { onBookmarkClick() }, + painter = painterResource(if (is_saved) R.drawable.ic_save_filled else R.drawable.ic_save), + contentDescription = null, + tint = colors.White + ) + } + + } +} + +@Preview +@Composable +private fun SavedFeedCardPrev() { + SavedFeedCard( + user_name = "user.01", + user_role = stringResource(R.string.influencer), + book_title = "책 제목", + auth_name = "한강", + time_ago = 3, + content = "무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷", + like_count = 10, + comment_count = 5, + is_like = false + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt index bec3e91a..d233d31f 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt @@ -1,17 +1,19 @@ package com.texthip.thip.ui.myPage.data +import androidx.compose.ui.graphics.painter.Painter + data class FeedItem( val id: Int, - val username: String, + val user_name: String, val user_role: String, - val book_name: String, + val book_title: String, val auth_name: String, - val timedate: String, + val time_ago: Int, val content: String, val like_count: Int, val comment_count: Int, val is_like: Boolean, val is_saved: Boolean, - val imageUrl: String? = null + val imageUrl: Painter? = null ) From 1b8e9b3d63ca2d19263b12426fa5f282e8a8cdb8 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 20:48:44 +0900 Subject: [PATCH 18/41] =?UTF-8?q?[ui]:=20=EC=A0=80=EC=9E=A5=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20-=20=ED=94=BC=EB=93=9C=20content=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/myPage/SavedFeedCard.kt | 70 ++++++++---- .../com/texthip/thip/ui/myPage/SavedScreen.kt | 32 +++++- .../texthip/thip/ui/myPage/data/FeedItem.kt | 7 +- .../ui/myPage/viewmodel/SavedFeedViewModel.kt | 104 ++++++++++++++++++ 4 files changed, 188 insertions(+), 25 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/viewmodel/SavedFeedViewModel.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt index d3e2ff73..838b727b 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt @@ -1,6 +1,7 @@ package com.texthip.thip.ui.myPage import android.R.attr.top +import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -21,6 +22,7 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.ActionBookButton import com.texthip.thip.ui.common.header.ProfileBar +import com.texthip.thip.ui.theme.Red import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography import com.texthip.thip.ui.theme.White @@ -30,6 +32,7 @@ fun SavedFeedCard( modifier: Modifier = Modifier, user_name: String, user_role: String, + user_profile_image: Painter? = null, book_title: String, auth_name: String, imageRes: Painter? = null, @@ -39,7 +42,8 @@ fun SavedFeedCard( comment_count: Int, is_like: Boolean, is_saved: Boolean = true, - onBookmarkClick: () -> Unit = {} + onBookmarkClick: () -> Unit = {}, + onLikeClick: () -> Unit = {} ) { Column( modifier = Modifier @@ -47,7 +51,7 @@ fun SavedFeedCard( .padding(20.dp) ) { ProfileBar( - profileImage = imageRes, + profileImage = user_profile_image, topText = user_name, bottomText = user_role, showSubscriberInfo = false, @@ -58,27 +62,38 @@ fun SavedFeedCard( bookAuthor = auth_name, onClick = {} ) + if (imageRes != null) { + Image( + painter = imageRes, + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + ) + } + Text( text = content, style = typography.feedcopy_r400_s14_h20, color = White, modifier = Modifier .fillMaxWidth() - .padding(top = 16.dp,bottom = 16.dp) + .padding(top = 16.dp, bottom = 16.dp) ) - Row ( + Row( verticalAlignment = Alignment.CenterVertically - ){ + ) { Icon( + modifier = Modifier.clickable { onLikeClick() }, painter = painterResource(R.drawable.ic_heart), contentDescription = null, - tint = colors.White + tint = if (is_like) Red else colors.White ) Text( text = like_count.toString(), style = typography.feedcopy_r400_s14_h20, color = White, - modifier = Modifier.padding(start = 5.dp,end = 12.dp) + modifier = Modifier.padding(start = 5.dp, end = 12.dp) ) Icon( painter = painterResource(R.drawable.ic_comment), @@ -89,7 +104,7 @@ fun SavedFeedCard( text = comment_count.toString(), style = typography.feedcopy_r400_s14_h20, color = White, - modifier = Modifier.padding(start = 5.dp,end = 12.dp) + modifier = Modifier.padding(start = 5.dp, end = 12.dp) ) Spacer(modifier = Modifier.weight(1f)) Icon( @@ -106,15 +121,32 @@ fun SavedFeedCard( @Preview @Composable private fun SavedFeedCardPrev() { - SavedFeedCard( - user_name = "user.01", - user_role = stringResource(R.string.influencer), - book_title = "책 제목", - auth_name = "한강", - time_ago = 3, - content = "무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷", - like_count = 10, - comment_count = 5, - is_like = false - ) + Column { + SavedFeedCard( + user_name = "user.01", + user_role = stringResource(R.string.influencer), + book_title = "책 제목", + auth_name = "한강", + time_ago = 3, + content = "무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷", + like_count = 10, + comment_count = 5, + is_like = false, + user_profile_image = R.drawable.character_literature.let { painterResource(it) } + ) + SavedFeedCard( + user_name = "user.01", + user_role = stringResource(R.string.influencer), + book_title = "책 제목", + auth_name = "한강", + time_ago = 3, + content = "한줄만 입력 가능", + like_count = 10, + comment_count = 5, + is_like = false, + imageRes = R.drawable.bookcover_sample.let { painterResource(it) }, + user_profile_image = R.drawable.character_art.let { painterResource(it) } + ) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index eb4c9e4f..781d889a 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -17,6 +17,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 @@ -25,6 +26,7 @@ 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.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -32,7 +34,9 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.texthip.thip.R import com.texthip.thip.ui.common.cards.CardBookList import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.myPage.SavedFeedCard import com.texthip.thip.ui.myPage.viewmodel.SavedBookViewModel +import com.texthip.thip.ui.myPage.viewmodel.SavedFeedViewModel import com.texthip.thip.ui.theme.Black import com.texthip.thip.ui.theme.Grey02 import com.texthip.thip.ui.theme.ThipTheme.typography @@ -111,8 +115,32 @@ fun SavedScreen() { } @Composable -fun FeedContent() { - Text("피드 항목들 보여주는 Composable") +fun FeedContent(viewModel: SavedFeedViewModel = viewModel()) { + val feedList by viewModel.feeds.collectAsState() + + LazyColumn { + items(feedList, key = { it.id }) { feed -> + val bookImagePainter = feed.imageUrl?.let { painterResource(it) } + val profileImagePainter = feed.user_profile_image?.let { painterResource(it) } + + SavedFeedCard( + user_name = feed.user_name, + user_role = feed.user_role, + user_profile_image = profileImagePainter, + book_title = feed.book_title, + auth_name = feed.auth_name, + time_ago = feed.time_ago, + content = feed.content, + like_count = feed.like_count, + comment_count = feed.comment_count, + is_like = feed.is_liked, + is_saved = feed.is_saved, + imageRes = bookImagePainter, + onBookmarkClick = { viewModel.toggleBookmark(feed.id) }, + onLikeClick = { viewModel.toggleLike(feed.id) } + ) + } + } } @Composable diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt index d233d31f..f498de09 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt @@ -1,9 +1,8 @@ package com.texthip.thip.ui.myPage.data -import androidx.compose.ui.graphics.painter.Painter - data class FeedItem( val id: Int, + val user_profile_image: Int? = null, val user_name: String, val user_role: String, val book_title: String, @@ -12,8 +11,8 @@ data class FeedItem( val content: String, val like_count: Int, val comment_count: Int, - val is_like: Boolean, + val is_liked: Boolean, val is_saved: Boolean, - val imageUrl: Painter? = null + val imageUrl: Int? = null ) 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 new file mode 100644 index 00000000..a45b4cde --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/viewmodel/SavedFeedViewModel.kt @@ -0,0 +1,104 @@ +package com.texthip.thip.ui.myPage.viewmodel + +import androidx.compose.ui.res.painterResource +import androidx.lifecycle.ViewModel +import com.texthip.thip.R +import com.texthip.thip.ui.myPage.data.FeedItem +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow + +class SavedFeedViewModel: ViewModel() { + private val _feeds = MutableStateFlow( + listOf( + FeedItem( + id = 1, + user_profile_image = R.drawable.character_art, + user_name = "user", + user_role = "학생", + book_title = "라랄ㄹ라라", + auth_name = "야야야", + time_ago = 15, + content = "진짜최공진짜최공진차최공", + like_count = 25, + comment_count = 4, + is_liked = false, + is_saved = true, + imageUrl = R.drawable.bookcover_sample + ), + FeedItem( + id = 2, + user_profile_image = R.drawable.character_art, + user_name = "user", + user_role = "학생", + book_title = "라랄ㄹ라라", + auth_name = "야야야", + time_ago = 15, + content = "진짜최공진짜최공진차최공", + like_count = 25, + comment_count = 4, + is_liked = false, + is_saved = true, + imageUrl = R.drawable.bookcover_sample + ), + FeedItem( + id = 3, + user_profile_image = R.drawable.character_art, + user_name = "user", + user_role = "학생", + book_title = "라랄ㄹ라라", + auth_name = "야야야", + time_ago = 15, + content = "진짜최공진짜최공진차최공", + like_count = 25, + comment_count = 4, + is_liked = false, + is_saved = true, + imageUrl = R.drawable.bookcover_sample + ), + FeedItem( + id = 4, + user_profile_image = R.drawable.character_literature, + user_name = "user", + user_role = "학생", + book_title = "라랄ㄹ라라", + auth_name = "야야야", + time_ago = 15, + content = "진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공", + like_count = 25, + comment_count = 4, + is_liked = false, + is_saved = true + ), + FeedItem( + id = 5, + user_profile_image = R.drawable.character_sociology, + user_name = "user", + user_role = "학생", + book_title = "라랄ㄹ라라", + auth_name = "야야야", + time_ago = 15, + content = "진짜최공진짜최공진차최공", + like_count = 25, + comment_count = 4, + is_liked = false, + is_saved = true, + imageUrl = R.drawable.bookcover_sample + ), + + + ) + ) + val feeds: StateFlow> = _feeds + + fun toggleBookmark(id: Int) { + _feeds.value = _feeds.value.map { + if (it.id == id) it.copy(is_saved = !it.is_saved) else it + } + } + + fun toggleLike(id: Int) { + _feeds.value = _feeds.value.map { + if (it.id == id) it.copy(is_liked = !it.is_liked) else it + } + } +} \ No newline at end of file From 9ce2027619f1ba5a836a34391e9b2d5313547c4e Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 22:14:43 +0900 Subject: [PATCH 19/41] =?UTF-8?q?[ui]:=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=83=9D=EC=84=B1(#2?= =?UTF-8?q?6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/myPage/DeleteAccountCompleteScreen.kt | 105 ++++++++++++++++++ app/src/main/res/values/strings.xml | 7 ++ 2 files changed, 112 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt new file mode 100644 index 00000000..6090c34e --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt @@ -0,0 +1,105 @@ +package com.texthip.thip.ui.myPage.screen + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +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.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +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.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.theme.Black +import com.texthip.thip.ui.theme.ThipTheme.typography +import com.texthip.thip.ui.theme.White + + +@Composable +fun DeleteAccountCompleteScreen() { + Scaffold( + containerColor = Black, + topBar = { + DefaultTopAppBar( + isRightIconVisible = false, + isTitleVisible = false, + onLeftClick = {}, + ) + } + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(R.string.delete_account_complete), + style = typography.title_b700_s20_h24, + color = White, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) + Text( + text = stringResource(R.string.see_you_again), + style = typography.menu_m500_s16_h24, + color = White, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Image( + painter = painterResource(R.drawable.character_humanities), + contentDescription = null, + modifier = Modifier + .size(80.dp) + ) + Image( + painter = painterResource(R.drawable.character_art), + contentDescription = null, + modifier = Modifier + .size(80.dp) + ) + Image( + painter = painterResource(R.drawable.character_science), + contentDescription = null, + modifier = Modifier + .size(80.dp) + ) + Image( + painter = painterResource(R.drawable.character_sociology), + contentDescription = null, + modifier = Modifier + .width(80.dp) + .height(95.dp) + ) + } + } + } +} + +@Preview +@Composable +private fun DeleteAccountCompleteScreenPrev() { + DeleteAccountCompleteScreen() +} \ 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 f482b949..4092606b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,7 @@ 예술가 인문학 철학자 + 또 THIP 해주실거죠? THIP 떠나기 @@ -104,12 +105,18 @@ -을 사유로 개인정보를 -개월 간 보존합니다. 등록된 기록 및 게시물은 자동으로 삭제되지 않습니다.(or 삭제됩니다.) 주의사항을 확인하였으며 이에 동의합니다. + 탈퇴 완료 + 다음에 또 만나요! + 푸시 알림 알림센터의 모든 알림을 포함해요 푸시 알림이 해제되었어요. 푸시 알림이 설정되었어요. + texthip2025@gmail.com + 이메일로 닉네임과 문의사항을 보내주시면\n빠른 시일 내로 해결해 드릴게요! + 진행중 From f7995a4285e8f58193db9c1734e67d471a829246 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 22:23:06 +0900 Subject: [PATCH 20/41] =?UTF-8?q?[ui]:=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=88=98=EC=A0=95(#2?= =?UTF-8?q?6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt index 6090c34e..e418d76a 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement 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 @@ -64,6 +65,7 @@ fun DeleteAccountCompleteScreen() { .fillMaxWidth() .padding(bottom = 12.dp) ) + Spacer(modifier = Modifier.height(40.dp)) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween From c2eea1b4ab5be24e5bf572562066925bcf63f182 Mon Sep 17 00:00:00 2001 From: juyeon Date: Mon, 30 Jun 2025 23:03:03 +0900 Subject: [PATCH 21/41] =?UTF-8?q?[ui]:=20SavedFeedCard=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt index 838b727b..932b319f 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt @@ -1,5 +1,6 @@ package com.texthip.thip.ui.myPage +import android.R.attr.height import android.R.attr.top import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -8,13 +9,16 @@ 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.foundation.layout.width import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -62,13 +66,15 @@ fun SavedFeedCard( bookAuthor = auth_name, onClick = {} ) + Spacer(modifier = Modifier.height(16.dp)) if (imageRes != null) { Image( painter = imageRes, contentDescription = null, modifier = Modifier .fillMaxWidth() - .padding(top = 16.dp) + .height(480.dp), + contentScale = ContentScale.Crop ) } From ed68e223d9f1ec085dbfface6da64447bebde70a Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 03:15:00 +0900 Subject: [PATCH 22/41] =?UTF-8?q?[chore]:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20data=20->=20mock(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/myPage/{data => mock}/BookItem.kt | 2 +- .../java/com/texthip/thip/ui/myPage/{data => mock}/FeedItem.kt | 2 +- .../com/texthip/thip/ui/myPage/{data => mock}/ReactionItem.kt | 2 +- .../java/com/texthip/thip/ui/myPage/{data => mock}/RoleItem.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename app/src/main/java/com/texthip/thip/ui/myPage/{data => mock}/BookItem.kt (81%) rename app/src/main/java/com/texthip/thip/ui/myPage/{data => mock}/FeedItem.kt (90%) rename app/src/main/java/com/texthip/thip/ui/myPage/{data => mock}/ReactionItem.kt (75%) rename app/src/main/java/com/texthip/thip/ui/myPage/{data => mock}/RoleItem.kt (80%) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/BookItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/mock/BookItem.kt similarity index 81% rename from app/src/main/java/com/texthip/thip/ui/myPage/data/BookItem.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/mock/BookItem.kt index b76cd3dd..bb5c4688 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/data/BookItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/mock/BookItem.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.data +package com.texthip.thip.ui.myPage.mock data class BookItem( val id: Int, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/mock/FeedItem.kt similarity index 90% rename from app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/mock/FeedItem.kt index f498de09..7fb4f312 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/data/FeedItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/mock/FeedItem.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.data +package com.texthip.thip.ui.myPage.mock data class FeedItem( val id: Int, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/ReactionItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/mock/ReactionItem.kt similarity index 75% rename from app/src/main/java/com/texthip/thip/ui/myPage/data/ReactionItem.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/mock/ReactionItem.kt index fc79a4ba..bb13b594 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/data/ReactionItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/mock/ReactionItem.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.data +package com.texthip.thip.ui.myPage.mock data class ReactionItem( val title: String, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/data/RoleItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/mock/RoleItem.kt similarity index 80% rename from app/src/main/java/com/texthip/thip/ui/myPage/data/RoleItem.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/mock/RoleItem.kt index 90813f09..584cdbb7 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/data/RoleItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/mock/RoleItem.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.data +package com.texthip.thip.ui.myPage.mock import androidx.compose.ui.graphics.Color From 3e9b1423c5576688cba18ec5bbe0ed5c47fa2dcf Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 03:15:44 +0900 Subject: [PATCH 23/41] =?UTF-8?q?[chore]:=20mypage.component=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=83=9D=EC=84=B1(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/{ => component}/RoleCard.kt | 5 +---- .../texthip/thip/ui/myPage/{ => component}/SavedFeedCard.kt | 6 +----- 2 files changed, 2 insertions(+), 9 deletions(-) rename app/src/main/java/com/texthip/thip/ui/myPage/{ => component}/RoleCard.kt (95%) rename app/src/main/java/com/texthip/thip/ui/myPage/{ => component}/SavedFeedCard.kt (96%) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/RoleCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt similarity index 95% rename from app/src/main/java/com/texthip/thip/ui/myPage/RoleCard.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt index 8e96204f..1bcce763 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/RoleCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage +package com.texthip.thip.ui.myPage.component import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -8,9 +8,6 @@ import androidx.compose.foundation.layout.Arrangement 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.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt index 932b319f..46779cd2 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedFeedCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt @@ -1,17 +1,13 @@ -package com.texthip.thip.ui.myPage +package com.texthip.thip.ui.myPage.component -import android.R.attr.height -import android.R.attr.top import androidx.compose.foundation.Image 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.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable From b557592f03155d87fec395219b4f40562e5e3c3e Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 03:16:31 +0900 Subject: [PATCH 24/41] =?UTF-8?q?[chore]:=20import=20=EC=A0=95=EB=A6=AC(#2?= =?UTF-8?q?6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt | 4 ++-- app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt | 2 +- .../texthip/thip/ui/myPage/viewmodel/SavedBookViewModel.kt | 3 +-- .../texthip/thip/ui/myPage/viewmodel/SavedFeedViewModel.kt | 3 +-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt index 7ba2b26e..2579768d 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt @@ -24,8 +24,8 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.forms.BaseInputTextField import com.texthip.thip.ui.common.topappbar.InputTopAppBar -import com.texthip.thip.ui.myPage.RoleCard -import com.texthip.thip.ui.myPage.data.RoleItem +import com.texthip.thip.ui.myPage.component.RoleCard +import com.texthip.thip.ui.myPage.mock.RoleItem import com.texthip.thip.ui.theme.Black import com.texthip.thip.ui.theme.Lavendar import com.texthip.thip.ui.theme.NeonGreen diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index 781d889a..c0a75440 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -34,7 +34,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.texthip.thip.R import com.texthip.thip.ui.common.cards.CardBookList import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.myPage.SavedFeedCard +import com.texthip.thip.ui.myPage.component.SavedFeedCard import com.texthip.thip.ui.myPage.viewmodel.SavedBookViewModel import com.texthip.thip.ui.myPage.viewmodel.SavedFeedViewModel import com.texthip.thip.ui.theme.Black 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 fa3f6b59..f0245da0 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 @@ -4,8 +4,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel -import com.texthip.thip.R -import com.texthip.thip.ui.myPage.data.BookItem +import com.texthip.thip.ui.myPage.mock.BookItem class SavedBookViewModel : ViewModel() { 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 a45b4cde..39e89b04 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 @@ -1,9 +1,8 @@ package com.texthip.thip.ui.myPage.viewmodel -import androidx.compose.ui.res.painterResource import androidx.lifecycle.ViewModel import com.texthip.thip.R -import com.texthip.thip.ui.myPage.data.FeedItem +import com.texthip.thip.ui.myPage.mock.FeedItem import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow From c3e106cae43fb2249bb254291d814a31b6946b68 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 04:02:41 +0900 Subject: [PATCH 25/41] =?UTF-8?q?[ui]:=20ReactionScreen=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/common/cards/CardAlarm.kt | 2 ++ .../texthip/thip/ui/myPage/ReactionsScreen.kt | 29 ++++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt index cca99e99..682215c1 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt @@ -25,6 +25,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt index 18410549..fd160109 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt @@ -11,24 +11,29 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.Scaffold 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.HeaderButton +import com.texthip.thip.ui.common.buttons.OptionChipButton import com.texthip.thip.ui.common.cards.NotificationCard import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.myPage.data.ReactionItem +import com.texthip.thip.ui.myPage.mock.ReactionItem import com.texthip.thip.ui.theme.Black @Composable fun ReactionsScreen() { //추후 뷰모델로 수정 예정 val reactions = listOf( - ReactionItem("@user 1님의 피드 글","어쩌구 저쩌구 콘텐츠 내용입니다.어쩌구 저쩌구 콘텐츠 내용입니다.어쩌구 저쩌구 콘텐츠 내용입니다.", "2",false), + ReactionItem("@user 1님의 피드 글","어쩌구 저쩌구 콘텐츠 내용입니다.어쩌구 저쩌구 콘텐츠 내용입니다.어쩌구 저쩌구 콘텐츠 내용입니다.", "2",true), ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), - ReactionItem("@user 3님의 기록", "어쩌구 저쩌구 콘텐츠 내용입니다.", "17", false), + ReactionItem("@user 3님의 기록", "어쩌구 저쩌구 콘텐츠 내용입니다.", "17", true), ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), @@ -39,6 +44,8 @@ fun ReactionsScreen() { ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true), ReactionItem("@user 1님의 글", "어쩌구 저쩌구 콘텐츠 내용입니다.", "7", true) ) + var isLikesSelected by remember { mutableStateOf(false) } + var isCommentsSelected by remember { mutableStateOf(false) } Scaffold( containerColor = Black, topBar = { @@ -53,22 +60,28 @@ fun ReactionsScreen() { .padding(innerPadding) .fillMaxSize() ) { + //TODO card 컴포넌트 수정 후 적용 & 필터링 기능 Row(modifier = Modifier.padding(start = 20.dp, top = 20.dp, bottom = 20.dp)) { - HeaderButton( + OptionChipButton( text = stringResource(R.string.likes), - enabled = false + isFilled = true, + onClick = { + } ) Spacer(modifier = Modifier.width(12.dp)) - HeaderButton( + OptionChipButton( text = stringResource(R.string.comments), - enabled = false + isFilled = true, + onClick = { + } ) + } LazyColumn( modifier = Modifier .fillMaxSize() .padding(horizontal = 20.dp), - verticalArrangement = Arrangement.spacedBy(12.dp) + verticalArrangement = Arrangement.spacedBy(20.dp) ) { items(reactions) { item -> NotificationCard( From 419ad1eb473ae36a0462e2a5994f05c188c749db Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 05:23:38 +0900 Subject: [PATCH 26/41] =?UTF-8?q?[ui]:=20dialog=20popup=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/common/modal/DialogPopup.kt | 2 +- .../texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt | 5 ++--- .../java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt | 6 ++---- .../main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt | 7 +++---- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt b/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt index d310ba62..857948fa 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/modal/DialogPopup.kt @@ -45,7 +45,7 @@ fun DialogPopup( verticalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxSize() ) { - Column { + Column (){ Text( text = title, color = colors.White, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt index e418d76a..393c0a2b 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt @@ -89,11 +89,10 @@ fun DeleteAccountCompleteScreen() { .size(80.dp) ) Image( - painter = painterResource(R.drawable.character_sociology), + painter = painterResource(R.drawable.character_literature), contentDescription = null, modifier = Modifier - .width(80.dp) - .height(95.dp) + .size(80.dp) ) } } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt index 132df8bf..58eb661f 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt @@ -140,14 +140,12 @@ fun DeleteAccountScreen() { Box( modifier = Modifier .fillMaxSize() - .background(colors.Black.copy(alpha = 0.5f)) - .padding(20.dp), + .background(colors.Black.copy(alpha = 0.5f)), contentAlignment = Alignment.Center ) { DialogPopup( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), + .fillMaxWidth(), title = stringResource(R.string.ask_account_deletion), description = stringResource(R.string.delete_account_description), onCancel = { isDialogVisible = false }, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt index 9dae1403..8437304a 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt @@ -73,7 +73,7 @@ fun MyPageScreen( color = White, modifier = Modifier .fillMaxWidth() - .padding(bottom = 16.dp) + .padding(bottom = 12.dp) ) MenuItemButton( text = stringResource(R.string.saved), @@ -107,7 +107,7 @@ fun MyPageScreen( color = White, modifier = Modifier .fillMaxWidth() - .padding(bottom = 16.dp) + .padding(bottom = 12.dp) ) MenuItemButton( text = stringResource(R.string.notification_settings), @@ -165,8 +165,7 @@ fun MyPageScreen( Dialog(onDismissRequest = { showLogoutDialog = false }) { DialogPopup( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), + .fillMaxWidth(), title = stringResource(R.string.log_out), description = stringResource(R.string.logout_description), onCancel = { showLogoutDialog = false }, From 24b59280866b147f7e8affc437784de4891d425c Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 05:24:30 +0900 Subject: [PATCH 27/41] =?UTF-8?q?[ui]:=20=ED=83=AD=EB=B0=94=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/SavedScreen.kt | 9 ++++----- .../thip/ui/myPage/component/SavedFeedCard.kt | 20 ++++++++++++------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index c0a75440..5871e5ec 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -61,7 +61,7 @@ fun SavedScreen() { .padding(innerPadding) .fillMaxSize() ) { - Box(modifier = Modifier.width(160.dp)) { + Box(modifier = Modifier.width(160.dp).padding(start = 20.dp)) { TabRow( selectedTabIndex = selectedTabIndex, containerColor = Color.Transparent, @@ -72,8 +72,8 @@ fun SavedScreen() { Box( modifier = Modifier .tabIndicatorOffset(tabPosition) - .width(10.dp) - .height(1.dp) + .width(48.dp) + .height(2.dp) .align(Alignment.BottomCenter) .clip(RoundedCornerShape(1.5.dp)) .background(White) @@ -84,14 +84,13 @@ fun SavedScreen() { tabs.forEachIndexed { index, title -> val selected = selectedTabIndex == index Tab( - modifier = Modifier.width(80.dp), + modifier = Modifier.width(60.dp), selected = selected, onClick = { selectedTabIndex = index }, selectedContentColor = White, unselectedContentColor = Grey02, text = { Box( - modifier = Modifier.width(60.dp), contentAlignment = Alignment.Center ) { Text( diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt index 46779cd2..ee67d6dd 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt @@ -1,10 +1,12 @@ package com.texthip.thip.ui.myPage.component +import android.R.attr.contentDescription import androidx.compose.foundation.Image 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.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -57,12 +59,16 @@ fun SavedFeedCard( showSubscriberInfo = false, hoursAgo = time_ago ) - ActionBookButton( - bookTitle = book_title, - bookAuthor = auth_name, - onClick = {} - ) - Spacer(modifier = Modifier.height(16.dp)) + Column( + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp, bottom = 16.dp) + ) { + ActionBookButton( + bookTitle = book_title, + bookAuthor = auth_name, + onClick = {}) + } if (imageRes != null) { Image( painter = imageRes, @@ -80,7 +86,7 @@ fun SavedFeedCard( color = White, modifier = Modifier .fillMaxWidth() - .padding(top = 16.dp, bottom = 16.dp) + .padding(bottom = 16.dp) ) Row( verticalAlignment = Alignment.CenterVertically From a06f045e8bde447a1a20e4a3e830ddbabff10e06 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 05:26:07 +0900 Subject: [PATCH 28/41] =?UTF-8?q?[chore]:=20=EC=A0=84=EB=8B=AC=ED=95=A0=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20data=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/myPage/EditProfileScreen.kt | 39 ++++++++++++++++--- .../ui/myPage/viewmodel/SavedFeedViewModel.kt | 8 ++-- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt index 2579768d..88d2c397 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt @@ -2,6 +2,7 @@ package com.texthip.thip.ui.myPage.screen 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 @@ -9,6 +10,7 @@ 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.layout.size import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -39,11 +41,36 @@ import com.texthip.thip.ui.theme.White fun EditProfileScreen() { var selectedIndex by rememberSaveable { mutableStateOf(-1) } val roleCards = listOf( - RoleItem(stringResource(R.string.literature),stringResource(R.string.literary_person), R.drawable.character_literature,NeonGreen), - RoleItem(stringResource(R.string.science_it),stringResource(R.string.scientist), R.drawable.character_science,Lavendar), - RoleItem(stringResource(R.string.social_science),stringResource(R.string.sociologist), R.drawable.character_sociology,Orange), - RoleItem(stringResource(R.string.art),stringResource(R.string.artist), R.drawable.character_art, Pink), - RoleItem(stringResource(R.string.humanities),stringResource(R.string.philosopher), R.drawable.character_humanities, Skyblue) + RoleItem( + stringResource(R.string.literature), + stringResource(R.string.literary_person), + R.drawable.character_literature, + NeonGreen + ), + RoleItem( + stringResource(R.string.science_it), + stringResource(R.string.scientist), + R.drawable.character_science, + Lavendar + ), + RoleItem( + stringResource(R.string.social_science), + stringResource(R.string.sociologist), + R.drawable.character_sociology, + Orange + ), + RoleItem( + stringResource(R.string.art), + stringResource(R.string.artist), + R.drawable.character_art, + Pink + ), + RoleItem( + stringResource(R.string.humanities), + stringResource(R.string.philosopher), + R.drawable.character_humanities, + Skyblue + ) ) Scaffold( containerColor = Black, @@ -60,7 +87,7 @@ fun EditProfileScreen() { modifier = Modifier .padding(innerPadding) .padding(horizontal = 20.dp) - .fillMaxSize(), + .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally ) { Spacer(modifier = Modifier.height(40.dp)) 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 39e89b04..74af21e6 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 @@ -17,12 +17,11 @@ class SavedFeedViewModel: ViewModel() { book_title = "라랄ㄹ라라", auth_name = "야야야", time_ago = 15, - content = "진짜최공진짜최공진차최공", + content = "진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공", like_count = 25, comment_count = 4, is_liked = false, - is_saved = true, - imageUrl = R.drawable.bookcover_sample + is_saved = true ), FeedItem( id = 2, @@ -51,8 +50,7 @@ class SavedFeedViewModel: ViewModel() { like_count = 25, comment_count = 4, is_liked = false, - is_saved = true, - imageUrl = R.drawable.bookcover_sample + is_saved = true ), FeedItem( id = 4, From c2a5d071f69c43ec4604a57d304978a21a5408d1 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 14:44:13 +0900 Subject: [PATCH 29/41] =?UTF-8?q?[refactor]:=20data=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/SavedScreen.kt | 20 +++++++++---------- .../texthip/thip/ui/myPage/mock/FeedItem.kt | 20 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index 5871e5ec..344810dc 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -120,20 +120,20 @@ fun FeedContent(viewModel: SavedFeedViewModel = viewModel()) { LazyColumn { items(feedList, key = { it.id }) { feed -> val bookImagePainter = feed.imageUrl?.let { painterResource(it) } - val profileImagePainter = feed.user_profile_image?.let { painterResource(it) } + val profileImagePainter = feed.userProfileImage?.let { painterResource(it) } SavedFeedCard( - user_name = feed.user_name, - user_role = feed.user_role, + user_name = feed.userName, + user_role = feed.userRole, user_profile_image = profileImagePainter, - book_title = feed.book_title, - auth_name = feed.auth_name, - time_ago = feed.time_ago, + book_title = feed.bookTitle, + auth_name = feed.authName, + time_ago = feed.timeAgo, content = feed.content, - like_count = feed.like_count, - comment_count = feed.comment_count, - is_like = feed.is_liked, - is_saved = feed.is_saved, + like_count = feed.likeCount, + comment_count = feed.commentCount, + is_like = feed.isLiked, + is_saved = feed.isSaved, imageRes = bookImagePainter, onBookmarkClick = { viewModel.toggleBookmark(feed.id) }, onLikeClick = { viewModel.toggleLike(feed.id) } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/mock/FeedItem.kt b/app/src/main/java/com/texthip/thip/ui/myPage/mock/FeedItem.kt index 7fb4f312..fab38a1b 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/mock/FeedItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/mock/FeedItem.kt @@ -2,17 +2,17 @@ package com.texthip.thip.ui.myPage.mock data class FeedItem( val id: Int, - val user_profile_image: Int? = null, - val user_name: String, - val user_role: String, - val book_title: String, - val auth_name: String, - val time_ago: Int, + val userProfileImage: Int? = null, + val userName: String, + val userRole: String, + val bookTitle: String, + val authName: String, + val timeAgo: Int, val content: String, - val like_count: Int, - val comment_count: Int, - val is_liked: Boolean, - val is_saved: Boolean, + val likeCount: Int, + val commentCount: Int, + val isLiked: Boolean, + val isSaved: Boolean, val imageUrl: Int? = null ) From d4d6f9062699bd0740a03beabaf168965bd7b0c7 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 14:50:39 +0900 Subject: [PATCH 30/41] =?UTF-8?q?[refactor]:=20Color=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/texthip/thip/ui/theme/Color.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt index 85d97d93..2f710334 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt +++ b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt @@ -58,6 +58,7 @@ data class ThipColors( val genreColor: Color, val Skyblue: Color, val SkyblueSub: Color, + val Pink: Color, val Lavendar: Color, val LavendaSub: Color, val Yellow: Color, @@ -92,6 +93,7 @@ val defaultThipColors = ThipColors( genreColor = genreColor, Skyblue = Skyblue, SkyblueSub = SkyblueSub, + Pink = Pink, Lavendar = Lavendar, LavendaSub = LavendaSub, Yellow = Yellow, From 435a60c3e840cfbb7e4d7afeeac798da8a3a8bd1 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 14:51:40 +0900 Subject: [PATCH 31/41] =?UTF-8?q?[refactor]:=20AuthorHeader=20OnButtonClic?= =?UTF-8?q?k=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=EB=A1=9C=20=EB=B0=9B?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/common/header/AuthorHeader.kt | 5 +++-- 1 file changed, 3 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 06becf45..38d1ab0d 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 @@ -37,7 +37,8 @@ fun AuthorHeader( profileImage: Painter?, nickname: String, badgeText: String, - buttonText: String + buttonText: String, + onButtonClick: () -> Unit = {} ) { Row( modifier = modifier @@ -83,7 +84,7 @@ fun AuthorHeader( .size(width = 51.dp, height = 35.dp), text = buttonText, textStyle = typography.menu_m500_s14_h24, - onClick = {} + onClick = onButtonClick ) } } From 1e22cd1b24d1bf09c2e1dbed62c779bd2f43fb8b Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 15:10:31 +0900 Subject: [PATCH 32/41] =?UTF-8?q?[refactor]:=20RoleCard=20RoundCornerShape?= =?UTF-8?q?=20=ED=86=B5=EC=9D=BC=20=EB=B0=8F=20=EB=B0=9D=EA=B8=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/component/RoleCard.kt | 10 +++++----- app/src/main/java/com/texthip/thip/ui/theme/Color.kt | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt index 1bcce763..623f5c66 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt @@ -52,8 +52,8 @@ fun RoleCard( val backgroundBrush = if (selected) { Brush.verticalGradient( colors = listOf( - Color.Black.copy(alpha = 0.6f), //상단은 어둡게 - Color.White.copy(alpha = 0.3f) //하단은 밝게 + Color.Black.copy(alpha = 0.7f), //상단은 어둡게 + Color.White.copy(alpha = 0.2f) //하단은 밝게 ) ) } else { @@ -64,11 +64,11 @@ fun RoleCard( .width(162.dp) .height(100.dp) .clip(RoundedCornerShape(12.dp)) - .background(brush = backgroundBrush, shape = RoundedCornerShape(16.dp)) + .background(brush = backgroundBrush, shape = RoundedCornerShape(12.dp)) .border( width = 1.dp, color = borderColor, - shape = RoundedCornerShape(16.dp) + shape = RoundedCornerShape(12.dp) ) .clickable { onClick() } ) { @@ -101,7 +101,7 @@ fun RoleCard( } } -@Preview(showBackground = true, backgroundColor = 0xFF000000) +@Preview(showBackground = true, backgroundColor = 0xFF121212) @Composable fun RoleCardPreview() { var selected1 by rememberSaveable { mutableStateOf(true) } diff --git a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt index 2f710334..18710484 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt +++ b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt @@ -37,7 +37,6 @@ val DarkGrey = Color(0xFF3D3D3D) val DarkGrey50 = Color(0x803D3D3D) val DarkGrey02 = Color(0xFF282828) val DarkGrey01 = Color(0x4B4B4B4B) - val Black = Color(0xFF121212) val Black50 = Color(0x80121212) val Black10 = Color(0x1A121212) From 1c039af10f8254b1b7f45b5db2ff2516e4d13e7d Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 15:25:33 +0900 Subject: [PATCH 33/41] =?UTF-8?q?[refactor]:=20=EC=A0=80=EC=9E=A5=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20->=20=EB=B7=B0=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EA=B4=80=EB=A6=AC=20=EC=9D=BC=EA=B4=80?= =?UTF-8?q?=EC=84=B1=20=EC=9E=88=EA=B2=8C=EB=81=94=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/SavedScreen.kt | 2 +- .../ui/myPage/viewmodel/SavedBookViewModel.kt | 12 +- .../ui/myPage/viewmodel/SavedFeedViewModel.kt | 113 +++++++++--------- 3 files changed, 66 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index 344810dc..c2141823 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -144,7 +144,7 @@ fun FeedContent(viewModel: SavedFeedViewModel = viewModel()) { @Composable fun BookContent(viewModel: SavedBookViewModel = viewModel()) { - val books = viewModel.bookList + val books by viewModel.bookList.collectAsState() LazyColumn { items(items = books, key = { it.id }) { book -> 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 f0245da0..b271d533 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 @@ -5,17 +5,21 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import com.texthip.thip.ui.myPage.mock.BookItem +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map class SavedBookViewModel : ViewModel() { - var bookList by mutableStateOf>(emptyList()) - private set + private val _bookList = MutableStateFlow>(emptyList()) + val bookList: StateFlow> = _bookList + init { loadMockBooks() } private fun loadMockBooks() { - bookList = listOf( + _bookList.value = listOf( BookItem( id = 1, title = "이기적 유전자", @@ -84,7 +88,7 @@ class SavedBookViewModel : ViewModel() { } fun toggleBookmark(id: Int) { - bookList = bookList.map { + _bookList.value = _bookList.value.map { if (it.id == id) it.copy(isSaved = !it.isSaved) else it } } 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 74af21e6..f0fcbeb5 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 @@ -11,75 +11,76 @@ class SavedFeedViewModel: ViewModel() { listOf( FeedItem( id = 1, - user_profile_image = R.drawable.character_art, - user_name = "user", - user_role = "학생", - book_title = "라랄ㄹ라라", - auth_name = "야야야", - time_ago = 15, + userProfileImage = R.drawable.character_art, + userName = "user", + userRole = "학생", + bookTitle = "라랄ㄹ라라", + authName = "야야야", + timeAgo = 15, content = "진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공", - like_count = 25, - comment_count = 4, - is_liked = false, - is_saved = true + likeCount = 25, + commentCount = 4, + isLiked = false, + isSaved = true ), FeedItem( id = 2, - user_profile_image = R.drawable.character_art, - user_name = "user", - user_role = "학생", - book_title = "라랄ㄹ라라", - auth_name = "야야야", - time_ago = 15, - content = "진짜최공진짜최공진차최공", - like_count = 25, - comment_count = 4, - is_liked = false, - is_saved = true, + userProfileImage = R.drawable.character_art, + userName = "user", + userRole = "학생", + bookTitle = "라랄ㄹ라라", + authName = "야야야", + timeAgo = 15, + content = "너무 재밌네요..", + likeCount = 25, + commentCount = 4, + isLiked = false, + isSaved = true, imageUrl = R.drawable.bookcover_sample ), FeedItem( id = 3, - user_profile_image = R.drawable.character_art, - user_name = "user", - user_role = "학생", - book_title = "라랄ㄹ라라", - auth_name = "야야야", - time_ago = 15, - content = "진짜최공진짜최공진차최공", - like_count = 25, - comment_count = 4, - is_liked = false, - is_saved = true + userProfileImage = R.drawable.character_art, + userName = "user", + userRole = "학생", + bookTitle = "라랄ㄹ라라", + authName = "야야야", + timeAgo = 15, + content = "너무 재밌네요..", + likeCount = 25, + commentCount = 4, + isLiked = false, + isSaved = true, + imageUrl = R.drawable.bookcover_sample ), FeedItem( id = 4, - user_profile_image = R.drawable.character_literature, - user_name = "user", - user_role = "학생", - book_title = "라랄ㄹ라라", - auth_name = "야야야", - time_ago = 15, + userProfileImage = R.drawable.character_art, + userName = "user", + userRole = "학생", + bookTitle = "책이름책이름", + authName = "저자이름저자이름", + timeAgo = 25, content = "진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공", - like_count = 25, - comment_count = 4, - is_liked = false, - is_saved = true + likeCount = 25, + commentCount = 4, + isLiked = false, + isSaved = true, + imageUrl = R.drawable.bookcover_sample ), FeedItem( id = 5, - user_profile_image = R.drawable.character_sociology, - user_name = "user", - user_role = "학생", - book_title = "라랄ㄹ라라", - auth_name = "야야야", - time_ago = 15, - content = "진짜최공진짜최공진차최공", - like_count = 25, - comment_count = 4, - is_liked = false, - is_saved = true, - imageUrl = R.drawable.bookcover_sample + userProfileImage = R.drawable.character_art, + userName = "user", + userRole = "학생", + bookTitle = "책이름책이름", + authName = "저자이름저자이름", + timeAgo = 25, + content = "진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공진짜최공진짜최공진차최공", + likeCount = 25, + commentCount = 4, + isLiked = true, + isSaved = true ), @@ -89,13 +90,13 @@ class SavedFeedViewModel: ViewModel() { fun toggleBookmark(id: Int) { _feeds.value = _feeds.value.map { - if (it.id == id) it.copy(is_saved = !it.is_saved) else it + if (it.id == id) it.copy(isSaved = !it.isSaved) else it } } fun toggleLike(id: Int) { _feeds.value = _feeds.value.map { - if (it.id == id) it.copy(is_liked = !it.is_liked) else it + if (it.id == id) it.copy(isLiked = !it.isLiked) else it } } } \ No newline at end of file From 3e893d68b1148fe9237a7c210b14183c3e5d049c Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 17:24:20 +0900 Subject: [PATCH 34/41] =?UTF-8?q?[refactor]:=20SavedScreen,=20SavedFeedCar?= =?UTF-8?q?d=20->=20feedItem=20=EC=A0=81=EC=9A=A9(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/SavedScreen.kt | 15 +-- .../thip/ui/myPage/component/SavedFeedCard.kt | 105 ++++++++++-------- 2 files changed, 61 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index c2141823..38480e89 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -123,18 +123,9 @@ fun FeedContent(viewModel: SavedFeedViewModel = viewModel()) { val profileImagePainter = feed.userProfileImage?.let { painterResource(it) } SavedFeedCard( - user_name = feed.userName, - user_role = feed.userRole, - user_profile_image = profileImagePainter, - book_title = feed.bookTitle, - auth_name = feed.authName, - time_ago = feed.timeAgo, - content = feed.content, - like_count = feed.likeCount, - comment_count = feed.commentCount, - is_like = feed.isLiked, - is_saved = feed.isSaved, - imageRes = bookImagePainter, + feedItem = feed, + bookImage = bookImagePainter, + profileImage = profileImagePainter, onBookmarkClick = { viewModel.toggleBookmark(feed.id) }, onLikeClick = { viewModel.toggleLike(feed.id) } ) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt index ee67d6dd..0e35a117 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.ActionBookButton import com.texthip.thip.ui.common.header.ProfileBar +import com.texthip.thip.ui.myPage.mock.FeedItem import com.texthip.thip.ui.theme.Red import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -32,18 +33,9 @@ import com.texthip.thip.ui.theme.White @Composable fun SavedFeedCard( modifier: Modifier = Modifier, - user_name: String, - user_role: String, - user_profile_image: Painter? = null, - book_title: String, - auth_name: String, - imageRes: Painter? = null, - time_ago: Int, - content: String, - like_count: Int, - comment_count: Int, - is_like: Boolean, - is_saved: Boolean = true, + feedItem: FeedItem, + bookImage: Painter? = null, + profileImage: Painter? = null, onBookmarkClick: () -> Unit = {}, onLikeClick: () -> Unit = {} ) { @@ -53,11 +45,11 @@ fun SavedFeedCard( .padding(20.dp) ) { ProfileBar( - profileImage = user_profile_image, - topText = user_name, - bottomText = user_role, + profileImage = profileImage, + topText = feedItem.userName, + bottomText = feedItem.userRole, showSubscriberInfo = false, - hoursAgo = time_ago + hoursAgo = feedItem.timeAgo ) Column( modifier = Modifier @@ -65,13 +57,14 @@ fun SavedFeedCard( .padding(top = 16.dp, bottom = 16.dp) ) { ActionBookButton( - bookTitle = book_title, - bookAuthor = auth_name, - onClick = {}) + bookTitle = feedItem.bookTitle, + bookAuthor = feedItem.authName, + onClick = {} + ) } - if (imageRes != null) { + if (bookImage != null) { Image( - painter = imageRes, + painter = bookImage , contentDescription = null, modifier = Modifier .fillMaxWidth() @@ -81,7 +74,7 @@ fun SavedFeedCard( } Text( - text = content, + text = feedItem.content, style = typography.feedcopy_r400_s14_h20, color = White, modifier = Modifier @@ -95,10 +88,10 @@ fun SavedFeedCard( modifier = Modifier.clickable { onLikeClick() }, painter = painterResource(R.drawable.ic_heart), contentDescription = null, - tint = if (is_like) Red else colors.White + tint = if (feedItem.isLiked) Red else colors.White ) Text( - text = like_count.toString(), + text = feedItem.likeCount.toString(), style = typography.feedcopy_r400_s14_h20, color = White, modifier = Modifier.padding(start = 5.dp, end = 12.dp) @@ -109,7 +102,7 @@ fun SavedFeedCard( tint = colors.White ) Text( - text = comment_count.toString(), + text = feedItem.commentCount.toString(), style = typography.feedcopy_r400_s14_h20, color = White, modifier = Modifier.padding(start = 5.dp, end = 12.dp) @@ -117,7 +110,7 @@ fun SavedFeedCard( Spacer(modifier = Modifier.weight(1f)) Icon( modifier = Modifier.clickable { onBookmarkClick() }, - painter = painterResource(if (is_saved) R.drawable.ic_save_filled else R.drawable.ic_save), + painter = painterResource(if (feedItem.isSaved) R.drawable.ic_save_filled else R.drawable.ic_save), contentDescription = null, tint = colors.White ) @@ -129,32 +122,50 @@ fun SavedFeedCard( @Preview @Composable private fun SavedFeedCardPrev() { + val feed1 = FeedItem( + id = 1, + userProfileImage = R.drawable.character_literature, + userName = "user.01", + userRole = stringResource(R.string.influencer), + bookTitle = "책 제목", + authName = "한강", + timeAgo = 3, + content = "무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷", + likeCount = 10, + commentCount = 5, + isLiked = false, + isSaved = true, + imageUrl = null + ) + + val feed2 = FeedItem( + id = 2, + userProfileImage = R.drawable.character_art, + userName = "user.01", + userRole = stringResource(R.string.influencer), + bookTitle = "책 제목", + authName = "한강", + timeAgo = 3, + content = "한줄만 입력 가능", + likeCount = 10, + commentCount = 5, + isLiked = false, + isSaved = true, + imageUrl = R.drawable.bookcover_sample + ) + Column { SavedFeedCard( - user_name = "user.01", - user_role = stringResource(R.string.influencer), - book_title = "책 제목", - auth_name = "한강", - time_ago = 3, - content = "무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷무한대로입력가능합니닷", - like_count = 10, - comment_count = 5, - is_like = false, - user_profile_image = R.drawable.character_literature.let { painterResource(it) } + feedItem = feed1, + profileImage = painterResource(feed1.userProfileImage!!), + bookImage = null ) SavedFeedCard( - user_name = "user.01", - user_role = stringResource(R.string.influencer), - book_title = "책 제목", - auth_name = "한강", - time_ago = 3, - content = "한줄만 입력 가능", - like_count = 10, - comment_count = 5, - is_like = false, - imageRes = R.drawable.bookcover_sample.let { painterResource(it) }, - user_profile_image = R.drawable.character_art.let { painterResource(it) } + feedItem = feed2, + profileImage = painterResource(feed2.userProfileImage!!), + bookImage = painterResource(feed2.imageUrl!!) ) } + } \ No newline at end of file From 1e3a2b18a19e5ac4690c2b571485266bc2efa619 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 17:45:29 +0900 Subject: [PATCH 35/41] =?UTF-8?q?[refactor]:=20color=20=EC=88=98=EC=A0=95(?= =?UTF-8?q?#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/myPage/DeleteAccountCompleteScreen.kt | 10 +++--- .../thip/ui/myPage/DeleteAccountScreen.kt | 25 ++++++++----- .../thip/ui/myPage/EditProfileScreen.kt | 33 +++++++---------- .../texthip/thip/ui/myPage/MyPageScreen.kt | 36 +++++++++---------- .../thip/ui/myPage/NotificationScreen.kt | 10 +++--- .../texthip/thip/ui/myPage/ReactionsScreen.kt | 1 - .../com/texthip/thip/ui/myPage/SavedScreen.kt | 7 ++-- .../thip/ui/myPage/component/RoleCard.kt | 7 ++-- .../thip/ui/myPage/component/SavedFeedCard.kt | 8 ++--- 9 files changed, 66 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt index 393c0a2b..fc79be00 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountCompleteScreen.kt @@ -10,7 +10,6 @@ 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.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -23,15 +22,14 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.theme.Black +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 DeleteAccountCompleteScreen() { Scaffold( - containerColor = Black, + containerColor = colors.Black, topBar = { DefaultTopAppBar( isRightIconVisible = false, @@ -50,7 +48,7 @@ fun DeleteAccountCompleteScreen() { Text( text = stringResource(R.string.delete_account_complete), style = typography.title_b700_s20_h24, - color = White, + color = colors.White, textAlign = TextAlign.Center, modifier = Modifier .fillMaxWidth() @@ -59,7 +57,7 @@ fun DeleteAccountCompleteScreen() { Text( text = stringResource(R.string.see_you_again), style = typography.menu_m500_s16_h24, - color = White, + color = colors.White, textAlign = TextAlign.Center, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt index 58eb661f..b961f6a3 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt @@ -2,7 +2,15 @@ package com.texthip.thip.ui.myPage.screen import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +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.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold @@ -26,18 +34,19 @@ import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.CheckboxButton import com.texthip.thip.ui.common.modal.DialogPopup import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.theme.* +import com.texthip.thip.ui.theme.DarkGrey02 +import com.texthip.thip.ui.theme.Red import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun DeleteAccountScreen() { var isChecked by rememberSaveable { mutableStateOf(false) } - val backgroundColor = if (isChecked) Purple else Grey02 + val backgroundColor = if (isChecked) colors.Purple else colors.Grey02 var isDialogVisible by rememberSaveable { mutableStateOf(false) } Scaffold( - containerColor = Black, + containerColor = colors.Black, topBar = { DefaultTopAppBar( title = stringResource(R.string.delete_account), @@ -89,7 +98,7 @@ fun DeleteAccountScreen() { Text( text = stringResource(R.string.leave_thip_notice_title), style = typography.menu_m500_s16_h24, - color = White + color = colors.White ) Spacer(modifier = Modifier.height(40.dp)) Text( @@ -108,13 +117,13 @@ fun DeleteAccountScreen() { Text( text = stringResource(R.string.leave_thip_notice_4), style = typography.copy_r400_s14, - color = White + color = colors.White ) Spacer(modifier = Modifier.height(20.dp)) Text( text = stringResource(R.string.leave_thip_notice_5), style = typography.copy_r400_s14, - color = White + color = colors.White ) } } @@ -123,7 +132,7 @@ fun DeleteAccountScreen() { Text( text = stringResource(R.string.leave_thip_agree), style = typography.copy_r400_s14, - color = White, + color = colors.White, modifier = Modifier.weight(1f) ) CheckboxButton( diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt index 88d2c397..4029888f 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/EditProfileScreen.kt @@ -2,15 +2,12 @@ package com.texthip.thip.ui.myPage.screen 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.fillMaxSize 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.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -28,14 +25,8 @@ import com.texthip.thip.ui.common.forms.BaseInputTextField import com.texthip.thip.ui.common.topappbar.InputTopAppBar import com.texthip.thip.ui.myPage.component.RoleCard import com.texthip.thip.ui.myPage.mock.RoleItem -import com.texthip.thip.ui.theme.Black -import com.texthip.thip.ui.theme.Lavendar -import com.texthip.thip.ui.theme.NeonGreen -import com.texthip.thip.ui.theme.Orange -import com.texthip.thip.ui.theme.Pink -import com.texthip.thip.ui.theme.Skyblue +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 EditProfileScreen() { @@ -45,35 +36,35 @@ fun EditProfileScreen() { stringResource(R.string.literature), stringResource(R.string.literary_person), R.drawable.character_literature, - NeonGreen + colors.NeonGreen ), RoleItem( stringResource(R.string.science_it), stringResource(R.string.scientist), R.drawable.character_science, - Lavendar + colors.Lavendar ), RoleItem( stringResource(R.string.social_science), stringResource(R.string.sociologist), R.drawable.character_sociology, - Orange + colors.Orange ), RoleItem( stringResource(R.string.art), stringResource(R.string.artist), R.drawable.character_art, - Pink + colors.Pink ), RoleItem( stringResource(R.string.humanities), stringResource(R.string.philosopher), R.drawable.character_humanities, - Skyblue + colors.Skyblue ) ) Scaffold( - containerColor = Black, + containerColor = colors.Black, topBar = { InputTopAppBar( title = stringResource(R.string.edit_profile), @@ -94,7 +85,7 @@ fun EditProfileScreen() { Text( text = stringResource(R.string.change_nickname), style = typography.smalltitle_sb600_s18_h24, - color = White, + color = colors.White, modifier = Modifier .fillMaxWidth() .padding(bottom = 12.dp) @@ -107,7 +98,7 @@ fun EditProfileScreen() { Text( text = stringResource(R.string.edit_role), style = typography.smalltitle_sb600_s18_h24, - color = White, + color = colors.White, modifier = Modifier .fillMaxWidth() .padding(bottom = 8.dp) @@ -115,7 +106,7 @@ fun EditProfileScreen() { Text( text = stringResource(R.string.role_description), style = typography.copy_r400_s14, - color = White, + color = colors.White, modifier = Modifier .fillMaxWidth() .padding(bottom = 12.dp) @@ -123,7 +114,7 @@ fun EditProfileScreen() { Text( text = stringResource(R.string.choice_one), style = typography.info_r400_s12, - color = NeonGreen, + color = colors.NeonGreen, modifier = Modifier .fillMaxWidth() .padding(bottom = 12.dp) @@ -140,7 +131,7 @@ fun EditProfileScreen() { genre = RoleItem.genre, role = RoleItem.role, imageResId = RoleItem.imageResId, - genreColor = White, + genreColor = colors.White, roleColor = RoleItem.roleColor, selected = selectedIndex == index, onClick = { selectedIndex = index } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt index 8437304a..e746dfca 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt @@ -26,10 +26,8 @@ import com.texthip.thip.ui.common.header.AuthorHeader import com.texthip.thip.ui.common.modal.DialogPopup import com.texthip.thip.ui.common.topappbar.LeftNameTopAppBar import com.texthip.thip.ui.theme.Black -import com.texthip.thip.ui.theme.DarkGrey02 -import com.texthip.thip.ui.theme.Red +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 MyPageScreen( @@ -70,7 +68,7 @@ fun MyPageScreen( Text( text = stringResource(R.string.my_activity), style = typography.smalltitle_sb600_s18_h24, - color = White, + color = colors.White, modifier = Modifier .fillMaxWidth() .padding(bottom = 12.dp) @@ -78,8 +76,8 @@ fun MyPageScreen( MenuItemButton( text = stringResource(R.string.saved), icon = painterResource(R.drawable.ic_save), - contentColor = White, - backgroundColor = DarkGrey02, + contentColor = colors.White, + backgroundColor = colors.DarkGrey02, hasRightIcon = true, modifier = Modifier.fillMaxWidth(), onClick = {} @@ -88,8 +86,8 @@ fun MyPageScreen( MenuItemButton( text = stringResource(R.string.reactions), icon = painterResource(R.drawable.ic_heart), - contentColor = White, - backgroundColor = DarkGrey02, + contentColor = colors.White, + backgroundColor = colors.DarkGrey02, hasRightIcon = true, modifier = Modifier.fillMaxWidth(), onClick = {} @@ -104,7 +102,7 @@ fun MyPageScreen( Text( text = stringResource(R.string.menu), style = typography.smalltitle_sb600_s18_h24, - color = White, + color = colors.White, modifier = Modifier .fillMaxWidth() .padding(bottom = 12.dp) @@ -112,8 +110,8 @@ fun MyPageScreen( MenuItemButton( text = stringResource(R.string.notification_settings), icon = painterResource(R.drawable.ic_notice), - contentColor = White, - backgroundColor = DarkGrey02, + contentColor = colors.White, + backgroundColor = colors.DarkGrey02, hasRightIcon = true, modifier = Modifier.fillMaxWidth(), onClick = {} @@ -122,8 +120,8 @@ fun MyPageScreen( MenuItemButton( text = stringResource(R.string.guide), icon = painterResource(R.drawable.ic_guide), - contentColor = White, - backgroundColor = DarkGrey02, + contentColor = colors.White, + backgroundColor = colors.DarkGrey02, hasRightIcon = true, modifier = Modifier.fillMaxWidth(), onClick = {} @@ -132,8 +130,8 @@ fun MyPageScreen( MenuItemButton( text = stringResource(R.string.customer_service), icon = painterResource(R.drawable.ic_center), - contentColor = White, - backgroundColor = DarkGrey02, + contentColor = colors.White, + backgroundColor = colors.DarkGrey02, hasRightIcon = true, modifier = Modifier.fillMaxWidth(), onClick = {} @@ -142,8 +140,8 @@ fun MyPageScreen( MenuItemButton( text = stringResource(R.string.delete_account), icon = painterResource(R.drawable.ic_bye), - contentColor = White, - backgroundColor = DarkGrey02, + contentColor = colors.White, + backgroundColor = colors.DarkGrey02, hasRightIcon = true, modifier = Modifier.fillMaxWidth(), onClick = {} @@ -152,8 +150,8 @@ fun MyPageScreen( MenuItemButton( text = stringResource(R.string.log_out), icon = painterResource(R.drawable.ic_logout), - contentColor = Red, - backgroundColor = DarkGrey02, + contentColor = colors.Red, + backgroundColor = colors.DarkGrey02, hasRightIcon = false, modifier = Modifier.fillMaxWidth(), onClick = { diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt index d83fa982..2f73a0a0 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt @@ -24,9 +24,8 @@ import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.ToggleSwitchButton import com.texthip.thip.ui.common.modal.Toast import com.texthip.thip.ui.common.topappbar.InputTopAppBar -import com.texthip.thip.ui.theme.Black +import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography -import com.texthip.thip.ui.theme.White import kotlinx.coroutines.delay @Composable @@ -57,11 +56,10 @@ fun NotificationScreen() { date = "2025년 6월 29일 22시 30분", modifier = Modifier.fillMaxWidth() ) -// Spacer(modifier = Modifier.height(37.dp)) } } Scaffold( - containerColor = Black, + containerColor = colors.Black, topBar = { InputTopAppBar( title = stringResource(R.string.notification_settings), @@ -81,7 +79,7 @@ fun NotificationScreen() { Text( text = stringResource(R.string.push_notification), style = typography.smalltitle_sb600_s18_h24, - color = White, + color = colors.White, modifier = Modifier .fillMaxWidth() .padding(bottom = 12.dp) @@ -90,7 +88,7 @@ fun NotificationScreen() { Text( text = stringResource(R.string.notification_description), style = typography.menu_r400_s14_h24, - color = White, + color = colors.White, modifier = Modifier .fillMaxWidth() .padding(bottom = 8.dp) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt index fd160109..ed26b425 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/ReactionsScreen.kt @@ -20,7 +20,6 @@ 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.HeaderButton import com.texthip.thip.ui.common.buttons.OptionChipButton import com.texthip.thip.ui.common.cards.NotificationCard import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index 38480e89..bf12aaec 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -39,6 +39,7 @@ import com.texthip.thip.ui.myPage.viewmodel.SavedBookViewModel import com.texthip.thip.ui.myPage.viewmodel.SavedFeedViewModel import com.texthip.thip.ui.theme.Black import com.texthip.thip.ui.theme.Grey02 +import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography import com.texthip.thip.ui.theme.White @@ -65,7 +66,7 @@ fun SavedScreen() { TabRow( selectedTabIndex = selectedTabIndex, containerColor = Color.Transparent, - contentColor = White, + contentColor = colors.White, indicator = { tabPositions -> val tabPosition = tabPositions[selectedTabIndex] @@ -87,8 +88,8 @@ fun SavedScreen() { modifier = Modifier.width(60.dp), selected = selected, onClick = { selectedTabIndex = index }, - selectedContentColor = White, - unselectedContentColor = Grey02, + selectedContentColor = colors.White, + unselectedContentColor = colors.Grey02, text = { Box( contentAlignment = Alignment.Center diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt index 623f5c66..8c43aaa0 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt @@ -33,6 +33,7 @@ import com.texthip.thip.R import com.texthip.thip.ui.theme.DarkGrey import com.texthip.thip.ui.theme.NeonGreen import com.texthip.thip.ui.theme.Pink +import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography import com.texthip.thip.ui.theme.White @@ -52,12 +53,12 @@ fun RoleCard( val backgroundBrush = if (selected) { Brush.verticalGradient( colors = listOf( - Color.Black.copy(alpha = 0.7f), //상단은 어둡게 - Color.White.copy(alpha = 0.2f) //하단은 밝게 + colors.Black.copy(alpha = 0.7f), //상단은 어둡게 + colors.White.copy(alpha = 0.2f) //하단은 밝게 ) ) } else { - SolidColor(Color.Black.copy(alpha = 0.3f)) + SolidColor(colors.Black.copy(alpha = 0.3f)) } Box( modifier = modifier diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt index 0e35a117..7e2b86e1 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt @@ -76,7 +76,7 @@ fun SavedFeedCard( Text( text = feedItem.content, style = typography.feedcopy_r400_s14_h20, - color = White, + color = colors.White, modifier = Modifier .fillMaxWidth() .padding(bottom = 16.dp) @@ -88,12 +88,12 @@ fun SavedFeedCard( modifier = Modifier.clickable { onLikeClick() }, painter = painterResource(R.drawable.ic_heart), contentDescription = null, - tint = if (feedItem.isLiked) Red else colors.White + tint = if (feedItem.isLiked) colors.Red else colors.White ) Text( text = feedItem.likeCount.toString(), style = typography.feedcopy_r400_s14_h20, - color = White, + color = colors.White, modifier = Modifier.padding(start = 5.dp, end = 12.dp) ) Icon( @@ -104,7 +104,7 @@ fun SavedFeedCard( Text( text = feedItem.commentCount.toString(), style = typography.feedcopy_r400_s14_h20, - color = White, + color = colors.White, modifier = Modifier.padding(start = 5.dp, end = 12.dp) ) Spacer(modifier = Modifier.weight(1f)) From 198f78c20a1c7fa910f7f5dbff258d614b6409f6 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 17:54:44 +0900 Subject: [PATCH 36/41] =?UTF-8?q?[refactor]:=20SavedScreen=20UI=20?= =?UTF-8?q?=EA=B0=84=EB=8B=A8=ED=95=9C=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/SavedScreen.kt | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index bf12aaec..af551f24 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -28,6 +28,7 @@ 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.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel @@ -45,7 +46,7 @@ import com.texthip.thip.ui.theme.White @Composable fun SavedScreen() { - val tabs = listOf("피드", "책") + val tabs = listOf(stringResource(R.string.feed), stringResource(R.string.book)) var selectedTabIndex by rememberSaveable { mutableStateOf(0) } Scaffold( @@ -91,14 +92,11 @@ fun SavedScreen() { selectedContentColor = colors.White, unselectedContentColor = colors.Grey02, text = { - Box( - contentAlignment = Alignment.Center - ) { - Text( - text = title, - style = typography.smalltitle_sb600_s18_h24 - ) - } + Text( + textAlign = TextAlign.Center, + text = title, + style = typography.smalltitle_sb600_s18_h24 + ) } ) } From dd431b32b0063fd5ff2dab2e9734c30be122335f Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 17:57:55 +0900 Subject: [PATCH 37/41] =?UTF-8?q?[refactor]:=20SavedScreen=20content?= =?UTF-8?q?=EB=93=A4=20component=EB=A1=9C=20=EB=B6=84=EB=A6=AC(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/myPage/SavedScreen.kt | 49 +------------------ .../thip/ui/myPage/component/BookContent.kt | 28 +++++++++++ .../thip/ui/myPage/component/FeedContent.kt | 30 ++++++++++++ app/src/main/res/values/strings.xml | 3 +- 4 files changed, 62 insertions(+), 48 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/component/BookContent.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/component/FeedContent.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt index af551f24..332dffe4 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/SavedScreen.kt @@ -8,8 +8,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Scaffold import androidx.compose.material3.Tab @@ -17,7 +15,6 @@ 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,20 +23,15 @@ 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.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.cards.CardBookList import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.myPage.component.SavedFeedCard -import com.texthip.thip.ui.myPage.viewmodel.SavedBookViewModel -import com.texthip.thip.ui.myPage.viewmodel.SavedFeedViewModel +import com.texthip.thip.ui.myPage.component.BookContent +import com.texthip.thip.ui.myPage.component.FeedContent import com.texthip.thip.ui.theme.Black -import com.texthip.thip.ui.theme.Grey02 import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography import com.texthip.thip.ui.theme.White @@ -112,43 +104,6 @@ fun SavedScreen() { } } -@Composable -fun FeedContent(viewModel: SavedFeedViewModel = viewModel()) { - val feedList by viewModel.feeds.collectAsState() - - LazyColumn { - items(feedList, key = { it.id }) { feed -> - val bookImagePainter = feed.imageUrl?.let { painterResource(it) } - val profileImagePainter = feed.userProfileImage?.let { painterResource(it) } - - SavedFeedCard( - feedItem = feed, - bookImage = bookImagePainter, - profileImage = profileImagePainter, - onBookmarkClick = { viewModel.toggleBookmark(feed.id) }, - onLikeClick = { viewModel.toggleLike(feed.id) } - ) - } - } -} - -@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) } - ) - } - } -} @Preview @Composable 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..9d70930a --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/BookContent.kt @@ -0,0 +1,28 @@ +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/component/FeedContent.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/FeedContent.kt new file mode 100644 index 00000000..56216cef --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/FeedContent.kt @@ -0,0 +1,30 @@ +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 bookImagePainter = feed.imageUrl?.let { painterResource(it) } + val profileImagePainter = feed.userProfileImage?.let { painterResource(it) } + + SavedFeedCard( + feedItem = feed, + bookImage = bookImagePainter, + profileImage = profileImagePainter, + onBookmarkClick = { viewModel.toggleBookmark(feed.id) }, + onLikeClick = { viewModel.toggleLike(feed.id) } + ) + } + } +} \ 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 4092606b..1ddabbcc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,6 +74,8 @@ 메뉴 좋아요 댓글 + 피드 + 프로필 편집 닉네임 변경 칭호 편집 @@ -83,7 +85,6 @@ 정말로 탈퇴하시겠어요? \'예\'를 누르면 모든 기록이 사라져요. - 문학 문학가 과학·IT From da83f88a305ede8dfbe939266d45774a3457a1e6 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 18:19:05 +0900 Subject: [PATCH 38/41] =?UTF-8?q?[refactor]:=20backgroundColor=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt index b961f6a3..95d5e2d6 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/DeleteAccountScreen.kt @@ -148,8 +148,7 @@ fun DeleteAccountScreen() { Dialog(onDismissRequest = { isDialogVisible = false }) { Box( modifier = Modifier - .fillMaxSize() - .background(colors.Black.copy(alpha = 0.5f)), + .fillMaxSize(), contentAlignment = Alignment.Center ) { DialogPopup( From c5fd480c6454250636f5f9402dac3f21c5ade613 Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 18:20:51 +0900 Subject: [PATCH 39/41] =?UTF-8?q?[refactor]:=20Toast=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EB=AA=85=20=EC=88=98=EC=A0=95=20->=20ToastWi?= =?UTF-8?q?thDate=20=EB=B0=8F=20preview=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/{Toast.kt => ToastWithDate.kt} | 7 +-- .../thip/ui/myPage/NotificationScreen.kt | 4 +- .../thip/ui/myPage/component/RoleCard.kt | 49 ++++++++++--------- 3 files changed, 32 insertions(+), 28 deletions(-) rename app/src/main/java/com/texthip/thip/ui/common/modal/{Toast.kt => ToastWithDate.kt} (95%) diff --git a/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt b/app/src/main/java/com/texthip/thip/ui/common/modal/ToastWithDate.kt similarity index 95% rename from app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt rename to app/src/main/java/com/texthip/thip/ui/common/modal/ToastWithDate.kt index 651b8020..d5216ca2 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/modal/Toast.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/modal/ToastWithDate.kt @@ -1,5 +1,6 @@ package com.texthip.thip.ui.common.modal +import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement @@ -21,7 +22,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun Toast( +fun ToastWithDate( modifier: Modifier = Modifier, message: String, date: String @@ -35,7 +36,7 @@ fun Toast( color = colors.Grey02, shape = RoundedCornerShape(12.dp) ) - .padding(horizontal = 15.dp, vertical = 15.dp) + .padding(15.dp) ) { Row( modifier = Modifier.fillMaxWidth(), @@ -59,7 +60,7 @@ fun Toast( @Preview(showBackground = true) @Composable fun ToastPrev() { - Toast( + ToastWithDate( message = stringResource(R.string.push_off), date = "2025년 6월 29일 22시 30분", modifier = Modifier.fillMaxWidth() diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt index 2f73a0a0..3f6c49ee 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/NotificationScreen.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.ToggleSwitchButton -import com.texthip.thip.ui.common.modal.Toast +import com.texthip.thip.ui.common.modal.ToastWithDate import com.texthip.thip.ui.common.topappbar.InputTopAppBar import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -49,7 +49,7 @@ fun NotificationScreen() { .padding(horizontal = 15.dp, vertical = 15.dp), contentAlignment = Alignment.TopCenter ) { - Toast( + ToastWithDate( message = stringResource( if (message == "push_on") R.string.push_on else R.string.push_off ), diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt index 8c43aaa0..1743529c 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/RoleCard.kt @@ -33,6 +33,7 @@ import com.texthip.thip.R import com.texthip.thip.ui.theme.DarkGrey import com.texthip.thip.ui.theme.NeonGreen import com.texthip.thip.ui.theme.Pink +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 @@ -102,34 +103,36 @@ fun RoleCard( } } -@Preview(showBackground = true, backgroundColor = 0xFF121212) +@Preview @Composable fun RoleCardPreview() { var selected1 by rememberSaveable { mutableStateOf(true) } var selected2 by rememberSaveable { mutableStateOf(false) } - Row( - modifier = Modifier.padding(20.dp), - horizontalArrangement = Arrangement.spacedBy(12.dp) - ) { - RoleCard( - genre = "문학", - role = "문학가", - imageResId = R.drawable.character_literature, - genreColor = White, - roleColor = NeonGreen, - selected = selected1, - onClick = { selected1 = !selected1 } - ) + ThipTheme { + Row( + modifier = Modifier.padding(20.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + RoleCard( + genre = "문학", + role = "문학가", + imageResId = R.drawable.character_literature, + genreColor = White, + roleColor = NeonGreen, + selected = selected1, + onClick = { selected1 = !selected1 } + ) - RoleCard( - genre = "예술", - role = "예술가", - imageResId = R.drawable.character_art, - genreColor = White, - roleColor = Pink, - selected = selected2, - onClick = { selected2 = !selected2 } - ) + RoleCard( + genre = "예술", + role = "예술가", + imageResId = R.drawable.character_art, + genreColor = White, + roleColor = Pink, + selected = selected2, + onClick = { selected2 = !selected2 } + ) + } } } From 6fef2cf1ae549ae66d983e409be72dc169ac615b Mon Sep 17 00:00:00 2001 From: juyeon Date: Tue, 1 Jul 2025 18:28:28 +0900 Subject: [PATCH 40/41] =?UTF-8?q?[refactor]:=20ic=5Fheat=5Ffilled=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/myPage/component/SavedFeedCard.kt | 7 ++++--- app/src/main/res/drawable/ic_heart_filled.xml | 9 +++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_heart_filled.xml diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt index 7e2b86e1..cad18ede 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/component/SavedFeedCard.kt @@ -15,6 +15,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource @@ -86,9 +87,9 @@ fun SavedFeedCard( ) { Icon( modifier = Modifier.clickable { onLikeClick() }, - painter = painterResource(R.drawable.ic_heart), + painter = painterResource(if (feedItem.isLiked) R.drawable.ic_heart_filled else R.drawable.ic_heart), contentDescription = null, - tint = if (feedItem.isLiked) colors.Red else colors.White + tint = Color.Unspecified ) Text( text = feedItem.likeCount.toString(), @@ -112,7 +113,7 @@ fun SavedFeedCard( modifier = Modifier.clickable { onBookmarkClick() }, painter = painterResource(if (feedItem.isSaved) R.drawable.ic_save_filled else R.drawable.ic_save), contentDescription = null, - tint = colors.White + tint = Color.Unspecified ) } diff --git a/app/src/main/res/drawable/ic_heart_filled.xml b/app/src/main/res/drawable/ic_heart_filled.xml new file mode 100644 index 00000000..cfb9ba1e --- /dev/null +++ b/app/src/main/res/drawable/ic_heart_filled.xml @@ -0,0 +1,9 @@ + + + From 83ee93561c6062502a68f7f94a95d95826433978 Mon Sep 17 00:00:00 2001 From: juyeon Date: Wed, 2 Jul 2025 19:09:18 +0900 Subject: [PATCH 41/41] =?UTF-8?q?[refactor]:ReactionScreen=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=EB=A7=81=20=EB=A1=9C=EC=A7=81=20=EC=A0=81=EC=9A=A9,?= =?UTF-8?q?=20EditProfileScreen=20=ED=85=8D=EC=8A=A4=ED=8A=B8=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=88=98=EC=A0=95(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetSelector.xml | 11 ---- .../texthip/thip/ui/common/cards/CardAlarm.kt | 4 +- .../ui/common/forms/FormTextFieldDefault.kt | 16 +++--- .../thip/ui/common/header/ProfileBar.kt | 3 +- .../thip/ui/myPage/EditProfileScreen.kt | 10 +++- .../texthip/thip/ui/myPage/ReactionsScreen.kt | 52 +++++++++++-------- .../thip/ui/myPage/mock/ReactionItem.kt | 4 +- .../ui/myPage/{ => screen}/MyPageScreen.kt | 0 .../texthip/thip/ui/navigator/MainNavHost.kt | 2 +- 9 files changed, 54 insertions(+), 48 deletions(-) rename app/src/main/java/com/texthip/thip/ui/myPage/{ => screen}/MyPageScreen.kt (100%) diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 75b3c473..00e85ee2 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -2,17 +2,6 @@ - -