From ac5e75399a617a0540da1311a6bdecf20082c4cf Mon Sep 17 00:00:00 2001 From: Son Juwan Date: Sat, 1 Nov 2025 20:25:47 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat/#14:=20Navigation=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hslink/presentation/main/MainNavHost.kt | 22 +++++++++++++++++-- .../hslink/presentation/main/MainNavigator.kt | 19 ++++++++++++++-- .../hslink/presentation/main/MainTab.kt | 2 +- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavHost.kt b/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavHost.kt index e77eaff..f43f63c 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavHost.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavHost.kt @@ -4,7 +4,9 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.compose.NavHost -import com.hsLink.hslink.presentation.home.navigation.communityNavGraph +import com.hsLink.hslink.presentation.community.navigation.main.communityNavGraph +import com.hsLink.hslink.presentation.community.navigation.post.communityPostNavGraph +import com.hsLink.hslink.presentation.community.navigation.write.communityWriteNavGraph import com.hsLink.hslink.presentation.home.navigation.homeNavGraph import com.hsLink.hslink.presentation.home.navigation.searchNavGraph import com.hsLink.hslink.presentation.mypage.navigation.mypageNavGraph @@ -23,7 +25,23 @@ fun MainNavHost( ) { homeNavGraph(padding) searchNavGraph(padding) - communityNavGraph(padding) + communityNavGraph( + padding, + navigateUp = navigator::navigateUp, + navigateToWriting = navigator::navigateWriteCommunity, + navigateToPost = navigator::navigateToCommunityPost + ) mypageNavGraph(padding) + + communityWriteNavGraph( + padding = padding, + navigateUp = navigator::navigateUp, + navigateToCommunity = navigator::navigateToCommunity + ) + + communityPostNavGraph( + padding = padding, + navigateUp = navigator::navigateUp + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavigator.kt b/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavigator.kt index a9fd785..bddfade 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavigator.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavigator.kt @@ -5,13 +5,16 @@ import androidx.compose.runtime.remember import androidx.navigation.NavDestination import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.NavHostController +import androidx.navigation.NavOptions import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions import com.hsLink.hslink.presentation.home.navigation.Home -import com.hsLink.hslink.presentation.home.navigation.navigateToCommunity +import com.hsLink.hslink.presentation.community.navigation.main.navigateToCommunity +import com.hsLink.hslink.presentation.community.navigation.post.navigateToCommunityPost import com.hsLink.hslink.presentation.home.navigation.navigateToHome import com.hsLink.hslink.presentation.home.navigation.navigateToSearch +import com.hsLink.hslink.presentation.community.navigation.write.navigateToWriteCommunity import com.hsLink.hslink.presentation.mypage.navigation.navigateToMypage class MainNavigator( @@ -51,7 +54,19 @@ class MainNavigator( } fun navigateUp() { - navController::navigateUp + navController.navigateUp() + } + + fun navigateWriteCommunity(navOptions: NavOptions? = null) { + navController.navigateToWriteCommunity(navOptions) + } + + fun navigateToCommunity(navOptions: NavOptions? = null) { + navController.navigateToCommunity(navOptions) + } + + fun navigateToCommunityPost(postId: String, navOptions: NavOptions? = null) { + navController.navigateToCommunityPost(postId, navOptions) } @Composable diff --git a/app/src/main/java/com/hsLink/hslink/presentation/main/MainTab.kt b/app/src/main/java/com/hsLink/hslink/presentation/main/MainTab.kt index 05d3280..8f92f96 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/main/MainTab.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/main/MainTab.kt @@ -5,7 +5,7 @@ import androidx.annotation.StringRes import androidx.compose.runtime.Composable import com.hsLink.hslink.R import com.hsLink.hslink.core.navigation.MainTabRoute -import com.hsLink.hslink.presentation.home.navigation.Community +import com.hsLink.hslink.presentation.community.navigation.main.Community import com.hsLink.hslink.presentation.home.navigation.Home import com.hsLink.hslink.presentation.home.navigation.Search import com.hsLink.hslink.presentation.mypage.navigation.Mypage From f56cbb6ed6f94ef444579e2385df69fa57fa6f22 Mon Sep 17 00:00:00 2001 From: Son Juwan Date: Sat, 1 Nov 2025 20:26:25 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat/#14:=20asset,=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hsLink/hslink/core/DummyComponent.kt | 4 --- .../hsLink/hslink/core/designsystem/.gitkeep | 0 .../presentation/community/CommunityScreen.kt | 27 ------------------- .../res/drawable/ic_community_arrow_down.xml | 9 +++++++ .../res/drawable/ic_community_arrow_up.xml | 9 +++++++ .../main/res/drawable/ic_community_button.xml | 20 ++++++++++++++ .../main/res/drawable/ic_community_kebab.xml | 15 +++++++++++ .../main/res/drawable/ic_community_post.xml | 20 ++++++++++++++ .../drawable/ic_community_post_leftarrow.xml | 20 ++++++++++++++ .../res/drawable/ic_community_post_send.xml | 13 +++++++++ .../res/drawable/ic_community_write_close.xml | 9 +++++++ 11 files changed, 115 insertions(+), 31 deletions(-) delete mode 100644 app/src/main/java/com/hsLink/hslink/core/DummyComponent.kt delete mode 100644 app/src/main/java/com/hsLink/hslink/core/designsystem/.gitkeep delete mode 100644 app/src/main/java/com/hsLink/hslink/presentation/community/CommunityScreen.kt create mode 100644 app/src/main/res/drawable/ic_community_arrow_down.xml create mode 100644 app/src/main/res/drawable/ic_community_arrow_up.xml create mode 100644 app/src/main/res/drawable/ic_community_button.xml create mode 100644 app/src/main/res/drawable/ic_community_kebab.xml create mode 100644 app/src/main/res/drawable/ic_community_post.xml create mode 100644 app/src/main/res/drawable/ic_community_post_leftarrow.xml create mode 100644 app/src/main/res/drawable/ic_community_post_send.xml create mode 100644 app/src/main/res/drawable/ic_community_write_close.xml diff --git a/app/src/main/java/com/hsLink/hslink/core/DummyComponent.kt b/app/src/main/java/com/hsLink/hslink/core/DummyComponent.kt deleted file mode 100644 index aa23361..0000000 --- a/app/src/main/java/com/hsLink/hslink/core/DummyComponent.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.hsLink.hslink.core - -class DummyComponent { -} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/core/designsystem/.gitkeep b/app/src/main/java/com/hsLink/hslink/core/designsystem/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/app/src/main/java/com/hsLink/hslink/presentation/community/CommunityScreen.kt b/app/src/main/java/com/hsLink/hslink/presentation/community/CommunityScreen.kt deleted file mode 100644 index f2b8d20..0000000 --- a/app/src/main/java/com/hsLink/hslink/presentation/community/CommunityScreen.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.hsLink.hslink.presentation.community - -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - - -@Composable -fun CommunityRoute( - paddingValues: PaddingValues, -) { - CommunityScreen(paddingValues) -} - -@Composable -fun CommunityScreen( - paddingValues: PaddingValues, - modifier: Modifier = Modifier, -) { - Text( - text = "Community Screen", - modifier = modifier - .padding(paddingValues) - ) -} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_community_arrow_down.xml b/app/src/main/res/drawable/ic_community_arrow_down.xml new file mode 100644 index 0000000..72b8356 --- /dev/null +++ b/app/src/main/res/drawable/ic_community_arrow_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_community_arrow_up.xml b/app/src/main/res/drawable/ic_community_arrow_up.xml new file mode 100644 index 0000000..1be87b0 --- /dev/null +++ b/app/src/main/res/drawable/ic_community_arrow_up.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_community_button.xml b/app/src/main/res/drawable/ic_community_button.xml new file mode 100644 index 0000000..e986c2c --- /dev/null +++ b/app/src/main/res/drawable/ic_community_button.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_community_kebab.xml b/app/src/main/res/drawable/ic_community_kebab.xml new file mode 100644 index 0000000..d23deaf --- /dev/null +++ b/app/src/main/res/drawable/ic_community_kebab.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_community_post.xml b/app/src/main/res/drawable/ic_community_post.xml new file mode 100644 index 0000000..466c559 --- /dev/null +++ b/app/src/main/res/drawable/ic_community_post.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_community_post_leftarrow.xml b/app/src/main/res/drawable/ic_community_post_leftarrow.xml new file mode 100644 index 0000000..3161228 --- /dev/null +++ b/app/src/main/res/drawable/ic_community_post_leftarrow.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_community_post_send.xml b/app/src/main/res/drawable/ic_community_post_send.xml new file mode 100644 index 0000000..46424c7 --- /dev/null +++ b/app/src/main/res/drawable/ic_community_post_send.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/ic_community_write_close.xml b/app/src/main/res/drawable/ic_community_write_close.xml new file mode 100644 index 0000000..11ec82f --- /dev/null +++ b/app/src/main/res/drawable/ic_community_write_close.xml @@ -0,0 +1,9 @@ + + + From d6f7346b4e70f223ec668d4eaf52b02645e4c495 Mon Sep 17 00:00:00 2001 From: Son Juwan Date: Sat, 1 Nov 2025 20:26:51 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat/#14:=20=EA=B3=B5=ED=86=B5=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/component/HsLinkDialog.kt | 110 ++++++++++++++++++ .../designsystem/component/HsLinkTextField.kt | 12 +- .../designsystem/component/HsLinkTopBar.kt | 13 ++- 3 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkDialog.kt diff --git a/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkDialog.kt b/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkDialog.kt new file mode 100644 index 0000000..25daaef --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkDialog.kt @@ -0,0 +1,110 @@ +package com.hsLink.hslink.core.designsystem.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +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.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme +import com.hsLink.hslink.core.util.noRippleClickable + +@Composable +fun HsLinkDialog( + title: String, + message: String, + confirmText: String, + dismissText: String, + onConfirm: () -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, +) { + Dialog(onDismissRequest = onDismiss) { + Column( + modifier = modifier + .fillMaxWidth() + .background( + color = HsLinkTheme.colors.Common, + shape = RoundedCornerShape(12.dp) + ) + .padding(24.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + Text( + text = title, + color = HsLinkTheme.colors.Grey700, + style = HsLinkTheme.typography.title_20Strong + ) + + Text( + text = message, + color = HsLinkTheme.colors.Grey500, + style = HsLinkTheme.typography.body_14Normal + ) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + Box( + modifier = Modifier + .background( + color = HsLinkTheme.colors.Grey100, + shape = RoundedCornerShape(8.dp) + ) + .noRippleClickable(onClick = onDismiss) + .padding(vertical = 12.dp, horizontal = 40.dp) + ) { + Text( + text = dismissText, + color = HsLinkTheme.colors.Grey500, + style = HsLinkTheme.typography.btm_M, + ) + } + + Spacer(modifier = Modifier.width(8.dp)) + + Box( + modifier = Modifier + .background( + color = HsLinkTheme.colors.DeepBlue500, + shape = RoundedCornerShape(8.dp) + ) + .noRippleClickable(onClick = onConfirm) + .padding(vertical = 12.dp, horizontal = 40.dp) + ) { + Text( + text = confirmText, + color = HsLinkTheme.colors.Common, + style = HsLinkTheme.typography.btm_M, + ) + } + } + } + } +} + +@Preview(showBackground = true) +@Composable +private fun HsLinkDialogPreview() { + HsLinkTheme { + HsLinkDialog( + title = "글쓰기를 종료하시겠습니까?", + message = "작성 중인 내용이 저장되지 않습니다.", + confirmText = "나가기", + dismissText = "취소하기", + onConfirm = {}, + onDismiss = {} + ) + } +} diff --git a/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkTextField.kt b/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkTextField.kt index 6167737..77d3221 100644 --- a/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkTextField.kt +++ b/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkTextField.kt @@ -93,11 +93,13 @@ fun HsLinkTextField( ) } } - Icon( - imageVector = ImageVector.vectorResource(id = leadingIconRes ?: 0), - contentDescription = null, - tint = Color.Unspecified - ) + leadingIconRes?.let { iconRes -> + Icon( + imageVector = ImageVector.vectorResource(id = iconRes), + contentDescription = null, + tint = Color.Unspecified + ) + } } } ) diff --git a/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkTopBar.kt b/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkTopBar.kt index 0ac5600..c89e4c4 100644 --- a/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkTopBar.kt +++ b/app/src/main/java/com/hsLink/hslink/core/designsystem/component/HsLinkTopBar.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.hsLink.hslink.R import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme +import com.hsLink.hslink.core.util.noRippleClickable @Composable fun HsLinkTopBar( @@ -25,6 +26,9 @@ fun HsLinkTopBar( @DrawableRes rightIconFirst: Int? = null, @DrawableRes rightIconSecond: Int? = null, @DrawableRes leftIcon: Int? = null, + onRightIconFirstClick: () -> Unit = {}, + onRightIconSecondClick: () -> Unit = {}, + onLeftIconClick: () -> Unit = {} ) { Row( modifier = modifier @@ -36,7 +40,8 @@ fun HsLinkTopBar( leftIcon?.let { Icon( imageVector = ImageVector.vectorResource(id = it), - contentDescription = "leftIcon" + contentDescription = "leftIcon", + modifier = Modifier.noRippleClickable(onClick = onLeftIconClick) ) } @@ -47,14 +52,16 @@ fun HsLinkTopBar( rightIconFirst?.let { Icon( imageVector = ImageVector.vectorResource(id = it), - contentDescription = "rightIconFirst" + contentDescription = "rightIconFirst", + modifier = Modifier.noRippleClickable(onClick = onRightIconFirstClick) ) } rightIconSecond?.let { Icon( imageVector = ImageVector.vectorResource(id = it), - contentDescription = "rightIconSecond" + contentDescription = "rightIconSecond", + modifier = Modifier.noRippleClickable(onClick = onRightIconSecondClick) ) } } From 88fd6bb38c48f4ebee37a2b1b9b0d3e3f6caa1e2 Mon Sep 17 00:00:00 2001 From: Son Juwan Date: Sat, 1 Nov 2025 20:27:30 +0900 Subject: [PATCH 4/8] feat/#14: community component --- .idea/caches/deviceStreaming.xml | 24 ++++ .../community/component/main/CommentItem.kt | 93 ++++++++++++++++ .../component/main/CommunityCardItem.kt | 87 +++++++++++++++ .../community/component/post/CommentInput.kt | 91 +++++++++++++++ .../component/write/BoardSelectionField.kt | 105 ++++++++++++++++++ 5 files changed, 400 insertions(+) create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/community/component/main/CommentItem.kt create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/community/component/main/CommunityCardItem.kt create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/community/component/post/CommentInput.kt create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/community/component/write/BoardSelectionField.kt diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml index 5d41895..63165ba 100644 --- a/.idea/caches/deviceStreaming.xml +++ b/.idea/caches/deviceStreaming.xml @@ -330,6 +330,18 @@