From ebe5fc983c298500d6a9adc3c0ca60646f055a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Fri, 16 Aug 2024 21:32:39 +0900 Subject: [PATCH 01/17] :fire: :: Fire Unused Code --- .../src/main/java/com/msg/post/PostDetailSettingScreen.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostDetailSettingScreen.kt b/feature/post/src/main/java/com/msg/post/PostDetailSettingScreen.kt index 861aba07..fecb01ab 100644 --- a/feature/post/src/main/java/com/msg/post/PostDetailSettingScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostDetailSettingScreen.kt @@ -60,12 +60,6 @@ internal fun PostDetailSettingScreen( onClickAddButton: () -> Unit, onValueChanged: (index: Int, item: String) -> Unit ) { - val scrollState = rememberScrollState() - val interactionSource = remember { MutableInteractionSource() } - - val addedLinks = links - val count = remember { mutableIntStateOf(links.count()) } - BitgoeulAndroidTheme { colors, typography -> Column( modifier = modifier From 2e737774e954baa81d53c51027bbdc78f7009519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Fri, 16 Aug 2024 21:34:47 +0900 Subject: [PATCH 02/17] :recycle: :: ScrollState State Hoisting --- feature/post/src/main/java/com/msg/post/PostAddScreen.kt | 4 ++-- feature/post/src/main/java/com/msg/post/PostDetailScreen.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt index 1f481e6a..cac94f30 100644 --- a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt @@ -1,6 +1,7 @@ package com.msg.post import androidx.activity.ComponentActivity +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Column @@ -80,6 +81,7 @@ internal fun PostAddScreenRoute( internal fun PostAddScreen( modifier: Modifier = Modifier, focusManager: FocusManager = LocalFocusManager.current, + scrollState: ScrollState = rememberScrollState(), onBackClicked: () -> Unit, onSettingClicked: (title: String, content: String) -> Unit, onAddClicked: (feedType: FeedType, title: String, content: String) -> Unit, @@ -92,8 +94,6 @@ internal fun PostAddScreen( val maxTitleLength = 100 - val scrollState = rememberScrollState() - val typeText = when (feedType) { FeedType.EMPLOYMENT -> "게시글" FeedType.NOTICE -> "공지사항" diff --git a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt index b4b05dc9..4ac18a8a 100644 --- a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt @@ -2,6 +2,7 @@ package com.msg.post import com.msg.model.enumdata.Authority import androidx.activity.ComponentActivity +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -96,6 +97,7 @@ private suspend fun getDetailPost( @Composable internal fun PostDetailScreen( modifier: Modifier = Modifier, + scrollState: ScrollState = rememberScrollState(), data: GetDetailPostEntity, id: UUID, role: Authority = Authority.ROLE_USER, @@ -103,8 +105,6 @@ internal fun PostDetailScreen( onEditClicked: () -> Unit, onBackClicked: () -> Unit ) { - val scrollState = rememberScrollState() - val isDialogShow = remember { mutableStateOf(false) } BitgoeulAndroidTheme { colors, typography -> From 12822e16090a3436ebd045666d77388462f518a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Fri, 16 Aug 2024 21:35:06 +0900 Subject: [PATCH 03/17] :memo: :: Apply Code Convention --- .../post/src/main/java/com/msg/post/component/AddLinkSection.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/post/src/main/java/com/msg/post/component/AddLinkSection.kt b/feature/post/src/main/java/com/msg/post/component/AddLinkSection.kt index e1bfafcc..a3738b41 100644 --- a/feature/post/src/main/java/com/msg/post/component/AddLinkSection.kt +++ b/feature/post/src/main/java/com/msg/post/component/AddLinkSection.kt @@ -23,7 +23,7 @@ import com.msg.design_system.theme.BitgoeulAndroidTheme @Composable internal fun AddLinkSection( - modifier: Modifier, + modifier: Modifier = Modifier, links: List, onClickAddButton: () -> Unit, onValueChanged: (index: Int, item: String) -> Unit From fa012e0d2917b4a7aab5e6e645a826f4b33cd09e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Fri, 16 Aug 2024 23:49:54 +0900 Subject: [PATCH 04/17] :recycle: :: Use SavedStateHandle To PostViewModel --- .../com/msg/post/viewmodel/PostViewModel.kt | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/viewmodel/PostViewModel.kt b/feature/post/src/main/java/com/msg/post/viewmodel/PostViewModel.kt index a1e296b6..5d94edcd 100644 --- a/feature/post/src/main/java/com/msg/post/viewmodel/PostViewModel.kt +++ b/feature/post/src/main/java/com/msg/post/viewmodel/PostViewModel.kt @@ -2,6 +2,7 @@ package com.msg.post.viewmodel import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.msg.common.errorhandling.errorHandling @@ -28,9 +29,15 @@ class PostViewModel @Inject constructor( private val getDetailPostUseCase: GetDetailPostUseCase, private val getPostListUseCase: GetPostListUseCase, private val sendPostUseCase: SendPostUseCase, - private val getAuthorityUseCase: GetAuthorityUseCase + private val getAuthorityUseCase: GetAuthorityUseCase, + private val savedStateHandle: SavedStateHandle ) : ViewModel() { + companion object { + private const val TITLE = "title" + private const val CONTENT = "content" + } + val role = getRole().toString() private val _deletePostResponse = MutableStateFlow>(Event.Loading) @@ -73,11 +80,9 @@ class PostViewModel @Inject constructor( var currentFeedType = mutableStateOf(FeedType.EMPLOYMENT) private set - var savedTitle = mutableStateOf("") - private set + internal var title = savedStateHandle.getStateFlow(key = TITLE, initialValue = "") - var savedContent = mutableStateOf("") - private set + internal var content = savedStateHandle.getStateFlow(key = CONTENT, initialValue = "") var selectedId = mutableStateOf(UUID.randomUUID()) private set @@ -192,8 +197,8 @@ class PostViewModel @Inject constructor( } internal fun getFilledEditPage() { - savedTitle.value = detailPost.value.title - savedContent.value = detailPost.value.content + onTitleChange(detailPost.value.title) + onContentChange(detailPost.value.content) links.addAll(detailPost.value.links) isEditPage.value = true } @@ -201,4 +206,9 @@ class PostViewModel @Inject constructor( private fun getRole() = viewModelScope.launch { getAuthorityUseCase() } + + internal fun onTitleChange(value: String) { savedStateHandle[TITLE] = value } + + internal fun onContentChange(value: String) { savedStateHandle[CONTENT] = value } + } \ No newline at end of file From d00773b5b398e01d6597c06805f4d13b7806e976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:04:14 +0900 Subject: [PATCH 05/17] :recycle: :: Apply Changed ViewModel && Use State Hoisting --- .../main/java/com/msg/post/PostAddScreen.kt | 77 +++++++++++-------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt index cac94f30..1e49deb4 100644 --- a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt @@ -17,8 +17,7 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.input.pointer.pointerInput @@ -26,6 +25,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.msg.design_system.component.button.BitgoeulButton import com.msg.design_system.component.button.ButtonState import com.msg.design_system.component.button.DetailSettingButton @@ -43,12 +43,20 @@ internal fun PostAddScreenRoute( onSettingClicked: () -> Unit, onAddClicked: () -> Unit ) { + val titleValue by viewModel.title.collectAsStateWithLifecycle() + val contentValue by viewModel.content.collectAsStateWithLifecycle() + val isFeedType = viewModel.currentFeedType.value + + val typeText = when (isFeedType) { + FeedType.EMPLOYMENT -> "게시글" + FeedType.NOTICE -> "공지사항" + } PostAddScreen( onBackClicked = onBackClicked, onSettingClicked = { title, content -> - viewModel.savedTitle.value = title - viewModel.savedContent.value = content + viewModel.onTitleChange(title) + viewModel.onContentChange(content) onSettingClicked() }, onAddClicked = { feedType, title, content -> @@ -66,14 +74,18 @@ internal fun PostAddScreenRoute( content = content ) } - viewModel.savedContent.value = "" - viewModel.savedTitle.value = "" + viewModel.onContentChange("") + viewModel.onTitleChange("") viewModel.isEditPage.value = false onAddClicked() }, - savedTitle = viewModel.savedTitle.value, - savedContent = viewModel.savedContent.value, - feedType = viewModel.currentFeedType.value + title = titleValue, + content = contentValue, + onTitleChange = viewModel::onTitleChange, + onContentChange = viewModel::onContentChange, + maxTitleLength = 100, + typeText = typeText, + feedType = isFeedType, ) } @@ -85,19 +97,14 @@ internal fun PostAddScreen( onBackClicked: () -> Unit, onSettingClicked: (title: String, content: String) -> Unit, onAddClicked: (feedType: FeedType, title: String, content: String) -> Unit, - savedTitle: String, - savedContent: String, - feedType: FeedType + title: String, + content: String, + onTitleChange: (String) -> Unit, + onContentChange: (String) -> Unit, + maxTitleLength: Int, + feedType: FeedType, + typeText: String ) { - val title = remember { mutableStateOf(savedTitle) } - val content = remember { mutableStateOf(savedContent) } - - val maxTitleLength = 100 - - val typeText = when (feedType) { - FeedType.EMPLOYMENT -> "게시글" - FeedType.NOTICE -> "공지사항" - } BitgoeulAndroidTheme { colors, typography -> Surface( modifier = modifier @@ -129,11 +136,11 @@ internal fun PostAddScreen( ) { BasicTextField( modifier = modifier.fillMaxWidth(), - value = title.value, - onValueChange = { if (it.length <= maxTitleLength) title.value = it }, + value = title, + onValueChange = { if (it.length <= maxTitleLength) onTitleChange(it) }, textStyle = typography.titleSmall, decorationBox = { innerTextField -> - if (title.value.isEmpty()) Text( + if (title.isEmpty()) Text( text = "$typeText 제목 (100자 이내)", style = typography.titleSmall, color = colors.G1 @@ -150,11 +157,11 @@ internal fun PostAddScreen( Spacer(modifier = Modifier.height(16.dp)) BasicTextField( modifier = modifier.fillMaxWidth(), - value = content.value, - onValueChange = { if (it.length <= maxTitleLength) content.value = it }, + value = content, + onValueChange = { if (it.length <= maxTitleLength) onContentChange(it) }, textStyle = typography.bodySmall, decorationBox = { innerTextField -> - if (content.value.isEmpty()) Text( + if (content.isEmpty()) Text( text = "본문 입력 (1000자 이내)", style = typography.bodySmall, color = colors.G1 @@ -178,15 +185,15 @@ internal fun PostAddScreen( modifier = modifier.fillMaxWidth(), type = typeText ) { - onSettingClicked(title.value, content.value) + onSettingClicked(title, content) } Spacer(modifier = modifier.height(8.dp)) BitgoeulButton( modifier = modifier.fillMaxWidth(), text = "$typeText 추가", - state = if (title.value.isNotEmpty() && content.value.isNotEmpty()) ButtonState.Enable else ButtonState.Disable + state = if (title.isNotEmpty() && content.isNotEmpty()) ButtonState.Enable else ButtonState.Disable ) { - onAddClicked(feedType, title.value, content.value) + onAddClicked(feedType, title, content) } Spacer(modifier = modifier.height(16.dp)) } @@ -202,9 +209,13 @@ fun PostAddScreenPre() { onBackClicked = {}, onSettingClicked = { _, _ -> }, onAddClicked = { _, _, _ -> }, - savedTitle = "", - savedContent = "", feedType = FeedType.NOTICE, - focusManager = LocalFocusManager.current + focusManager = LocalFocusManager.current, + title = "제목", + content = "내용", + onTitleChange = {}, + onContentChange = {}, + maxTitleLength = 100, + typeText = "공지사항" ) } \ No newline at end of file From b3aba8e65b518b1496e730e8c3af5c9efdf2f2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:04:14 +0900 Subject: [PATCH 06/17] :recycle: :: Apply Changed ViewModel && Use State Hoisting - PostAddScreen --- .../main/java/com/msg/post/PostAddScreen.kt | 77 +++++++++++-------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt index cac94f30..1e49deb4 100644 --- a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt @@ -17,8 +17,7 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.input.pointer.pointerInput @@ -26,6 +25,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.msg.design_system.component.button.BitgoeulButton import com.msg.design_system.component.button.ButtonState import com.msg.design_system.component.button.DetailSettingButton @@ -43,12 +43,20 @@ internal fun PostAddScreenRoute( onSettingClicked: () -> Unit, onAddClicked: () -> Unit ) { + val titleValue by viewModel.title.collectAsStateWithLifecycle() + val contentValue by viewModel.content.collectAsStateWithLifecycle() + val isFeedType = viewModel.currentFeedType.value + + val typeText = when (isFeedType) { + FeedType.EMPLOYMENT -> "게시글" + FeedType.NOTICE -> "공지사항" + } PostAddScreen( onBackClicked = onBackClicked, onSettingClicked = { title, content -> - viewModel.savedTitle.value = title - viewModel.savedContent.value = content + viewModel.onTitleChange(title) + viewModel.onContentChange(content) onSettingClicked() }, onAddClicked = { feedType, title, content -> @@ -66,14 +74,18 @@ internal fun PostAddScreenRoute( content = content ) } - viewModel.savedContent.value = "" - viewModel.savedTitle.value = "" + viewModel.onContentChange("") + viewModel.onTitleChange("") viewModel.isEditPage.value = false onAddClicked() }, - savedTitle = viewModel.savedTitle.value, - savedContent = viewModel.savedContent.value, - feedType = viewModel.currentFeedType.value + title = titleValue, + content = contentValue, + onTitleChange = viewModel::onTitleChange, + onContentChange = viewModel::onContentChange, + maxTitleLength = 100, + typeText = typeText, + feedType = isFeedType, ) } @@ -85,19 +97,14 @@ internal fun PostAddScreen( onBackClicked: () -> Unit, onSettingClicked: (title: String, content: String) -> Unit, onAddClicked: (feedType: FeedType, title: String, content: String) -> Unit, - savedTitle: String, - savedContent: String, - feedType: FeedType + title: String, + content: String, + onTitleChange: (String) -> Unit, + onContentChange: (String) -> Unit, + maxTitleLength: Int, + feedType: FeedType, + typeText: String ) { - val title = remember { mutableStateOf(savedTitle) } - val content = remember { mutableStateOf(savedContent) } - - val maxTitleLength = 100 - - val typeText = when (feedType) { - FeedType.EMPLOYMENT -> "게시글" - FeedType.NOTICE -> "공지사항" - } BitgoeulAndroidTheme { colors, typography -> Surface( modifier = modifier @@ -129,11 +136,11 @@ internal fun PostAddScreen( ) { BasicTextField( modifier = modifier.fillMaxWidth(), - value = title.value, - onValueChange = { if (it.length <= maxTitleLength) title.value = it }, + value = title, + onValueChange = { if (it.length <= maxTitleLength) onTitleChange(it) }, textStyle = typography.titleSmall, decorationBox = { innerTextField -> - if (title.value.isEmpty()) Text( + if (title.isEmpty()) Text( text = "$typeText 제목 (100자 이내)", style = typography.titleSmall, color = colors.G1 @@ -150,11 +157,11 @@ internal fun PostAddScreen( Spacer(modifier = Modifier.height(16.dp)) BasicTextField( modifier = modifier.fillMaxWidth(), - value = content.value, - onValueChange = { if (it.length <= maxTitleLength) content.value = it }, + value = content, + onValueChange = { if (it.length <= maxTitleLength) onContentChange(it) }, textStyle = typography.bodySmall, decorationBox = { innerTextField -> - if (content.value.isEmpty()) Text( + if (content.isEmpty()) Text( text = "본문 입력 (1000자 이내)", style = typography.bodySmall, color = colors.G1 @@ -178,15 +185,15 @@ internal fun PostAddScreen( modifier = modifier.fillMaxWidth(), type = typeText ) { - onSettingClicked(title.value, content.value) + onSettingClicked(title, content) } Spacer(modifier = modifier.height(8.dp)) BitgoeulButton( modifier = modifier.fillMaxWidth(), text = "$typeText 추가", - state = if (title.value.isNotEmpty() && content.value.isNotEmpty()) ButtonState.Enable else ButtonState.Disable + state = if (title.isNotEmpty() && content.isNotEmpty()) ButtonState.Enable else ButtonState.Disable ) { - onAddClicked(feedType, title.value, content.value) + onAddClicked(feedType, title, content) } Spacer(modifier = modifier.height(16.dp)) } @@ -202,9 +209,13 @@ fun PostAddScreenPre() { onBackClicked = {}, onSettingClicked = { _, _ -> }, onAddClicked = { _, _, _ -> }, - savedTitle = "", - savedContent = "", feedType = FeedType.NOTICE, - focusManager = LocalFocusManager.current + focusManager = LocalFocusManager.current, + title = "제목", + content = "내용", + onTitleChange = {}, + onContentChange = {}, + maxTitleLength = 100, + typeText = "공지사항" ) } \ No newline at end of file From d8bb18558133a54d20f0099294057a587d43e803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:07:37 +0900 Subject: [PATCH 07/17] :recycle: :: Use Destructuring Declaration --- .../post/src/main/java/com/msg/post/PostDetailScreen.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt index 4ac18a8a..9b684384 100644 --- a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt @@ -105,7 +105,7 @@ internal fun PostDetailScreen( onEditClicked: () -> Unit, onBackClicked: () -> Unit ) { - val isDialogShow = remember { mutableStateOf(false) } + val (isDialogShow, setIsDialogShow) = remember { mutableStateOf(false) } BitgoeulAndroidTheme { colors, typography -> Box { @@ -183,7 +183,7 @@ internal fun PostDetailScreen( modifier = Modifier.fillMaxWidth(), text = "삭제하기" ) { - isDialogShow.value = true + setIsDialogShow(true) } } Row( @@ -202,8 +202,8 @@ internal fun PostDetailScreen( title = "게시글을 삭제하시겠습니까?", negativeAction = "삭제", content = data.title, - isVisible = isDialogShow.value, - onQuit = { isDialogShow.value = false }, + isVisible = isDialogShow, + onQuit = { setIsDialogShow(false) }, onActionClicked = { onDeleteClicked(id) } ) } From 4536fb6578302e5756a714cfb7861899c2d81338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:09:41 +0900 Subject: [PATCH 08/17] :memo: :: Apply Code Convention --- .../post/src/main/java/com/msg/post/PostAddScreen.kt | 6 +++--- .../src/main/java/com/msg/post/PostDetailScreen.kt | 10 ++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt index 1e49deb4..609f4b99 100644 --- a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt @@ -150,11 +150,11 @@ internal fun PostAddScreen( ) Spacer(modifier = modifier.height(16.dp)) HorizontalDivider( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), thickness = 1.dp, color = colors.G9 ) - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = modifier.height(16.dp)) BasicTextField( modifier = modifier.fillMaxWidth(), value = content, @@ -176,7 +176,7 @@ internal fun PostAddScreen( .padding(horizontal = 28.dp) ) { HorizontalDivider( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), thickness = 1.dp, color = colors.G9 ) diff --git a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt index 9b684384..6ced4893 100644 --- a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt @@ -176,21 +176,19 @@ internal fun PostDetailScreen( horizontalArrangement = Arrangement.spacedBy(8.dp) ) { if (role == Authority.ROLE_ADMIN) { - Row( - modifier = Modifier.weight(0.45f) - ) { + Row(modifier = modifier.weight(0.45f)) { NegativeBitgoeulButton( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), text = "삭제하기" ) { setIsDialogShow(true) } } Row( - modifier = Modifier.weight(0.45f) + modifier = modifier.weight(0.45f) ) { BitgoeulButton( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), text = "수정하기" ) { onEditClicked() From 23a509ce3ae92cfd69f564e0ac21dbd97387f6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:09:41 +0900 Subject: [PATCH 09/17] :memo: :: Apply Code Convention - PostAddScreen, PostDetailScreen --- .../post/src/main/java/com/msg/post/PostAddScreen.kt | 6 +++--- .../src/main/java/com/msg/post/PostDetailScreen.kt | 10 ++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt index 1e49deb4..609f4b99 100644 --- a/feature/post/src/main/java/com/msg/post/PostAddScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostAddScreen.kt @@ -150,11 +150,11 @@ internal fun PostAddScreen( ) Spacer(modifier = modifier.height(16.dp)) HorizontalDivider( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), thickness = 1.dp, color = colors.G9 ) - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = modifier.height(16.dp)) BasicTextField( modifier = modifier.fillMaxWidth(), value = content, @@ -176,7 +176,7 @@ internal fun PostAddScreen( .padding(horizontal = 28.dp) ) { HorizontalDivider( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), thickness = 1.dp, color = colors.G9 ) diff --git a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt index 9b684384..6ced4893 100644 --- a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt @@ -176,21 +176,19 @@ internal fun PostDetailScreen( horizontalArrangement = Arrangement.spacedBy(8.dp) ) { if (role == Authority.ROLE_ADMIN) { - Row( - modifier = Modifier.weight(0.45f) - ) { + Row(modifier = modifier.weight(0.45f)) { NegativeBitgoeulButton( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), text = "삭제하기" ) { setIsDialogShow(true) } } Row( - modifier = Modifier.weight(0.45f) + modifier = modifier.weight(0.45f) ) { BitgoeulButton( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), text = "수정하기" ) { onEditClicked() From 14c1ef6380c47db508c62766c54dcc102bc1faf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:11:16 +0900 Subject: [PATCH 10/17] :memo: :: Apply Code Convention - PostScreen --- feature/post/src/main/java/com/msg/post/PostScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/post/src/main/java/com/msg/post/PostScreen.kt b/feature/post/src/main/java/com/msg/post/PostScreen.kt index 18526f0b..a12d0bae 100644 --- a/feature/post/src/main/java/com/msg/post/PostScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostScreen.kt @@ -135,7 +135,7 @@ internal fun PostScreen( style = typography.titleMedium, color = colors.BLACK ) - Spacer(Modifier.weight(1f)) + Spacer(modifier.weight(1f)) IconButton( onClick = { viewState = From 0baea5f3487f95395626b3c7680d9cb8c6fe218f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:25:34 +0900 Subject: [PATCH 11/17] :recycle: :: Use State Hoisting && Simplify Code - PostScreen(Refactor) --- .../src/main/java/com/msg/post/PostScreen.kt | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostScreen.kt b/feature/post/src/main/java/com/msg/post/PostScreen.kt index a12d0bae..66bd1076 100644 --- a/feature/post/src/main/java/com/msg/post/PostScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostScreen.kt @@ -14,9 +14,12 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.msg.common.event.Event @@ -38,22 +41,14 @@ internal fun PostScreenRoute( onAddClicked: () -> Unit ) { val role = viewModel.role - var state = FeedType.EMPLOYMENT + val state = remember { mutableStateOf(viewModel.currentFeedType.value) } LaunchedEffect(true, state) { - viewModel.getPostList( - type = state - ) + viewModel.getPostList(type = state.value) getPostList( viewModel = viewModel, - onSuccess = { - viewModel.postList.value = it - }, - onFailure = { - viewModel.postList.value = GetPostListEntity( - posts = emptyList() - ) - } + onSuccess = { viewModel.postList.value = it }, + onFailure = { viewModel.postList.value = GetPostListEntity(posts = emptyList()) } ) } @@ -70,13 +65,11 @@ internal fun PostScreenRoute( }, data = viewModel.postList.value, onViewChangeClicked = { - viewModel.postList.value = GetPostListEntity( - posts = emptyList() - ) + viewModel.postList.value = GetPostListEntity(posts = emptyList()) viewModel.getPostList(type = it) - state = it + state.value = it }, - feedType = viewModel.currentFeedType.value + viewState = state.value, ) } @@ -106,17 +99,15 @@ internal fun PostScreen( onItemClicked: (UUID) -> Unit, onViewChangeClicked: (type: FeedType) -> Unit, data: GetPostListEntity, - feedType: FeedType = FeedType.EMPLOYMENT + viewState: FeedType, ) { - val roleField = listOf( - Authority.ROLE_ADMIN.toString(), - Authority.ROLE_BBOZZAK.toString(), - Authority.ROLE_PROFESSOR.toString(), - Authority.ROLE_COMPANY_INSTRUCTOR.toString(), - Authority.ROLE_GOVERNMENT.toString() - ) - - var viewState: FeedType = feedType + val roleField = setOf( + Authority.ROLE_ADMIN, + Authority.ROLE_BBOZZAK, + Authority.ROLE_PROFESSOR, + Authority.ROLE_COMPANY_INSTRUCTOR, + Authority.ROLE_GOVERNMENT + ).map { it.toString() } BitgoeulAndroidTheme { colors, typography -> Column( @@ -138,9 +129,8 @@ internal fun PostScreen( Spacer(modifier.weight(1f)) IconButton( onClick = { - viewState = - if (viewState == FeedType.EMPLOYMENT) FeedType.NOTICE else FeedType.EMPLOYMENT - onViewChangeClicked(viewState) + val newViewState = if (viewState == FeedType.EMPLOYMENT) FeedType.NOTICE else FeedType.EMPLOYMENT + onViewChangeClicked(newViewState) }, content = { when (viewState) { @@ -170,4 +160,17 @@ internal fun PostScreen( ) } } +} + +@Preview +@Composable +private fun Priview() { + PostScreen( + role = "", + onAddClicked = {}, + onItemClicked = {}, + onViewChangeClicked = {}, + data = GetPostListEntity(posts = emptyList()), + viewState = FeedType.EMPLOYMENT + ) } \ No newline at end of file From 9b1b293df3ad972c113e041bdc40d9e7268d565c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:26:06 +0900 Subject: [PATCH 12/17] :memo: :: Changed Preview Naming --- feature/post/src/main/java/com/msg/post/PostScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/post/src/main/java/com/msg/post/PostScreen.kt b/feature/post/src/main/java/com/msg/post/PostScreen.kt index 66bd1076..8db6d8d7 100644 --- a/feature/post/src/main/java/com/msg/post/PostScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostScreen.kt @@ -164,7 +164,7 @@ internal fun PostScreen( @Preview @Composable -private fun Priview() { +private fun postScreenPreview() { PostScreen( role = "", onAddClicked = {}, From 9b497cc726dff3d7c82a7d2e72ab77def4a43edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:32:38 +0900 Subject: [PATCH 13/17] :recycle: :: Use RememberSaveable --- feature/post/src/main/java/com/msg/post/PostDetailScreen.kt | 3 ++- feature/post/src/main/java/com/msg/post/PostScreen.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt index 6ced4893..4b6f5537 100644 --- a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -105,7 +106,7 @@ internal fun PostDetailScreen( onEditClicked: () -> Unit, onBackClicked: () -> Unit ) { - val (isDialogShow, setIsDialogShow) = remember { mutableStateOf(false) } + val (isDialogShow, setIsDialogShow) = rememberSaveable { mutableStateOf(false) } BitgoeulAndroidTheme { colors, typography -> Box { diff --git a/feature/post/src/main/java/com/msg/post/PostScreen.kt b/feature/post/src/main/java/com/msg/post/PostScreen.kt index 8db6d8d7..1f0218d8 100644 --- a/feature/post/src/main/java/com/msg/post/PostScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -41,7 +42,7 @@ internal fun PostScreenRoute( onAddClicked: () -> Unit ) { val role = viewModel.role - val state = remember { mutableStateOf(viewModel.currentFeedType.value) } + val state = rememberSaveable { mutableStateOf(viewModel.currentFeedType.value) } LaunchedEffect(true, state) { viewModel.getPostList(type = state.value) From dcb4fb0f4bb35d1b4c32fc17239f0e97f1fd4e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:33:03 +0900 Subject: [PATCH 14/17] :fire: :: Fire Unused Import Code --- .../src/main/java/com/msg/post/PostDetailSettingScreen.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostDetailSettingScreen.kt b/feature/post/src/main/java/com/msg/post/PostDetailSettingScreen.kt index fecb01ab..f9c34dd5 100644 --- a/feature/post/src/main/java/com/msg/post/PostDetailSettingScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostDetailSettingScreen.kt @@ -3,7 +3,6 @@ package com.msg.post import androidx.activity.ComponentActivity import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectTapGestures -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -12,12 +11,9 @@ 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.rememberScrollState import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusManager From e5bd2dab6160cb774078a4c9063b3e729455bf24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Sat, 17 Aug 2024 02:37:50 +0900 Subject: [PATCH 15/17] :recycle: :: Fire Unused Import && contains() -> in --- feature/post/src/main/java/com/msg/post/PostDetailScreen.kt | 1 - feature/post/src/main/java/com/msg/post/PostScreen.kt | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt index 4b6f5537..d9f36697 100644 --- a/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostDetailScreen.kt @@ -20,7 +20,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier diff --git a/feature/post/src/main/java/com/msg/post/PostScreen.kt b/feature/post/src/main/java/com/msg/post/PostScreen.kt index 1f0218d8..6b2efd69 100644 --- a/feature/post/src/main/java/com/msg/post/PostScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostScreen.kt @@ -15,7 +15,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -144,7 +143,7 @@ internal fun PostScreen( onClick = {}, content = { HelpIcon() } ) - if (roleField.contains(role)) { + if (role in roleField) { IconButton( modifier = modifier.padding(end = 28.dp), onClick = { onAddClicked(viewState) }, From a4afc98590ed5e13ad5524a20dd172d7b57d1ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Mon, 19 Aug 2024 08:02:32 +0900 Subject: [PATCH 16/17] :recycle: :: Apply Reviewer(postList Value Changed In viewModel) --- .../src/main/java/com/msg/post/viewmodel/PostViewModel.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/feature/post/src/main/java/com/msg/post/viewmodel/PostViewModel.kt b/feature/post/src/main/java/com/msg/post/viewmodel/PostViewModel.kt index 5d94edcd..c777170a 100644 --- a/feature/post/src/main/java/com/msg/post/viewmodel/PostViewModel.kt +++ b/feature/post/src/main/java/com/msg/post/viewmodel/PostViewModel.kt @@ -31,7 +31,6 @@ class PostViewModel @Inject constructor( private val sendPostUseCase: SendPostUseCase, private val getAuthorityUseCase: GetAuthorityUseCase, private val savedStateHandle: SavedStateHandle - ) : ViewModel() { companion object { private const val TITLE = "title" @@ -68,9 +67,7 @@ class PostViewModel @Inject constructor( private set var postList = mutableStateOf( - GetPostListEntity( - posts = listOf() - ) + GetPostListEntity(posts = listOf()) ) private set @@ -207,6 +204,8 @@ class PostViewModel @Inject constructor( getAuthorityUseCase() } + internal fun clearPostList() { postList.value = GetPostListEntity(posts = emptyList()) } + internal fun onTitleChange(value: String) { savedStateHandle[TITLE] = value } internal fun onContentChange(value: String) { savedStateHandle[CONTENT] = value } From b23e2bd2a7d000624c557ae12bc89131382620a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Mon, 19 Aug 2024 08:02:59 +0900 Subject: [PATCH 17/17] :recycle: :: Apply Before Commit(PostViewModel) --- feature/post/src/main/java/com/msg/post/PostScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/post/src/main/java/com/msg/post/PostScreen.kt b/feature/post/src/main/java/com/msg/post/PostScreen.kt index 6b2efd69..bb6af53f 100644 --- a/feature/post/src/main/java/com/msg/post/PostScreen.kt +++ b/feature/post/src/main/java/com/msg/post/PostScreen.kt @@ -48,7 +48,7 @@ internal fun PostScreenRoute( getPostList( viewModel = viewModel, onSuccess = { viewModel.postList.value = it }, - onFailure = { viewModel.postList.value = GetPostListEntity(posts = emptyList()) } + onFailure = { viewModel.clearPostList() } ) }