From 5ceeb64d8793cbde499275ab1a3251d478741dfa Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Fri, 27 Sep 2024 17:23:59 +0900 Subject: [PATCH 01/16] =?UTF-8?q?[Feat]=20MyPageMemesTabBar=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/component/MyPageMemesTabBar.kt | 110 ++++++++++++++++++ .../team/ppac/mypage/mvi/MyPageUiState.kt | 7 ++ 2 files changed, 117 insertions(+) create mode 100644 feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt new file mode 100644 index 00000000..5b3b3621 --- /dev/null +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt @@ -0,0 +1,110 @@ +package team.ppac.mypage.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.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.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import team.ppac.designsystem.FarmemeTheme +import team.ppac.designsystem.util.extension.noRippleClickable +import team.ppac.mypage.mvi.MyPageTab + +@Composable +internal fun MyPageMemesTabBar( + modifier: Modifier = Modifier, + currentTab: MyPageTab, + onClick: (MyPageTab) -> Unit, +) { + Row( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 20.dp) + ) { + MyPageMemesTab( + modifier = Modifier.weight(1f), + currentTab = MyPageTab.MY_MEMES, + isSelected = currentTab == MyPageTab.MY_MEMES, + onClick = onClick, + ) + Spacer(modifier = Modifier.width(8.dp)) + MyPageMemesTab( + modifier = Modifier.weight(1f), + currentTab = MyPageTab.SAVED_MEMES, + isSelected = currentTab == MyPageTab.SAVED_MEMES, + onClick = onClick, + ) + } +} + +@Composable +internal fun MyPageMemesTab( + modifier: Modifier = Modifier, + currentTab: MyPageTab, + isSelected: Boolean, + onClick: (MyPageTab) -> Unit, +) { + val textColor = + if (isSelected) FarmemeTheme.textColor.primary else FarmemeTheme.textColor.tertiary + val lineColor = if (isSelected) FarmemeTheme.backgroundColor.primary else Color.Unspecified + + Column( + modifier = modifier.noRippleClickable(onClick = { + onClick(currentTab) + }), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = currentTab.title, + color = textColor, + style = FarmemeTheme.typography.body.xLarge.semibold, + ) + Spacer(modifier = Modifier.height(15.dp)) + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(2.dp) + .background(lineColor), + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun MyPageMemesTabBarPreview( + modifier: Modifier = Modifier, +) { + MyPageMemesTabBar( + currentTab = MyPageTab.MY_MEMES, + onClick = {}, + ) +} + +@Preview(showBackground = true) +@Composable +private fun MyPageMemesTabPreview( + modifier: Modifier = Modifier, +) { + Column { + MyPageMemesTab( + currentTab = MyPageTab.MY_MEMES, + isSelected = true, + onClick = {}, + ) + MyPageMemesTab( + currentTab = MyPageTab.SAVED_MEMES, + isSelected = false, + onClick = {}, + ) + } +} \ No newline at end of file diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt index 7dd60b60..330c93c6 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt @@ -14,6 +14,7 @@ data class MyPageUiState( val isRefreshing: Boolean = false, val isError: Boolean = false, val levelUiModel: LevelUiModel = LevelUiModel(), + val currentTab: MyPageTab = MyPageTab.MY_MEMES, val recentMemes: ImmutableList = persistentListOf(), val savedMemes: Flow> = flowOf(PagingData.empty()), ) : UiState { @@ -21,4 +22,10 @@ data class MyPageUiState( val INITIAL_STATE get() = MyPageUiState() } +} + +enum class MyPageTab(val title: String) { + MY_MEMES(title = "나의 밈"), + SAVED_MEMES(title = "나의 파밈함"), + ; } \ No newline at end of file From 5238edf6dca9609ff6eb8257d46dd03745e83c01 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Fri, 27 Sep 2024 17:27:17 +0900 Subject: [PATCH 02/16] =?UTF-8?q?[Feat]=20=ED=83=AD=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/team/ppac/mypage/MyPageScreen.kt | 38 +++++++++++++++---- .../java/team/ppac/mypage/MyPageViewModel.kt | 7 ++++ .../java/team/ppac/mypage/mvi/MyPageIntent.kt | 1 + 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt index 6badc608..df6c76a8 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt @@ -43,6 +43,7 @@ import team.ppac.designsystem.component.toolbar.FarmemeActionToolBar import team.ppac.designsystem.foundation.FarmemeRadius import team.ppac.domain.repository.SavedMemeEvent import team.ppac.mypage.component.MyPageLevelBox +import team.ppac.mypage.component.MyPageMemesTabBar import team.ppac.mypage.component.MyPageProgressBar import team.ppac.mypage.component.MyPagePullRefreshIndicator import team.ppac.mypage.component.MyPageSpeechBubble @@ -51,6 +52,7 @@ import team.ppac.mypage.component.SavedMemeContent import team.ppac.mypage.model.LevelUiModel import team.ppac.mypage.model.MyPageLevel import team.ppac.mypage.mvi.MyPageIntent +import team.ppac.mypage.mvi.MyPageTab import team.ppac.mypage.mvi.MyPageUiState @OptIn(ExperimentalMaterialApi::class) @@ -126,14 +128,36 @@ internal fun MyPageScreen( }, isLoading = uiState.isLoading, ) + MyPageMemesTabBar( + currentTab = uiState.currentTab, + onClick = { tab -> + onIntent(MyPageIntent.ClickMemesTab(currentTab = tab)) + }, + ) + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(FarmemeTheme.borderColor.tertiary), + ) if (!uiState.isLoading) { - SavedMemeContent( - savedMemes = savedMemes, - onMemeClick = { memeId -> - onIntent(MyPageIntent.ClickSavedMemeItem(memeId = memeId)) - }, - onCopyClick = { onIntent(MyPageIntent.ClickCopy(it)) } - ) + when (uiState.currentTab) { + MyPageTab.MY_MEMES -> { + // TODO(ze-zeh) : 나의 밈 + } + + MyPageTab.SAVED_MEMES -> { + SavedMemeContent( + savedMemes = savedMemes, + onMemeClick = { memeId -> + onIntent(MyPageIntent.ClickSavedMemeItem(memeId = memeId)) + }, + onCopyClick = { + onIntent(MyPageIntent.ClickCopy(it)) + }, + ) + } + } } } MyPagePullRefreshIndicator( diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt index 33838d9e..d22fbfdb 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt @@ -85,6 +85,13 @@ class MyPageViewModel @Inject constructor( MyPageIntent.InitView -> initialAction() MyPageIntent.RefreshData -> refreshAction() is MyPageIntent.ClickCopy -> postSideEffect(MyPageSideEffect.LogClickCopy(intent.meme)) + is MyPageIntent.ClickMemesTab -> { + reduce { + copy( + currentTab = intent.currentTab, + ) + } + } } } diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt index e72b7448..0ec3a11e 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt @@ -21,4 +21,5 @@ sealed class MyPageIntent : UiIntent { data object InitView : MyPageIntent() data object RefreshData : MyPageIntent() data class ClickCopy(val meme: Meme) : MyPageIntent() + data class ClickMemesTab(val currentTab: MyPageTab) : MyPageIntent() } \ No newline at end of file From 769ec3e29a5b1bee031d9264f32c8b6e545c4e62 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 16:38:25 +0900 Subject: [PATCH 03/16] =?UTF-8?q?[Refactor]=20MyPageTab=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/team/ppac/mypage/MyPageScreen.kt | 12 ++++---- .../java/team/ppac/mypage/MyPageViewModel.kt | 2 +- .../mypage/component/MyPageMemesTabBar.kt | 28 +++++++++---------- .../java/team/ppac/mypage/mvi/MyPageIntent.kt | 2 +- .../team/ppac/mypage/mvi/MyPageUiState.kt | 4 +-- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt index df6c76a8..872f70fe 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt @@ -52,7 +52,7 @@ import team.ppac.mypage.component.SavedMemeContent import team.ppac.mypage.model.LevelUiModel import team.ppac.mypage.model.MyPageLevel import team.ppac.mypage.mvi.MyPageIntent -import team.ppac.mypage.mvi.MyPageTab +import team.ppac.mypage.mvi.MyPageTabType import team.ppac.mypage.mvi.MyPageUiState @OptIn(ExperimentalMaterialApi::class) @@ -129,9 +129,9 @@ internal fun MyPageScreen( isLoading = uiState.isLoading, ) MyPageMemesTabBar( - currentTab = uiState.currentTab, + currentTabType = uiState.currentTabType, onClick = { tab -> - onIntent(MyPageIntent.ClickMemesTab(currentTab = tab)) + onIntent(MyPageIntent.ClickMemesTab(currentTabType = tab)) }, ) Spacer( @@ -141,12 +141,12 @@ internal fun MyPageScreen( .background(FarmemeTheme.borderColor.tertiary), ) if (!uiState.isLoading) { - when (uiState.currentTab) { - MyPageTab.MY_MEMES -> { + when (uiState.currentTabType) { + MyPageTabType.MY_MEMES -> { // TODO(ze-zeh) : 나의 밈 } - MyPageTab.SAVED_MEMES -> { + MyPageTabType.SAVED_MEMES -> { SavedMemeContent( savedMemes = savedMemes, onMemeClick = { memeId -> diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt index d22fbfdb..a7fe1fa5 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt @@ -88,7 +88,7 @@ class MyPageViewModel @Inject constructor( is MyPageIntent.ClickMemesTab -> { reduce { copy( - currentTab = intent.currentTab, + currentTabType = intent.currentTabType, ) } } diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt index 5b3b3621..5e35e173 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt @@ -17,13 +17,13 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import team.ppac.designsystem.FarmemeTheme import team.ppac.designsystem.util.extension.noRippleClickable -import team.ppac.mypage.mvi.MyPageTab +import team.ppac.mypage.mvi.MyPageTabType @Composable internal fun MyPageMemesTabBar( modifier: Modifier = Modifier, - currentTab: MyPageTab, - onClick: (MyPageTab) -> Unit, + currentTabType: MyPageTabType, + onClick: (MyPageTabType) -> Unit, ) { Row( modifier = modifier @@ -32,15 +32,15 @@ internal fun MyPageMemesTabBar( ) { MyPageMemesTab( modifier = Modifier.weight(1f), - currentTab = MyPageTab.MY_MEMES, - isSelected = currentTab == MyPageTab.MY_MEMES, + currentTabType = MyPageTabType.MY_MEMES, + isSelected = currentTabType == MyPageTabType.MY_MEMES, onClick = onClick, ) Spacer(modifier = Modifier.width(8.dp)) MyPageMemesTab( modifier = Modifier.weight(1f), - currentTab = MyPageTab.SAVED_MEMES, - isSelected = currentTab == MyPageTab.SAVED_MEMES, + currentTabType = MyPageTabType.SAVED_MEMES, + isSelected = currentTabType == MyPageTabType.SAVED_MEMES, onClick = onClick, ) } @@ -49,9 +49,9 @@ internal fun MyPageMemesTabBar( @Composable internal fun MyPageMemesTab( modifier: Modifier = Modifier, - currentTab: MyPageTab, + currentTabType: MyPageTabType, isSelected: Boolean, - onClick: (MyPageTab) -> Unit, + onClick: (MyPageTabType) -> Unit, ) { val textColor = if (isSelected) FarmemeTheme.textColor.primary else FarmemeTheme.textColor.tertiary @@ -59,13 +59,13 @@ internal fun MyPageMemesTab( Column( modifier = modifier.noRippleClickable(onClick = { - onClick(currentTab) + onClick(currentTabType) }), horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(modifier = Modifier.height(10.dp)) Text( - text = currentTab.title, + text = currentTabType.title, color = textColor, style = FarmemeTheme.typography.body.xLarge.semibold, ) @@ -85,7 +85,7 @@ private fun MyPageMemesTabBarPreview( modifier: Modifier = Modifier, ) { MyPageMemesTabBar( - currentTab = MyPageTab.MY_MEMES, + currentTabType = MyPageTabType.MY_MEMES, onClick = {}, ) } @@ -97,12 +97,12 @@ private fun MyPageMemesTabPreview( ) { Column { MyPageMemesTab( - currentTab = MyPageTab.MY_MEMES, + currentTabType = MyPageTabType.MY_MEMES, isSelected = true, onClick = {}, ) MyPageMemesTab( - currentTab = MyPageTab.SAVED_MEMES, + currentTabType = MyPageTabType.SAVED_MEMES, isSelected = false, onClick = {}, ) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt index 0ec3a11e..f479cd94 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt @@ -21,5 +21,5 @@ sealed class MyPageIntent : UiIntent { data object InitView : MyPageIntent() data object RefreshData : MyPageIntent() data class ClickCopy(val meme: Meme) : MyPageIntent() - data class ClickMemesTab(val currentTab: MyPageTab) : MyPageIntent() + data class ClickMemesTab(val currentTabType: MyPageTabType) : MyPageIntent() } \ No newline at end of file diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt index 330c93c6..9d722946 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt @@ -14,7 +14,7 @@ data class MyPageUiState( val isRefreshing: Boolean = false, val isError: Boolean = false, val levelUiModel: LevelUiModel = LevelUiModel(), - val currentTab: MyPageTab = MyPageTab.MY_MEMES, + val currentTabType: MyPageTabType = MyPageTabType.MY_MEMES, val recentMemes: ImmutableList = persistentListOf(), val savedMemes: Flow> = flowOf(PagingData.empty()), ) : UiState { @@ -24,7 +24,7 @@ data class MyPageUiState( } } -enum class MyPageTab(val title: String) { +enum class MyPageTabType(val title: String) { MY_MEMES(title = "나의 밈"), SAVED_MEMES(title = "나의 파밈함"), ; From 8c17a503a04e9756d281fc4b8674fb681b047089 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 16:47:38 +0900 Subject: [PATCH 04/16] =?UTF-8?q?[Refactor]=20FarmemeFilledButton=20defaul?= =?UTF-8?q?t=20value=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/android/component/error/FarmemeErrorScreen.kt | 4 +--- .../team/ppac/designsystem/component/button/Button.kt | 6 ++---- .../src/main/java/team/ppac/setting/SettingScreen.kt | 2 -- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/core/common/android/src/main/kotlin/team/ppac/common/android/component/error/FarmemeErrorScreen.kt b/core/common/android/src/main/kotlin/team/ppac/common/android/component/error/FarmemeErrorScreen.kt index 6832cab8..ec61c648 100644 --- a/core/common/android/src/main/kotlin/team/ppac/common/android/component/error/FarmemeErrorScreen.kt +++ b/core/common/android/src/main/kotlin/team/ppac/common/android/component/error/FarmemeErrorScreen.kt @@ -38,10 +38,8 @@ fun FarmemeErrorScreen( ) Spacer(modifier = Modifier.size(24.dp)) FarmemeFilledButton( - backgroundColor = FarmemeTheme.backgroundColor.primary, text = "새로고침하기", - textColor = FarmemeTheme.textColor.inverse, - onClick = onRetryClick + onClick = onRetryClick, ) } } diff --git a/core/designsystem/src/main/kotlin/team/ppac/designsystem/component/button/Button.kt b/core/designsystem/src/main/kotlin/team/ppac/designsystem/component/button/Button.kt index d65f0c08..7ace1ee0 100644 --- a/core/designsystem/src/main/kotlin/team/ppac/designsystem/component/button/Button.kt +++ b/core/designsystem/src/main/kotlin/team/ppac/designsystem/component/button/Button.kt @@ -79,9 +79,9 @@ fun FarmemeWeakButton( @Composable fun FarmemeFilledButton( modifier: Modifier = Modifier, - backgroundColor: Color, + backgroundColor: Color = FarmemeTheme.backgroundColor.primary, text: String, - textColor: Color, + textColor: Color = FarmemeTheme.textColor.inverse, onClick: () -> Unit = { }, ) { Box( @@ -136,8 +136,6 @@ private fun FarmemeWeakButtonPreview() { @Preview private fun FarmemeFilledButtonPreview() { FarmemeFilledButton( - backgroundColor = FarmemeTheme.backgroundColor.primary, text = "버튼", - textColor = FarmemeTheme.textColor.inverse, ) } \ No newline at end of file diff --git a/feature/setting/src/main/java/team/ppac/setting/SettingScreen.kt b/feature/setting/src/main/java/team/ppac/setting/SettingScreen.kt index ddf5df6a..5bc1f010 100644 --- a/feature/setting/src/main/java/team/ppac/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/team/ppac/setting/SettingScreen.kt @@ -102,9 +102,7 @@ private fun SettingBody( if (hasNewAppVersion) { Spacer(modifier = Modifier.height(16.dp)) FarmemeFilledButton( - backgroundColor = FarmemeTheme.backgroundColor.primary, text = "앱 업데이트하기", - textColor = FarmemeTheme.textColor.inverse, onClick = onAppUpdateClick, ) } From 9c59f6eb8d61f3c3e93721e8808317f8718df553 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 17:05:20 +0900 Subject: [PATCH 05/16] =?UTF-8?q?[Feat]=20EmptyMemeContent=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ppac/mypage/component/EmptyMemeContent.kt | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt new file mode 100644 index 00000000..c34235b3 --- /dev/null +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt @@ -0,0 +1,67 @@ +package team.ppac.mypage.component + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import team.ppac.designsystem.FarmemeTheme +import team.ppac.designsystem.component.button.FarmemeFilledButton +import team.ppac.designsystem.foundation.FarmemeIcon +import team.ppac.mypage.mvi.MyPageTabType + +@Composable +fun EmptyMemeContent( + modifier: Modifier = Modifier, + tabType: MyPageTabType, + onUploadClick: () -> Unit = {}, +) { + val (title, content) = when (tabType) { + MyPageTabType.MY_MEMES -> "올린 밈이 없어요" to "공유하고 싶은 밈이 있다면\n업로드해보세요." + MyPageTabType.SAVED_MEMES -> "저장한 밈이 없어요" to "관심있는 밈을 저장하고\n필요할 때 편하게 사용해보세요." + } + + Column( + modifier = modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Spacer(modifier = Modifier.size(160.dp)) + FarmemeIcon.EmptyResult() + Spacer(modifier = Modifier.size(20.dp)) + Text( + text = title, + textAlign = TextAlign.Center, + style = FarmemeTheme.typography.heading.small.bold.copy( + color = FarmemeTheme.textColor.primary + ), + ) + Spacer(modifier = Modifier.size(9.dp)) + Text( + text = content, + textAlign = TextAlign.Center, + style = FarmemeTheme.typography.body.large.medium.copy( + color = FarmemeTheme.textColor.tertiary + ), + ) + if (tabType == MyPageTabType.MY_MEMES) { + Spacer(modifier = Modifier.size(20.dp)) + FarmemeFilledButton( + text = "밈 올리기", + onClick = onUploadClick, + ) + } + Spacer(modifier = Modifier.size(220.dp)) + } +} + +@Preview(showBackground = true) +@Composable +private fun EmptyMemeContentPreview() { + EmptyMemeContent(tabType = MyPageTabType.MY_MEMES) +} \ No newline at end of file From 2c848844b206653d7ce6e13f72c786e5011232ca Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 17:05:35 +0900 Subject: [PATCH 06/16] =?UTF-8?q?[Feat]=20=EC=B5=9C=EA=B7=BC=20=EB=B0=88?= =?UTF-8?q?=20=EA=B0=84=EA=B2=A9=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/team/ppac/mypage/component/RecentMemeContent.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/RecentMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/RecentMemeContent.kt index dfd2dd37..1289b232 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/RecentMemeContent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/RecentMemeContent.kt @@ -61,7 +61,7 @@ internal fun RecentMemeContent( } else { RecentMemeEmpty() } - Spacer(modifier = Modifier.height(50.dp)) + Spacer(modifier = Modifier.height(46.dp)) } } } From 8bbe94e8a309404dfdde103c547f9e4e9d9b13b2 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 17:11:09 +0900 Subject: [PATCH 07/16] =?UTF-8?q?[Feat]=20MyMemeContent=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ppac/mypage/component/MyMemeContent.kt | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 feature/mypage/src/main/java/team/ppac/mypage/component/MyMemeContent.kt diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/MyMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/MyMemeContent.kt new file mode 100644 index 00000000..04564b05 --- /dev/null +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/MyMemeContent.kt @@ -0,0 +1,103 @@ +package team.ppac.mypage.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid +import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells +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.paging.PagingData +import androidx.paging.compose.LazyPagingItems +import androidx.paging.compose.collectAsLazyPagingItems +import kotlinx.coroutines.flow.flowOf +import team.ppac.common.android.component.FARMEME_MEME_ITEM_MAX_HEIGHT +import team.ppac.common.android.component.FarmemeMemeItem +import team.ppac.domain.model.Meme +import team.ppac.mypage.mvi.MyPageTabType + +@Composable +internal fun MyMemeContent( + modifier: Modifier = Modifier, + myMemes: LazyPagingItems, + onMemeClick: (String) -> Unit, + onCopyClick: (Meme) -> Unit, + onUploadClick: () -> Unit, +) { + Column( + modifier = modifier.fillMaxWidth(), + ) { + if (myMemes.itemCount > 0) { + MyMemeList( + myMemes = myMemes, + onMemeItemClick = onMemeClick, + onCopyClick = onCopyClick + ) + } else { + EmptyMemeContent( + tabType = MyPageTabType.MY_MEMES, + onUploadClick = onUploadClick, + ) + } + Spacer(modifier = Modifier.height(50.dp)) + } +} + +@Composable +private fun MyMemeList( + modifier: Modifier = Modifier, + myMemes: LazyPagingItems, + onMemeItemClick: (String) -> Unit, + onCopyClick: (Meme) -> Unit, +) { + LazyVerticalStaggeredGrid( + modifier = modifier + .fillMaxWidth() + .heightIn(max = (FARMEME_MEME_ITEM_MAX_HEIGHT * myMemes.itemCount).dp) + .wrapContentHeight(), + userScrollEnabled = false, + columns = StaggeredGridCells.Fixed(2), + horizontalArrangement = Arrangement.spacedBy(space = 12.dp), + contentPadding = PaddingValues( + start = 20.dp, + end = 20.dp, + ), + verticalItemSpacing = 20.dp, + ) { + items(count = myMemes.itemCount) { index -> + val meme = myMemes[index] + + if (meme != null) { + FarmemeMemeItem( + modifier = Modifier, + memeId = meme.id, + memeTitle = meme.title, + lolCount = 0, + imageUrl = meme.imageUrl, + onMemeClick = onMemeItemClick, + onCopyClick = { + onCopyClick(meme) + }, + ) + } + } + } +} + +@Preview +@Composable +private fun MyMemeContentPreview() { + MyMemeContent( + myMemes = flowOf(PagingData.empty()).collectAsLazyPagingItems(), + onMemeClick = {}, + onCopyClick = {}, + onUploadClick = {}, + ) +} \ No newline at end of file From b41057691819ff6907438fad46ad4c24c781d935 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 17:11:57 +0900 Subject: [PATCH 08/16] =?UTF-8?q?[Feat]=20SavedMemeContent=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ppac/mypage/component/SavedMemeContent.kt | 37 +++---------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/SavedMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/SavedMemeContent.kt index 2d8c2114..96974762 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/SavedMemeContent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/SavedMemeContent.kt @@ -7,13 +7,10 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn -import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells -import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -23,10 +20,8 @@ import androidx.paging.compose.collectAsLazyPagingItems import kotlinx.coroutines.flow.flowOf import team.ppac.common.android.component.FARMEME_MEME_ITEM_MAX_HEIGHT import team.ppac.common.android.component.FarmemeMemeItem -import team.ppac.designsystem.FarmemeTheme -import team.ppac.designsystem.component.list.FarmemeListHeader -import team.ppac.designsystem.foundation.FarmemeIcon import team.ppac.domain.model.Meme +import team.ppac.mypage.mvi.MyPageTabType @Composable internal fun SavedMemeContent( @@ -38,20 +33,16 @@ internal fun SavedMemeContent( Column( modifier = modifier.fillMaxWidth(), ) { - FarmemeListHeader( - title = "나의 파밈함", - leadingIcon = { - FarmemeIcon.BookmarkLine(Modifier.size(20.dp)) - }, - ) if (savedMemes.itemCount > 0) { SavedMemeList( savedMemes = savedMemes, onMemeItemClick = onMemeClick, - onCopyClick = onCopyClick + onCopyClick = onCopyClick, ) } else { - SavedMemeEmpty() + EmptyMemeContent( + tabType = MyPageTabType.SAVED_MEMES, + ) } Spacer(modifier = Modifier.height(50.dp)) } @@ -96,24 +87,6 @@ private fun SavedMemeList( } } -@Composable -private fun SavedMemeEmpty( - modifier: Modifier = Modifier, -) { - Column( - modifier = modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.height(50.dp)) - Text( - text = "저장한 밈이 없어요", - style = FarmemeTheme.typography.body.large.medium, - color = FarmemeTheme.textColor.assistive, - ) - Spacer(modifier = Modifier.height(50.dp)) - } -} - @Preview @Composable private fun SavedMemeContentPreview() { From 242129ccff61acd3f1a5166a4cbb0b3f39693401 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 17:12:11 +0900 Subject: [PATCH 09/16] =?UTF-8?q?[Feat]=20MyPageScreen=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/team/ppac/mypage/MyPageScreen.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt index 872f70fe..93440390 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt @@ -42,6 +42,7 @@ import team.ppac.designsystem.component.tabbar.TabBarHeight import team.ppac.designsystem.component.toolbar.FarmemeActionToolBar import team.ppac.designsystem.foundation.FarmemeRadius import team.ppac.domain.repository.SavedMemeEvent +import team.ppac.mypage.component.MyMemeContent import team.ppac.mypage.component.MyPageLevelBox import team.ppac.mypage.component.MyPageMemesTabBar import team.ppac.mypage.component.MyPageProgressBar @@ -140,10 +141,22 @@ internal fun MyPageScreen( .height(1.dp) .background(FarmemeTheme.borderColor.tertiary), ) + Spacer(modifier = Modifier.height(20.dp)) if (!uiState.isLoading) { when (uiState.currentTabType) { MyPageTabType.MY_MEMES -> { - // TODO(ze-zeh) : 나의 밈 + MyMemeContent( + myMemes = savedMemes, // TODO(ze-zeh) : API 연결 + onMemeClick = { memeId -> + onIntent(MyPageIntent.ClickSavedMemeItem(memeId = memeId)) + }, + onCopyClick = { + onIntent(MyPageIntent.ClickCopy(it)) + }, + onUploadClick = { + // TODO(ze-zeh) : Intent 추가 + }, + ) } MyPageTabType.SAVED_MEMES -> { From f0cf849fb3d21e9cd22887c3b9629236d330322f Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 20:54:10 +0900 Subject: [PATCH 10/16] =?UTF-8?q?[Feat]=20ClickUploadedMemeItem=20intent?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/team/ppac/analytics/action/Const.kt | 1 + .../mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt | 6 +++--- .../src/main/java/team/ppac/mypage/MyPageViewModel.kt | 5 +++++ .../src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt | 6 ++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/core/analytics/src/main/java/team/ppac/analytics/action/Const.kt b/core/analytics/src/main/java/team/ppac/analytics/action/Const.kt index 4a824008..49c88355 100644 --- a/core/analytics/src/main/java/team/ppac/analytics/action/Const.kt +++ b/core/analytics/src/main/java/team/ppac/analytics/action/Const.kt @@ -10,3 +10,4 @@ const val PAGINATION_COUNT = "page_count" const val CONTENT_TYPE = "content_type" const val MY_PAGE_RECENT_MEME = "my_recent_meme" const val MY_PAGE_SAVED_MEME = "my_saved_meme" +const val MY_PAGE_UPLOADED_MEME = "my_uploaded_meme" diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt index 93440390..d5493c1a 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt @@ -148,13 +148,13 @@ internal fun MyPageScreen( MyMemeContent( myMemes = savedMemes, // TODO(ze-zeh) : API 연결 onMemeClick = { memeId -> - onIntent(MyPageIntent.ClickSavedMemeItem(memeId = memeId)) - }, + onIntent(MyPageIntent.ClickUploadedMemeItem(memeId = memeId)) + }, onCopyClick = { onIntent(MyPageIntent.ClickCopy(it)) }, onUploadClick = { - // TODO(ze-zeh) : Intent 추가 + // TODO(ze-zeh) : Register 이동 Intent 추가 }, ) } diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt index a7fe1fa5..b5e12f88 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt @@ -72,6 +72,11 @@ class MyPageViewModel @Inject constructor( memeId = intent.memeId ) + is MyPageIntent.ClickUploadedMemeItem -> navigateToDetail( + contentType = intent.contentType, + memeId = intent.memeId + ) + MyPageIntent.ClickSettingButton -> navigateToSetting() is MyPageIntent.ClickRetryButton -> { initialAction() diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt index f479cd94..4b33080f 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt @@ -2,6 +2,7 @@ package team.ppac.mypage.mvi import team.ppac.analytics.action.MY_PAGE_RECENT_MEME import team.ppac.analytics.action.MY_PAGE_SAVED_MEME +import team.ppac.analytics.action.MY_PAGE_UPLOADED_MEME import team.ppac.common.android.base.UiIntent import team.ppac.domain.model.Meme @@ -17,6 +18,11 @@ sealed class MyPageIntent : UiIntent { val memeId: String ) : MyPageIntent() + data class ClickUploadedMemeItem( + val contentType: String = MY_PAGE_UPLOADED_MEME, + val memeId: String + ) : MyPageIntent() + data object ClickRetryButton : MyPageIntent() data object InitView : MyPageIntent() data object RefreshData : MyPageIntent() From 70d41d9a4c58ffaaed4963d73e7a28b9fdd0ca67 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 20:57:05 +0900 Subject: [PATCH 11/16] =?UTF-8?q?[Refactor]=20my=20memes=20->=20uploaded?= =?UTF-8?q?=20memes=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/team/ppac/mypage/MyPageScreen.kt | 10 +++---- .../ppac/mypage/component/EmptyMemeContent.kt | 6 ++-- .../mypage/component/MyPageMemesTabBar.kt | 8 +++--- ...yMemeContent.kt => UploadedMemeContent.kt} | 28 +++++++++---------- .../team/ppac/mypage/mvi/MyPageUiState.kt | 4 +-- 5 files changed, 28 insertions(+), 28 deletions(-) rename feature/mypage/src/main/java/team/ppac/mypage/component/{MyMemeContent.kt => UploadedMemeContent.kt} (80%) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt index d5493c1a..65709384 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt @@ -42,7 +42,7 @@ import team.ppac.designsystem.component.tabbar.TabBarHeight import team.ppac.designsystem.component.toolbar.FarmemeActionToolBar import team.ppac.designsystem.foundation.FarmemeRadius import team.ppac.domain.repository.SavedMemeEvent -import team.ppac.mypage.component.MyMemeContent +import team.ppac.mypage.component.UploadedMemeContent import team.ppac.mypage.component.MyPageLevelBox import team.ppac.mypage.component.MyPageMemesTabBar import team.ppac.mypage.component.MyPageProgressBar @@ -144,9 +144,9 @@ internal fun MyPageScreen( Spacer(modifier = Modifier.height(20.dp)) if (!uiState.isLoading) { when (uiState.currentTabType) { - MyPageTabType.MY_MEMES -> { - MyMemeContent( - myMemes = savedMemes, // TODO(ze-zeh) : API 연결 + MyPageTabType.UPLOADED_MEMES -> { + UploadedMemeContent( + uploadedMemes = savedMemes, // TODO(ze-zeh) : API 연결 필요 onMemeClick = { memeId -> onIntent(MyPageIntent.ClickUploadedMemeItem(memeId = memeId)) }, @@ -154,7 +154,7 @@ internal fun MyPageScreen( onIntent(MyPageIntent.ClickCopy(it)) }, onUploadClick = { - // TODO(ze-zeh) : Register 이동 Intent 추가 + // TODO(ze-zeh) : Register 이동 Intent 추가 필요 }, ) } diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt index c34235b3..35b0c919 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt @@ -23,7 +23,7 @@ fun EmptyMemeContent( onUploadClick: () -> Unit = {}, ) { val (title, content) = when (tabType) { - MyPageTabType.MY_MEMES -> "올린 밈이 없어요" to "공유하고 싶은 밈이 있다면\n업로드해보세요." + MyPageTabType.UPLOADED_MEMES -> "올린 밈이 없어요" to "공유하고 싶은 밈이 있다면\n업로드해보세요." MyPageTabType.SAVED_MEMES -> "저장한 밈이 없어요" to "관심있는 밈을 저장하고\n필요할 때 편하게 사용해보세요." } @@ -49,7 +49,7 @@ fun EmptyMemeContent( color = FarmemeTheme.textColor.tertiary ), ) - if (tabType == MyPageTabType.MY_MEMES) { + if (tabType == MyPageTabType.UPLOADED_MEMES) { Spacer(modifier = Modifier.size(20.dp)) FarmemeFilledButton( text = "밈 올리기", @@ -63,5 +63,5 @@ fun EmptyMemeContent( @Preview(showBackground = true) @Composable private fun EmptyMemeContentPreview() { - EmptyMemeContent(tabType = MyPageTabType.MY_MEMES) + EmptyMemeContent(tabType = MyPageTabType.UPLOADED_MEMES) } \ No newline at end of file diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt index 5e35e173..03ec60b9 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt @@ -32,8 +32,8 @@ internal fun MyPageMemesTabBar( ) { MyPageMemesTab( modifier = Modifier.weight(1f), - currentTabType = MyPageTabType.MY_MEMES, - isSelected = currentTabType == MyPageTabType.MY_MEMES, + currentTabType = MyPageTabType.UPLOADED_MEMES, + isSelected = currentTabType == MyPageTabType.UPLOADED_MEMES, onClick = onClick, ) Spacer(modifier = Modifier.width(8.dp)) @@ -85,7 +85,7 @@ private fun MyPageMemesTabBarPreview( modifier: Modifier = Modifier, ) { MyPageMemesTabBar( - currentTabType = MyPageTabType.MY_MEMES, + currentTabType = MyPageTabType.UPLOADED_MEMES, onClick = {}, ) } @@ -97,7 +97,7 @@ private fun MyPageMemesTabPreview( ) { Column { MyPageMemesTab( - currentTabType = MyPageTabType.MY_MEMES, + currentTabType = MyPageTabType.UPLOADED_MEMES, isSelected = true, onClick = {}, ) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/MyMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/UploadedMemeContent.kt similarity index 80% rename from feature/mypage/src/main/java/team/ppac/mypage/component/MyMemeContent.kt rename to feature/mypage/src/main/java/team/ppac/mypage/component/UploadedMemeContent.kt index 04564b05..c67af6c3 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/MyMemeContent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/UploadedMemeContent.kt @@ -24,9 +24,9 @@ import team.ppac.domain.model.Meme import team.ppac.mypage.mvi.MyPageTabType @Composable -internal fun MyMemeContent( +internal fun UploadedMemeContent( modifier: Modifier = Modifier, - myMemes: LazyPagingItems, + uploadedMemes: LazyPagingItems, onMemeClick: (String) -> Unit, onCopyClick: (Meme) -> Unit, onUploadClick: () -> Unit, @@ -34,15 +34,15 @@ internal fun MyMemeContent( Column( modifier = modifier.fillMaxWidth(), ) { - if (myMemes.itemCount > 0) { - MyMemeList( - myMemes = myMemes, + if (uploadedMemes.itemCount > 0) { + UploadedMemeList( + uploadedMemes = uploadedMemes, onMemeItemClick = onMemeClick, onCopyClick = onCopyClick ) } else { EmptyMemeContent( - tabType = MyPageTabType.MY_MEMES, + tabType = MyPageTabType.UPLOADED_MEMES, onUploadClick = onUploadClick, ) } @@ -51,16 +51,16 @@ internal fun MyMemeContent( } @Composable -private fun MyMemeList( +private fun UploadedMemeList( modifier: Modifier = Modifier, - myMemes: LazyPagingItems, + uploadedMemes: LazyPagingItems, onMemeItemClick: (String) -> Unit, onCopyClick: (Meme) -> Unit, ) { LazyVerticalStaggeredGrid( modifier = modifier .fillMaxWidth() - .heightIn(max = (FARMEME_MEME_ITEM_MAX_HEIGHT * myMemes.itemCount).dp) + .heightIn(max = (FARMEME_MEME_ITEM_MAX_HEIGHT * uploadedMemes.itemCount).dp) .wrapContentHeight(), userScrollEnabled = false, columns = StaggeredGridCells.Fixed(2), @@ -71,8 +71,8 @@ private fun MyMemeList( ), verticalItemSpacing = 20.dp, ) { - items(count = myMemes.itemCount) { index -> - val meme = myMemes[index] + items(count = uploadedMemes.itemCount) { index -> + val meme = uploadedMemes[index] if (meme != null) { FarmemeMemeItem( @@ -93,9 +93,9 @@ private fun MyMemeList( @Preview @Composable -private fun MyMemeContentPreview() { - MyMemeContent( - myMemes = flowOf(PagingData.empty()).collectAsLazyPagingItems(), +private fun UploadedMemeContentPreview() { + UploadedMemeContent( + uploadedMemes = flowOf(PagingData.empty()).collectAsLazyPagingItems(), onMemeClick = {}, onCopyClick = {}, onUploadClick = {}, diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt index 9d722946..508386bd 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt @@ -14,7 +14,7 @@ data class MyPageUiState( val isRefreshing: Boolean = false, val isError: Boolean = false, val levelUiModel: LevelUiModel = LevelUiModel(), - val currentTabType: MyPageTabType = MyPageTabType.MY_MEMES, + val currentTabType: MyPageTabType = MyPageTabType.UPLOADED_MEMES, val recentMemes: ImmutableList = persistentListOf(), val savedMemes: Flow> = flowOf(PagingData.empty()), ) : UiState { @@ -25,7 +25,7 @@ data class MyPageUiState( } enum class MyPageTabType(val title: String) { - MY_MEMES(title = "나의 밈"), + UPLOADED_MEMES(title = "나의 밈"), SAVED_MEMES(title = "나의 파밈함"), ; } \ No newline at end of file From eb0d02d86c6a1718d1e40224ab3da4b5fb3afee7 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 21:04:19 +0900 Subject: [PATCH 12/16] =?UTF-8?q?[Feat]=20MyPage=20->=20Register=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/team/ppac/navigation/FarmemeNavHost.kt | 1 + .../java/team/ppac/analytics/action/MyPageAction.kt | 1 + .../src/main/java/team/ppac/mypage/MyPageRoute.kt | 11 ++++++++++- .../src/main/java/team/ppac/mypage/MyPageScreen.kt | 4 ++-- .../src/main/java/team/ppac/mypage/MyPageViewModel.kt | 5 +++++ .../main/java/team/ppac/mypage/mvi/MyPageIntent.kt | 1 + .../java/team/ppac/mypage/mvi/MyPageSideEffect.kt | 1 + .../team/ppac/mypage/navigation/MyPageNavigation.kt | 2 ++ 8 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/team/ppac/navigation/FarmemeNavHost.kt b/app/src/main/java/team/ppac/navigation/FarmemeNavHost.kt index 3fdeadfb..2d7f3ab5 100644 --- a/app/src/main/java/team/ppac/navigation/FarmemeNavHost.kt +++ b/app/src/main/java/team/ppac/navigation/FarmemeNavHost.kt @@ -52,6 +52,7 @@ fun FarmemeNavHost( analyticsHelper = analyticsHelper, navigateToDetail = navigateToDetail, navigateToSetting = navigateToSetting, + navigateToRegister = navigateToRegister, ) } } diff --git a/core/analytics/src/main/java/team/ppac/analytics/action/MyPageAction.kt b/core/analytics/src/main/java/team/ppac/analytics/action/MyPageAction.kt index 54545f7b..443babe7 100644 --- a/core/analytics/src/main/java/team/ppac/analytics/action/MyPageAction.kt +++ b/core/analytics/src/main/java/team/ppac/analytics/action/MyPageAction.kt @@ -7,6 +7,7 @@ enum class MyPageAction(private val tag: String) : ActionType { CLICK_MEME("click_meme"), CLICK_COPY("click_copy"), CLICK_SETTINGS("click_settings"), + CLICK_REGISTER("click_register"), ; override fun getAction(): String = tag diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageRoute.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageRoute.kt index 4c7b45bd..2c8851f4 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageRoute.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageRoute.kt @@ -24,7 +24,6 @@ import team.ppac.common.android.util.ComposableLifecycle import team.ppac.designsystem.foundation.FarmemeIcon import team.ppac.mypage.mvi.MyPageIntent import team.ppac.mypage.mvi.MyPageSideEffect -import timber.log.Timber @Composable internal fun MyPageRoute( @@ -32,6 +31,7 @@ internal fun MyPageRoute( viewModel: MyPageViewModel = hiltViewModel(), navigateToDetail: (String) -> Unit, navigateToSetting: () -> Unit, + navigateToRegister: () -> Unit, ) { var lastPage by remember { mutableIntStateOf(0) } @@ -86,6 +86,15 @@ internal fun MyPageRoute( navigateToSetting() } + MyPageSideEffect.NavigateToRegister -> { + analyticsHelper.reportAction( + action = MyPageAction.CLICK_REGISTER, + screen = ScreenType.MY_PAGE + ) + + navigateToRegister() + } + is MyPageSideEffect.ShowLevelUpSnackBar -> { viewModel.showSnackbar( message = "LV.${sideEffect.level}로 레벨업했어요!", diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt index 65709384..a4e5e4e0 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt @@ -42,7 +42,6 @@ import team.ppac.designsystem.component.tabbar.TabBarHeight import team.ppac.designsystem.component.toolbar.FarmemeActionToolBar import team.ppac.designsystem.foundation.FarmemeRadius import team.ppac.domain.repository.SavedMemeEvent -import team.ppac.mypage.component.UploadedMemeContent import team.ppac.mypage.component.MyPageLevelBox import team.ppac.mypage.component.MyPageMemesTabBar import team.ppac.mypage.component.MyPageProgressBar @@ -50,6 +49,7 @@ import team.ppac.mypage.component.MyPagePullRefreshIndicator import team.ppac.mypage.component.MyPageSpeechBubble import team.ppac.mypage.component.RecentMemeContent import team.ppac.mypage.component.SavedMemeContent +import team.ppac.mypage.component.UploadedMemeContent import team.ppac.mypage.model.LevelUiModel import team.ppac.mypage.model.MyPageLevel import team.ppac.mypage.mvi.MyPageIntent @@ -154,7 +154,7 @@ internal fun MyPageScreen( onIntent(MyPageIntent.ClickCopy(it)) }, onUploadClick = { - // TODO(ze-zeh) : Register 이동 Intent 추가 필요 + onIntent(MyPageIntent.ClickUpload) }, ) } diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt index b5e12f88..110379cf 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt @@ -77,6 +77,7 @@ class MyPageViewModel @Inject constructor( memeId = intent.memeId ) + MyPageIntent.ClickUpload -> navigateToRegister() MyPageIntent.ClickSettingButton -> navigateToSetting() is MyPageIntent.ClickRetryButton -> { initialAction() @@ -113,6 +114,10 @@ class MyPageViewModel @Inject constructor( postSideEffect(MyPageSideEffect.NavigateToSetting) } + private fun navigateToRegister() { + postSideEffect(MyPageSideEffect.NavigateToRegister) + } + private fun initialAction() { launch { getUserData() diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt index 4b33080f..28993e77 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt @@ -23,6 +23,7 @@ sealed class MyPageIntent : UiIntent { val memeId: String ) : MyPageIntent() + data object ClickUpload : MyPageIntent() data object ClickRetryButton : MyPageIntent() data object InitView : MyPageIntent() data object RefreshData : MyPageIntent() diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageSideEffect.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageSideEffect.kt index 3444dc40..94104aaa 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageSideEffect.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageSideEffect.kt @@ -6,6 +6,7 @@ import team.ppac.domain.model.Meme sealed class MyPageSideEffect : UiSideEffect { data class NavigateToDetail(val contentType: String, val memeId: String) : MyPageSideEffect() data object NavigateToSetting : MyPageSideEffect() + data object NavigateToRegister : MyPageSideEffect() data class ShowLevelUpSnackBar(val level: Int) : MyPageSideEffect() data class LogClickCopy(val meme: Meme) : MyPageSideEffect() } \ No newline at end of file diff --git a/feature/mypage/src/main/java/team/ppac/mypage/navigation/MyPageNavigation.kt b/feature/mypage/src/main/java/team/ppac/mypage/navigation/MyPageNavigation.kt index e5ec465f..0847a132 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/navigation/MyPageNavigation.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/navigation/MyPageNavigation.kt @@ -15,6 +15,7 @@ fun NavGraphBuilder.myPageScreen( analyticsHelper: AnalyticsHelper, navigateToDetail: (String) -> Unit, navigateToSetting: () -> Unit, + navigateToRegister: () -> Unit, ) { composable( route = MY_PAGE_ROUTE @@ -23,6 +24,7 @@ fun NavGraphBuilder.myPageScreen( analyticsHelper = analyticsHelper, navigateToDetail = navigateToDetail, navigateToSetting = navigateToSetting, + navigateToRegister = navigateToRegister, ) } } \ No newline at end of file From 0f0d81263991db87ff3ef92aec3a085f8d0adf1f Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 21:09:11 +0900 Subject: [PATCH 13/16] =?UTF-8?q?[Refactor]=20uploaded=20memes=20->=20regi?= =?UTF-8?q?stered=20memes=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/team/ppac/analytics/action/Const.kt | 2 +- .../java/team/ppac/mypage/MyPageScreen.kt | 14 ++++---- .../java/team/ppac/mypage/MyPageViewModel.kt | 4 +-- .../ppac/mypage/component/EmptyMemeContent.kt | 6 ++-- .../mypage/component/MyPageMemesTabBar.kt | 8 ++--- ...emeContent.kt => RegisteredMemeContent.kt} | 34 +++++++++---------- .../java/team/ppac/mypage/mvi/MyPageIntent.kt | 8 ++--- .../team/ppac/mypage/mvi/MyPageUiState.kt | 4 +-- 8 files changed, 40 insertions(+), 40 deletions(-) rename feature/mypage/src/main/java/team/ppac/mypage/component/{UploadedMemeContent.kt => RegisteredMemeContent.kt} (76%) diff --git a/core/analytics/src/main/java/team/ppac/analytics/action/Const.kt b/core/analytics/src/main/java/team/ppac/analytics/action/Const.kt index 49c88355..81e2677f 100644 --- a/core/analytics/src/main/java/team/ppac/analytics/action/Const.kt +++ b/core/analytics/src/main/java/team/ppac/analytics/action/Const.kt @@ -10,4 +10,4 @@ const val PAGINATION_COUNT = "page_count" const val CONTENT_TYPE = "content_type" const val MY_PAGE_RECENT_MEME = "my_recent_meme" const val MY_PAGE_SAVED_MEME = "my_saved_meme" -const val MY_PAGE_UPLOADED_MEME = "my_uploaded_meme" +const val MY_PAGE_REGISTERED_MEME = "my_registered_meme" diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt index a4e5e4e0..e0ac4d0d 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt @@ -49,7 +49,7 @@ import team.ppac.mypage.component.MyPagePullRefreshIndicator import team.ppac.mypage.component.MyPageSpeechBubble import team.ppac.mypage.component.RecentMemeContent import team.ppac.mypage.component.SavedMemeContent -import team.ppac.mypage.component.UploadedMemeContent +import team.ppac.mypage.component.RegisteredMemeContent import team.ppac.mypage.model.LevelUiModel import team.ppac.mypage.model.MyPageLevel import team.ppac.mypage.mvi.MyPageIntent @@ -144,17 +144,17 @@ internal fun MyPageScreen( Spacer(modifier = Modifier.height(20.dp)) if (!uiState.isLoading) { when (uiState.currentTabType) { - MyPageTabType.UPLOADED_MEMES -> { - UploadedMemeContent( - uploadedMemes = savedMemes, // TODO(ze-zeh) : API 연결 필요 + MyPageTabType.REGISTERED_MEMES -> { + RegisteredMemeContent( + registeredMemes = savedMemes, // TODO(ze-zeh) : API 연결 필요 onMemeClick = { memeId -> - onIntent(MyPageIntent.ClickUploadedMemeItem(memeId = memeId)) + onIntent(MyPageIntent.ClickRegisteredMemeItem(memeId = memeId)) }, onCopyClick = { onIntent(MyPageIntent.ClickCopy(it)) }, - onUploadClick = { - onIntent(MyPageIntent.ClickUpload) + onRegisterClick = { + onIntent(MyPageIntent.ClickRegister) }, ) } diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt index 110379cf..cbeeedec 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageViewModel.kt @@ -72,12 +72,12 @@ class MyPageViewModel @Inject constructor( memeId = intent.memeId ) - is MyPageIntent.ClickUploadedMemeItem -> navigateToDetail( + is MyPageIntent.ClickRegisteredMemeItem -> navigateToDetail( contentType = intent.contentType, memeId = intent.memeId ) - MyPageIntent.ClickUpload -> navigateToRegister() + MyPageIntent.ClickRegister -> navigateToRegister() MyPageIntent.ClickSettingButton -> navigateToSetting() is MyPageIntent.ClickRetryButton -> { initialAction() diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt index 35b0c919..7048ae51 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt @@ -23,7 +23,7 @@ fun EmptyMemeContent( onUploadClick: () -> Unit = {}, ) { val (title, content) = when (tabType) { - MyPageTabType.UPLOADED_MEMES -> "올린 밈이 없어요" to "공유하고 싶은 밈이 있다면\n업로드해보세요." + MyPageTabType.REGISTERED_MEMES -> "올린 밈이 없어요" to "공유하고 싶은 밈이 있다면\n업로드해보세요." MyPageTabType.SAVED_MEMES -> "저장한 밈이 없어요" to "관심있는 밈을 저장하고\n필요할 때 편하게 사용해보세요." } @@ -49,7 +49,7 @@ fun EmptyMemeContent( color = FarmemeTheme.textColor.tertiary ), ) - if (tabType == MyPageTabType.UPLOADED_MEMES) { + if (tabType == MyPageTabType.REGISTERED_MEMES) { Spacer(modifier = Modifier.size(20.dp)) FarmemeFilledButton( text = "밈 올리기", @@ -63,5 +63,5 @@ fun EmptyMemeContent( @Preview(showBackground = true) @Composable private fun EmptyMemeContentPreview() { - EmptyMemeContent(tabType = MyPageTabType.UPLOADED_MEMES) + EmptyMemeContent(tabType = MyPageTabType.REGISTERED_MEMES) } \ No newline at end of file diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt index 03ec60b9..6c99c11a 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/MyPageMemesTabBar.kt @@ -32,8 +32,8 @@ internal fun MyPageMemesTabBar( ) { MyPageMemesTab( modifier = Modifier.weight(1f), - currentTabType = MyPageTabType.UPLOADED_MEMES, - isSelected = currentTabType == MyPageTabType.UPLOADED_MEMES, + currentTabType = MyPageTabType.REGISTERED_MEMES, + isSelected = currentTabType == MyPageTabType.REGISTERED_MEMES, onClick = onClick, ) Spacer(modifier = Modifier.width(8.dp)) @@ -85,7 +85,7 @@ private fun MyPageMemesTabBarPreview( modifier: Modifier = Modifier, ) { MyPageMemesTabBar( - currentTabType = MyPageTabType.UPLOADED_MEMES, + currentTabType = MyPageTabType.REGISTERED_MEMES, onClick = {}, ) } @@ -97,7 +97,7 @@ private fun MyPageMemesTabPreview( ) { Column { MyPageMemesTab( - currentTabType = MyPageTabType.UPLOADED_MEMES, + currentTabType = MyPageTabType.REGISTERED_MEMES, isSelected = true, onClick = {}, ) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/UploadedMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/RegisteredMemeContent.kt similarity index 76% rename from feature/mypage/src/main/java/team/ppac/mypage/component/UploadedMemeContent.kt rename to feature/mypage/src/main/java/team/ppac/mypage/component/RegisteredMemeContent.kt index c67af6c3..cff6a1df 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/UploadedMemeContent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/RegisteredMemeContent.kt @@ -24,26 +24,26 @@ import team.ppac.domain.model.Meme import team.ppac.mypage.mvi.MyPageTabType @Composable -internal fun UploadedMemeContent( +internal fun RegisteredMemeContent( modifier: Modifier = Modifier, - uploadedMemes: LazyPagingItems, + registeredMemes: LazyPagingItems, onMemeClick: (String) -> Unit, onCopyClick: (Meme) -> Unit, - onUploadClick: () -> Unit, + onRegisterClick: () -> Unit, ) { Column( modifier = modifier.fillMaxWidth(), ) { - if (uploadedMemes.itemCount > 0) { - UploadedMemeList( - uploadedMemes = uploadedMemes, + if (registeredMemes.itemCount > 0) { + RegisteredMemeList( + registeredMemes = registeredMemes, onMemeItemClick = onMemeClick, onCopyClick = onCopyClick ) } else { EmptyMemeContent( - tabType = MyPageTabType.UPLOADED_MEMES, - onUploadClick = onUploadClick, + tabType = MyPageTabType.REGISTERED_MEMES, + onUploadClick = onRegisterClick, ) } Spacer(modifier = Modifier.height(50.dp)) @@ -51,16 +51,16 @@ internal fun UploadedMemeContent( } @Composable -private fun UploadedMemeList( +private fun RegisteredMemeList( modifier: Modifier = Modifier, - uploadedMemes: LazyPagingItems, + registeredMemes: LazyPagingItems, onMemeItemClick: (String) -> Unit, onCopyClick: (Meme) -> Unit, ) { LazyVerticalStaggeredGrid( modifier = modifier .fillMaxWidth() - .heightIn(max = (FARMEME_MEME_ITEM_MAX_HEIGHT * uploadedMemes.itemCount).dp) + .heightIn(max = (FARMEME_MEME_ITEM_MAX_HEIGHT * registeredMemes.itemCount).dp) .wrapContentHeight(), userScrollEnabled = false, columns = StaggeredGridCells.Fixed(2), @@ -71,8 +71,8 @@ private fun UploadedMemeList( ), verticalItemSpacing = 20.dp, ) { - items(count = uploadedMemes.itemCount) { index -> - val meme = uploadedMemes[index] + items(count = registeredMemes.itemCount) { index -> + val meme = registeredMemes[index] if (meme != null) { FarmemeMemeItem( @@ -93,11 +93,11 @@ private fun UploadedMemeList( @Preview @Composable -private fun UploadedMemeContentPreview() { - UploadedMemeContent( - uploadedMemes = flowOf(PagingData.empty()).collectAsLazyPagingItems(), +private fun RegisteredMemeContentPreview() { + RegisteredMemeContent( + registeredMemes = flowOf(PagingData.empty()).collectAsLazyPagingItems(), onMemeClick = {}, onCopyClick = {}, - onUploadClick = {}, + onRegisterClick = {}, ) } \ No newline at end of file diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt index 28993e77..ff653a74 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageIntent.kt @@ -2,7 +2,7 @@ package team.ppac.mypage.mvi import team.ppac.analytics.action.MY_PAGE_RECENT_MEME import team.ppac.analytics.action.MY_PAGE_SAVED_MEME -import team.ppac.analytics.action.MY_PAGE_UPLOADED_MEME +import team.ppac.analytics.action.MY_PAGE_REGISTERED_MEME import team.ppac.common.android.base.UiIntent import team.ppac.domain.model.Meme @@ -18,12 +18,12 @@ sealed class MyPageIntent : UiIntent { val memeId: String ) : MyPageIntent() - data class ClickUploadedMemeItem( - val contentType: String = MY_PAGE_UPLOADED_MEME, + data class ClickRegisteredMemeItem( + val contentType: String = MY_PAGE_REGISTERED_MEME, val memeId: String ) : MyPageIntent() - data object ClickUpload : MyPageIntent() + data object ClickRegister : MyPageIntent() data object ClickRetryButton : MyPageIntent() data object InitView : MyPageIntent() data object RefreshData : MyPageIntent() diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt index 508386bd..436d6725 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt @@ -14,7 +14,7 @@ data class MyPageUiState( val isRefreshing: Boolean = false, val isError: Boolean = false, val levelUiModel: LevelUiModel = LevelUiModel(), - val currentTabType: MyPageTabType = MyPageTabType.UPLOADED_MEMES, + val currentTabType: MyPageTabType = MyPageTabType.REGISTERED_MEMES, val recentMemes: ImmutableList = persistentListOf(), val savedMemes: Flow> = flowOf(PagingData.empty()), ) : UiState { @@ -25,7 +25,7 @@ data class MyPageUiState( } enum class MyPageTabType(val title: String) { - UPLOADED_MEMES(title = "나의 밈"), + REGISTERED_MEMES(title = "나의 밈"), SAVED_MEMES(title = "나의 파밈함"), ; } \ No newline at end of file From 59679af4c535cd63bbf8802412f3e587401613a9 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 21:15:29 +0900 Subject: [PATCH 14/16] =?UTF-8?q?[Feat]=20registeredMemes=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt | 5 +++-- .../src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt index e0ac4d0d..d3f0772b 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/MyPageScreen.kt @@ -48,8 +48,8 @@ import team.ppac.mypage.component.MyPageProgressBar import team.ppac.mypage.component.MyPagePullRefreshIndicator import team.ppac.mypage.component.MyPageSpeechBubble import team.ppac.mypage.component.RecentMemeContent -import team.ppac.mypage.component.SavedMemeContent import team.ppac.mypage.component.RegisteredMemeContent +import team.ppac.mypage.component.SavedMemeContent import team.ppac.mypage.model.LevelUiModel import team.ppac.mypage.model.MyPageLevel import team.ppac.mypage.mvi.MyPageIntent @@ -64,6 +64,7 @@ internal fun MyPageScreen( onIntent: (MyPageIntent) -> Unit, ) { val savedMemes = uiState.savedMemes.collectAsLazyPagingItems() + val registeredMemes = uiState.registeredMemes.collectAsLazyPagingItems() val pullRefreshState = rememberPullRefreshState( refreshing = uiState.isRefreshing, onRefresh = { @@ -146,7 +147,7 @@ internal fun MyPageScreen( when (uiState.currentTabType) { MyPageTabType.REGISTERED_MEMES -> { RegisteredMemeContent( - registeredMemes = savedMemes, // TODO(ze-zeh) : API 연결 필요 + registeredMemes = registeredMemes, onMemeClick = { memeId -> onIntent(MyPageIntent.ClickRegisteredMemeItem(memeId = memeId)) }, diff --git a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt index 436d6725..7310551d 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/mvi/MyPageUiState.kt @@ -17,6 +17,7 @@ data class MyPageUiState( val currentTabType: MyPageTabType = MyPageTabType.REGISTERED_MEMES, val recentMemes: ImmutableList = persistentListOf(), val savedMemes: Flow> = flowOf(PagingData.empty()), + val registeredMemes: Flow> = flowOf(PagingData.empty()), ) : UiState { companion object { val INITIAL_STATE From 221bbe805886c0e6fcc87743be2c1c177647d4de Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Sat, 28 Sep 2024 21:32:15 +0900 Subject: [PATCH 15/16] =?UTF-8?q?[Fix]=20RegisterScreen=20LazyColumn=20?= =?UTF-8?q?=ED=81=AC=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../register/src/main/java/team/ppac/register/RegisterScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/register/src/main/java/team/ppac/register/RegisterScreen.kt b/feature/register/src/main/java/team/ppac/register/RegisterScreen.kt index e56f51aa..d3d05894 100644 --- a/feature/register/src/main/java/team/ppac/register/RegisterScreen.kt +++ b/feature/register/src/main/java/team/ppac/register/RegisterScreen.kt @@ -53,6 +53,7 @@ internal fun RegisterScreen( } ) { LazyColumn( + modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { item { From 6633f88f3cabfefe97af1944f705407dc22ce845 Mon Sep 17 00:00:00 2001 From: ze-zeh Date: Mon, 30 Sep 2024 01:12:25 +0900 Subject: [PATCH 16/16] =?UTF-8?q?[Fix]=20empty=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=ED=8C=8C=EC=9D=BC=20vector=20->=20png=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team/ppac/designsystem/foundation/Icon.kt | 12 +---- .../src/main/res/drawable/ic_empty_80.xml | 45 ------------------ .../src/main/res/drawable/img_empty.png | Bin 0 -> 24935 bytes .../ppac/mypage/component/EmptyMemeContent.kt | 20 +++++--- .../detail/component/EmptyResultContent.kt | 9 +++- 5 files changed, 21 insertions(+), 65 deletions(-) delete mode 100644 core/designsystem/src/main/res/drawable/ic_empty_80.xml create mode 100644 core/designsystem/src/main/res/drawable/img_empty.png diff --git a/core/designsystem/src/main/kotlin/team/ppac/designsystem/foundation/Icon.kt b/core/designsystem/src/main/kotlin/team/ppac/designsystem/foundation/Icon.kt index b03078ef..52a2de77 100644 --- a/core/designsystem/src/main/kotlin/team/ppac/designsystem/foundation/Icon.kt +++ b/core/designsystem/src/main/kotlin/team/ppac/designsystem/foundation/Icon.kt @@ -401,16 +401,6 @@ object FarmemeIcon { contentDescription = null, ) - @Composable - fun EmptyResult( - modifier: Modifier = Modifier, - ) = Icon( - modifier = modifier, - painter = painterResource(R.drawable.ic_empty_80), - contentDescription = null, - tint = Color.Unspecified - ) - @Composable fun Required( modifier: Modifier = Modifier, @@ -434,7 +424,7 @@ object FarmemeIcon { @Composable fun Upload( modifier: Modifier = Modifier, - )= Icon( + ) = Icon( modifier = modifier, painter = painterResource(R.drawable.ic_upload_16), contentDescription = null, diff --git a/core/designsystem/src/main/res/drawable/ic_empty_80.xml b/core/designsystem/src/main/res/drawable/ic_empty_80.xml deleted file mode 100644 index 074db2e6..00000000 --- a/core/designsystem/src/main/res/drawable/ic_empty_80.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - diff --git a/core/designsystem/src/main/res/drawable/img_empty.png b/core/designsystem/src/main/res/drawable/img_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..748eb68d1cc727796af0bbef7f5f59aba1b4342d GIT binary patch literal 24935 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%0A`8s-&Fc+ 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 literal 0 HcmV?d00001 diff --git a/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt b/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt index 7048ae51..7c091890 100644 --- a/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt +++ b/feature/mypage/src/main/java/team/ppac/mypage/component/EmptyMemeContent.kt @@ -1,19 +1,21 @@ package team.ppac.mypage.component +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.size import androidx.compose.material.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.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import team.ppac.designsystem.FarmemeTheme import team.ppac.designsystem.component.button.FarmemeFilledButton -import team.ppac.designsystem.foundation.FarmemeIcon import team.ppac.mypage.mvi.MyPageTabType @Composable @@ -31,9 +33,13 @@ fun EmptyMemeContent( modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { - Spacer(modifier = Modifier.size(160.dp)) - FarmemeIcon.EmptyResult() - Spacer(modifier = Modifier.size(20.dp)) + Spacer(modifier = Modifier.height(160.dp)) + Image( + modifier = Modifier.size(80.dp), + painter = painterResource(id = team.ppac.designsystem.R.drawable.img_empty), + contentDescription = null, + ) + Spacer(modifier = Modifier.height(20.dp)) Text( text = title, textAlign = TextAlign.Center, @@ -41,7 +47,7 @@ fun EmptyMemeContent( color = FarmemeTheme.textColor.primary ), ) - Spacer(modifier = Modifier.size(9.dp)) + Spacer(modifier = Modifier.height(9.dp)) Text( text = content, textAlign = TextAlign.Center, @@ -50,13 +56,13 @@ fun EmptyMemeContent( ), ) if (tabType == MyPageTabType.REGISTERED_MEMES) { - Spacer(modifier = Modifier.size(20.dp)) + Spacer(modifier = Modifier.height(20.dp)) FarmemeFilledButton( text = "밈 올리기", onClick = onUploadClick, ) } - Spacer(modifier = Modifier.size(220.dp)) + Spacer(modifier = Modifier.height(220.dp)) } } diff --git a/feature/search/src/main/java/team/ppac/search/detail/component/EmptyResultContent.kt b/feature/search/src/main/java/team/ppac/search/detail/component/EmptyResultContent.kt index 29532d18..99e827f3 100644 --- a/feature/search/src/main/java/team/ppac/search/detail/component/EmptyResultContent.kt +++ b/feature/search/src/main/java/team/ppac/search/detail/component/EmptyResultContent.kt @@ -1,5 +1,6 @@ package team.ppac.search.detail.component +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -11,10 +12,10 @@ 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.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import team.ppac.designsystem.FarmemeTheme -import team.ppac.designsystem.foundation.FarmemeIcon @Composable fun EmptyResultContent( @@ -28,7 +29,11 @@ fun EmptyResultContent( modifier = Modifier, horizontalAlignment = Alignment.CenterHorizontally ) { - FarmemeIcon.EmptyResult() + Image( + modifier = Modifier.size(80.dp), + painter = painterResource(id = team.ppac.designsystem.R.drawable.img_empty), + contentDescription = null, + ) Spacer(modifier = Modifier.size(20.dp)) Text( text = "밈이 없어요",