From 082a7ef209c45dd6c4607c9fb0a02434ee60bc47 Mon Sep 17 00:00:00 2001 From: arinming Date: Wed, 11 Sep 2024 18:07:43 +0900 Subject: [PATCH 01/51] =?UTF-8?q?[FEAT/#239]=20=ED=99=94=EB=A9=B4=EC=97=90?= =?UTF-8?q?=20background=20color=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/com/terning/feature/intern/InternRoute.kt | 6 +++++- .../java/com/terning/feature/search/search/SearchRoute.kt | 3 +++ .../feature/search/searchprocess/SearchProcessRoute.kt | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index ef02c79ed..266fc55be 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -2,6 +2,7 @@ package com.terning.feature.intern import android.view.ViewGroup import android.webkit.WebView +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight @@ -27,6 +28,7 @@ import com.terning.core.designsystem.theme.CalRed import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme +import com.terning.core.designsystem.theme.White import com.terning.core.extension.customShadow import com.terning.core.extension.toast import com.terning.core.state.UiState @@ -136,7 +138,9 @@ fun InternScreen( } Column( - modifier = modifier.fillMaxHeight(), + modifier = modifier + .fillMaxHeight() + .background(White), ) { Column( modifier = Modifier.weight(1f) diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index 1088e226c..84454cd82 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -1,5 +1,6 @@ package com.terning.feature.search.search +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -22,6 +23,7 @@ import com.terning.core.designsystem.component.image.TerningImage import com.terning.core.designsystem.component.textfield.SearchTextField import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.TerningTheme +import com.terning.core.designsystem.theme.White import com.terning.core.extension.noRippleClickable import com.terning.core.state.UiState import com.terning.domain.entity.search.SearchPopularAnnouncement @@ -96,6 +98,7 @@ fun SearchScreen( Column( modifier = modifier .fillMaxSize() + .background(White) ) { TerningImage( painter = com.terning.core.R.drawable.ic_terning_logo_typo, diff --git a/feature/src/main/java/com/terning/feature/search/searchprocess/SearchProcessRoute.kt b/feature/src/main/java/com/terning/feature/search/searchprocess/SearchProcessRoute.kt index 50809694c..09d4ff6b7 100644 --- a/feature/src/main/java/com/terning/feature/search/searchprocess/SearchProcessRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/searchprocess/SearchProcessRoute.kt @@ -1,6 +1,7 @@ package com.terning.feature.search.searchprocess import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -47,6 +48,7 @@ import com.terning.core.designsystem.theme.Grey500 import com.terning.core.designsystem.theme.TerningMain import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.designsystem.theme.TerningTheme +import com.terning.core.designsystem.theme.White import com.terning.core.extension.addFocusCleaner import com.terning.core.extension.noRippleClickable import com.terning.core.extension.toast @@ -138,6 +140,7 @@ fun SearchProcessScreen( Column( modifier = modifier .fillMaxSize() + .background(White) .addFocusCleaner(focusManager), ) { BackButtonTopAppBar( From 2fbb25d7e38dcc35f602bda9e3b72eecea4e76e3 Mon Sep 17 00:00:00 2001 From: arinming Date: Wed, 11 Sep 2024 18:18:49 +0900 Subject: [PATCH 02/51] =?UTF-8?q?[FEAT/#239]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EB=B7=B0=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/terning/feature/intern/InternRoute.kt | 6 ++++-- .../terning/feature/intern/navigation/InternNavigation.kt | 5 ----- .../src/main/java/com/terning/feature/main/MainScreen.kt | 1 - 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index 266fc55be..205a47b65 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -6,7 +6,9 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material3.Text @@ -47,7 +49,6 @@ import java.text.DecimalFormat @Composable fun InternRoute( announcementId: Long = 0, - modifier: Modifier, viewModel: InternViewModel = hiltViewModel(), navController: NavHostController, ) { @@ -77,7 +78,6 @@ fun InternRoute( InternScreen( announcementId = announcementId, internUiState = internState, - modifier = modifier, internInfo = (internState.loadState as UiState.Success).data, navController = navController, onDismissCancelDialog = { @@ -139,6 +139,8 @@ fun InternScreen( Column( modifier = modifier + .statusBarsPadding() + .navigationBarsPadding() .fillMaxHeight() .background(White), ) { diff --git a/feature/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt b/feature/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt index 7af39f4c0..7bc5c14c3 100644 --- a/feature/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt +++ b/feature/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt @@ -2,9 +2,6 @@ package com.terning.feature.intern.navigation import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding -import androidx.compose.ui.Modifier import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -27,7 +24,6 @@ fun NavController.navigateIntern( fun NavGraphBuilder.internNavGraph( navHostController: NavHostController, - paddingValues: PaddingValues, ) { composable( exitTransition = { @@ -46,7 +42,6 @@ fun NavGraphBuilder.internNavGraph( val args = it.toRoute() InternRoute( announcementId = args.announcementId, - modifier = Modifier.padding(paddingValues), navController = navHostController ) } diff --git a/feature/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/src/main/java/com/terning/feature/main/MainScreen.kt index ce270cd8e..585768eed 100644 --- a/feature/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/src/main/java/com/terning/feature/main/MainScreen.kt @@ -168,7 +168,6 @@ fun MainScreen( navHostController = navigator.navController ) internNavGraph( - paddingValues = paddingValues, navHostController = navigator.navController ) myPageNavGraph( From 5b3a6dfc24794ee2e196119ad5e9b202c6b241cb Mon Sep 17 00:00:00 2001 From: arinming Date: Wed, 11 Sep 2024 18:29:16 +0900 Subject: [PATCH 03/51] =?UTF-8?q?[FIX/#239]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EB=B7=B0=20Padding=20=EA=B0=92=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/terning/feature/intern/InternRoute.kt | 4 ++-- .../com/terning/feature/intern/component/InternInfoRow.kt | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index 205a47b65..4c458c4d8 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -206,7 +206,7 @@ fun InternScreen( } } - Spacer(modifier = Modifier.padding(top = 16.dp)) + Spacer(modifier = Modifier.padding(top = 13.dp)) InternPageTitle( modifier = Modifier, @@ -225,7 +225,7 @@ fun InternScreen( } } - Spacer(modifier = Modifier.padding(top = 16.dp)) + Spacer(modifier = Modifier.padding(top = 13.dp)) InternPageTitle( modifier = Modifier, diff --git a/feature/src/main/java/com/terning/feature/intern/component/InternInfoRow.kt b/feature/src/main/java/com/terning/feature/intern/component/InternInfoRow.kt index 756b4c097..7b67986be 100644 --- a/feature/src/main/java/com/terning/feature/intern/component/InternInfoRow.kt +++ b/feature/src/main/java/com/terning/feature/intern/component/InternInfoRow.kt @@ -2,9 +2,11 @@ package com.terning.feature.intern.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.Grey500 @@ -13,6 +15,7 @@ import com.terning.core.designsystem.theme.TerningTheme @Composable fun InternInfoRow(title: String, value: String) { Row( + modifier = Modifier.padding(bottom = 3.dp), horizontalArrangement = Arrangement.spacedBy(23.dp, Alignment.Start), verticalAlignment = Alignment.Top, ) { From 34f3d7a3ec64fbd89f9e22f76d1ec6959c784791 Mon Sep 17 00:00:00 2001 From: arinming Date: Wed, 11 Sep 2024 20:10:12 +0900 Subject: [PATCH 04/51] =?UTF-8?q?[FEAT/#239]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EC=B7=A8=EC=86=8C=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EB=9D=84=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/intern/InternRoute.kt | 44 ++++++++++--------- .../terning/feature/intern/InternViewModel.kt | 21 +++++---- .../intern/component/InternBottomBar.kt | 4 +- .../feature/intern/model/InternUiState.kt | 2 +- 4 files changed, 39 insertions(+), 32 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index 4c458c4d8..e9bc8edf3 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -90,7 +90,9 @@ fun InternRoute( onClickScrapButton = { with(viewModel) { updateInternshipModel(it) - updateInternDialogVisibility(true) + if (internState.isScrappedState) + updateScrapCancelDialogVisibility(true) + else updateInternDialogVisibility(true) } } ) @@ -255,37 +257,37 @@ fun InternScreen( InternBottomBar( modifier = Modifier, internInfo = internInfo, + internUiState = internUiState, onScrapClick = { - if (!internUiState.isScrappedState) + if (!internUiState.isScrappedState) { onClickScrapButton(internInfo) - else onClickCancelButton(internInfo) + } else { + onClickCancelButton(internInfo) + } }, ) - - if (internUiState.scrapDialogVisibility) { + if (internUiState.scrapCancelDialogVisibility && internUiState.isScrappedState) { ScrapCancelDialog( internshipAnnouncementId = announcementId, onDismissRequest = onDismissCancelDialog ) } - if (internUiState.internDialogVisibility) { - internUiState.internshipModel?.let { - ScrapDialog( - title = internUiState.internshipModel.title, - scrapColor = CalRed, - deadline = internUiState.internshipModel.deadline, - startYearMonth = internUiState.internshipModel.startDate, - workingPeriod = internUiState.internshipModel.workingPeriod, - internshipAnnouncementId = announcementId, - companyImage = internUiState.internshipModel.companyImage, - isScrapped = false, - onDismissRequest = onDismissScrapDialog, - onClickChangeColor = { }, - onClickNavigateButton = { } - ) - } + if (internUiState.internDialogVisibility && !internUiState.isScrappedState) { + ScrapDialog( + title = internInfo.title, + scrapColor = CalRed, + deadline = internInfo.deadline, + startYearMonth = internInfo.startDate, + workingPeriod = internInfo.workingPeriod, + internshipAnnouncementId = announcementId, + companyImage = internInfo.companyImage, + isScrapped = false, + onDismissRequest = onDismissScrapDialog, + onClickChangeColor = { }, + onClickNavigateButton = { } + ) } } } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt b/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt index 03c8b5b60..b7b5d07b8 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt @@ -3,7 +3,6 @@ package com.terning.feature.intern import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.terning.core.state.UiState -import com.terning.domain.entity.calendar.CalendarScrapDetail import com.terning.domain.entity.intern.InternInfo import com.terning.domain.repository.InternRepository import com.terning.feature.R @@ -33,7 +32,10 @@ class InternViewModel @Inject constructor( internRepository.getInternInfo(id) .onSuccess { internInfoModel -> _internUiState.update { currentState -> - currentState.copy(loadState = UiState.Success(internInfoModel)) + currentState.copy( + loadState = UiState.Success(internInfoModel), + isScrappedState = internInfoModel.scrapId != null, + ) } } .onFailure { @@ -42,26 +44,27 @@ class InternViewModel @Inject constructor( } } - fun updateInternshipModel(scrapDetailModel: InternInfo?) { + fun updateScrapCancelDialogVisibility(visibility: Boolean) { _internUiState.update { currentState -> currentState.copy( - internshipModel = scrapDetailModel + scrapCancelDialogVisibility = visibility, + isScrappedState = visibility ) } } - fun updateScrapCancelDialogVisibility(visibility: Boolean) { + fun updateInternDialogVisibility(visibility: Boolean) { _internUiState.update { currentState -> currentState.copy( - scrapDialogVisibility = visibility + internDialogVisibility = visibility ) } } - fun updateInternDialogVisibility(visibility: Boolean) { + fun updateInternshipModel(scrapDetailModel: InternInfo?) { _internUiState.update { currentState -> currentState.copy( - internDialogVisibility = visibility + internshipModel = scrapDetailModel ) } } @@ -71,4 +74,4 @@ class InternViewModel @Inject constructor( it.copy(showWeb = show) } } -} \ No newline at end of file +} diff --git a/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt b/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt index 46e7dc7c0..cf0ca7b8f 100644 --- a/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt +++ b/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt @@ -27,11 +27,13 @@ import com.terning.core.extension.noRippleClickable import com.terning.domain.entity.intern.InternInfo import com.terning.feature.R import com.terning.feature.intern.InternViewModel +import com.terning.feature.intern.model.InternUiState @Composable fun InternBottomBar( modifier: Modifier, internInfo: InternInfo, + internUiState: InternUiState, onScrapClick: (InternInfo) -> Unit, viewModel: InternViewModel = hiltViewModel(), ) { @@ -64,7 +66,7 @@ fun InternBottomBar( Icon( painter = painterResource( id = - if (internInfo.scrapId != null) R.drawable.ic_scrap_true_24 + if (internUiState.isScrappedState) R.drawable.ic_scrap_true_24 else R.drawable.ic_scrap_false_24, ), contentDescription = null, diff --git a/feature/src/main/java/com/terning/feature/intern/model/InternUiState.kt b/feature/src/main/java/com/terning/feature/intern/model/InternUiState.kt index adc01874f..3906b2e4b 100644 --- a/feature/src/main/java/com/terning/feature/intern/model/InternUiState.kt +++ b/feature/src/main/java/com/terning/feature/intern/model/InternUiState.kt @@ -9,7 +9,7 @@ data class InternUiState( val loadState: UiState = UiState.Loading, val isColorChange: Boolean = false, val selectedColor: Color = CalRed, - val scrapDialogVisibility: Boolean = false, + val scrapCancelDialogVisibility: Boolean = false, val internDialogVisibility: Boolean = false, val isScrappedState: Boolean = false, val showWeb: Boolean = false, From 6e172275cb4744e62a167e3c7a277abccfd82b98 Mon Sep 17 00:00:00 2001 From: arinming Date: Thu, 12 Sep 2024 14:59:14 +0900 Subject: [PATCH 05/51] =?UTF-8?q?[FEAT/#239]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/intern/InternRoute.kt | 13 ++++++++++--- .../terning/feature/intern/InternViewModel.kt | 1 - .../intern/component/InternBottomBar.kt | 18 ++++++++---------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index e9bc8edf3..c7b14af24 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -81,15 +81,22 @@ fun InternRoute( internInfo = (internState.loadState as UiState.Success).data, navController = navController, onDismissCancelDialog = { - viewModel.updateScrapCancelDialogVisibility(false) + with(viewModel) { + updateScrapCancelDialogVisibility(false) + getInternInfo(announcementId) + } + }, + onDismissScrapDialog = { + with(viewModel) { + updateInternDialogVisibility(false) + getInternInfo(announcementId) + } }, - onDismissScrapDialog = { viewModel.updateInternDialogVisibility(false) }, onClickCancelButton = { viewModel.updateScrapCancelDialogVisibility(true) }, onClickScrapButton = { with(viewModel) { - updateInternshipModel(it) if (internState.isScrappedState) updateScrapCancelDialogVisibility(true) else updateInternDialogVisibility(true) diff --git a/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt b/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt index b7b5d07b8..9eb0546e4 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt @@ -48,7 +48,6 @@ class InternViewModel @Inject constructor( _internUiState.update { currentState -> currentState.copy( scrapCancelDialogVisibility = visibility, - isScrappedState = visibility ) } } diff --git a/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt b/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt index cf0ca7b8f..7e7922f14 100644 --- a/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt +++ b/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt @@ -37,7 +37,6 @@ fun InternBottomBar( onScrapClick: (InternInfo) -> Unit, viewModel: InternViewModel = hiltViewModel(), ) { - Row( modifier = modifier .fillMaxWidth() @@ -65,20 +64,19 @@ fun InternBottomBar( ) { Icon( painter = painterResource( - id = - if (internUiState.isScrappedState) R.drawable.ic_scrap_true_24 - else R.drawable.ic_scrap_false_24, + id = if (internUiState.isScrappedState) { + R.drawable.ic_scrap_true_24 + } else { + R.drawable.ic_scrap_false_24 + } ), contentDescription = null, modifier = modifier - .padding( - bottom = 6.dp - ) + .padding(bottom = 6.dp) .noRippleClickable { onScrapClick(internInfo) }, - tint = if (internInfo.scrapId != null) TerningMain - else Grey350 + tint = if (internInfo.scrapId != null) TerningMain else Grey350 ) Text( text = stringResource( @@ -101,4 +99,4 @@ fun InternBottomBar( } } } -} \ No newline at end of file +} From ce74482e43858e04fbc83395144fbc60223a6463 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 12:27:55 +0900 Subject: [PATCH 06/51] =?UTF-8?q?[ADD/#241]=20=EC=84=A0=ED=83=9D=EB=90=9C?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ic_terning_selected_profile_00.xml | 68 ++++++++++++++ .../ic_terning_selected_profile_01.xml | 88 ++++++++++++++++++ .../ic_terning_selected_profile_02.xml | 83 +++++++++++++++++ .../ic_terning_selected_profile_03.xml | 84 +++++++++++++++++ .../ic_terning_selected_profile_04.xml | 91 +++++++++++++++++++ .../ic_terning_selected_profile_05.xml | 81 +++++++++++++++++ 6 files changed, 495 insertions(+) create mode 100644 core/src/main/res/drawable/ic_terning_selected_profile_00.xml create mode 100644 core/src/main/res/drawable/ic_terning_selected_profile_01.xml create mode 100644 core/src/main/res/drawable/ic_terning_selected_profile_02.xml create mode 100644 core/src/main/res/drawable/ic_terning_selected_profile_03.xml create mode 100644 core/src/main/res/drawable/ic_terning_selected_profile_04.xml create mode 100644 core/src/main/res/drawable/ic_terning_selected_profile_05.xml diff --git a/core/src/main/res/drawable/ic_terning_selected_profile_00.xml b/core/src/main/res/drawable/ic_terning_selected_profile_00.xml new file mode 100644 index 000000000..8a9b710e5 --- /dev/null +++ b/core/src/main/res/drawable/ic_terning_selected_profile_00.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/drawable/ic_terning_selected_profile_01.xml b/core/src/main/res/drawable/ic_terning_selected_profile_01.xml new file mode 100644 index 000000000..2a523a251 --- /dev/null +++ b/core/src/main/res/drawable/ic_terning_selected_profile_01.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/drawable/ic_terning_selected_profile_02.xml b/core/src/main/res/drawable/ic_terning_selected_profile_02.xml new file mode 100644 index 000000000..2506e7877 --- /dev/null +++ b/core/src/main/res/drawable/ic_terning_selected_profile_02.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/drawable/ic_terning_selected_profile_03.xml b/core/src/main/res/drawable/ic_terning_selected_profile_03.xml new file mode 100644 index 000000000..99a8c53c8 --- /dev/null +++ b/core/src/main/res/drawable/ic_terning_selected_profile_03.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/drawable/ic_terning_selected_profile_04.xml b/core/src/main/res/drawable/ic_terning_selected_profile_04.xml new file mode 100644 index 000000000..e5a8e406f --- /dev/null +++ b/core/src/main/res/drawable/ic_terning_selected_profile_04.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/drawable/ic_terning_selected_profile_05.xml b/core/src/main/res/drawable/ic_terning_selected_profile_05.xml new file mode 100644 index 000000000..ec760e325 --- /dev/null +++ b/core/src/main/res/drawable/ic_terning_selected_profile_05.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + From 7826b9730398841a33f6494898b87b24091b5d05 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 12:54:30 +0900 Subject: [PATCH 07/51] =?UTF-8?q?[FEAT/#241]=20=EC=84=A0=ED=83=9D=EB=90=9C?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bottomsheet/ProfileBottomSheet.kt | 26 +++++++------------ .../com/terning/core/type/ProfileImage.kt | 11 ++++++++ .../ic_terning_selected_profile_04.xml | 1 - 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/bottomsheet/ProfileBottomSheet.kt b/core/src/main/java/com/terning/core/designsystem/component/bottomsheet/ProfileBottomSheet.kt index 9109deb87..f9a1c8ddc 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/bottomsheet/ProfileBottomSheet.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/bottomsheet/ProfileBottomSheet.kt @@ -1,7 +1,6 @@ package com.terning.core.designsystem.component.bottomsheet import androidx.compose.foundation.Image -import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -27,10 +26,10 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.terning.core.R -import com.terning.core.designsystem.theme.TerningMain import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.extension.noRippleClickable import com.terning.core.type.ProfileImage +import com.terning.core.type.SelectedProfileImage import kotlinx.coroutines.launch /** @@ -98,7 +97,6 @@ fun RadioButtonGroup( modifier: Modifier = Modifier, ) { val options = ProfileImage.entries - var selectedOptionIndex by rememberSaveable { mutableIntStateOf(ProfileImage.toIndex(ProfileImage.fromString(initialSelectedOption))) } @@ -110,29 +108,23 @@ fun RadioButtonGroup( modifier = modifier.padding(horizontal = 34.dp) ) { itemsIndexed(options.take(6)) { index, option -> - val imageModifier = if (selectedOptionIndex == index) { - Modifier - .border( - color = TerningMain, - width = 2.dp, - shape = CircleShape - ) - .aspectRatio(1f) - } else { - Modifier.aspectRatio(1f) + val isSelected = selectedOptionIndex == index + val imageResId = when { + isSelected -> SelectedProfileImage.entries[index].drawableResId + else -> option.drawableResId } Image( - painter = painterResource(id = option.drawableResId), + painter = painterResource(id = imageResId), contentDescription = "profile image", - modifier = imageModifier + modifier = Modifier + .aspectRatio(1f) .noRippleClickable { onOptionSelected(option) selectedOptionIndex = index } .clip(shape = CircleShape) - .size(76.dp) - .aspectRatio(1f) + .size(76.dp), ) } } diff --git a/core/src/main/java/com/terning/core/type/ProfileImage.kt b/core/src/main/java/com/terning/core/type/ProfileImage.kt index 8ccc58040..551485ee6 100644 --- a/core/src/main/java/com/terning/core/type/ProfileImage.kt +++ b/core/src/main/java/com/terning/core/type/ProfileImage.kt @@ -31,3 +31,14 @@ enum class ProfileImage( entries.indexOf(profileImage) } } + +enum class SelectedProfileImage( + @DrawableRes val drawableResId: Int, +) { + BASIC(drawableResId = R.drawable.ic_terning_selected_profile_00), + LUCKY(drawableResId = R.drawable.ic_terning_selected_profile_01), + SMART(drawableResId = R.drawable.ic_terning_selected_profile_02), + GLASS(drawableResId = R.drawable.ic_terning_selected_profile_03), + CALENDAR(drawableResId = R.drawable.ic_terning_selected_profile_04), + PASSION(drawableResId = R.drawable.ic_terning_selected_profile_05); +} \ No newline at end of file diff --git a/core/src/main/res/drawable/ic_terning_selected_profile_04.xml b/core/src/main/res/drawable/ic_terning_selected_profile_04.xml index e5a8e406f..ea7e41f94 100644 --- a/core/src/main/res/drawable/ic_terning_selected_profile_04.xml +++ b/core/src/main/res/drawable/ic_terning_selected_profile_04.xml @@ -12,7 +12,6 @@ Date: Fri, 13 Sep 2024 13:00:11 +0900 Subject: [PATCH 08/51] =?UTF-8?q?[FIX/#241]=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20=ED=95=84=EB=93=9C=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/designsystem/component/textfield/NameTextField.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt b/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt index 9620bde6c..3aea71673 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt @@ -44,7 +44,7 @@ fun NameTextField( val trimmedName: String var isNameOutOfBounds = false if (value.length > MAX_LENGTH) { - trimmedName = value.substring(0, MAX_LENGTH) + trimmedName = value.substring(0, MAX_LENGTH + 1) isNameOutOfBounds = true } else { trimmedName = value From a20cd2a8a1e1acb7076cb6967648c9eaf0dc0d11 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 13:08:26 +0900 Subject: [PATCH 09/51] =?UTF-8?q?[FIX/#241]=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20=ED=95=84=EB=93=9C=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/designsystem/component/textfield/NameTextField.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt b/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt index 3aea71673..46f77d581 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt @@ -114,7 +114,7 @@ fun NameTextField( onValueChange = onValueChange, modifier = modifier, textStyle = TerningTheme.typography.detail1, - textColor = Black, + textColor = if (value.isNotEmpty()) Black else Grey400, drawLineColor = state.lineColor, cursorBrush = SolidColor(Grey400), hint = hint, From 9f5dbafdda973b0c467811f389a8d16edc6d56c4 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 13:11:38 +0900 Subject: [PATCH 10/51] =?UTF-8?q?[FIX/#241]=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=EB=9D=BC=EC=9D=B4=ED=8C=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/src/main/res/values/strings.xml b/feature/src/main/res/values/strings.xml index 8c283460c..9c8cacba8 100644 --- a/feature/src/main/res/values/strings.xml +++ b/feature/src/main/res/values/strings.xml @@ -97,12 +97,12 @@ 오늘 마감인 공고가 없어요 - 터치 3번으로\n원하는 대학생 인턴 공고를 띄워드릴게요 + 터닝에서 내 계획에 딱 맞는\n대학생 인턴 찾기를 도와드릴게요 시작화면 이미지 시작하기 - 이제 딱 맞는 공고와 함께\n터닝을 시작해 볼까요? + 나에게 딱 맞는 공고가 준비됐어요!\n터닝을 시작해 볼까요? 내 맞춤 공고 바로 보러가기 From 29293cce453fa45cc2db0d55f791ed520f095ad6 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 13:23:46 +0900 Subject: [PATCH 11/51] =?UTF-8?q?[FIX/#241]=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=EB=B2=84=ED=8A=BC=20=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/filtering/filteringone/FilteringOneRoute.kt | 7 ++++++- .../filtering/filteringone/FilteringOneViewModel.kt | 9 +++++++-- .../feature/filtering/filteringtwo/FilteringTwoRoute.kt | 7 ++++++- .../filtering/filteringtwo/FilteringTwoViewModel.kt | 9 +++++++-- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt index e3cd9d226..ffcd199f0 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt @@ -41,6 +41,10 @@ fun FilteringOneRoute( val lifecycleOwner = LocalLifecycleOwner.current + LaunchedEffect(key1 = true) { + viewModel.updateButton(false) + } + LaunchedEffect(viewModel.sideEffects, lifecycleOwner) { viewModel.sideEffects.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { sideEffect -> @@ -54,7 +58,8 @@ fun FilteringOneRoute( FilteringOneScreen( name = name, onButtonClick = { grade -> - viewModel.updateGradeAndButton(grade) + viewModel.updateGrade(grade) + viewModel.updateButton(true) }, onNextClick = viewModel::navigateToFilteringTwo, navigateUp = viewModel::navigateUp, diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneViewModel.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneViewModel.kt index 60704bd02..09f190c93 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneViewModel.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneViewModel.kt @@ -18,10 +18,15 @@ class FilteringOneViewModel : ViewModel() { private val _sideEffects = MutableSharedFlow() val sideEffects: SharedFlow get() = _sideEffects.asSharedFlow() - fun updateGradeAndButton(grade: String) { + fun updateButton(isButtonValid: Boolean) { + _state.value = _state.value.copy( + isButtonValid = isButtonValid + ) + } + + fun updateGrade(grade: String) { _state.value = _state.value.copy( grade = grade, - isButtonValid = true ) } diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt index 2f4dc26fc..7673f3f9f 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt @@ -41,6 +41,10 @@ fun FilteringTwoRoute( val lifecycleOwner = LocalLifecycleOwner.current + LaunchedEffect(key1 = true) { + viewModel.updateButton(false) + } + LaunchedEffect(viewModel.sideEffects, lifecycleOwner) { viewModel.sideEffects.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { sideEffect -> @@ -59,7 +63,8 @@ fun FilteringTwoRoute( onNextClick = viewModel::navigateToFilteringThree, navigateUp = viewModel::navigateUp, onButtonClick = { workingPeriod -> - viewModel.updateWorkingPeriodAndButton(workingPeriod) + viewModel.updateWorkingPeriod(workingPeriod) + viewModel.updateButton(true) }, buttonState = state.isButtonValid, workingPeriod = state.workingPeriod, diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoViewModel.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoViewModel.kt index 495fd3fd1..1958d6e1e 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoViewModel.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoViewModel.kt @@ -18,10 +18,15 @@ class FilteringTwoViewModel : ViewModel() { private val _sideEffects = MutableSharedFlow() val sideEffects: SharedFlow get() = _sideEffects.asSharedFlow() - fun updateWorkingPeriodAndButton(workingPeriod: String) { + fun updateButton(isButtonValid: Boolean) { + _state.value = _state.value.copy( + isButtonValid = isButtonValid + ) + } + + fun updateWorkingPeriod(workingPeriod: String) { _state.value = _state.value.copy( workingPeriod = workingPeriod, - isButtonValid = true ) } From 3d9badfdcfc9b05e6b220537443ba81902df9b9e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 13:33:31 +0900 Subject: [PATCH 12/51] =?UTF-8?q?[FIX/#241]=20=EC=B9=B4=EC=B9=B4=EC=98=A4?= =?UTF-8?q?=20=EC=97=B0=EB=8F=99=EA=B3=84=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/mypage/mypage/MyPageRoute.kt | 5 +++-- .../mypage/mypage/navigation/MyPageNavigation.kt | 5 +++-- .../feature/mypage/profileedit/ProfileEditRoute.kt | 9 +++++++-- .../mypage/profileedit/ProfileEditViewModel.kt | 5 +++-- .../profileedit/navigation/ProfileEditNavigation.kt | 11 +++++++++-- feature/src/main/res/values/strings.xml | 1 + 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt index e6a88254b..868a89e59 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt @@ -58,7 +58,7 @@ import com.terning.feature.mypage.mypage.util.MyPageDefaults.VERSION @Composable fun MyPageRoute( paddingValues: PaddingValues, - navigateToProfileEdit: (String, String) -> Unit, + navigateToProfileEdit: (String, String, String) -> Unit, viewModel: MyPageViewModel = hiltViewModel(), ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -91,7 +91,8 @@ fun MyPageRoute( when (sideEffect) { is MyPageSideEffect.NavigateToProfileEdit -> navigateToProfileEdit( state.name, - state.profileImage + state.profileImage, + state.authType ) is MyPageSideEffect.ShowToast -> context.toast(sideEffect.message) diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt index e2543a085..30d7de08b 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt @@ -25,10 +25,11 @@ fun NavGraphBuilder.myPageNavGraph( composable { MyPageRoute( paddingValues = paddingValues, - navigateToProfileEdit = { name, profileImage -> + navigateToProfileEdit = { name, profileImage, authType -> navHostController.navigateProfileEdit( name, - profileImage + profileImage, + authType ) } ) diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt index 7dba0d325..82181b19c 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt @@ -44,6 +44,7 @@ fun ProfileEditRoute( navigateUp: () -> Unit, initialName: String, initialProfile: String, + authType: String, viewModel: ProfileEditViewModel = hiltViewModel(), ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -62,7 +63,8 @@ fun ProfileEditRoute( LaunchedEffect(key1 = true) { viewModel.updateInitialInfo( initialName = initialName, - initialProfile = initialProfile + initialProfile = initialProfile, + authType = authType ) } @@ -173,7 +175,8 @@ fun ProfileEditScreen( ) Spacer(modifier = Modifier.height(11.dp)) Text( - text = profileEditState.authType, + text = if (profileEditState.authType == KAKA0) stringResource(id = R.string.profile_edit_kakao) + else "", style = TerningTheme.typography.detail0 ) } @@ -189,6 +192,8 @@ fun ProfileEditScreen( } } +private const val KAKA0 = "KAKAO" + @Preview(showBackground = true) @Composable fun ProfileEditScreenPreview() { diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt index a12f19733..ce958d6b8 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt @@ -32,12 +32,13 @@ class ProfileEditViewModel @Inject constructor( _state.value = _state.value.copy(showBottomSheet = isVisible) } - fun updateInitialInfo(initialName: String, initialProfile: String) { + fun updateInitialInfo(initialName: String, initialProfile: String, authType: String) { _state.value = _state.value.copy( name = initialName, initialName = initialName, profile = initialProfile, - initialProfile = initialProfile + initialProfile = initialProfile, + authType = authType ) } diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/navigation/ProfileEditNavigation.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/navigation/ProfileEditNavigation.kt index 61b250f75..6127b7b50 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/navigation/ProfileEditNavigation.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/navigation/ProfileEditNavigation.kt @@ -17,10 +17,15 @@ import kotlinx.serialization.Serializable fun NavController.navigateProfileEdit( name: String, profileImage: String, + authType: String, navOptions: NavOptions? = null ) { navigate( - route = ProfileEdit(name = name, profileImage = profileImage), + route = ProfileEdit( + name = name, + profileImage = profileImage, + authType = authType + ), navOptions = navOptions ) } @@ -46,6 +51,7 @@ fun NavGraphBuilder.profileEditNavGraph( ProfileEditRoute( initialName = args.name, initialProfile = args.profileImage, + authType = args.authType, navigateUp = { navHostController.navigateUp() } ) } @@ -54,5 +60,6 @@ fun NavGraphBuilder.profileEditNavGraph( @Serializable data class ProfileEdit( val name: String, - val profileImage: String + val profileImage: String, + val authType: String ) : Route \ No newline at end of file diff --git a/feature/src/main/res/values/strings.xml b/feature/src/main/res/values/strings.xml index 9c8cacba8..183923aac 100644 --- a/feature/src/main/res/values/strings.xml +++ b/feature/src/main/res/values/strings.xml @@ -175,6 +175,7 @@ 프로필 수정 저장하기 연동 계정 + 카카오 로그인 From e6c834e793419150fbca2475473cf923b438dbbb Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 14:16:21 +0900 Subject: [PATCH 13/51] =?UTF-8?q?[FIX/#241]=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83,=20=ED=83=88=ED=87=B4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/mypage/mypage/MyPageRoute.kt | 23 ++++++++------- .../feature/mypage/mypage/MyPageSideEffect.kt | 1 + .../feature/mypage/mypage/MyPageViewModel.kt | 29 ++++--------------- .../mypage/navigation/MyPageNavigation.kt | 4 ++- 4 files changed, 23 insertions(+), 34 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt index 868a89e59..e7dc3a6e2 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt @@ -1,6 +1,7 @@ package com.terning.feature.mypage.mypage import android.content.Context +import android.content.Intent import androidx.browser.customtabs.CustomTabsIntent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -47,6 +48,7 @@ import com.terning.core.extension.noRippleClickable import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.feature.R +import com.terning.feature.main.MainActivity import com.terning.feature.mypage.component.MyPageProfile import com.terning.feature.mypage.mypage.component.MyPageItem import com.terning.feature.mypage.mypage.util.MyPageDefaults.NOTICE_URL @@ -59,6 +61,7 @@ import com.terning.feature.mypage.mypage.util.MyPageDefaults.VERSION fun MyPageRoute( paddingValues: PaddingValues, navigateToProfileEdit: (String, String, String) -> Unit, + navigateToSignIn: () -> Unit, viewModel: MyPageViewModel = hiltViewModel(), ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -102,6 +105,8 @@ fun MyPageRoute( is MyPageSideEffect.NavigateToPersonalWebView -> navigateToPersonalWebView( context ) + + is MyPageSideEffect.RestartApp -> restartApp(context) } } } @@ -124,16 +129,6 @@ fun MyPageRoute( ) } - when (state.isLogoutAndQuitSuccess) { - is UiState.Success -> { - viewModel.restartApp(context) - } - - is UiState.Loading -> {} - is UiState.Empty -> {} - is UiState.Failure -> {} - } - when (state.isGetSuccess) { is UiState.Success -> { MyPageScreen( @@ -415,6 +410,14 @@ private fun navigateToPersonalWebView(context: Context) { CustomTabsIntent.Builder().build().launchUrl(context, PERSONAL_URL.toUri()) } +private fun restartApp(context: Context) { + Intent(context, MainActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(this) + } +} + @Preview(showBackground = true) @Composable fun MyPageScreenPreview() { diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageSideEffect.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageSideEffect.kt index fa8f43cf1..ce07e43a5 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageSideEffect.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageSideEffect.kt @@ -9,4 +9,5 @@ sealed class MyPageSideEffect { data object NavigateToServiceWebView : MyPageSideEffect() data object NavigateToPersonalWebView : MyPageSideEffect() data class ShowToast(@StringRes val message: Int) : MyPageSideEffect() + data object RestartApp : MyPageSideEffect() } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageViewModel.kt index 1bec5979f..af07f6c46 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageViewModel.kt @@ -1,18 +1,12 @@ package com.terning.feature.mypage.mypage -import android.content.Context -import android.content.Intent -import android.os.Handler -import android.os.Looper import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jakewharton.processphoenix.ProcessPhoenix import com.kakao.sdk.user.UserApiClient import com.terning.core.state.UiState import com.terning.domain.repository.MyPageRepository import com.terning.domain.repository.TokenRepository import com.terning.feature.R -import com.terning.feature.main.MainActivity import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -38,7 +32,7 @@ class MyPageViewModel @Inject constructor( fun logoutKakao() { UserApiClient.instance.logout { error -> if (error == null) { - postLogout() + logoutApp() } else { _state.value = _state.value.copy(isLogoutAndQuitSuccess = UiState.Failure(error.toString())) @@ -46,11 +40,11 @@ class MyPageViewModel @Inject constructor( } } - private fun postLogout() { + private fun logoutApp() { viewModelScope.launch { myPageRepository.postLogout().onSuccess { tokenRepository.clearInfo() - _state.value = _state.value.copy(isLogoutAndQuitSuccess = UiState.Success(true)) + _sideEffects.emit(MyPageSideEffect.RestartApp) }.onFailure { _state.value = _state.value.copy(isLogoutAndQuitSuccess = UiState.Failure(it.toString())) @@ -58,21 +52,10 @@ class MyPageViewModel @Inject constructor( } } - fun restartApp(context: Context) { - Handler(Looper.getMainLooper()).post { - Handler(Looper.getMainLooper()).post { - ProcessPhoenix.triggerRebirth( - context, - Intent(context, MainActivity::class.java) - ) - } - } - } - fun quitKakao() { UserApiClient.instance.unlink { error -> if (error == null) { - deleteQuit() + quitApp() } else { _state.value = _state.value.copy(isLogoutAndQuitSuccess = UiState.Failure(error.toString())) @@ -80,11 +63,11 @@ class MyPageViewModel @Inject constructor( } } - private fun deleteQuit() { + private fun quitApp() { viewModelScope.launch { myPageRepository.deleteQuit().onSuccess { tokenRepository.clearInfo() - _state.value = _state.value.copy(isLogoutAndQuitSuccess = UiState.Success(true)) + _sideEffects.emit(MyPageSideEffect.RestartApp) }.onFailure { _state.value = _state.value.copy(isLogoutAndQuitSuccess = UiState.Failure(it.toString())) diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt index 30d7de08b..2856f2638 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt @@ -9,6 +9,7 @@ import androidx.navigation.compose.composable import com.terning.core.navigation.MainTabRoute import com.terning.feature.mypage.mypage.MyPageRoute import com.terning.feature.mypage.profileedit.navigation.navigateProfileEdit +import com.terning.feature.onboarding.signin.navigation.navigateSignIn import kotlinx.serialization.Serializable fun NavController.navigateMyPage(navOptions: NavOptions? = null) { @@ -31,7 +32,8 @@ fun NavGraphBuilder.myPageNavGraph( profileImage, authType ) - } + }, + navigateToSignIn = navHostController::navigateSignIn ) } } From 0c9518ab97504b715b6e6785a7af61a73f890d71 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 14:16:54 +0900 Subject: [PATCH 14/51] =?UTF-8?q?[FIX/#241]=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83,=20=ED=83=88=ED=87=B4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/feature/mypage/mypage/MyPageRoute.kt | 1 - .../feature/mypage/mypage/navigation/MyPageNavigation.kt | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt index e7dc3a6e2..15c76c8a4 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageRoute.kt @@ -61,7 +61,6 @@ import com.terning.feature.mypage.mypage.util.MyPageDefaults.VERSION fun MyPageRoute( paddingValues: PaddingValues, navigateToProfileEdit: (String, String, String) -> Unit, - navigateToSignIn: () -> Unit, viewModel: MyPageViewModel = hiltViewModel(), ) { val state by viewModel.state.collectAsStateWithLifecycle() diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt index 2856f2638..30d7de08b 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/navigation/MyPageNavigation.kt @@ -9,7 +9,6 @@ import androidx.navigation.compose.composable import com.terning.core.navigation.MainTabRoute import com.terning.feature.mypage.mypage.MyPageRoute import com.terning.feature.mypage.profileedit.navigation.navigateProfileEdit -import com.terning.feature.onboarding.signin.navigation.navigateSignIn import kotlinx.serialization.Serializable fun NavController.navigateMyPage(navOptions: NavOptions? = null) { @@ -32,8 +31,7 @@ fun NavGraphBuilder.myPageNavGraph( profileImage, authType ) - }, - navigateToSignIn = navHostController::navigateSignIn + } ) } } From a12cabb5c17f4369529cd777452cb3d595da6cd9 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 14:27:04 +0900 Subject: [PATCH 15/51] =?UTF-8?q?[FIX/#241]=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83,=20=ED=83=88=ED=87=B4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/feature/mypage/mypage/MyPageState.kt | 1 - .../feature/mypage/mypage/MyPageViewModel.kt | 16 ++++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageState.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageState.kt index 921031d8c..e53a43dd3 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageState.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageState.kt @@ -3,7 +3,6 @@ package com.terning.feature.mypage.mypage import com.terning.core.state.UiState data class MyPageState( - val isLogoutAndQuitSuccess: UiState = UiState.Loading, val isGetSuccess: UiState = UiState.Loading, val name: String = "", val profileImage: String = "", diff --git a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageViewModel.kt index af07f6c46..d26ec9575 100644 --- a/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/mypage/MyPageViewModel.kt @@ -34,8 +34,9 @@ class MyPageViewModel @Inject constructor( if (error == null) { logoutApp() } else { - _state.value = - _state.value.copy(isLogoutAndQuitSuccess = UiState.Failure(error.toString())) + viewModelScope.launch { + _sideEffects.emit(MyPageSideEffect.ShowToast(R.string.server_failure)) + } } } } @@ -46,8 +47,7 @@ class MyPageViewModel @Inject constructor( tokenRepository.clearInfo() _sideEffects.emit(MyPageSideEffect.RestartApp) }.onFailure { - _state.value = - _state.value.copy(isLogoutAndQuitSuccess = UiState.Failure(it.toString())) + _sideEffects.emit(MyPageSideEffect.ShowToast(R.string.server_failure)) } } } @@ -57,8 +57,9 @@ class MyPageViewModel @Inject constructor( if (error == null) { quitApp() } else { - _state.value = - _state.value.copy(isLogoutAndQuitSuccess = UiState.Failure(error.toString())) + viewModelScope.launch { + _sideEffects.emit(MyPageSideEffect.ShowToast(R.string.server_failure)) + } } } } @@ -69,8 +70,7 @@ class MyPageViewModel @Inject constructor( tokenRepository.clearInfo() _sideEffects.emit(MyPageSideEffect.RestartApp) }.onFailure { - _state.value = - _state.value.copy(isLogoutAndQuitSuccess = UiState.Failure(it.toString())) + _sideEffects.emit(MyPageSideEffect.ShowToast(R.string.server_failure)) } } } From 5c7cfc3da1ca5027ab6f8fee395a82e72adb2cef Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 17:37:19 +0900 Subject: [PATCH 16/51] =?UTF-8?q?[FIX/#246]=20=EB=82=A0=EC=A7=9C=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=8B=9C=EC=A0=90=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/feature/calendar/calendar/CalendarRoute.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index d173cbd4b..053a40a27 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -8,10 +8,8 @@ import androidx.compose.animation.togetherWith import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -80,10 +78,12 @@ private fun CalendarScreen( ) LaunchedEffect(key1 = listState) { - snapshotFlow { listState.firstVisibleItemIndex } + snapshotFlow { listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset} .distinctUntilChanged() - .collect { - updatePage(listState.firstVisibleItemIndex) + .collect { (index, offset) -> + if (offset == 0) { + updatePage(index) + } } } From 62af88387573669b8a02c48017709606575d8b50 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Fri, 13 Sep 2024 17:38:08 +0900 Subject: [PATCH 17/51] =?UTF-8?q?[FIX/#241]=20=ED=85=8D=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/textfield/NameTextField.kt | 28 +++++++++++++------ .../mypage/profileedit/ProfileEditRoute.kt | 3 +- .../mypage/profileedit/ProfileEditState.kt | 2 +- .../profileedit/ProfileEditViewModel.kt | 13 +++++---- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt b/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt index 46f77d581..cec5586d5 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/textfield/NameTextField.kt @@ -25,7 +25,7 @@ data class NameFieldState( val helperMessage: Int, val helperIcon: Int?, val helperColor: Color, - val isValid: Boolean + val isButtonValid: Boolean ) @Composable @@ -35,7 +35,8 @@ fun NameTextField( hint: String, modifier: Modifier = Modifier, onValidationChanged: (Boolean) -> Unit, - initialView: Boolean = false + initialView: Boolean = false, + isProfileChangedButNameSame: Boolean = false, ) { val focusManager = LocalFocusManager.current val keyboardController = LocalSoftwareKeyboardController.current @@ -58,7 +59,18 @@ fun NameTextField( helperMessage = R.string.sign_up_helper, helperIcon = R.drawable.ic_name_text_field_check, helperColor = White, - isValid = false + isButtonValid = false + ) + } + + isProfileChangedButNameSame -> { + NameFieldState( + name = trimmedName, + lineColor = Grey500, + helperMessage = R.string.sign_up_helper, + helperIcon = R.drawable.ic_name_text_field_check, + helperColor = White, + isButtonValid = true ) } @@ -69,7 +81,7 @@ fun NameTextField( helperMessage = R.string.sign_up_helper_error, helperIcon = R.drawable.ic_name_text_field_error, helperColor = WarningRed, - isValid = false + isButtonValid = false ) } @@ -80,7 +92,7 @@ fun NameTextField( helperMessage = R.string.sign_up_helper, helperIcon = null, helperColor = Grey400, - isValid = false + isButtonValid = false ) } @@ -91,7 +103,7 @@ fun NameTextField( helperMessage = R.string.sign_up_helper_out, helperIcon = R.drawable.ic_name_text_field_error, helperColor = WarningRed, - isValid = false + isButtonValid = false ) } @@ -102,12 +114,12 @@ fun NameTextField( helperMessage = R.string.sign_up_helper_available, helperIcon = R.drawable.ic_name_text_field_check, helperColor = TerningMain, - isValid = true + isButtonValid = true ) } } - onValidationChanged(state.isValid) + onValidationChanged(state.isButtonValid) TerningBasicTextField( value = state.name, diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt index 82181b19c..3c05b18cd 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt @@ -165,7 +165,8 @@ fun ProfileEditScreen( onValidationChanged = { isValid -> onValidationChanged(isValid) }, - initialView = profileEditState.initialView + initialView = profileEditState.initialView, + isProfileChangedButNameSame = profileEditState.isProfileChangedButNameSame ) Spacer(modifier = Modifier.height(48.dp)) Text( diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt index 41d811f37..724566051 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt @@ -6,7 +6,7 @@ data class ProfileEditState( val profile: String = "", val initialProfile: String = "", val initialView: Boolean = true, - val isModified: Boolean = false, + val isProfileChangedButNameSame: Boolean = false, val isButtonValid: Boolean = false, val authType: String = "", val showBottomSheet: Boolean = false diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt index ce958d6b8..d30c974df 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt @@ -43,21 +43,22 @@ class ProfileEditViewModel @Inject constructor( } fun updateName(name: String) { + val isSameAsInitial = name == _state.value.initialName + val isProfileChangedButNameSame = + _state.value.profile != _state.value.initialProfile && isSameAsInitial + _state.value = _state.value.copy( name = name, initialView = false, - isModified = true + isProfileChangedButNameSame = isProfileChangedButNameSame ) } fun updateProfile(profile: String) { - val isSameAsInitial = profile == _state.value.initialProfile - val isSameAsPrevious = profile == _state.value.profile - _state.value = _state.value.copy( profile = profile, - initialView = !_state.value.isModified && isSameAsInitial, - isModified = if (isSameAsPrevious) _state.value.isModified else !isSameAsInitial + initialView = false, + isProfileChangedButNameSame = _state.value.name == _state.value.initialName ) } From d8461dfe33fd83168111335cd21accfe71bdb227 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 17:38:46 +0900 Subject: [PATCH 18/51] =?UTF-8?q?[DEL/#246]=20=EB=A1=9C=EB=94=A9=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EB=B7=B0=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/list/CalendarListScreen.kt | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt index 6e145abbc..4f32f527c 100644 --- a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt @@ -151,24 +151,7 @@ private fun CalendarListScreen( .background(Back) ) { when (uiState.loadState) { - UiState.Loading -> { - item { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - Text( - modifier = Modifier - .padding(top = 42.dp) - .fillMaxWidth(), - text = stringResource(id = R.string.calendar_text_friday), - textAlign = TextAlign.Center, - style = TerningTheme.typography.body5, - color = Grey400 - ) - } - } - } + UiState.Loading -> {} UiState.Empty -> { item { Column( From 7bf4b6c480ddff12a288c41cc9a007ae6bff0e48 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 22:20:40 +0900 Subject: [PATCH 19/51] =?UTF-8?q?[FEAT/#246]=20PagerState=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85,=20=EC=9B=94=EA=B0=84=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarRoute.kt | 159 ++++++++++-------- .../calendar/model/CalendarUiState.kt | 6 + .../calendar/month/CalendarMonthScreen.kt | 100 ++++------- 3 files changed, 128 insertions(+), 137 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 053a40a27..5f14289ea 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -9,8 +9,10 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope @@ -27,6 +29,7 @@ import com.terning.feature.calendar.calendar.component.ScreenTransition import com.terning.feature.calendar.calendar.component.WeekDaysHeader import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getYearMonthByPage import com.terning.feature.calendar.calendar.model.CalendarUiState +import com.terning.feature.calendar.calendar.model.LocalPagerState import com.terning.feature.calendar.list.CalendarListRoute import com.terning.feature.calendar.month.CalendarMonthRoute import com.terning.feature.calendar.week.CalendarWeekRoute @@ -73,6 +76,18 @@ private fun CalendarScreen( ) { val coroutineScope = rememberCoroutineScope() + val pagerState = rememberPagerState( + initialPage = uiState.calendarModel.initialPage, + pageCount = { uiState.calendarModel.pageCount } + ) + + LaunchedEffect(key1 = pagerState) { + snapshotFlow { pagerState.currentPage} + .collect { current -> + updatePage(current) + } + } + val listState = rememberLazyListState( initialFirstVisibleItemIndex = uiState.calendarModel.initialPage ) @@ -87,81 +102,83 @@ private fun CalendarScreen( } } - Column( - modifier = modifier, - ){ - CalendarTopAppBar( - date = getYearMonthByPage(uiState.currentPage), - isListExpanded = uiState.isListEnabled, - isWeekExpanded = uiState.isWeekEnabled, - onListButtonClicked = onClickListButton, - onMonthNavigationButtonClicked = { direction -> - coroutineScope.launch { - listState.animateScrollToItem( - index = listState.firstVisibleItemIndex + direction, - ) + CompositionLocalProvider( + LocalPagerState provides pagerState + ) { + Column( + modifier = modifier, + ) { + CalendarTopAppBar( + date = getYearMonthByPage(uiState.currentPage), + isListExpanded = uiState.isListEnabled, + isWeekExpanded = uiState.isWeekEnabled, + onListButtonClicked = onClickListButton, + onMonthNavigationButtonClicked = { direction -> + coroutineScope.launch { + listState.animateScrollToItem( + index = listState.firstVisibleItemIndex + direction, + ) + } } - } - ) - ScreenTransition( - targetState = !uiState.isListEnabled, - transitionOne = slideInHorizontally { fullWidth -> -fullWidth } togetherWith - slideOutHorizontally { fullWidth -> fullWidth }, - transitionTwo = slideInHorizontally { fullWidth -> fullWidth } togetherWith - slideOutHorizontally { fullWidth -> -fullWidth }, - contentOne = { - Column( - modifier = Modifier - .fillMaxSize() - ) { - WeekDaysHeader() + ) + ScreenTransition( + targetState = !uiState.isListEnabled, + transitionOne = slideInHorizontally { fullWidth -> -fullWidth } togetherWith + slideOutHorizontally { fullWidth -> fullWidth }, + transitionTwo = slideInHorizontally { fullWidth -> fullWidth } togetherWith + slideOutHorizontally { fullWidth -> -fullWidth }, + contentOne = { + Column( + modifier = Modifier + .fillMaxSize() + ) { + WeekDaysHeader() - HorizontalDivider( - thickness = 1.dp, - color = Grey200 - ) + HorizontalDivider( + thickness = 1.dp, + color = Grey200 + ) - ScreenTransition( - targetState = !uiState.isWeekEnabled, - transitionOne = slideInVertically { fullHeight -> -fullHeight } togetherWith - slideOutVertically { fullHeight -> fullHeight }, - transitionTwo = slideInVertically { fullHeight -> fullHeight } togetherWith - slideOutVertically { fullHeight -> -fullHeight }, - contentOne = { - CalendarMonthRoute( - listState = listState, - pages = uiState.calendarModel.pageCount, - selectedDate = uiState.selectedDate, - updateSelectedDate = updateSelectedDate, - modifier = Modifier - .fillMaxSize() - .background(White), - ) - }, - contentTwo = { - CalendarWeekRoute( - calendarUiState = uiState, - modifier = Modifier - .fillMaxSize(), - navigateUp = disableWeekVisibility, - navigateToAnnouncement = navigateToAnnouncement, - updateSelectedDate = updateSelectedDate - ) - } + ScreenTransition( + targetState = !uiState.isWeekEnabled, + transitionOne = slideInVertically { fullHeight -> -fullHeight } togetherWith + slideOutVertically { fullHeight -> fullHeight }, + transitionTwo = slideInVertically { fullHeight -> fullHeight } togetherWith + slideOutVertically { fullHeight -> -fullHeight }, + contentOne = { + CalendarMonthRoute( + selectedDate = uiState.selectedDate, + updateSelectedDate = updateSelectedDate, + modifier = Modifier + .fillMaxSize() + .background(White), + ) + }, + contentTwo = { + CalendarWeekRoute( + calendarUiState = uiState, + modifier = Modifier + .fillMaxSize(), + navigateUp = disableWeekVisibility, + navigateToAnnouncement = navigateToAnnouncement, + updateSelectedDate = updateSelectedDate + ) + } + ) + } + }, + contentTwo = { + CalendarListRoute( + listState = listState, + pages = uiState.calendarModel.pageCount, + navigateToAnnouncement = navigateToAnnouncement, + navigateUp = disableListVisibility, + modifier = Modifier + .fillMaxSize() ) - } - }, - contentTwo = { - CalendarListRoute( - listState = listState, - pages = uiState.calendarModel.pageCount, - navigateToAnnouncement = navigateToAnnouncement, - navigateUp = disableListVisibility, - modifier = Modifier - .fillMaxSize() - ) - }, - ) + }, + ) + } } } diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt index e4d75e7ef..4e84cb41c 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt @@ -1,5 +1,7 @@ package com.terning.feature.calendar.calendar.model +import androidx.compose.foundation.pager.PagerState +import androidx.compose.runtime.compositionLocalOf import java.time.LocalDate data class CalendarUiState( @@ -9,3 +11,7 @@ data class CalendarUiState( val isListEnabled: Boolean = false, val isWeekEnabled: Boolean = false ) + +val LocalPagerState = compositionLocalOf { + error("No PagerState provided") +} diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt index 5ebbabdd4..f2a5a01c5 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt @@ -1,7 +1,8 @@ package com.terning.feature.calendar.month -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -14,25 +15,23 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle import com.terning.core.extension.toast import com.terning.core.state.UiState -import com.terning.domain.entity.calendar.CalendarScrap -import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLocalDateByPage -import com.terning.feature.calendar.month.model.MonthModel +import com.terning.feature.calendar.calendar.model.LocalPagerState import com.terning.feature.calendar.month.component.CalendarMonth import com.terning.feature.calendar.month.model.CalendarMonthUiState -import kotlinx.coroutines.flow.distinctUntilChanged +import com.terning.feature.calendar.month.model.MonthModel +import timber.log.Timber import java.time.LocalDate import java.time.YearMonth @Composable fun CalendarMonthRoute( - listState: LazyListState, - pages: Int, selectedDate: LocalDate, updateSelectedDate: (LocalDate) -> Unit, modifier: Modifier = Modifier, viewModel: CalendarMonthViewModel = hiltViewModel() ) { + val pagerState = LocalPagerState.current val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current val monthUiState by viewModel.uiState.collectAsStateWithLifecycle(lifecycleOwner) @@ -46,21 +45,19 @@ fun CalendarMonthRoute( } } - LaunchedEffect(key1 = listState) { - snapshotFlow { listState.firstVisibleItemIndex } - .distinctUntilChanged() - .collect { - val page = listState.firstVisibleItemIndex - val date = getLocalDateByPage(page) + LaunchedEffect(key1 = pagerState) { + snapshotFlow { pagerState.settledPage } + .collect { settled-> + val date = getLocalDateByPage(settled) viewModel.getScrapMonth(date.year, date.monthValue) + Timber.tag("Calendar").d("MonthAPI date:${date} ") } } CalendarMonthScreen( + pagerState = pagerState, selectedDate = selectedDate, - calendarMonthUiState = monthUiState, - listState = listState, - pages = pages, + uiState = monthUiState, updateSelectedDate = updateSelectedDate, modifier = modifier ) @@ -68,62 +65,33 @@ fun CalendarMonthRoute( @Composable private fun CalendarMonthScreen( - listState: LazyListState, - calendarMonthUiState: CalendarMonthUiState, - pages: Int, + pagerState: PagerState, selectedDate: LocalDate, + uiState: CalendarMonthUiState, updateSelectedDate: (LocalDate) -> Unit, modifier: Modifier = Modifier, ) { - when (calendarMonthUiState.loadState) { - UiState.Loading -> {} - UiState.Empty -> {} - is UiState.Failure -> {} - is UiState.Success -> { - val scrapMap = calendarMonthUiState.loadState.data - MonthSuccessScreen( - pages = pages, - listState = listState, - scrapMap = scrapMap, - onDateSelected = updateSelectedDate, - selectedDate = selectedDate, - modifier = modifier - ) - } - } -} + HorizontalPager( + state = pagerState, + modifier = modifier.fillMaxSize() + ) {page -> + val date = getLocalDateByPage(page) + val monthModel = MonthModel(YearMonth.of(date.year, date.month)) -@Composable -private fun MonthSuccessScreen( - pages: Int, - listState: LazyListState, - selectedDate: LocalDate, - scrapMap: Map>, - onDateSelected: (LocalDate) -> Unit, - modifier: Modifier = Modifier, -) { - LazyRow( - modifier = modifier, - state = listState, - userScrollEnabled = true, - flingBehavior = flingBehavior( - state = listState + CalendarMonth( + modifier = Modifier.fillMaxSize(), + onDateSelected = updateSelectedDate, + monthModel = monthModel, + selectedDate = selectedDate, + isWeekEnabled = false, + scrapMap = when (uiState.loadState) { + UiState.Loading -> emptyMap() + UiState.Empty -> emptyMap() + is UiState.Failure -> emptyMap() + is UiState.Success -> uiState.loadState.data + }, ) - ) { - items(pages) { page -> - val date = getLocalDateByPage(page) - val monthModel = MonthModel(YearMonth.of(date.year, date.month)) - - CalendarMonth( - modifier = Modifier.fillParentMaxSize(), - onDateSelected = onDateSelected, - monthModel = monthModel, - scrapMap = scrapMap, - selectedDate = selectedDate, - isWeekEnabled = false - ) - } } } From b0eb8752cd8a487886ae9ffd6f5c5a8a825ad2ee Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 22:33:52 +0900 Subject: [PATCH 20/51] =?UTF-8?q?[MOD/#246]=20Dialog,=20List=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/list/CalendarListScreen.kt | 128 +++++++++++------- 1 file changed, 78 insertions(+), 50 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt index 4f32f527c..2c9dd57a6 100644 --- a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt @@ -29,6 +29,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle +import com.google.devtools.ksp.symbol.Visibility import com.terning.core.designsystem.theme.Back import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey400 @@ -91,20 +92,9 @@ fun CalendarListRoute( listState = listState, uiState = uiState, modifier = modifier, - navigateToAnnouncement = { announcementId -> - navigateToAnnouncement(announcementId) - viewModel.updateInternDialogVisibility(false) - }, - onDismissCancelDialog = { isCancelled -> - viewModel.updateScrapCancelDialogVisibility(false) - if (isCancelled) { viewModel.getScrapMonthList(uiState.currentDate) } - }, - onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, - onClickChangeColor = { - viewModel.getScrapMonthList(uiState.currentDate) - }, + onClickScrapButton = { scrapId -> - with(viewModel){ + with(viewModel) { updateAnnouncementId(scrapId) updateScrapCancelDialogVisibility(true) } @@ -116,6 +106,31 @@ fun CalendarListRoute( } } ) + + CalendarListScrapPatchDialog( + currentDate = uiState.currentDate, + dialogVisibility = uiState.internDialogVisibility, + internshipModel = uiState.internshipModel, + navigateToAnnouncement = { announcementId -> + navigateToAnnouncement(announcementId) + viewModel.updateInternDialogVisibility(false) + }, + onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, + onClickChangeColor = { + viewModel.getScrapMonthList(uiState.currentDate) + }, + ) + + CalendarListScrapCancelDialog( + scrapVisibility = uiState.scrapDialogVisibility, + internshipAnnouncementId = uiState.internshipAnnouncementId, + onDismissCancelDialog = { isCancelled -> + viewModel.updateScrapCancelDialogVisibility(false) + if (isCancelled) { + viewModel.getScrapMonthList(uiState.currentDate) + } + } + ) } @Composable @@ -123,10 +138,6 @@ private fun CalendarListScreen( pages: Int, listState: LazyListState, uiState: CalendarListUiState, - navigateToAnnouncement: (Long) -> Unit, - onDismissCancelDialog: (Boolean) -> Unit, - onDismissInternDialog: () -> Unit, - onClickChangeColor: () -> Unit, onClickInternship: (CalendarScrapDetail) -> Unit, onClickScrapButton: (Long) -> Unit, modifier: Modifier = Modifier @@ -167,7 +178,8 @@ private fun CalendarListScreen( is UiState.Success -> { val scrapMap = uiState.loadState.data items(getDate.lengthOfMonth()) { day -> - val currentDate = LocalDate.of(getDate.year, getDate.monthValue, day + 1) + val currentDate = + LocalDate.of(getDate.year, getDate.monthValue, day + 1) val dateInKorean = currentDate.getFullDateStringInKorean() if (scrapMap[dateInKorean].isListNotEmpty()) { @@ -198,37 +210,7 @@ private fun CalendarListScreen( } } - if (uiState.scrapDialogVisibility) { - uiState.internshipAnnouncementId?.run { - ScrapCancelDialog( - internshipAnnouncementId = this, - onDismissRequest = onDismissCancelDialog - ) - } - } - if (uiState.internDialogVisibility) { - uiState.internshipModel?.let { - val scrapColor = Color( - android.graphics.Color.parseColor( - uiState.internshipModel.color - ) - ) - ScrapDialog( - title = uiState.internshipModel.title, - scrapColor = scrapColor, - deadline = uiState.currentDate.getFullDateStringInKorean(), - startYearMonth = uiState.internshipModel.startYearMonth, - workingPeriod = uiState.internshipModel.workingPeriod, - internshipAnnouncementId = uiState.internshipModel.internshipAnnouncementId, - companyImage = uiState.internshipModel.companyImage, - isScrapped = true, - onDismissRequest = onDismissInternDialog, - onClickChangeColor = onClickChangeColor, - onClickNavigateButton = navigateToAnnouncement - ) - } - } } @Composable @@ -244,8 +226,7 @@ private fun CalendarListEmpty( ) Text( - modifier = modifier - .fillMaxWidth(), + modifier = modifier.fillMaxWidth(), text = stringResource(id = R.string.calendar_empty_scrap), textAlign = TextAlign.Center, style = TerningTheme.typography.body5, @@ -253,4 +234,51 @@ private fun CalendarListEmpty( ) } +@Composable +private fun CalendarListScrapCancelDialog( + scrapVisibility: Boolean, + internshipAnnouncementId: Long?, + onDismissCancelDialog: (Boolean) -> Unit +) { + if (scrapVisibility) { + internshipAnnouncementId?.run { + ScrapCancelDialog( + internshipAnnouncementId = this, + onDismissRequest = onDismissCancelDialog + ) + } + } +} +@Composable +private fun CalendarListScrapPatchDialog( + currentDate: LocalDate, + dialogVisibility: Boolean, + internshipModel: CalendarScrapDetail?, + navigateToAnnouncement: (Long) -> Unit, + onDismissInternDialog: () -> Unit, + onClickChangeColor: () -> Unit, +) { + if (dialogVisibility) { + internshipModel?.let { internship -> + val scrapColor = Color( + android.graphics.Color.parseColor( + internship.color + ) + ) + ScrapDialog( + title = internship.title, + scrapColor = scrapColor, + deadline = currentDate.getFullDateStringInKorean(), + startYearMonth = internship.startYearMonth, + workingPeriod = internship.workingPeriod, + internshipAnnouncementId = internship.internshipAnnouncementId, + companyImage = internship.companyImage, + isScrapped = true, + onDismissRequest = onDismissInternDialog, + onClickChangeColor = onClickChangeColor, + onClickNavigateButton = navigateToAnnouncement + ) + } + } +} From c966343e601ee57dcc2f784fa56d262e80e4bcca Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 22:40:44 +0900 Subject: [PATCH 21/51] =?UTF-8?q?[MOD/#246]=20List=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?PagerState=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarRoute.kt | 8 +- .../calendar/list/CalendarListScreen.kt | 140 ++++++++---------- 2 files changed, 65 insertions(+), 83 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 5f14289ea..888f2eb11 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -1,5 +1,6 @@ package com.terning.feature.calendar.calendar +import androidx.compose.animation.core.tween import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutHorizontally @@ -115,8 +116,9 @@ private fun CalendarScreen( onListButtonClicked = onClickListButton, onMonthNavigationButtonClicked = { direction -> coroutineScope.launch { - listState.animateScrollToItem( - index = listState.firstVisibleItemIndex + direction, + pagerState.animateScrollToPage( + page = pagerState.settledPage + direction, + animationSpec = tween(500) ) } } @@ -169,8 +171,6 @@ private fun CalendarScreen( }, contentTwo = { CalendarListRoute( - listState = listState, - pages = uiState.calendarModel.pageCount, navigateToAnnouncement = navigateToAnnouncement, navigateUp = disableListVisibility, modifier = Modifier diff --git a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt index 2c9dd57a6..7b70c292a 100644 --- a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt @@ -3,15 +3,14 @@ package com.terning.feature.calendar.list import androidx.activity.compose.BackHandler import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -29,40 +28,37 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle -import com.google.devtools.ksp.symbol.Visibility import com.terning.core.designsystem.theme.Back import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningTheme -import com.terning.core.designsystem.theme.White import com.terning.core.extension.getFullDateStringInKorean import com.terning.core.extension.isListNotEmpty import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.domain.entity.calendar.CalendarScrapDetail import com.terning.feature.R -import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLocalDateByPage +import com.terning.feature.calendar.calendar.model.LocalPagerState import com.terning.feature.calendar.list.component.CalendarScrapList import com.terning.feature.calendar.list.model.CalendarListUiState import com.terning.feature.dialog.cancel.ScrapCancelDialog import com.terning.feature.dialog.detail.ScrapDialog -import kotlinx.coroutines.flow.distinctUntilChanged +import timber.log.Timber import java.time.LocalDate @Composable fun CalendarListRoute( - pages: Int, - listState: LazyListState, modifier: Modifier = Modifier, navigateUp: () -> Unit, navigateToAnnouncement: (Long) -> Unit, viewModel: CalendarListViewModel = hiltViewModel() ) { + val pagerState = LocalPagerState.current val lifecycleOwner = LocalLifecycleOwner.current val uiState by viewModel.uiState.collectAsStateWithLifecycle(lifecycleOwner) - val context = LocalContext.current + LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { sideEffect -> @@ -72,14 +68,13 @@ fun CalendarListRoute( } } - LaunchedEffect(key1 = listState) { - snapshotFlow { listState.firstVisibleItemIndex } - .distinctUntilChanged() - .collect { - val page = listState.firstVisibleItemIndex - val date = getLocalDateByPage(page) + LaunchedEffect(key1 = pagerState) { + snapshotFlow { pagerState.settledPage } + .collect { settled -> + val date = getLocalDateByPage(settled) viewModel.updateCurrentDate(date) viewModel.getScrapMonthList(date) + Timber.tag("Calendar").d("MonthAPI date:${date} ") } } @@ -88,11 +83,9 @@ fun CalendarListRoute( } CalendarListScreen( - pages = pages, - listState = listState, + pagerState = pagerState, uiState = uiState, modifier = modifier, - onClickScrapButton = { scrapId -> with(viewModel) { updateAnnouncementId(scrapId) @@ -135,84 +128,73 @@ fun CalendarListRoute( @Composable private fun CalendarListScreen( - pages: Int, - listState: LazyListState, + pagerState: PagerState, uiState: CalendarListUiState, onClickInternship: (CalendarScrapDetail) -> Unit, onClickScrapButton: (Long) -> Unit, modifier: Modifier = Modifier ) { - Box { - LazyRow( - modifier = modifier - .background(White), - state = listState, - userScrollEnabled = true, - flingBehavior = flingBehavior( - state = listState - ) - ) { - items(pages) { page -> - val getDate = getLocalDateByPage(page) + HorizontalPager( + state = pagerState, + modifier = modifier + ) { page -> + val getDate = getLocalDateByPage(page) - LazyColumn( - modifier = Modifier - .fillParentMaxWidth() - .fillMaxHeight() - .background(Back) - ) { - when (uiState.loadState) { - UiState.Loading -> {} - UiState.Empty -> { - item { - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - CalendarListEmpty() - } - } + LazyColumn( + modifier = Modifier + .fillMaxSize() + .fillMaxHeight() + .background(Back) + ) { + when (uiState.loadState) { + UiState.Loading -> {} + UiState.Empty -> { + item { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + CalendarListEmpty() } + } + } - is UiState.Failure -> {} - is UiState.Success -> { - val scrapMap = uiState.loadState.data - items(getDate.lengthOfMonth()) { day -> - val currentDate = - LocalDate.of(getDate.year, getDate.monthValue, day + 1) - val dateInKorean = currentDate.getFullDateStringInKorean() + is UiState.Failure -> {} + is UiState.Success -> { + val scrapMap = uiState.loadState.data + items(getDate.lengthOfMonth()) { day -> + val currentDate = + LocalDate.of(getDate.year, getDate.monthValue, day + 1) + val dateInKorean = currentDate.getFullDateStringInKorean() - if (scrapMap[dateInKorean].isListNotEmpty()) { - Text( - text = dateInKorean, - style = TerningTheme.typography.title5, - color = Black, - modifier = Modifier - .padding(start = 24.dp, top = 16.dp, bottom = 15.dp) - ) + if (scrapMap[dateInKorean].isListNotEmpty()) { + Text( + text = dateInKorean, + style = TerningTheme.typography.title5, + color = Black, + modifier = Modifier + .padding(start = 24.dp, top = 16.dp, bottom = 15.dp) + ) - CalendarScrapList( - selectedDate = currentDate, - scrapList = scrapMap[dateInKorean].orEmpty(), - onScrapButtonClicked = onClickScrapButton, - onInternshipClicked = onClickInternship, - isFromList = true, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp) - ) - } - } + CalendarScrapList( + selectedDate = currentDate, + scrapList = scrapMap[dateInKorean].orEmpty(), + onScrapButtonClicked = onClickScrapButton, + onInternshipClicked = onClickInternship, + isFromList = true, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + ) } } } } } } - - } + @Composable private fun CalendarListEmpty( modifier: Modifier = Modifier From fe4e5ab036407fa969824f7a301230b16cf6c7d7 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 22:42:43 +0900 Subject: [PATCH 22/51] =?UTF-8?q?[DEL/#246]=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/calendar/list/CalendarListScreen.kt | 2 -- .../com/terning/feature/calendar/month/CalendarMonthScreen.kt | 2 -- 2 files changed, 4 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt index 7b70c292a..b5786d8bd 100644 --- a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt @@ -44,7 +44,6 @@ import com.terning.feature.calendar.list.component.CalendarScrapList import com.terning.feature.calendar.list.model.CalendarListUiState import com.terning.feature.dialog.cancel.ScrapCancelDialog import com.terning.feature.dialog.detail.ScrapDialog -import timber.log.Timber import java.time.LocalDate @Composable @@ -74,7 +73,6 @@ fun CalendarListRoute( val date = getLocalDateByPage(settled) viewModel.updateCurrentDate(date) viewModel.getScrapMonthList(date) - Timber.tag("Calendar").d("MonthAPI date:${date} ") } } diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt index f2a5a01c5..9c530b282 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt @@ -20,7 +20,6 @@ import com.terning.feature.calendar.calendar.model.LocalPagerState import com.terning.feature.calendar.month.component.CalendarMonth import com.terning.feature.calendar.month.model.CalendarMonthUiState import com.terning.feature.calendar.month.model.MonthModel -import timber.log.Timber import java.time.LocalDate import java.time.YearMonth @@ -50,7 +49,6 @@ fun CalendarMonthRoute( .collect { settled-> val date = getLocalDateByPage(settled) viewModel.getScrapMonth(date.year, date.monthValue) - Timber.tag("Calendar").d("MonthAPI date:${date} ") } } From b5652ee4f90292f6ef8ccb0f75898f610d45caea Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 22:50:32 +0900 Subject: [PATCH 23/51] =?UTF-8?q?[MOD/#246]=20=ED=83=91=EB=B0=94=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/topappbar/CalendarTopAppBar.kt | 9 ++------- .../terning/feature/calendar/calendar/CalendarRoute.kt | 1 - 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/topappbar/CalendarTopAppBar.kt b/core/src/main/java/com/terning/core/designsystem/component/topappbar/CalendarTopAppBar.kt index 30364b680..f7c7d0a60 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/topappbar/CalendarTopAppBar.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/topappbar/CalendarTopAppBar.kt @@ -40,7 +40,6 @@ import java.time.YearMonth @Composable fun CalendarTopAppBar( date: YearMonth, - isWeekExpanded: Boolean, isListExpanded: Boolean, onListButtonClicked: () -> Unit, onMonthNavigationButtonClicked: (Int) -> Unit, @@ -59,28 +58,26 @@ fun CalendarTopAppBar( modifier = Modifier.align(Alignment.Center), verticalAlignment = Alignment.CenterVertically ) { - if(!isWeekExpanded || isListExpanded) { Icon( painter = painterResource(id = R.drawable.ic_calendar_previous), contentDescription = stringResource(id = R.string.calendar_button_description_previous), tint = TerningMain, modifier = Modifier.noRippleClickable { onMonthNavigationButtonClicked(-1) } ) - } + Text( text = LocalDate.of(date.year, date.month, 1).getStringAsTitle(), style = TerningTheme.typography.title2, color = Black, modifier = Modifier.padding(horizontal = 8.dp) ) - if(!isWeekExpanded || isListExpanded) { Icon( painter = painterResource(id = R.drawable.ic_calendar_next), contentDescription = stringResource(id = R.string.calendar_button_description_next), tint = TerningMain, modifier = Modifier.noRippleClickable { onMonthNavigationButtonClicked(1) } ) - } + } Box( modifier = Modifier @@ -109,8 +106,6 @@ fun CalendarTopBarPreview() { CalendarTopAppBar( date = YearMonth.now(), isListExpanded = false, - isWeekExpanded = false - , onListButtonClicked = {}, onMonthNavigationButtonClicked = {} ) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 888f2eb11..943be59e5 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -112,7 +112,6 @@ private fun CalendarScreen( CalendarTopAppBar( date = getYearMonthByPage(uiState.currentPage), isListExpanded = uiState.isListEnabled, - isWeekExpanded = uiState.isWeekEnabled, onListButtonClicked = onClickListButton, onMonthNavigationButtonClicked = { direction -> coroutineScope.launch { From f8722568b348ff6a6ce9154a3780dcfa9ba0f3e8 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 23:14:16 +0900 Subject: [PATCH 24/51] =?UTF-8?q?[MOD/#246]=20CalendarViewModel=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarRoute.kt | 31 ++++--------------- .../calendar/calendar/CalendarViewModel.kt | 22 ++++++++++--- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 943be59e5..6f227ac2d 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -9,7 +9,6 @@ import androidx.compose.animation.togetherWith import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable @@ -34,7 +33,6 @@ import com.terning.feature.calendar.calendar.model.LocalPagerState import com.terning.feature.calendar.list.CalendarListRoute import com.terning.feature.calendar.month.CalendarMonthRoute import com.terning.feature.calendar.week.CalendarWeekRoute -import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import java.time.LocalDate @@ -51,16 +49,12 @@ fun CalendarRoute( modifier = modifier, uiState = uiState, navigateToAnnouncement = navigateToAnnouncement, + onClickNewDate = viewModel::onSelectNewDate, updateSelectedDate = viewModel::updateSelectedDate, updatePage = viewModel::updatePage, disableListVisibility = { viewModel.updateListVisibility(false) }, disableWeekVisibility = { viewModel.updateSelectedDate(uiState.selectedDate) }, - onClickListButton = { - viewModel.updateListVisibility(!uiState.isListEnabled) - if (uiState.isWeekEnabled) { - viewModel.updateWeekVisibility(false) - } - } + onClickListButton = { viewModel.updateListVisibility(!uiState.isListEnabled) } ) } @@ -68,6 +62,7 @@ fun CalendarRoute( private fun CalendarScreen( uiState: CalendarUiState, navigateToAnnouncement: (Long) -> Unit, + onClickNewDate: (LocalDate) -> Unit, updateSelectedDate: (LocalDate) -> Unit, disableListVisibility: () -> Unit, disableWeekVisibility: () -> Unit, @@ -83,26 +78,12 @@ private fun CalendarScreen( ) LaunchedEffect(key1 = pagerState) { - snapshotFlow { pagerState.currentPage} + snapshotFlow { pagerState.currentPage } .collect { current -> updatePage(current) } } - val listState = rememberLazyListState( - initialFirstVisibleItemIndex = uiState.calendarModel.initialPage - ) - - LaunchedEffect(key1 = listState) { - snapshotFlow { listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset} - .distinctUntilChanged() - .collect { (index, offset) -> - if (offset == 0) { - updatePage(index) - } - } - } - CompositionLocalProvider( LocalPagerState provides pagerState ) { @@ -149,7 +130,7 @@ private fun CalendarScreen( contentOne = { CalendarMonthRoute( selectedDate = uiState.selectedDate, - updateSelectedDate = updateSelectedDate, + updateSelectedDate = onClickNewDate, modifier = Modifier .fillMaxSize() .background(White), @@ -162,7 +143,7 @@ private fun CalendarScreen( .fillMaxSize(), navigateUp = disableWeekVisibility, navigateToAnnouncement = navigateToAnnouncement, - updateSelectedDate = updateSelectedDate + updateSelectedDate = onClickNewDate ) } ) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 4b525140a..480d812c3 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -16,16 +16,28 @@ class CalendarViewModel @Inject constructor() : ViewModel() { private var _uiState: MutableStateFlow = MutableStateFlow(CalendarUiState()) val uiState get() = _uiState.asStateFlow() - fun updateSelectedDate(date: LocalDate) = viewModelScope.launch { - if (_uiState.value.selectedDate != date) { + fun onSelectNewDate(selectedDate: LocalDate) = viewModelScope.launch { + if (_uiState.value.selectedDate == selectedDate) { _uiState.update { currentState -> currentState.copy( - selectedDate = date + isWeekEnabled = !_uiState.value.isWeekEnabled ) } - updateWeekVisibility(true) } else { - updateWeekVisibility(!_uiState.value.isWeekEnabled) + _uiState.update { currentState -> + currentState.copy( + selectedDate = selectedDate, + isWeekEnabled = true + ) + } + } + } + + fun updateSelectedDate(date: LocalDate) = viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy( + selectedDate = date + ) } } From 0655243f8dc441c9f5d296efadb2b926470228d7 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Fri, 13 Sep 2024 23:21:20 +0900 Subject: [PATCH 25/51] =?UTF-8?q?[MOD/#246]=20Dialog,=20Week=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/week/CalendarWeekScreen.kt | 122 +++++++++++------- 1 file changed, 74 insertions(+), 48 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt index ca882549f..4f5bc4800 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt @@ -88,18 +88,6 @@ fun CalendarWeekRoute( uiState = uiState, selectedDate = calendarUiState.selectedDate, updateSelectedDate = updateSelectedDate, - navigateToAnnouncement = { announcementId -> - navigateToAnnouncement(announcementId) - viewModel.updateInternDialogVisibility(false) - }, - onDismissCancelDialog = { isCancelled -> - viewModel.updateScrapCancelDialogVisibility(false) - if (isCancelled) { - viewModel.getScrapWeekList(uiState.selectedDate) - } - }, - onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, - onClickChangeColor = { viewModel.getScrapWeekList(uiState.selectedDate) }, onClickScrapButton = { scrapId -> with(viewModel) { updateInternshipAnnouncementId(scrapId) @@ -113,6 +101,31 @@ fun CalendarWeekRoute( } }, ) + + CalendarWeekScrapPatchDialog( + currentDate = uiState.selectedDate, + dialogVisibility = uiState.internDialogVisibility, + internshipModel = uiState.internshipModel, + navigateToAnnouncement = { announcementId -> + navigateToAnnouncement(announcementId) + viewModel.updateInternDialogVisibility(false) + }, + onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, + onClickChangeColor = { + viewModel.getScrapWeekList(uiState.selectedDate) + }, + ) + + CalendarWeekScrapCancelDialog( + scrapVisibility = uiState.scrapDialogVisibility, + internshipAnnouncementId = uiState.internshipAnnouncementId, + onDismissCancelDialog = { isCancelled -> + viewModel.updateScrapCancelDialogVisibility(false) + if (isCancelled) { + viewModel.getScrapWeekList(uiState.selectedDate) + } + } + ) } @Composable @@ -120,12 +133,8 @@ private fun CalendarWeekScreen( uiState: CalendarWeekUiState, selectedDate: LocalDate, updateSelectedDate: (LocalDate) -> Unit, - onDismissCancelDialog: (Boolean) -> Unit, - onDismissInternDialog: () -> Unit, - onClickChangeColor: () -> Unit, onClickInternship: (CalendarScrapDetail) -> Unit, onClickScrapButton: (Long) -> Unit, - navigateToAnnouncement: (Long) -> Unit, modifier: Modifier = Modifier ) { var swiped by remember { mutableStateOf(false) } @@ -189,38 +198,6 @@ private fun CalendarWeekScreen( } } } - - if (uiState.scrapDialogVisibility) { - uiState.internshipAnnouncementId?.run { - ScrapCancelDialog( - internshipAnnouncementId = this, - onDismissRequest = onDismissCancelDialog - ) - } - } - - if (uiState.internDialogVisibility) { - uiState.internshipModel?.let { - val scrapColor = Color( - android.graphics.Color.parseColor( - uiState.internshipModel.color - ) - ) - ScrapDialog( - title = uiState.internshipModel.title, - scrapColor = scrapColor, - deadline = uiState.selectedDate.getFullDateStringInKorean(), - startYearMonth = uiState.internshipModel.startYearMonth, - workingPeriod = uiState.internshipModel.workingPeriod, - internshipAnnouncementId = uiState.internshipModel.internshipAnnouncementId, - companyImage = uiState.internshipModel.companyImage, - isScrapped = true, - onDismissRequest = onDismissInternDialog, - onClickChangeColor = onClickChangeColor, - onClickNavigateButton = navigateToAnnouncement - ) - } - } } @Composable @@ -262,6 +239,55 @@ private fun CalendarWeekSuccess( ) } +@Composable +private fun CalendarWeekScrapCancelDialog( + scrapVisibility: Boolean, + internshipAnnouncementId: Long?, + onDismissCancelDialog: (Boolean) -> Unit +) { + if (scrapVisibility) { + internshipAnnouncementId?.run { + ScrapCancelDialog( + internshipAnnouncementId = this, + onDismissRequest = onDismissCancelDialog + ) + } + } +} + +@Composable +private fun CalendarWeekScrapPatchDialog( + currentDate: LocalDate, + dialogVisibility: Boolean, + internshipModel: CalendarScrapDetail?, + navigateToAnnouncement: (Long) -> Unit, + onDismissInternDialog: () -> Unit, + onClickChangeColor: () -> Unit, +) { + if (dialogVisibility) { + internshipModel?.let { internship -> + val scrapColor = Color( + android.graphics.Color.parseColor( + internship.color + ) + ) + ScrapDialog( + title = internship.title, + scrapColor = scrapColor, + deadline = currentDate.getFullDateStringInKorean(), + startYearMonth = internship.startYearMonth, + workingPeriod = internship.workingPeriod, + internshipAnnouncementId = internship.internshipAnnouncementId, + companyImage = internship.companyImage, + isScrapped = true, + onDismissRequest = onDismissInternDialog, + onClickChangeColor = onClickChangeColor, + onClickNavigateButton = navigateToAnnouncement + ) + } + } +} + From 6475edeb044469875cff1dc0a0b6004a6f3946ba Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sat, 14 Sep 2024 02:58:40 +0900 Subject: [PATCH 26/51] =?UTF-8?q?[FEAT/#246]=20=EB=8B=AC=EB=A0=A5=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=20=EB=A1=9C=EC=A7=81=20=EC=9E=AC=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarRoute.kt | 13 +-- .../calendar/calendar/CalendarViewModel.kt | 10 +-- .../calendar/model/CalendarUiState.kt | 1 - .../calendar/week/CalendarWeekScreen.kt | 79 +++++++++++-------- .../calendar/week/CalendarWeekViewModel.kt | 8 -- .../week/component/HorizontalCalendarWeek.kt | 5 ++ .../week/model/CalendarWeekUiState.kt | 1 - 7 files changed, 63 insertions(+), 54 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 6f227ac2d..a6519820f 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -27,6 +27,7 @@ import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.White import com.terning.feature.calendar.calendar.component.ScreenTransition import com.terning.feature.calendar.calendar.component.WeekDaysHeader +import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLocalDateByPage import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getYearMonthByPage import com.terning.feature.calendar.calendar.model.CalendarUiState import com.terning.feature.calendar.calendar.model.LocalPagerState @@ -34,6 +35,7 @@ import com.terning.feature.calendar.list.CalendarListRoute import com.terning.feature.calendar.month.CalendarMonthRoute import com.terning.feature.calendar.week.CalendarWeekRoute import kotlinx.coroutines.launch +import timber.log.Timber import java.time.LocalDate @Composable @@ -51,7 +53,6 @@ fun CalendarRoute( navigateToAnnouncement = navigateToAnnouncement, onClickNewDate = viewModel::onSelectNewDate, updateSelectedDate = viewModel::updateSelectedDate, - updatePage = viewModel::updatePage, disableListVisibility = { viewModel.updateListVisibility(false) }, disableWeekVisibility = { viewModel.updateSelectedDate(uiState.selectedDate) }, onClickListButton = { viewModel.updateListVisibility(!uiState.isListEnabled) } @@ -66,7 +67,6 @@ private fun CalendarScreen( updateSelectedDate: (LocalDate) -> Unit, disableListVisibility: () -> Unit, disableWeekVisibility: () -> Unit, - updatePage: (Int) -> Unit, onClickListButton: () -> Unit, modifier: Modifier = Modifier, ) { @@ -77,10 +77,13 @@ private fun CalendarScreen( pageCount = { uiState.calendarModel.pageCount } ) - LaunchedEffect(key1 = pagerState) { + LaunchedEffect(key1 = pagerState, key2 = uiState.selectedDate) { snapshotFlow { pagerState.currentPage } .collect { current -> - updatePage(current) + val date = getLocalDateByPage(current) + val newDate = LocalDate.of(date.year, date.month, uiState.selectedDate.dayOfMonth) + updateSelectedDate(newDate) + Timber.tag("Calendar").d("new:$newDate old:${uiState.selectedDate}") } } @@ -91,7 +94,7 @@ private fun CalendarScreen( modifier = modifier, ) { CalendarTopAppBar( - date = getYearMonthByPage(uiState.currentPage), + date = getYearMonthByPage(pagerState.settledPage), isListExpanded = uiState.isListEnabled, onListButtonClicked = onClickListButton, onMonthNavigationButtonClicked = { direction -> diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 480d812c3..16d23aa30 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import timber.log.Timber import java.time.LocalDate import javax.inject.Inject @@ -34,6 +35,7 @@ class CalendarViewModel @Inject constructor() : ViewModel() { } fun updateSelectedDate(date: LocalDate) = viewModelScope.launch { + Timber.tag("Calendar").d("in calendar viewmodel:${_uiState.value.selectedDate}") _uiState.update { currentState -> currentState.copy( selectedDate = date @@ -41,14 +43,6 @@ class CalendarViewModel @Inject constructor() : ViewModel() { } } - fun updatePage(page: Int) = viewModelScope.launch { - _uiState.update { currentState -> - currentState.copy( - currentPage = page - ) - } - } - fun updateListVisibility( visibility: Boolean ) { diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt index 4e84cb41c..6231be95b 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt @@ -7,7 +7,6 @@ import java.time.LocalDate data class CalendarUiState( val selectedDate: LocalDate = LocalDate.now(), val calendarModel: CalendarModel = CalendarModel(), - val currentPage: Int = 0, val isListEnabled: Boolean = false, val isWeekEnabled: Boolean = false ) diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt index 4f5bc4800..5219b75e7 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt @@ -4,8 +4,11 @@ import androidx.activity.compose.BackHandler import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.Text @@ -15,6 +18,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.shadow @@ -40,13 +44,16 @@ import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.domain.entity.calendar.CalendarScrapDetail import com.terning.feature.R +import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLocalDateByPage import com.terning.feature.calendar.calendar.model.CalendarUiState +import com.terning.feature.calendar.calendar.model.LocalPagerState import com.terning.feature.calendar.list.component.CalendarScrapList import com.terning.feature.calendar.week.component.HorizontalCalendarWeek import com.terning.feature.calendar.week.model.CalendarWeekUiState import com.terning.feature.dialog.cancel.ScrapCancelDialog import com.terning.feature.dialog.detail.ScrapDialog import okhttp3.internal.toImmutableList +import timber.log.Timber import java.time.LocalDate @Composable @@ -58,6 +65,7 @@ fun CalendarWeekRoute( modifier: Modifier = Modifier, viewModel: CalendarWeekViewModel = hiltViewModel() ) { + val pagerState = LocalPagerState.current val lifecycleOwner = LocalLifecycleOwner.current val uiState by viewModel.uiState.collectAsStateWithLifecycle(lifecycleOwner) @@ -72,11 +80,7 @@ fun CalendarWeekRoute( } LaunchedEffect(key1 = calendarUiState.selectedDate) { - viewModel.updateSelectedDate(selectedDate = calendarUiState.selectedDate) - } - - LaunchedEffect(key1 = uiState.selectedDate) { - viewModel.getScrapWeekList(selectedDate = uiState.selectedDate) + viewModel.getScrapWeekList(selectedDate = calendarUiState.selectedDate) } BackHandler { @@ -85,6 +89,7 @@ fun CalendarWeekRoute( CalendarWeekScreen( modifier = modifier, + pagerState = pagerState, uiState = uiState, selectedDate = calendarUiState.selectedDate, updateSelectedDate = updateSelectedDate, @@ -103,7 +108,7 @@ fun CalendarWeekRoute( ) CalendarWeekScrapPatchDialog( - currentDate = uiState.selectedDate, + currentDate = calendarUiState.selectedDate, dialogVisibility = uiState.internDialogVisibility, internshipModel = uiState.internshipModel, navigateToAnnouncement = { announcementId -> @@ -112,7 +117,7 @@ fun CalendarWeekRoute( }, onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, onClickChangeColor = { - viewModel.getScrapWeekList(uiState.selectedDate) + viewModel.getScrapWeekList(calendarUiState.selectedDate) }, ) @@ -122,7 +127,7 @@ fun CalendarWeekRoute( onDismissCancelDialog = { isCancelled -> viewModel.updateScrapCancelDialogVisibility(false) if (isCancelled) { - viewModel.getScrapWeekList(uiState.selectedDate) + viewModel.getScrapWeekList(calendarUiState.selectedDate) } } ) @@ -131,6 +136,7 @@ fun CalendarWeekRoute( @Composable private fun CalendarWeekScreen( uiState: CalendarWeekUiState, + pagerState: PagerState, selectedDate: LocalDate, updateSelectedDate: (LocalDate) -> Unit, onClickInternship: (CalendarScrapDetail) -> Unit, @@ -169,32 +175,43 @@ private fun CalendarWeekScreen( ) } - Text( - text = selectedDate.getDateStringInKorean(), - style = TerningTheme.typography.title5, - color = Black, - modifier = Modifier - .fillMaxWidth() - .padding(start = 24.dp, top = 16.dp, bottom = 15.dp) - ) + HorizontalPager( + state = pagerState, + modifier = Modifier.fillMaxSize(), + userScrollEnabled = false + ) { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = selectedDate.getDateStringInKorean(), + style = TerningTheme.typography.title5, + color = Black, + modifier = Modifier + .fillMaxWidth() + .padding(start = 24.dp, top = 16.dp, bottom = 15.dp) + ) - when (uiState.loadState) { - is UiState.Loading -> {} - is UiState.Empty -> { - CalendarWeekEmpty() - } + when (uiState.loadState) { + is UiState.Loading -> {} + is UiState.Empty -> { + CalendarWeekEmpty() + } - is UiState.Failure -> { - CalendarWeekEmpty() - } + is UiState.Failure -> { + CalendarWeekEmpty() + } - is UiState.Success -> { - CalendarWeekSuccess( - scrapList = uiState.loadState.data.toImmutableList(), - selectedDate = uiState.selectedDate, - onScrapButtonClicked = onClickScrapButton, - onInternshipClicked = onClickInternship - ) + is UiState.Success -> { + CalendarWeekSuccess( + scrapList = uiState.loadState.data.toImmutableList(), + selectedDate = selectedDate, + onScrapButtonClicked = onClickScrapButton, + onInternshipClicked = onClickInternship + ) + } + } } } } diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekViewModel.kt index 0ebe403c3..52c824dc6 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekViewModel.kt @@ -28,14 +28,6 @@ class CalendarWeekViewModel @Inject constructor( private val _sideEffect: MutableSharedFlow = MutableSharedFlow() val sideEffect = _sideEffect.asSharedFlow() - fun updateSelectedDate(selectedDate: LocalDate) { - _uiState.update { currentState -> - currentState.copy( - selectedDate = selectedDate - ) - } - } - fun updateScrapCancelDialogVisibility(visibility: Boolean) { _uiState.update { currentState -> currentState.copy( diff --git a/feature/src/main/java/com/terning/feature/calendar/week/component/HorizontalCalendarWeek.kt b/feature/src/main/java/com/terning/feature/calendar/week/component/HorizontalCalendarWeek.kt index 593a927dd..e179cc7cc 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/component/HorizontalCalendarWeek.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/component/HorizontalCalendarWeek.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.terning.core.extension.getWeekIndexContainingSelectedDate @@ -31,6 +32,10 @@ fun HorizontalCalendarWeek( pageCount = { monthModel.totalDays / 7 } ) + LaunchedEffect(selectedDate) { + pagerState.animateScrollToPage(selectedDate.getWeekIndexContainingSelectedDate(monthModel.inDays)) + } + HorizontalPager( modifier = modifier, state = pagerState diff --git a/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt b/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt index 08932e1e7..fbf539b61 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt @@ -6,7 +6,6 @@ import java.time.LocalDate data class CalendarWeekUiState( val loadState: UiState> = UiState.Loading, - val selectedDate: LocalDate = LocalDate.now(), val scrapDialogVisibility: Boolean = false, val internDialogVisibility: Boolean = false, val internshipAnnouncementId: Long? = null, From 9fb6115bd2dea23b9f42b59ef9074dcfafd28c1b Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sat, 14 Sep 2024 02:59:46 +0900 Subject: [PATCH 27/51] =?UTF-8?q?[DEL/#246]=20=EB=9D=BC=EC=9D=B4=EB=B8=8C?= =?UTF-8?q?=EB=9F=AC=EB=A6=AC=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/calendar/calendar/CalendarRoute.kt | 2 -- .../feature/calendar/calendar/CalendarViewModel.kt | 12 ------------ .../calendar/list/component/CalendarScrapList.kt | 7 ------- .../feature/calendar/week/CalendarWeekScreen.kt | 3 --- .../calendar/week/model/CalendarWeekUiState.kt | 1 - 5 files changed, 25 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index a6519820f..6ac781127 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -35,7 +35,6 @@ import com.terning.feature.calendar.list.CalendarListRoute import com.terning.feature.calendar.month.CalendarMonthRoute import com.terning.feature.calendar.week.CalendarWeekRoute import kotlinx.coroutines.launch -import timber.log.Timber import java.time.LocalDate @Composable @@ -83,7 +82,6 @@ private fun CalendarScreen( val date = getLocalDateByPage(current) val newDate = LocalDate.of(date.year, date.month, uiState.selectedDate.dayOfMonth) updateSelectedDate(newDate) - Timber.tag("Calendar").d("new:$newDate old:${uiState.selectedDate}") } } diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 16d23aa30..9d8c5893d 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -8,7 +8,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import timber.log.Timber import java.time.LocalDate import javax.inject.Inject @@ -35,7 +34,6 @@ class CalendarViewModel @Inject constructor() : ViewModel() { } fun updateSelectedDate(date: LocalDate) = viewModelScope.launch { - Timber.tag("Calendar").d("in calendar viewmodel:${_uiState.value.selectedDate}") _uiState.update { currentState -> currentState.copy( selectedDate = date @@ -52,14 +50,4 @@ class CalendarViewModel @Inject constructor() : ViewModel() { ) } } - - fun updateWeekVisibility( - visibility: Boolean - ) { - _uiState.update { currentState -> - currentState.copy( - isWeekEnabled = visibility - ) - } - } } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/list/component/CalendarScrapList.kt b/feature/src/main/java/com/terning/feature/calendar/list/component/CalendarScrapList.kt index a2ff8bb49..6ac83ab5b 100644 --- a/feature/src/main/java/com/terning/feature/calendar/list/component/CalendarScrapList.kt +++ b/feature/src/main/java/com/terning/feature/calendar/list/component/CalendarScrapList.kt @@ -2,19 +2,12 @@ package com.terning.feature.calendar.list.component import androidx.compose.foundation.layout.Column 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.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.terning.core.designsystem.theme.Black -import com.terning.core.designsystem.theme.TerningTheme -import com.terning.core.extension.getDateStringInKorean -import com.terning.core.extension.isListNotEmpty import com.terning.domain.entity.calendar.CalendarScrapDetail import java.time.LocalDate diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt index 5219b75e7..33a911d83 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt @@ -18,7 +18,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.shadow @@ -44,7 +43,6 @@ import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.domain.entity.calendar.CalendarScrapDetail import com.terning.feature.R -import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLocalDateByPage import com.terning.feature.calendar.calendar.model.CalendarUiState import com.terning.feature.calendar.calendar.model.LocalPagerState import com.terning.feature.calendar.list.component.CalendarScrapList @@ -53,7 +51,6 @@ import com.terning.feature.calendar.week.model.CalendarWeekUiState import com.terning.feature.dialog.cancel.ScrapCancelDialog import com.terning.feature.dialog.detail.ScrapDialog import okhttp3.internal.toImmutableList -import timber.log.Timber import java.time.LocalDate @Composable diff --git a/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt b/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt index fbf539b61..18b586b77 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt @@ -2,7 +2,6 @@ package com.terning.feature.calendar.week.model import com.terning.core.state.UiState import com.terning.domain.entity.calendar.CalendarScrapDetail -import java.time.LocalDate data class CalendarWeekUiState( val loadState: UiState> = UiState.Loading, From 4b6db8f79a5f1d9e81b4bea80d899e4d4a4d040c Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sat, 14 Sep 2024 03:16:16 +0900 Subject: [PATCH 28/51] =?UTF-8?q?[REFACTOR/#246]=20=EB=B7=B0=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/calendar/CalendarRoute.kt | 2 +- .../calendar/calendar/CalendarViewModel.kt | 12 +++- .../calendar/list/CalendarListScreen.kt | 10 +-- .../calendar/list/CalendarListViewModel.kt | 67 ++++++++++--------- .../list/model/CalendarListUiState.kt | 4 +- .../calendar/week/CalendarWeekScreen.kt | 10 +-- .../calendar/week/CalendarWeekViewModel.kt | 25 +++---- .../week/model/CalendarWeekUiState.kt | 4 +- 8 files changed, 73 insertions(+), 61 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 6ac781127..640b2ca55 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -53,7 +53,7 @@ fun CalendarRoute( onClickNewDate = viewModel::onSelectNewDate, updateSelectedDate = viewModel::updateSelectedDate, disableListVisibility = { viewModel.updateListVisibility(false) }, - disableWeekVisibility = { viewModel.updateSelectedDate(uiState.selectedDate) }, + disableWeekVisibility = { viewModel.updateWeekVisibility(false) }, onClickListButton = { viewModel.updateListVisibility(!uiState.isListEnabled) } ) } diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt index 9d8c5893d..5280ae0af 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarViewModel.kt @@ -41,13 +41,19 @@ class CalendarViewModel @Inject constructor() : ViewModel() { } } - fun updateListVisibility( - visibility: Boolean - ) { + fun updateListVisibility(visibility: Boolean) = viewModelScope.launch { _uiState.update { currentState -> currentState.copy( isListEnabled = visibility ) } } + + fun updateWeekVisibility(visibility: Boolean) = viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy( + isWeekEnabled = visibility + ) + } + } } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt index b5786d8bd..cddf094bd 100644 --- a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListScreen.kt @@ -93,27 +93,27 @@ fun CalendarListRoute( onClickInternship = { calendarScrapDetail -> with(viewModel) { updateInternshipModel(calendarScrapDetail) - updateInternDialogVisibility(true) + updateScrapDetailDialogVisibility(true) } } ) CalendarListScrapPatchDialog( currentDate = uiState.currentDate, - dialogVisibility = uiState.internDialogVisibility, + dialogVisibility = uiState.scrapDetailDialogVisibility, internshipModel = uiState.internshipModel, navigateToAnnouncement = { announcementId -> navigateToAnnouncement(announcementId) - viewModel.updateInternDialogVisibility(false) + viewModel.updateScrapDetailDialogVisibility(false) }, - onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, + onDismissInternDialog = { viewModel.updateScrapDetailDialogVisibility(false) }, onClickChangeColor = { viewModel.getScrapMonthList(uiState.currentDate) }, ) CalendarListScrapCancelDialog( - scrapVisibility = uiState.scrapDialogVisibility, + scrapVisibility = uiState.scrapCancelDialogVisibility, internshipAnnouncementId = uiState.internshipAnnouncementId, onDismissCancelDialog = { isCancelled -> viewModel.updateScrapCancelDialogVisibility(false) diff --git a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListViewModel.kt index 6491ae47a..ffd9f161b 100644 --- a/feature/src/main/java/com/terning/feature/calendar/list/CalendarListViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/list/CalendarListViewModel.kt @@ -21,52 +21,57 @@ import javax.inject.Inject @HiltViewModel class CalendarListViewModel @Inject constructor( private val calendarRepository: CalendarRepository -): ViewModel(){ +) : ViewModel() { private val _uiState = MutableStateFlow(CalendarListUiState()) val uiState = _uiState.asStateFlow() private val _sideEffect: MutableSharedFlow = MutableSharedFlow() val sideEffect = _sideEffect.asSharedFlow() - fun updateCurrentDate(date: LocalDate) { - _uiState.update { currentState -> - currentState.copy( - currentDate = date - ) + fun updateCurrentDate(date: LocalDate) = + viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy( + currentDate = date + ) + } } - } - fun updateScrapCancelDialogVisibility(visibility: Boolean) { - _uiState.update { currentState -> - currentState.copy( - scrapDialogVisibility = visibility - ) + fun updateAnnouncementId(announcementId: Long? = null) = + viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy( + internshipAnnouncementId = announcementId + ) + } } - } - fun updateAnnouncementId(announcementId: Long? = null) { - _uiState.update { currentState -> - currentState.copy( - internshipAnnouncementId = announcementId - ) + fun updateScrapCancelDialogVisibility(visibility: Boolean) = + viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy( + scrapCancelDialogVisibility = visibility + ) + } } - } - fun updateInternDialogVisibility(visibility: Boolean) { - _uiState.update { currentState -> - currentState.copy( - internDialogVisibility = visibility - ) + fun updateScrapDetailDialogVisibility(visibility: Boolean) = + viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy( + scrapDetailDialogVisibility = visibility + ) + } } - } - fun updateInternshipModel(scrapDetailModel: CalendarScrapDetail?) { - _uiState.update { currentState -> - currentState.copy( - internshipModel = scrapDetailModel - ) + fun updateInternshipModel(scrapDetailModel: CalendarScrapDetail?) = + viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy( + internshipModel = scrapDetailModel + ) + } } - } fun getScrapMonthList( date: LocalDate diff --git a/feature/src/main/java/com/terning/feature/calendar/list/model/CalendarListUiState.kt b/feature/src/main/java/com/terning/feature/calendar/list/model/CalendarListUiState.kt index 1e7fb236f..ca214a28f 100644 --- a/feature/src/main/java/com/terning/feature/calendar/list/model/CalendarListUiState.kt +++ b/feature/src/main/java/com/terning/feature/calendar/list/model/CalendarListUiState.kt @@ -7,8 +7,8 @@ import java.time.LocalDate data class CalendarListUiState( val loadState: UiState>> = UiState.Loading, val currentDate: LocalDate = LocalDate.now(), - val scrapDialogVisibility: Boolean = false, - val internDialogVisibility: Boolean = false, + val scrapCancelDialogVisibility: Boolean = false, + val scrapDetailDialogVisibility: Boolean = false, val internshipAnnouncementId: Long? = null, val internshipModel: CalendarScrapDetail? = null ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt index 33a911d83..206530448 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekScreen.kt @@ -98,7 +98,7 @@ fun CalendarWeekRoute( }, onClickInternship = { scrapDetail -> with(viewModel) { - updateInternDialogVisibility(true) + updateScrapDetailDialogVisibility(true) updateInternshipModel(scrapDetail) } }, @@ -106,20 +106,20 @@ fun CalendarWeekRoute( CalendarWeekScrapPatchDialog( currentDate = calendarUiState.selectedDate, - dialogVisibility = uiState.internDialogVisibility, + dialogVisibility = uiState.scrapDetailDialogVisibility, internshipModel = uiState.internshipModel, navigateToAnnouncement = { announcementId -> navigateToAnnouncement(announcementId) - viewModel.updateInternDialogVisibility(false) + viewModel.updateScrapDetailDialogVisibility(false) }, - onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, + onDismissInternDialog = { viewModel.updateScrapDetailDialogVisibility(false) }, onClickChangeColor = { viewModel.getScrapWeekList(calendarUiState.selectedDate) }, ) CalendarWeekScrapCancelDialog( - scrapVisibility = uiState.scrapDialogVisibility, + scrapVisibility = uiState.scrapCancelDialogVisibility, internshipAnnouncementId = uiState.internshipAnnouncementId, onDismissCancelDialog = { isCancelled -> viewModel.updateScrapCancelDialogVisibility(false) diff --git a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekViewModel.kt index 52c824dc6..1e4c17d4e 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/CalendarWeekViewModel.kt @@ -21,38 +21,39 @@ import javax.inject.Inject @HiltViewModel class CalendarWeekViewModel @Inject constructor( private val calendarRepository: CalendarRepository -): ViewModel() { +) : ViewModel() { private val _uiState = MutableStateFlow(CalendarWeekUiState()) val uiState = _uiState.asStateFlow() private val _sideEffect: MutableSharedFlow = MutableSharedFlow() val sideEffect = _sideEffect.asSharedFlow() - fun updateScrapCancelDialogVisibility(visibility: Boolean) { - _uiState.update { currentState -> - currentState.copy( - scrapDialogVisibility = visibility - ) + fun updateInternshipAnnouncementId(internshipAnnouncementId: Long? = null) = + viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy( + internshipAnnouncementId = internshipAnnouncementId + ) + } } - } - fun updateInternshipAnnouncementId(internshipAnnouncementId: Long? = null) { + fun updateScrapDetailDialogVisibility(visibility: Boolean) = viewModelScope.launch { _uiState.update { currentState -> currentState.copy( - internshipAnnouncementId = internshipAnnouncementId + scrapDetailDialogVisibility = visibility ) } } - fun updateInternDialogVisibility(visibility: Boolean) { + fun updateScrapCancelDialogVisibility(visibility: Boolean) = viewModelScope.launch { _uiState.update { currentState -> currentState.copy( - internDialogVisibility = visibility + scrapCancelDialogVisibility = visibility ) } } - fun updateInternshipModel(scrapDetailModel: CalendarScrapDetail?) { + fun updateInternshipModel(scrapDetailModel: CalendarScrapDetail?) = viewModelScope.launch { _uiState.update { currentState -> currentState.copy( internshipModel = scrapDetailModel diff --git a/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt b/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt index 18b586b77..e0326f7e8 100644 --- a/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt +++ b/feature/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt @@ -5,8 +5,8 @@ import com.terning.domain.entity.calendar.CalendarScrapDetail data class CalendarWeekUiState( val loadState: UiState> = UiState.Loading, - val scrapDialogVisibility: Boolean = false, - val internDialogVisibility: Boolean = false, + val scrapCancelDialogVisibility: Boolean = false, + val scrapDetailDialogVisibility: Boolean = false, val internshipAnnouncementId: Long? = null, val internshipModel: CalendarScrapDetail? = null ) \ No newline at end of file From d0c05a3ec8414a757ac8dfb55f94c903e261bb63 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sat, 14 Sep 2024 03:20:12 +0900 Subject: [PATCH 29/51] =?UTF-8?q?[DEL/#246]=20listState=20=EC=A0=84?= =?UTF-8?q?=EC=9A=A9=20=ED=95=A8=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/model/CalendarDefault.kt | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarDefault.kt diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarDefault.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarDefault.kt deleted file mode 100644 index 1d2cf981a..000000000 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/model/CalendarDefault.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.terning.feature.calendar.calendar.model - -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.gestures.FlingBehavior -import androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider -import androidx.compose.foundation.gestures.snapping.SnapPosition -import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember - -internal object CalendarDefaults { - /** - * Returns the fling behavior for the given [LazyListState]. - * From Github [https://github.com/kizitonwose/Calendar] - */ - @OptIn(ExperimentalFoundationApi::class) - @Composable - fun flingBehavior(state: LazyListState): FlingBehavior { - val snappingLayout = remember(state) { - val provider = SnapLayoutInfoProvider(state, SnapPosition.Start) - CalendarSnapLayoutInfoProvider(provider) - } - return rememberSnapFlingBehavior(snappingLayout) - } -} - -@ExperimentalFoundationApi -@Suppress("FunctionName") -private fun CalendarSnapLayoutInfoProvider( - snapLayoutInfoProvider: SnapLayoutInfoProvider, -): SnapLayoutInfoProvider = object : SnapLayoutInfoProvider by snapLayoutInfoProvider { - override fun calculateApproachOffset(velocity: Float, decayOffset: Float): Float = 0f -} \ No newline at end of file From 05c6f89906f10f282c1b3e49ff4bb76a52c1f643 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sat, 14 Sep 2024 19:23:19 +0900 Subject: [PATCH 30/51] =?UTF-8?q?[FIX/#246]=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/calendar/calendar/CalendarRoute.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt index 640b2ca55..fd8e24bd2 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/CalendarRoute.kt @@ -131,7 +131,10 @@ private fun CalendarScreen( contentOne = { CalendarMonthRoute( selectedDate = uiState.selectedDate, - updateSelectedDate = onClickNewDate, + updateSelectedDate = { newDate -> + if(!pagerState.isScrollInProgress) + onClickNewDate(newDate) + }, modifier = Modifier .fillMaxSize() .background(White), From f40f734943f0a19a342e46dba694711d0d1466e1 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sat, 14 Sep 2024 19:31:57 +0900 Subject: [PATCH 31/51] =?UTF-8?q?[MOD/#246]=20=EA=B8=B0=ED=83=80=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/navigation/CalendarNavigation.kt | 17 +---------------- .../calendar/month/CalendarMonthScreen.kt | 7 +++---- .../calendar/month/CalendarMonthViewModel.kt | 6 ++++-- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/navigation/CalendarNavigation.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/navigation/CalendarNavigation.kt index 7aa5db891..61c158402 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/navigation/CalendarNavigation.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/navigation/CalendarNavigation.kt @@ -1,7 +1,5 @@ package com.terning.feature.calendar.calendar.navigation -import androidx.compose.animation.EnterTransition -import androidx.compose.animation.ExitTransition import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.ui.Modifier @@ -26,20 +24,7 @@ fun NavGraphBuilder.calendarNavGraph( navHostController: NavController, paddingValues: PaddingValues ) { - composable( - exitTransition = { - ExitTransition.None - }, - popEnterTransition = { - EnterTransition.None - }, - enterTransition = { - EnterTransition.None - }, - popExitTransition = { - ExitTransition.None - } - ) { + composable { CalendarRoute( modifier = Modifier.padding(paddingValues), navigateToAnnouncement = navHostController::navigateIntern diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt index 9c530b282..b0bade11e 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthScreen.kt @@ -45,10 +45,9 @@ fun CalendarMonthRoute( } LaunchedEffect(key1 = pagerState) { - snapshotFlow { pagerState.settledPage } - .collect { settled-> - val date = getLocalDateByPage(settled) - viewModel.getScrapMonth(date.year, date.monthValue) + snapshotFlow { pagerState.currentPage } + .collect { currentPage-> + viewModel.getScrapMonth(currentPage) } } diff --git a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthViewModel.kt b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthViewModel.kt index fbcd6dcb1..c3307f779 100644 --- a/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthViewModel.kt +++ b/feature/src/main/java/com/terning/feature/calendar/month/CalendarMonthViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import com.terning.core.state.UiState import com.terning.domain.repository.CalendarRepository import com.terning.feature.R +import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLocalDateByPage import com.terning.feature.calendar.month.model.CalendarMonthUiState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -27,9 +28,10 @@ class CalendarMonthViewModel @Inject constructor( val sideEffect = _sideEffect.asSharedFlow() fun getScrapMonth( - year: Int, month: Int + currentPage: Int ) = viewModelScope.launch(Dispatchers.IO) { - calendarRepository.getScrapMonth(year, month) + val date = getLocalDateByPage(currentPage) + calendarRepository.getScrapMonth(date.year, date.monthValue) .fold( onSuccess = { _uiState.update { currentState -> From 15daf07eaa2ca9abb578f139ee39a05872783831 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 14 Sep 2024 21:02:17 +0900 Subject: [PATCH 32/51] =?UTF-8?q?[FIX/#241]=20=ED=85=8D=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/profileedit/ProfileEditRoute.kt | 1 + .../mypage/profileedit/ProfileEditState.kt | 2 ++ .../mypage/profileedit/ProfileEditViewModel.kt | 17 ++++++++++------- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt index 3c05b18cd..f32f3e65d 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt @@ -166,6 +166,7 @@ fun ProfileEditScreen( onValidationChanged(isValid) }, initialView = profileEditState.initialView, + isNameChangedOnce = profileEditState.isNameChangedOnce, isProfileChangedButNameSame = profileEditState.isProfileChangedButNameSame ) Spacer(modifier = Modifier.height(48.dp)) diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt index 724566051..9305ce422 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt @@ -6,6 +6,8 @@ data class ProfileEditState( val profile: String = "", val initialProfile: String = "", val initialView: Boolean = true, + val isModified: Boolean = false, + val isNameChangedOnce: Boolean = false, val isProfileChangedButNameSame: Boolean = false, val isButtonValid: Boolean = false, val authType: String = "", diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt index d30c974df..82c78e623 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt @@ -43,22 +43,25 @@ class ProfileEditViewModel @Inject constructor( } fun updateName(name: String) { - val isSameAsInitial = name == _state.value.initialName - val isProfileChangedButNameSame = - _state.value.profile != _state.value.initialProfile && isSameAsInitial - _state.value = _state.value.copy( name = name, initialView = false, - isProfileChangedButNameSame = isProfileChangedButNameSame + isModified = true, + isProfileChangedButNameSame = false, + isNameChangedOnce = true ) } fun updateProfile(profile: String) { + val isSameAsInitial = profile == _state.value.initialProfile + val isSameAsPrevious = profile == _state.value.profile + _state.value = _state.value.copy( profile = profile, - initialView = false, - isProfileChangedButNameSame = _state.value.name == _state.value.initialName + initialView = !_state.value.isModified && isSameAsInitial, + isModified = if (isSameAsPrevious) _state.value.isModified else !isSameAsInitial, + isProfileChangedButNameSame = if (_state.value.isNameChangedOnce) false + else state.value.name == _state.value.initialName ) } From bfcd92a5988fc4dbf7b99f6ab3c3a3d541580a7e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 14 Sep 2024 21:03:32 +0900 Subject: [PATCH 33/51] =?UTF-8?q?[FIX/#241]=20=ED=85=8D=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/mypage/profileedit/ProfileEditRoute.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt index f32f3e65d..3c05b18cd 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditRoute.kt @@ -166,7 +166,6 @@ fun ProfileEditScreen( onValidationChanged(isValid) }, initialView = profileEditState.initialView, - isNameChangedOnce = profileEditState.isNameChangedOnce, isProfileChangedButNameSame = profileEditState.isProfileChangedButNameSame ) Spacer(modifier = Modifier.height(48.dp)) From a513b50f05a6aa31c0dd1c9267dcc56f1e84186e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 14 Sep 2024 22:53:53 +0900 Subject: [PATCH 34/51] =?UTF-8?q?[FIX/#241]=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=EB=B2=84=ED=8A=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/component/button/FilteringButton.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/button/FilteringButton.kt b/core/src/main/java/com/terning/core/designsystem/component/button/FilteringButton.kt index bc0ca38db..5c673849a 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/button/FilteringButton.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/button/FilteringButton.kt @@ -26,8 +26,10 @@ import com.terning.core.R import com.terning.core.designsystem.theme.Grey150 import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.Grey375 +import com.terning.core.designsystem.theme.Grey50 import com.terning.core.designsystem.theme.TerningMain import com.terning.core.designsystem.theme.TerningPointTheme +import com.terning.core.designsystem.theme.TerningSub5 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.util.NoRippleTheme @@ -56,10 +58,14 @@ fun FilteringButton( ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() - val backgroundColor = White + val backgroundColor = when { + !isSelected && isPressed -> Grey50 + isSelected && isPressed -> TerningSub5 + else -> White + } val textColor = when { - !isSelected -> Grey375 - isPressed -> Grey375 + !isSelected && !isPressed -> Grey375 + !isSelected && isPressed -> Grey375 else -> TerningMain } val borderColor = when { From b779241c15ed35051dcf6e7d65f913b8583ed1bb Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 14 Sep 2024 23:11:30 +0900 Subject: [PATCH 35/51] =?UTF-8?q?[FIX/#241]=20=EC=B2=AB=20=EB=B2=88?= =?UTF-8?q?=EC=A7=B8=20=ED=95=84=ED=84=B0=EB=A7=81=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filtering/filteringone/FilteringOneRoute.kt | 3 ++- .../filteringone/component/StatusOneRadioGroup.kt | 13 ++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt index ffcd199f0..4d25c06ab 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt @@ -59,7 +59,8 @@ fun FilteringOneRoute( name = name, onButtonClick = { grade -> viewModel.updateGrade(grade) - viewModel.updateButton(true) + if (grade.isNotEmpty()) viewModel.updateButton(true) + else viewModel.updateButton(false) }, onNextClick = viewModel::navigateToFilteringTwo, navigateUp = viewModel::navigateUp, diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/component/StatusOneRadioGroup.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/component/StatusOneRadioGroup.kt index c0c537db2..23630aeae 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/component/StatusOneRadioGroup.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/component/StatusOneRadioGroup.kt @@ -35,7 +35,6 @@ fun StatusOneRadioGroup( R.string.filtering_status1_description4 ) - val selectedIndex = remember { mutableIntStateOf(options[0]) } val selectedButton = remember { mutableStateListOf(false, false, false, false) } LazyVerticalGrid( @@ -50,10 +49,14 @@ fun StatusOneRadioGroup( modifier = modifier.fillMaxWidth(), text = if (selectedButton[index]) selectedOptions[index] else option, onButtonClick = { - selectedIndex.intValue = option - selectedButton.indices.forEach { i -> selectedButton[i] = false } - selectedButton[index] = true - onButtonClick(Grade.entries[index].stringValue) + if (selectedButton[index]) { + selectedButton[index] = false + onButtonClick("") + } else { + selectedButton.indices.forEach { i -> selectedButton[i] = false } + selectedButton[index] = true + onButtonClick(Grade.entries[index].stringValue) + } }, cornerRadius = 15.dp, paddingVertical = 14.dp From 800e5a6a67d86cf6eb4e02df571ec3a1bebba5d4 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 14 Sep 2024 23:13:17 +0900 Subject: [PATCH 36/51] =?UTF-8?q?[FIX/#241]=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20=ED=95=84=ED=84=B0=EB=A7=81=20=EC=83=89=EC=83=81=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 --- .../core/designsystem/component/button/FilteringButton.kt | 2 +- .../java/com/terning/feature/onboarding/signup/SignUpRoute.kt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/button/FilteringButton.kt b/core/src/main/java/com/terning/core/designsystem/component/button/FilteringButton.kt index 5c673849a..6a59e6f51 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/button/FilteringButton.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/button/FilteringButton.kt @@ -70,7 +70,7 @@ fun FilteringButton( } val borderColor = when { !isSelected && !isPressed -> Grey150 - isPressed -> Grey200 + !isSelected && isPressed -> Grey200 else -> TerningMain } diff --git a/feature/src/main/java/com/terning/feature/onboarding/signup/SignUpRoute.kt b/feature/src/main/java/com/terning/feature/onboarding/signup/SignUpRoute.kt index ba7e5c715..6ca3c5906 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signup/SignUpRoute.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signup/SignUpRoute.kt @@ -1,5 +1,6 @@ package com.terning.feature.onboarding.signup +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer @@ -28,6 +29,7 @@ import com.terning.core.designsystem.component.textfield.NameTextField import com.terning.core.designsystem.theme.Grey500 import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.designsystem.theme.TerningTheme +import com.terning.core.designsystem.theme.White import com.terning.core.extension.addFocusCleaner import com.terning.core.extension.noRippleClickable import com.terning.core.extension.toast @@ -105,6 +107,7 @@ fun SignUpScreen( .fillMaxSize() .addFocusCleaner(focusManager) .padding(paddingValues) + .background(White) ) { Spacer(modifier = Modifier.height(56.dp)) Text( From af048378207422ba72024d9adc98c79c4272edd3 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 14 Sep 2024 23:16:38 +0900 Subject: [PATCH 37/51] =?UTF-8?q?[FIX/#241]=20=EB=91=90=20=EB=B2=88?= =?UTF-8?q?=EC=A7=B8=20=ED=95=84=ED=84=B0=EB=A7=81=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filtering/filteringtwo/FilteringTwoRoute.kt | 3 ++- .../filteringtwo/component/StatusTwoRadioGroup.kt | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt index 7673f3f9f..9df80fba0 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt @@ -64,7 +64,8 @@ fun FilteringTwoRoute( navigateUp = viewModel::navigateUp, onButtonClick = { workingPeriod -> viewModel.updateWorkingPeriod(workingPeriod) - viewModel.updateButton(true) + if (workingPeriod.isNotEmpty()) viewModel.updateButton(true) + else viewModel.updateButton(false) }, buttonState = state.isButtonValid, workingPeriod = state.workingPeriod, diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/component/StatusTwoRadioGroup.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/component/StatusTwoRadioGroup.kt index 72579da5e..7faac5a44 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/component/StatusTwoRadioGroup.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/component/StatusTwoRadioGroup.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.itemsIndexed import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -33,7 +32,6 @@ fun StatusTwoRadioGroup( R.string.filtering_status2_description3, ) - val selectedIndex = remember { mutableIntStateOf(options[0]) } val selectedButton = remember { mutableStateListOf(false, false, false) } LazyVerticalGrid( @@ -48,10 +46,14 @@ fun StatusTwoRadioGroup( modifier = modifier.fillMaxWidth(), text = if (selectedButton[index]) selectedOptions[index] else option, onButtonClick = { - selectedIndex.intValue = option - selectedButton.indices.forEach { i -> selectedButton[i] = false } - selectedButton[index] = true - onButtonClick(WorkingPeriod.entries[index].stringValue) + if (selectedButton[index]) { + selectedButton[index] = false + onButtonClick("") + } else { + selectedButton.indices.forEach { i -> selectedButton[i] = false } + selectedButton[index] = true + onButtonClick(WorkingPeriod.entries[index].stringValue) + } }, cornerRadius = 15.dp, paddingVertical = 24.dp From 404568d62288c63d2c74157ebc8dc658c4dc18ab Mon Sep 17 00:00:00 2001 From: arinming Date: Sat, 14 Sep 2024 23:20:35 +0900 Subject: [PATCH 38/51] =?UTF-8?q?[FIX/#239]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/data/dto/response/InternResponseDto.kt | 10 ++++++---- .../terning/data/mapper/intern/InternInfoMapper.kt | 5 +++-- .../com/terning/domain/entity/intern/InternInfo.kt | 5 +++-- .../java/com/terning/feature/intern/InternRoute.kt | 7 +++---- .../com/terning/feature/intern/InternViewModel.kt | 14 +++++++------- .../feature/intern/component/InternBottomBar.kt | 2 +- 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/data/src/main/java/com/terning/data/dto/response/InternResponseDto.kt b/data/src/main/java/com/terning/data/dto/response/InternResponseDto.kt index 542c29130..3be4e1979 100644 --- a/data/src/main/java/com/terning/data/dto/response/InternResponseDto.kt +++ b/data/src/main/java/com/terning/data/dto/response/InternResponseDto.kt @@ -13,8 +13,8 @@ data class InternResponseDto( val deadline: String, @SerialName("workingPeriod") val workingPeriod: String, - @SerialName("startDate") - val startDate: String, + @SerialName("startYearMonth") + val startYearMonth: String, @SerialName("scrapCount") val scrapCount: Int, @SerialName("viewCount") @@ -33,6 +33,8 @@ data class InternResponseDto( val detail: String, @SerialName("url") val url: String, - @SerialName("scrapId") - val scrapId: Long? = null, + @SerialName("isScrapped") + val isScrapped: Boolean, + @SerialName("color") + val color: String? = null, ) \ No newline at end of file diff --git a/data/src/main/java/com/terning/data/mapper/intern/InternInfoMapper.kt b/data/src/main/java/com/terning/data/mapper/intern/InternInfoMapper.kt index 7e3e8c1e0..9084268eb 100644 --- a/data/src/main/java/com/terning/data/mapper/intern/InternInfoMapper.kt +++ b/data/src/main/java/com/terning/data/mapper/intern/InternInfoMapper.kt @@ -9,7 +9,7 @@ fun InternResponseDto.toInternInfo(): InternInfo = title = title, deadline = deadline, workingPeriod = workingPeriod, - startDate = startDate, + startYearMonth = startYearMonth, scrapCount = scrapCount, viewCount = viewCount, company = company, @@ -19,5 +19,6 @@ fun InternResponseDto.toInternInfo(): InternInfo = jobType = jobType, detail = detail, url = url, - scrapId = scrapId + isScrapped = isScrapped, + color = color, ) \ No newline at end of file diff --git a/domain/src/main/java/com/terning/domain/entity/intern/InternInfo.kt b/domain/src/main/java/com/terning/domain/entity/intern/InternInfo.kt index 77e70f12c..382db6d52 100644 --- a/domain/src/main/java/com/terning/domain/entity/intern/InternInfo.kt +++ b/domain/src/main/java/com/terning/domain/entity/intern/InternInfo.kt @@ -5,7 +5,7 @@ data class InternInfo( val title: String, val deadline: String, val workingPeriod: String, - val startDate: String, + val startYearMonth: String, val scrapCount: Int, val viewCount: Int, val company: String, @@ -15,5 +15,6 @@ data class InternInfo( val jobType: String, val detail: String, val url: String, - val scrapId: Long? = null, + val isScrapped: Boolean, + val color: String? = null, ) \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index c7b14af24..a1f60ab7b 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -52,10 +52,9 @@ fun InternRoute( viewModel: InternViewModel = hiltViewModel(), navController: NavHostController, ) { - val internState by viewModel.internUiState.collectAsStateWithLifecycle() - val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current + val internState by viewModel.internUiState.collectAsStateWithLifecycle(lifecycleOwner) LaunchedEffect(key1 = true) { viewModel.getInternInfo(announcementId) @@ -124,7 +123,7 @@ fun InternScreen( val internInfoList = listOf( stringResource(id = R.string.intern_info_d_day) to internInfo.deadline, stringResource(id = R.string.intern_info_working) to internInfo.workingPeriod, - stringResource(id = R.string.intern_info_start_date) to internInfo.startDate, + stringResource(id = R.string.intern_info_start_date) to internInfo.startYearMonth, ) val qualificationList = listOf( @@ -286,7 +285,7 @@ fun InternScreen( title = internInfo.title, scrapColor = CalRed, deadline = internInfo.deadline, - startYearMonth = internInfo.startDate, + startYearMonth = internInfo.startYearMonth, workingPeriod = internInfo.workingPeriod, internshipAnnouncementId = announcementId, companyImage = internInfo.companyImage, diff --git a/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt b/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt index 9eb0546e4..e1f955247 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternViewModel.kt @@ -31,14 +31,14 @@ class InternViewModel @Inject constructor( viewModelScope.launch { internRepository.getInternInfo(id) .onSuccess { internInfoModel -> - _internUiState.update { currentState -> - currentState.copy( - loadState = UiState.Success(internInfoModel), - isScrappedState = internInfoModel.scrapId != null, - ) - } + _internUiState.value = _internUiState.value.copy( + loadState = UiState.Success(internInfoModel) + ) } - .onFailure { + .onFailure { exception: Throwable -> + _internUiState.value = _internUiState.value.copy( + loadState = UiState.Failure(exception.toString()) + ) _sideEffect.emit(InternViewSideEffect.Toast(R.string.server_failure)) } } diff --git a/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt b/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt index 7e7922f14..08cae178a 100644 --- a/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt +++ b/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt @@ -76,7 +76,7 @@ fun InternBottomBar( .noRippleClickable { onScrapClick(internInfo) }, - tint = if (internInfo.scrapId != null) TerningMain else Grey350 + tint = if (internInfo.isScrapped) TerningMain else Grey350 ) Text( text = stringResource( From 3f9b34116234d5a9b7901b5ad0149909b84d4245 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 14 Sep 2024 23:20:55 +0900 Subject: [PATCH 39/51] =?UTF-8?q?[FIX/#241]=20=ED=95=84=ED=84=B0=EB=A7=81?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/filtering/filteringone/FilteringOneRoute.kt | 7 ++++--- .../feature/filtering/filteringtwo/FilteringTwoRoute.kt | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt index 4d25c06ab..5a685d46c 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt @@ -58,9 +58,10 @@ fun FilteringOneRoute( FilteringOneScreen( name = name, onButtonClick = { grade -> - viewModel.updateGrade(grade) - if (grade.isNotEmpty()) viewModel.updateButton(true) - else viewModel.updateButton(false) + if (grade.isNotEmpty()) { + viewModel.updateGrade(grade) + viewModel.updateButton(true) + } else viewModel.updateButton(false) }, onNextClick = viewModel::navigateToFilteringTwo, navigateUp = viewModel::navigateUp, diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt index 9df80fba0..aefc06ca2 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt @@ -63,9 +63,10 @@ fun FilteringTwoRoute( onNextClick = viewModel::navigateToFilteringThree, navigateUp = viewModel::navigateUp, onButtonClick = { workingPeriod -> - viewModel.updateWorkingPeriod(workingPeriod) - if (workingPeriod.isNotEmpty()) viewModel.updateButton(true) - else viewModel.updateButton(false) + if (workingPeriod.isNotEmpty()) { + viewModel.updateWorkingPeriod(workingPeriod) + viewModel.updateButton(true) + } else viewModel.updateButton(false) }, buttonState = state.isButtonValid, workingPeriod = state.workingPeriod, From e1ef6bd846634c649dda12ec72087bb5b104e8b4 Mon Sep 17 00:00:00 2001 From: arinming Date: Sat, 14 Sep 2024 23:26:39 +0900 Subject: [PATCH 40/51] =?UTF-8?q?[FIX/#239]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/intern/InternRoute.kt | 19 +++++++------------ .../intern/component/InternBottomBar.kt | 3 +-- .../feature/intern/model/InternUiState.kt | 1 - 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index a1f60ab7b..d6c9270b3 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -95,11 +95,7 @@ fun InternRoute( viewModel.updateScrapCancelDialogVisibility(true) }, onClickScrapButton = { - with(viewModel) { - if (internState.isScrappedState) - updateScrapCancelDialogVisibility(true) - else updateInternDialogVisibility(true) - } + viewModel.updateInternDialogVisibility(true) } ) } @@ -263,24 +259,23 @@ fun InternScreen( InternBottomBar( modifier = Modifier, internInfo = internInfo, - internUiState = internUiState, onScrapClick = { - if (!internUiState.isScrappedState) { - onClickScrapButton(internInfo) - } else { + if (internInfo.isScrapped) { onClickCancelButton(internInfo) + } else { + onClickScrapButton(internInfo) } }, ) - if (internUiState.scrapCancelDialogVisibility && internUiState.isScrappedState) { + if (internUiState.scrapCancelDialogVisibility) { ScrapCancelDialog( internshipAnnouncementId = announcementId, onDismissRequest = onDismissCancelDialog ) } - if (internUiState.internDialogVisibility && !internUiState.isScrappedState) { + if (internUiState.internDialogVisibility) { ScrapDialog( title = internInfo.title, scrapColor = CalRed, @@ -289,7 +284,7 @@ fun InternScreen( workingPeriod = internInfo.workingPeriod, internshipAnnouncementId = announcementId, companyImage = internInfo.companyImage, - isScrapped = false, + isScrapped = internInfo.isScrapped, onDismissRequest = onDismissScrapDialog, onClickChangeColor = { }, onClickNavigateButton = { } diff --git a/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt b/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt index 08cae178a..bf5b2f1bf 100644 --- a/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt +++ b/feature/src/main/java/com/terning/feature/intern/component/InternBottomBar.kt @@ -33,7 +33,6 @@ import com.terning.feature.intern.model.InternUiState fun InternBottomBar( modifier: Modifier, internInfo: InternInfo, - internUiState: InternUiState, onScrapClick: (InternInfo) -> Unit, viewModel: InternViewModel = hiltViewModel(), ) { @@ -64,7 +63,7 @@ fun InternBottomBar( ) { Icon( painter = painterResource( - id = if (internUiState.isScrappedState) { + id = if (internInfo.isScrapped) { R.drawable.ic_scrap_true_24 } else { R.drawable.ic_scrap_false_24 diff --git a/feature/src/main/java/com/terning/feature/intern/model/InternUiState.kt b/feature/src/main/java/com/terning/feature/intern/model/InternUiState.kt index 3906b2e4b..0adb2c489 100644 --- a/feature/src/main/java/com/terning/feature/intern/model/InternUiState.kt +++ b/feature/src/main/java/com/terning/feature/intern/model/InternUiState.kt @@ -13,6 +13,5 @@ data class InternUiState( val internDialogVisibility: Boolean = false, val isScrappedState: Boolean = false, val showWeb: Boolean = false, - val scrapId: Long? = null, val internshipModel: InternInfo? = null, ) \ No newline at end of file From 463b62333ae5a8f79887039b722feb7258938cad Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 14 Sep 2024 23:27:24 +0900 Subject: [PATCH 41/51] =?UTF-8?q?[FIX/#241]=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/feature/mypage/profileedit/ProfileEditViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt index 82c78e623..a9a527f94 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt @@ -54,12 +54,11 @@ class ProfileEditViewModel @Inject constructor( fun updateProfile(profile: String) { val isSameAsInitial = profile == _state.value.initialProfile - val isSameAsPrevious = profile == _state.value.profile _state.value = _state.value.copy( profile = profile, initialView = !_state.value.isModified && isSameAsInitial, - isModified = if (isSameAsPrevious) _state.value.isModified else !isSameAsInitial, + isModified = if (profile == _state.value.profile) _state.value.isModified else !isSameAsInitial, isProfileChangedButNameSame = if (_state.value.isNameChangedOnce) false else state.value.name == _state.value.initialName ) From fe068772aa4f5f55337c9c6df1eeb0e48e912c2e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 15 Sep 2024 00:45:54 +0900 Subject: [PATCH 42/51] =?UTF-8?q?[FIX/#241]=20=EC=8A=A4=ED=83=9D=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/feature/main/MainScreen.kt | 6 +++++- .../signin/navigation/SignInNavigation.kt | 15 +++++++++++++-- .../signup/navigation/SignUpNavigation.kt | 17 +++++++++++++++-- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/src/main/java/com/terning/feature/main/MainScreen.kt index ce270cd8e..6b40b486a 100644 --- a/feature/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/src/main/java/com/terning/feature/main/MainScreen.kt @@ -10,7 +10,9 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.slideIn import androidx.compose.animation.slideOut 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.material3.Icon import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem @@ -30,6 +32,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.compose.NavHost import com.terning.core.designsystem.component.snackbar.TerningBasicSnackBar @@ -86,9 +89,10 @@ fun MainScreen( TerningBasicSnackBar { Text( text = snackBarData.visuals.message, - color = White, + color = White ) } + Spacer(modifier = Modifier.height(50.dp)) } }, bottomBar = { diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt index 49f367ab3..d2d359875 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt @@ -6,6 +6,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import androidx.navigation.navOptions import com.terning.core.navigation.Route import com.terning.feature.home.home.navigation.navigateHome import com.terning.feature.onboarding.signin.SignInRoute @@ -24,10 +25,20 @@ fun NavGraphBuilder.signInNavGraph( navHostController: NavHostController, ) { composable { + val navOptions = navOptions { + popUpTo(SignIn) { + inclusive = true + } + launchSingleTop = true + } SignInRoute( paddingValues = paddingValues, - navigateToHome = { navHostController.navigateHome() }, - navigateToSignUp = { authId -> navHostController.navigateSignUp(authId) } + navigateToHome = { + navHostController.navigateHome(navOptions = navOptions) + }, + navigateToSignUp = { authId -> + navHostController.navigateSignUp(authId = authId, navOptions = navOptions) + } ) } } diff --git a/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt index 07a1c7fa2..6bb6bbf07 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt @@ -6,6 +6,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import androidx.navigation.navOptions import androidx.navigation.toRoute import com.terning.core.navigation.Route import com.terning.feature.filtering.startfiltering.navigation.navigateStartFiltering @@ -28,11 +29,23 @@ fun NavGraphBuilder.signUpNavGraph( ) { composable { val args = it.toRoute() + val navOptions = navOptions { + navHostController.currentDestination?.route?.let { it1 -> + popUpTo(it1) { + inclusive = true + } + } + launchSingleTop = true + } SignUpRoute( paddingValues = paddingValues, authId = args.authId, - navigateToStartFiltering = { name -> navHostController.navigateStartFiltering(name) } - + navigateToStartFiltering = { name -> + navHostController.navigateStartFiltering( + name = name, + navOptions = navOptions + ) + } ) } } From 2b3c438fa8a1e54a05c75d014865786b9ad592e4 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 15 Sep 2024 00:57:35 +0900 Subject: [PATCH 43/51] =?UTF-8?q?[FIX/#241]=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/terning/feature/main/MainScreen.kt | 9 +++++---- .../onboarding/signup/navigation/SignUpNavigation.kt | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/src/main/java/com/terning/feature/main/MainScreen.kt index 6b40b486a..fb4ce235f 100644 --- a/feature/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/src/main/java/com/terning/feature/main/MainScreen.kt @@ -10,9 +10,8 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.slideIn import androidx.compose.animation.slideOut 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.padding import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem @@ -85,14 +84,16 @@ fun MainScreen( Scaffold( snackbarHost = { - SnackbarHost(hostState = snackBarHostState) { snackBarData -> + SnackbarHost( + hostState = snackBarHostState, + modifier = Modifier.padding(bottom = 10.dp) + ) { snackBarData -> TerningBasicSnackBar { Text( text = snackBarData.visuals.message, color = White ) } - Spacer(modifier = Modifier.height(50.dp)) } }, bottomBar = { diff --git a/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt index 6bb6bbf07..c12589569 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt @@ -30,8 +30,8 @@ fun NavGraphBuilder.signUpNavGraph( composable { val args = it.toRoute() val navOptions = navOptions { - navHostController.currentDestination?.route?.let { it1 -> - popUpTo(it1) { + navHostController.currentDestination?.route?.let { currentRoute -> + popUpTo(currentRoute) { inclusive = true } } From 673d92b4dc6d34c32f9467507d6d68e62e9c4a9b Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 15 Sep 2024 01:41:41 +0900 Subject: [PATCH 44/51] =?UTF-8?q?[FIX/#241]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20paddingValues=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filteringone/FilteringOneRoute.kt | 9 ++--- .../navigation/FilteringOneNavigation.kt | 3 -- .../filteringthree/FilteringThreeRoute.kt | 9 ++--- .../navigation/FilteringThreeNavigation.kt | 3 -- .../filteringtwo/FilteringTwoRoute.kt | 9 ++--- .../navigation/FilteringTwoNavigation.kt | 3 -- .../startfiltering/StartFilteringRoute.kt | 11 ++--- .../navigation/StartFilteringNavigation.kt | 3 -- .../filtering/starthome/StartHomeRoute.kt | 9 ++--- .../navigation/StartHomeNavigation.kt | 3 -- .../com/terning/feature/main/MainScreen.kt | 40 ++++--------------- .../feature/onboarding/signin/SignInRoute.kt | 9 ++--- .../signin/navigation/SignInNavigation.kt | 3 -- .../feature/onboarding/signup/SignUpRoute.kt | 9 ++--- .../signup/navigation/SignUpNavigation.kt | 3 -- .../feature/onboarding/splash/SplashRoute.kt | 11 +++-- .../splash/navigation/SplashNavigation.kt | 3 -- 17 files changed, 41 insertions(+), 99 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt index 5a685d46c..f4c8df0eb 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt @@ -3,10 +3,11 @@ package com.terning.feature.filtering.filteringone import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -34,7 +35,6 @@ fun FilteringOneRoute( name: String, onNextClick: (String) -> Unit, navigateUp: () -> Unit, - paddingValues: PaddingValues, viewModel: FilteringOneViewModel = hiltViewModel(), ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -67,7 +67,6 @@ fun FilteringOneRoute( navigateUp = viewModel::navigateUp, buttonState = state.isButtonValid, gradeState = state.grade, - paddingValues = paddingValues ) } @@ -79,11 +78,11 @@ fun FilteringOneScreen( onButtonClick: (String) -> Unit, buttonState: Boolean, gradeState: String, - paddingValues: PaddingValues = PaddingValues(), ) { Column( modifier = Modifier - .padding(paddingValues) + .statusBarsPadding() + .navigationBarsPadding() .background(White) ) { BackButtonTopAppBar( diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/navigation/FilteringOneNavigation.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/navigation/FilteringOneNavigation.kt index d771d018f..dd84da037 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/navigation/FilteringOneNavigation.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/navigation/FilteringOneNavigation.kt @@ -1,6 +1,5 @@ package com.terning.feature.filtering.filtering.navigation -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -22,13 +21,11 @@ fun NavController.navigateFilteringOne( } fun NavGraphBuilder.filteringOneNavGraph( - paddingValues: PaddingValues, navHostController: NavHostController ) { composable { val args = it.toRoute() FilteringOneRoute( - paddingValues = paddingValues, name = args.name, onNextClick = navHostController::navigateFilteringTwo, navigateUp = navHostController::navigateUp diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringthree/FilteringThreeRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringthree/FilteringThreeRoute.kt index 59a24ebd6..186610ddb 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringthree/FilteringThreeRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringthree/FilteringThreeRoute.kt @@ -3,11 +3,12 @@ package com.terning.feature.filtering.filteringthree import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -41,7 +42,6 @@ fun FilteringThreeRoute( workingPeriod: String, navigateUp: () -> Unit, navigateToStartHome: () -> Unit, - paddingValues: PaddingValues, viewModel: FilteringThreeViewModel = hiltViewModel(), ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -75,7 +75,6 @@ fun FilteringThreeRoute( } FilteringThreeScreen( - paddingValues = paddingValues, navigateUp = viewModel::navigateUp, chosenYear = Calendar.getInstance().currentYear, chosenMonth = Calendar.getInstance().currentMonth, @@ -93,11 +92,11 @@ fun FilteringThreeScreen( onYearChosen: (Int) -> Unit, onMonthChosen: (Int) -> Unit, onNextClick: () -> Unit, - paddingValues: PaddingValues = PaddingValues(), ) { Column( modifier = Modifier - .padding(paddingValues) + .statusBarsPadding() + .navigationBarsPadding() .background(White), ) { BackButtonTopAppBar( diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringthree/navigation/FilteringThreeNavigation.kt b/feature/src/main/java/com/terning/feature/filtering/filteringthree/navigation/FilteringThreeNavigation.kt index d1213c9bd..24d255630 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringthree/navigation/FilteringThreeNavigation.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringthree/navigation/FilteringThreeNavigation.kt @@ -1,6 +1,5 @@ package com.terning.feature.filtering.filteringthree.navigation -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -24,13 +23,11 @@ fun NavController.navigateFilteringThree( } fun NavGraphBuilder.filteringThreeNavGraph( - paddingValues: PaddingValues, navHostController: NavHostController ) { composable { val args = it.toRoute() FilteringThreeRoute( - paddingValues = paddingValues, grade = args.grade, workingPeriod = args.workingPeriod, navigateUp = navHostController::navigateUp, diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt index aefc06ca2..53f72278e 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt @@ -3,10 +3,11 @@ package com.terning.feature.filtering.filteringtwo import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -34,7 +35,6 @@ fun FilteringTwoRoute( grade: String, onNextClick: (String, String) -> Unit, navigateUp: () -> Unit, - paddingValues: PaddingValues, viewModel: FilteringTwoViewModel = hiltViewModel(), ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -70,7 +70,6 @@ fun FilteringTwoRoute( }, buttonState = state.isButtonValid, workingPeriod = state.workingPeriod, - paddingValues = paddingValues ) } @@ -82,12 +81,12 @@ fun FilteringTwoScreen( onButtonClick: (String) -> Unit, buttonState: Boolean, workingPeriod: String, - paddingValues: PaddingValues = PaddingValues(), ) { Column( modifier = Modifier - .padding(paddingValues) .background(White) + .statusBarsPadding() + .navigationBarsPadding() ) { BackButtonTopAppBar( onBackButtonClick = navigateUp diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/navigation/FilteringTwoNavigation.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/navigation/FilteringTwoNavigation.kt index 205233c12..8f72ac7a9 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/navigation/FilteringTwoNavigation.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/navigation/FilteringTwoNavigation.kt @@ -1,6 +1,5 @@ package com.terning.feature.filtering.filtering.navigation -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -23,13 +22,11 @@ fun NavController.navigateFilteringTwo( } fun NavGraphBuilder.filteringTwoNavGraph( - paddingValues: PaddingValues, navHostController: NavHostController ) { composable { val args = it.toRoute() FilteringTwoRoute( - paddingValues = paddingValues, grade = args.grade, onNextClick = { _, workingPeriod -> navHostController.navigateFilteringThree( diff --git a/feature/src/main/java/com/terning/feature/filtering/startfiltering/StartFilteringRoute.kt b/feature/src/main/java/com/terning/feature/filtering/startfiltering/StartFilteringRoute.kt index 47c47b9fc..9c3d8c975 100644 --- a/feature/src/main/java/com/terning/feature/filtering/startfiltering/StartFilteringRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/startfiltering/StartFilteringRoute.kt @@ -2,16 +2,16 @@ package com.terning.feature.filtering.startfiltering import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -19,7 +19,6 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -37,7 +36,6 @@ import kotlinx.coroutines.delay @Composable fun StartFilteringRoute( - paddingValues: PaddingValues = PaddingValues(), onNextClick: () -> Unit, viewModel: StartFilteringViewModel = hiltViewModel() ) { @@ -55,7 +53,6 @@ fun StartFilteringRoute( onNextClick = onNextClick, buttonState = state.isButtonVisible, screenHeight = screenHeight, - paddingValues = paddingValues ) } @@ -65,12 +62,12 @@ fun StartFilteringScreen( onNextClick: () -> Unit, buttonState: Boolean, screenHeight: Float, - paddingValues: PaddingValues = PaddingValues() ) { Box( modifier = Modifier .fillMaxSize() - .padding(paddingValues) + .statusBarsPadding() + .navigationBarsPadding() .background(White) ) { Column( diff --git a/feature/src/main/java/com/terning/feature/filtering/startfiltering/navigation/StartFilteringNavigation.kt b/feature/src/main/java/com/terning/feature/filtering/startfiltering/navigation/StartFilteringNavigation.kt index 38abe0cc2..f217cf39e 100644 --- a/feature/src/main/java/com/terning/feature/filtering/startfiltering/navigation/StartFilteringNavigation.kt +++ b/feature/src/main/java/com/terning/feature/filtering/startfiltering/navigation/StartFilteringNavigation.kt @@ -1,6 +1,5 @@ package com.terning.feature.filtering.startfiltering.navigation -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -23,13 +22,11 @@ fun NavController.navigateStartFiltering( } fun NavGraphBuilder.startFilteringNavGraph( - paddingValues: PaddingValues, navHostController: NavHostController ) { composable { val args = it.toRoute() StartFilteringRoute( - paddingValues = paddingValues, onNextClick = { navHostController.navigateFilteringOne(args.name) } diff --git a/feature/src/main/java/com/terning/feature/filtering/starthome/StartHomeRoute.kt b/feature/src/main/java/com/terning/feature/filtering/starthome/StartHomeRoute.kt index 246cbc8d9..69ec4e7e6 100644 --- a/feature/src/main/java/com/terning/feature/filtering/starthome/StartHomeRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/starthome/StartHomeRoute.kt @@ -5,13 +5,14 @@ import androidx.compose.animation.fadeIn import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -39,7 +40,6 @@ import kotlinx.coroutines.delay @Composable fun StartHomeRoute( navigateToHome: () -> Unit, - paddingValues: PaddingValues = PaddingValues(), viewModel: StartHomeViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -56,7 +56,6 @@ fun StartHomeRoute( navigateToHome = navigateToHome, buttonState = state.isButtonVisible, screenHeight = screenHeight, - paddingValues = paddingValues ) } @@ -65,13 +64,13 @@ fun StartHomeScreen( navigateToHome: () -> Unit, buttonState: Boolean, screenHeight: Float, - paddingValues: PaddingValues = PaddingValues() ) { Box( modifier = Modifier .fillMaxSize() - .padding(paddingValues) .background(White) + .statusBarsPadding() + .navigationBarsPadding() ) { Column( modifier = Modifier.fillMaxSize(), diff --git a/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt b/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt index bc63ae44c..5efeb8a3e 100644 --- a/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt +++ b/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt @@ -1,6 +1,5 @@ package com.terning.feature.filtering.starthome.navigation -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -20,12 +19,10 @@ fun NavController.navigateStartHome(navOptions: NavOptions? = null) { } fun NavGraphBuilder.startHomeNavGraph( - paddingValues: PaddingValues, navHostController: NavHostController ) { composable { StartHomeRoute( - paddingValues = paddingValues, navigateToHome = { navHostController.navigateHome( navOptions = NavOptions.Builder().setPopUpTo( diff --git a/feature/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/src/main/java/com/terning/feature/main/MainScreen.kt index fb4ce235f..f424df75b 100644 --- a/feature/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/src/main/java/com/terning/feature/main/MainScreen.kt @@ -124,10 +124,7 @@ fun MainScreen( navController = navigator.navController, startDestination = navigator.startDestination ) { - splashNavGraph( - paddingValues = paddingValues, - navHostController = navigator.navController - ) + splashNavGraph(navHostController = navigator.navController) homeNavGraph( paddingValues = paddingValues, navHostController = navigator.navController @@ -140,34 +137,13 @@ fun MainScreen( paddingValues = paddingValues, navHostController = navigator.navController ) - signInNavGraph( - paddingValues = paddingValues, - navHostController = navigator.navController - ) - signUpNavGraph( - paddingValues = paddingValues, - navHostController = navigator.navController - ) - startFilteringNavGraph( - paddingValues = paddingValues, - navHostController = navigator.navController - ) - startHomeNavGraph( - paddingValues = paddingValues, - navHostController = navigator.navController - ) - filteringOneNavGraph( - paddingValues = paddingValues, - navHostController = navigator.navController - ) - filteringTwoNavGraph( - paddingValues = paddingValues, - navHostController = navigator.navController - ) - filteringThreeNavGraph( - paddingValues = paddingValues, - navHostController = navigator.navController - ) + signInNavGraph(navHostController = navigator.navController) + signUpNavGraph(navHostController = navigator.navController) + startFilteringNavGraph(navHostController = navigator.navController) + startHomeNavGraph(navHostController = navigator.navController) + filteringOneNavGraph(navHostController = navigator.navController) + filteringTwoNavGraph(navHostController = navigator.navController) + filteringThreeNavGraph(navHostController = navigator.navController) searchProcessNavGraph( paddingValues = paddingValues, navHostController = navigator.navController diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInRoute.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInRoute.kt index 9b946f9f5..875070c41 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/SignInRoute.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/SignInRoute.kt @@ -3,11 +3,12 @@ package com.terning.feature.onboarding.signin import android.content.Context import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.SideEffect @@ -32,7 +33,6 @@ import com.terning.feature.onboarding.signin.component.KakaoButton @Composable fun SignInRoute( - paddingValues: PaddingValues, navigateToHome: () -> Unit, navigateToSignUp: (String) -> Unit, viewModel: SignInViewModel = hiltViewModel(), @@ -81,7 +81,6 @@ fun SignInRoute( } SignInScreen( - paddingValues = paddingValues, onSignInClick = { viewModel.startKakaoLogIn( isKakaoAvailable = UserApiClient.instance.isKakaoTalkLoginAvailable( @@ -95,13 +94,13 @@ fun SignInRoute( @Composable fun SignInScreen( onSignInClick: () -> Unit, - paddingValues: PaddingValues = PaddingValues(), ) { Column( modifier = Modifier .fillMaxSize() .background(color = White) - .padding(paddingValues) + .statusBarsPadding() + .navigationBarsPadding() .padding(horizontal = 20.dp), horizontalAlignment = Alignment.CenterHorizontally ) { diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt index d2d359875..76aa9fdfd 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt @@ -1,6 +1,5 @@ package com.terning.feature.onboarding.signin.navigation -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -21,7 +20,6 @@ fun NavController.navigateSignIn(navOptions: NavOptions? = null) { } fun NavGraphBuilder.signInNavGraph( - paddingValues: PaddingValues, navHostController: NavHostController, ) { composable { @@ -32,7 +30,6 @@ fun NavGraphBuilder.signInNavGraph( launchSingleTop = true } SignInRoute( - paddingValues = paddingValues, navigateToHome = { navHostController.navigateHome(navOptions = navOptions) }, diff --git a/feature/src/main/java/com/terning/feature/onboarding/signup/SignUpRoute.kt b/feature/src/main/java/com/terning/feature/onboarding/signup/SignUpRoute.kt index 6ca3c5906..c00b5cb96 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signup/SignUpRoute.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signup/SignUpRoute.kt @@ -2,11 +2,12 @@ package com.terning.feature.onboarding.signup import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -37,7 +38,6 @@ import com.terning.feature.R @Composable fun SignUpRoute( - paddingValues: PaddingValues, authId: String, navigateToStartFiltering: (String) -> Unit, viewModel: SignUpViewModel = hiltViewModel(), @@ -74,7 +74,6 @@ fun SignUpRoute( } SignUpScreen( - paddingValues = paddingValues, state = state, onSignUpClick = { viewModel.postSignUpWithServer() @@ -98,7 +97,6 @@ fun SignUpScreen( onInputChange: (String) -> Unit, onProfileEditClick: (Boolean) -> Unit, onValidationChanged: (Boolean) -> Unit, - paddingValues: PaddingValues = PaddingValues(), ) { val focusManager = LocalFocusManager.current @@ -106,7 +104,8 @@ fun SignUpScreen( modifier = Modifier .fillMaxSize() .addFocusCleaner(focusManager) - .padding(paddingValues) + .statusBarsPadding() + .navigationBarsPadding() .background(White) ) { Spacer(modifier = Modifier.height(56.dp)) diff --git a/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt index c12589569..a40fb882b 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt @@ -1,6 +1,5 @@ package com.terning.feature.onboarding.signup.navigation -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -24,7 +23,6 @@ fun NavController.navigateSignUp( } fun NavGraphBuilder.signUpNavGraph( - paddingValues: PaddingValues, navHostController: NavHostController ) { composable { @@ -38,7 +36,6 @@ fun NavGraphBuilder.signUpNavGraph( launchSingleTop = true } SignUpRoute( - paddingValues = paddingValues, authId = args.authId, navigateToStartFiltering = { name -> navHostController.navigateStartFiltering( diff --git a/feature/src/main/java/com/terning/feature/onboarding/splash/SplashRoute.kt b/feature/src/main/java/com/terning/feature/onboarding/splash/SplashRoute.kt index ba79374e2..6026f6787 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/splash/SplashRoute.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/splash/SplashRoute.kt @@ -3,9 +3,9 @@ package com.terning.feature.onboarding.splash import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.SideEffect @@ -22,7 +22,6 @@ import com.terning.feature.R @Composable fun SplashRoute( - paddingValues: PaddingValues, navigateToHome: () -> Unit, navigateToSignIn: () -> Unit, viewModel: SplashViewModel = hiltViewModel(), @@ -56,16 +55,16 @@ fun SplashRoute( } } - SplashScreen(paddingValues = paddingValues) + SplashScreen() } @Composable fun SplashScreen( - paddingValues: PaddingValues = PaddingValues(), ) { Column( modifier = Modifier - .padding(paddingValues) + .statusBarsPadding() + .navigationBarsPadding() .fillMaxSize() .background(TerningMain), ) { diff --git a/feature/src/main/java/com/terning/feature/onboarding/splash/navigation/SplashNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/splash/navigation/SplashNavigation.kt index 37dfeca9c..61dc771e7 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/splash/navigation/SplashNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/splash/navigation/SplashNavigation.kt @@ -1,6 +1,5 @@ package com.terning.feature.onboarding.splash.navigation -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -20,12 +19,10 @@ fun NavController.navigateSplash(navOptions: NavOptions? = null) { } fun NavGraphBuilder.splashNavGraph( - paddingValues: PaddingValues, navHostController: NavHostController, ) { composable { SplashRoute( - paddingValues = paddingValues, navigateToHome = { navHostController.navigateHome( navOptions = NavOptions.Builder().setPopUpTo( From 8e73a9c6b2625d318102eda9f76876dd9e2b57d0 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 15 Sep 2024 02:14:04 +0900 Subject: [PATCH 45/51] =?UTF-8?q?[FIX/#241]=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20->=20=ED=99=88=20=EC=8A=A4=ED=83=9D=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starthome/navigation/StartHomeNavigation.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt b/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt index 5efeb8a3e..ca1c71795 100644 --- a/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt +++ b/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt @@ -5,10 +5,10 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import androidx.navigation.navOptions import com.terning.core.navigation.Route import com.terning.feature.filtering.starthome.StartHomeRoute import com.terning.feature.home.home.navigation.navigateHome -import com.terning.feature.onboarding.signin.navigation.SignIn import kotlinx.serialization.Serializable fun NavController.navigateStartHome(navOptions: NavOptions? = null) { @@ -22,13 +22,15 @@ fun NavGraphBuilder.startHomeNavGraph( navHostController: NavHostController ) { composable { + val navOptions = navOptions { + popUpTo(id = navHostController.graph.id) { + inclusive = true + } + } StartHomeRoute( navigateToHome = { navHostController.navigateHome( - navOptions = NavOptions.Builder().setPopUpTo( - route = SignIn, - inclusive = true - ).build() + navOptions = navOptions ) } ) From b0e5ed51e04ce7c79401b33eea77cdd87936c441 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 15 Sep 2024 02:17:43 +0900 Subject: [PATCH 46/51] =?UTF-8?q?[FIX/#241]=20=EC=8A=A4=ED=83=9D=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/signin/navigation/SignInNavigation.kt | 3 +-- .../onboarding/signup/navigation/SignUpNavigation.kt | 7 ++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt index 76aa9fdfd..1f9559611 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt @@ -24,10 +24,9 @@ fun NavGraphBuilder.signInNavGraph( ) { composable { val navOptions = navOptions { - popUpTo(SignIn) { + popUpTo(id = navHostController.graph.id) { inclusive = true } - launchSingleTop = true } SignInRoute( navigateToHome = { diff --git a/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt index a40fb882b..a85c99f4a 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signup/navigation/SignUpNavigation.kt @@ -28,12 +28,9 @@ fun NavGraphBuilder.signUpNavGraph( composable { val args = it.toRoute() val navOptions = navOptions { - navHostController.currentDestination?.route?.let { currentRoute -> - popUpTo(currentRoute) { - inclusive = true - } + popUpTo(id = navHostController.graph.id) { + inclusive = true } - launchSingleTop = true } SignUpRoute( authId = args.authId, From 2c77a005387e97971d268a2cf9168e54db5aa66e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 15 Sep 2024 03:03:06 +0900 Subject: [PATCH 47/51] =?UTF-8?q?[FIX/#241]=20initialView=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/feature/mypage/profileedit/ProfileEditViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt index a9a527f94..118230e2f 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt @@ -57,7 +57,7 @@ class ProfileEditViewModel @Inject constructor( _state.value = _state.value.copy( profile = profile, - initialView = !_state.value.isModified && isSameAsInitial, + initialView = false, isModified = if (profile == _state.value.profile) _state.value.isModified else !isSameAsInitial, isProfileChangedButNameSame = if (_state.value.isNameChangedOnce) false else state.value.name == _state.value.initialName From c948c10a46fd2f439e275969280f7bb03f44f61a Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 15 Sep 2024 03:06:31 +0900 Subject: [PATCH 48/51] =?UTF-8?q?[FIX/#241]=20copy=20->=20update=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filtering/filteringone/FilteringOneViewModel.kt | 9 ++++++--- .../filtering/filteringtwo/FilteringTwoViewModel.kt | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneViewModel.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneViewModel.kt index 09f190c93..90f07f3c2 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneViewModel.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class FilteringOneViewModel : ViewModel() { @@ -19,9 +20,11 @@ class FilteringOneViewModel : ViewModel() { val sideEffects: SharedFlow get() = _sideEffects.asSharedFlow() fun updateButton(isButtonValid: Boolean) { - _state.value = _state.value.copy( - isButtonValid = isButtonValid - ) + _state.update { currentState -> + currentState.copy( + isButtonValid = isButtonValid + ) + } } fun updateGrade(grade: String) { diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoViewModel.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoViewModel.kt index 1958d6e1e..c4ed74cfe 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoViewModel.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class FilteringTwoViewModel : ViewModel() { @@ -19,9 +20,11 @@ class FilteringTwoViewModel : ViewModel() { val sideEffects: SharedFlow get() = _sideEffects.asSharedFlow() fun updateButton(isButtonValid: Boolean) { - _state.value = _state.value.copy( - isButtonValid = isButtonValid - ) + _state.update { currentState -> + currentState.copy( + isButtonValid = isButtonValid + ) + } } fun updateWorkingPeriod(workingPeriod: String) { From 180f9f3a7ba5fe0a999a60ea62f6238e9dc46953 Mon Sep 17 00:00:00 2001 From: arinming Date: Mon, 16 Sep 2024 03:10:34 +0900 Subject: [PATCH 49/51] =?UTF-8?q?[FIX/#239]=20=EC=9B=B9=EB=B7=B0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/intern/InternRoute.kt | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt index d6c9270b3..5dec1e4fc 100644 --- a/feature/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -1,7 +1,6 @@ package com.terning.feature.intern -import android.view.ViewGroup -import android.webkit.WebView +import androidx.browser.customtabs.CustomTabsIntent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -19,7 +18,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -114,6 +113,8 @@ fun InternScreen( onClickCancelButton: (InternInfo) -> Unit, onClickScrapButton: (InternInfo) -> Unit, ) { + val context = LocalContext.current + val decimal = DecimalFormat("#,###") val internInfoList = listOf( @@ -127,18 +128,10 @@ fun InternScreen( stringResource(id = R.string.intern_info_work) to internInfo.jobType, ) - if (internUiState.showWeb) { - AndroidView( - factory = { - WebView(it).apply { - layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, - ) - loadUrl(internInfo.url) - } - }, - ) + LaunchedEffect(internUiState.showWeb) { + if (internUiState.showWeb) { + CustomTabsIntent.Builder().build().launchUrl(context, internInfo.url.toUri()) + } } Column( From ad86cc9d7707fa5e02da8ef429e730854e666fae Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Mon, 16 Sep 2024 14:41:05 +0900 Subject: [PATCH 50/51] =?UTF-8?q?[FIX/#241]=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filtering/filteringone/FilteringOneRoute.kt | 10 ++++++---- .../filtering/filteringtwo/FilteringTwoRoute.kt | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt index f4c8df0eb..28438e817 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneRoute.kt @@ -58,10 +58,12 @@ fun FilteringOneRoute( FilteringOneScreen( name = name, onButtonClick = { grade -> - if (grade.isNotEmpty()) { - viewModel.updateGrade(grade) - viewModel.updateButton(true) - } else viewModel.updateButton(false) + with(viewModel) { + if (grade.isNotEmpty()) { + updateGrade(grade) + updateButton(true) + } else updateButton(false) + } }, onNextClick = viewModel::navigateToFilteringTwo, navigateUp = viewModel::navigateUp, diff --git a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt index 53f72278e..facee419f 100644 --- a/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt +++ b/feature/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoRoute.kt @@ -63,10 +63,12 @@ fun FilteringTwoRoute( onNextClick = viewModel::navigateToFilteringThree, navigateUp = viewModel::navigateUp, onButtonClick = { workingPeriod -> - if (workingPeriod.isNotEmpty()) { - viewModel.updateWorkingPeriod(workingPeriod) - viewModel.updateButton(true) - } else viewModel.updateButton(false) + with(viewModel) { + if (workingPeriod.isNotEmpty()) { + updateWorkingPeriod(workingPeriod) + updateButton(true) + } else updateButton(false) + } }, buttonState = state.isButtonValid, workingPeriod = state.workingPeriod, From 7889ab1ea6eeb820b2f9338c5fcb391cc80a385d Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Mon, 16 Sep 2024 15:12:25 +0900 Subject: [PATCH 51/51] =?UTF-8?q?[FIX/#241]=20=ED=85=8D=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/mypage/profileedit/ProfileEditViewModel.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt index 118230e2f..340677618 100644 --- a/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt +++ b/feature/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditViewModel.kt @@ -53,14 +53,14 @@ class ProfileEditViewModel @Inject constructor( } fun updateProfile(profile: String) { - val isSameAsInitial = profile == _state.value.initialProfile + val isProfileModified = profile != _state.value.initialProfile _state.value = _state.value.copy( profile = profile, - initialView = false, - isModified = if (profile == _state.value.profile) _state.value.isModified else !isSameAsInitial, + initialView = if (isProfileModified) false else _state.value.initialView, + isModified = if (isProfileModified) true else _state.value.isModified, isProfileChangedButNameSame = if (_state.value.isNameChangedOnce) false - else state.value.name == _state.value.initialName + else _state.value.name == _state.value.initialName ) }