From be7abcb866485f7ab57987107e892cd41502620d Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sun, 1 Sep 2024 14:14:36 +0900 Subject: [PATCH 01/26] =?UTF-8?q?[MOD/#212]=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=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/assets/terning_scrap_cancel.json | 1 + .../calendar/week/CalendarWeekScreen.kt | 38 +++++- .../dialog/cancel/ScrapCancelDialog.kt | 108 ++++++++++++++++++ .../dialog/cancel/ScrapCancelSideEffect.kt | 6 + .../dialog/cancel/ScrapCancelViewModel.kt | 32 ++++++ 5 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 feature/src/main/assets/terning_scrap_cancel.json create mode 100644 feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt create mode 100644 feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt create mode 100644 feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt diff --git a/feature/src/main/assets/terning_scrap_cancel.json b/feature/src/main/assets/terning_scrap_cancel.json new file mode 100644 index 000000000..2c5b45f06 --- /dev/null +++ b/feature/src/main/assets/terning_scrap_cancel.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.7","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":66.0000026882351,"w":2600,"h":2030,"nm":"aos_scrap_cancle","ddd":0,"assets":[{"id":"image_0","w":982,"h":773,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":979,"h":772,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_2","w":983,"h":398,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_3","w":982,"h":762,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_4","w":2031,"h":2031,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"before","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":8.00000032584668,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[1],"y":[0.4]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[32]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[44]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[44]},{"t":65.0000026475043,"s":[44]}],"ix":10},"p":{"a":0,"k":[837.874,846.891,0],"ix":2},"a":{"a":0,"k":[28.577,28.519,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":66.0000026882351,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"after","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.948]},"o":{"x":[1],"y":[0.4]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.978]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[50]},{"i":{"x":[0.863],"y":[1.022]},"o":{"x":[0.333],"y":[0]},"t":33,"s":[34]},{"i":{"x":[0.671],"y":[1]},"o":{"x":[0.457],"y":[0]},"t":43,"s":[44]},{"i":{"x":[0.833],"y":[0.5]},"o":{"x":[0.333],"y":[0]},"t":53,"s":[41]},{"i":{"x":[0.833],"y":[0.5]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[44]},{"t":65.0000026475043,"s":[44]}],"ix":10},"p":{"a":0,"k":[837.874,846.891,0],"ix":2},"a":{"a":0,"k":[28.577,28.519,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":66.0000026882351,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"basic","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1300.427,647.931,0],"ix":2},"a":{"a":0,"k":[491.422,198.705,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":66.0000026882351,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"back_cal","refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1301.426,1200.386,0],"ix":2},"a":{"a":0,"k":[490.883,380.927,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":66.0000026882351,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"background","refId":"image_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1300,1015.081,0],"ix":2},"a":{"a":0,"k":[1015.31,1015.31,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":66.0000026882351,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":1,"nm":"back","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1300,1015,0],"ix":2},"a":{"a":0,"k":[1300,1015,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sw":2600,"sh":2030,"sc":"#ffffff","ip":0,"op":66.0000026882351,"st":0,"bm":0}],"markers":[]} \ 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 44ee9d65c..ca919b3f8 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 @@ -12,10 +12,15 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.shadow +import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -110,12 +115,43 @@ private fun CalendarWeekScreen( navigateToAnnouncement: (Long) -> Unit, modifier: Modifier = Modifier ) { + var initialTouchPosition by remember { mutableStateOf(null) } + var hideComponent by remember { mutableStateOf(false) } + + LaunchedEffect(hideComponent) { + if(hideComponent) { + updateSelectedDate(selectedDate) + } + } + + val swipeModifier = Modifier.pointerInput(Unit) { + awaitPointerEventScope { + while (true) { + val event = awaitPointerEvent() + val position = event.changes.first().position + + if (event.changes.first().pressed) { + if (initialTouchPosition == null) { + initialTouchPosition = position + } else { + val deltaY = initialTouchPosition?.let { position.y - it.y } + if (deltaY != null && deltaY > 300f) { + hideComponent = true + } + } + } else { + initialTouchPosition = null + } + } + } + } + Column( modifier = modifier .background(Back) ) { Card( - modifier = Modifier + modifier = swipeModifier .shadow( shape = RoundedCornerShape(bottomStart = 20.dp, bottomEnd = 20.dp), elevation = 1.dp diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt new file mode 100644 index 000000000..5e88c2de8 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -0,0 +1,108 @@ +package com.terning.feature.dialog.cancel + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.flowWithLifecycle +import com.terning.core.R +import com.terning.core.designsystem.component.button.RoundButton +import com.terning.core.designsystem.component.dialog.TerningBasicDialog +import com.terning.core.designsystem.component.item.TerningLottieAnimation +import com.terning.core.designsystem.theme.Grey350 +import com.terning.core.designsystem.theme.Grey500 +import com.terning.core.designsystem.theme.TerningPointTheme +import com.terning.core.designsystem.theme.TerningTheme + +@Composable +fun ScrapCancelDialog( + scrapId: Long, + onDismissRequest: (Boolean) -> Unit, + viewModel: ScrapCancelViewModel = hiltViewModel() +) { + val lifecycleOwner = LocalLifecycleOwner.current + LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { + viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) + .collect{ sideEffect -> + when(sideEffect){ + is ScrapCancelSideEffect.DismissDialog -> { + onDismissRequest(true) + } + is ScrapCancelSideEffect.ShowToast -> {} + } + } + } + + + TerningBasicDialog( + onDismissRequest = { onDismissRequest(false) } + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(top = 50.dp), + contentAlignment = Alignment.TopCenter + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + TerningLottieAnimation( + jsonString = "terning_scrap_cancel.json", + modifier = Modifier + .fillMaxWidth() + .aspectRatio(1f) + ) + + Text( + text = stringResource(id = R.string.dialog_content_scrap_cancel_main_title), + textAlign = TextAlign.Center, + style = TerningTheme.typography.title4, + color = Grey500, + ) + Text( + text = stringResource(id = R.string.dialog_content_scrap_cancel_sub_title), + style = TerningTheme.typography.body5, + color = Grey350, + modifier = Modifier.padding( + top = 5.dp + ) + ) + RoundButton( + style = TerningTheme.typography.button3, + paddingVertical = 12.dp, + cornerRadius = 8.dp, + text = R.string.dialog_scrap_cancel_button, + onButtonClick = { viewModel.deleteScrap(scrapId) }, + modifier = Modifier.padding(bottom = 8.dp, top = 40.dp) + ) + } + } + } +} + + +@Preview(showBackground = true) +@Composable +private fun TerningBasicDialogPreview() { + TerningPointTheme { + ScrapCancelDialog( + scrapId = 1, + onDismissRequest = {} + ) + } +} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt new file mode 100644 index 000000000..c91071090 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt @@ -0,0 +1,6 @@ +package com.terning.feature.dialog.cancel + +sealed class ScrapCancelSideEffect{ + data class ShowToast(val message: Int): ScrapCancelSideEffect() + data object DismissDialog : ScrapCancelSideEffect() +} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt new file mode 100644 index 000000000..5d3c6db22 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt @@ -0,0 +1,32 @@ +package com.terning.feature.dialog.cancel + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.terning.domain.entity.CalendarScrapRequest +import com.terning.domain.repository.ScrapRepository +import com.terning.feature.R +import com.terning.feature.calendar.list.CalendarListSideEffect +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class ScrapCancelViewModel @Inject constructor( + private val scrapRepository: ScrapRepository +) : ViewModel() { + private var _sideEffect: MutableSharedFlow = MutableSharedFlow() + val sideEffect = _sideEffect.asSharedFlow() + + fun deleteScrap( + scrapId: Long + ) = viewModelScope.launch { + scrapRepository.deleteScrap(CalendarScrapRequest(scrapId, null)) + .onSuccess { + _sideEffect.emit(ScrapCancelSideEffect.DismissDialog) + }.onFailure { + _sideEffect.emit(ScrapCancelSideEffect.ShowToast(R.string.server_failure)) + } + } +} \ No newline at end of file From 7a0fa35217a41d125eba23ababe018bb400ee34b Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sun, 1 Sep 2024 14:54:07 +0900 Subject: [PATCH 02/26] =?UTF-8?q?[FEAT/#212]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EC=B7=A8=EC=86=8C=EC=99=80=20=EC=BA=98=EB=A6=B0=EB=8D=94=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/list/CalendarListScreen.kt | 36 ++++++++++--------- .../calendar/week/CalendarWeekScreen.kt | 29 ++++++++------- .../dialog/cancel/ScrapCancelDialog.kt | 8 +++++ 3 files changed, 45 insertions(+), 28 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 d5563b7ff..e7184ccaa 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 @@ -39,12 +39,12 @@ import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.domain.entity.CalendarScrapDetail import com.terning.feature.R -import com.terning.feature.calendar.calendar.component.CalendarCancelDialog import com.terning.feature.calendar.calendar.component.CalendarDetailDialog import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLocalDateByPage import com.terning.feature.calendar.list.component.CalendarScrapList import com.terning.feature.calendar.list.model.CalendarListUiState +import com.terning.feature.dialog.cancel.ScrapCancelDialog import kotlinx.coroutines.flow.distinctUntilChanged import java.time.LocalDate @@ -86,17 +86,23 @@ fun CalendarListRoute( uiState = uiState, modifier = modifier, navigateToAnnouncement = navigateToAnnouncement, - onDismissCancelDialog = { viewModel.updateScrapCancelDialogVisibility(false) }, + onDismissCancelDialog = { isCancelled -> + viewModel.updateScrapCancelDialogVisibility(false) + if (isCancelled) { viewModel.getScrapMonthList(uiState.currentDate) } + }, onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, onClickChangeColor = { newColor -> viewModel.patchScrap(newColor) }, - onClickScrapCancel = { uiState.scrapId?.let { viewModel.deleteScrap(it) } }, onClickScrapButton = { scrapId -> - viewModel.updateScrapId(scrapId) - viewModel.updateScrapCancelDialogVisibility(true) + with(viewModel){ + updateScrapId(scrapId) + updateScrapCancelDialogVisibility(true) + } }, onClickInternship = { calendarScrapDetail -> - viewModel.updateInternshipModel(calendarScrapDetail) - viewModel.updateInternDialogVisibility(true) + with(viewModel) { + updateInternshipModel(calendarScrapDetail) + updateInternDialogVisibility(true) + } } ) } @@ -107,10 +113,9 @@ private fun CalendarListScreen( listState: LazyListState, uiState: CalendarListUiState, navigateToAnnouncement: (Long) -> Unit, - onDismissCancelDialog: () -> Unit, + onDismissCancelDialog: (Boolean) -> Unit, onDismissInternDialog: () -> Unit, onClickChangeColor: (Color) -> Unit, - onClickScrapCancel: () -> Unit, onClickInternship: (CalendarScrapDetail) -> Unit, onClickScrapButton: (Long) -> Unit, modifier: Modifier = Modifier @@ -189,13 +194,12 @@ private fun CalendarListScreen( } if (uiState.scrapDialogVisibility) { - CalendarCancelDialog( - onDismissRequest = onDismissCancelDialog, - onClickScrapCancel = { - onClickScrapCancel() - onDismissCancelDialog() - } - ) + uiState.scrapId?.run { + ScrapCancelDialog( + scrapId = this, + onDismissRequest = onDismissCancelDialog + ) + } } if (uiState.internDialogVisibility) { 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 ca919b3f8..2ccb983d4 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 @@ -38,12 +38,12 @@ import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.domain.entity.CalendarScrapDetail import com.terning.feature.R -import com.terning.feature.calendar.calendar.component.CalendarCancelDialog import com.terning.feature.calendar.calendar.component.CalendarDetailDialog import com.terning.feature.calendar.calendar.model.CalendarUiState 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 okhttp3.internal.toImmutableList import java.time.LocalDate @@ -82,11 +82,16 @@ fun CalendarWeekRoute( selectedDate = calendarUiState.selectedDate, updateSelectedDate = updateSelectedDate, navigateToAnnouncement = navigateToAnnouncement, - onDismissCancelDialog = { viewModel.updateScrapCancelDialogVisibility(false) }, + onDismissCancelDialog = { isCancelled -> + viewModel.updateScrapCancelDialogVisibility(false) + if (isCancelled) { + viewModel.getScrapWeekList(uiState.selectedDate) + } + }, onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, onClickChangeColor = { viewModel.patchScrap(it) }, onClickScrapCancel = { uiState.scrapId?.let { viewModel.deleteScrap(it) } }, - onClickScrapButton = {scrapId -> + onClickScrapButton = { scrapId -> with(viewModel) { updateScrapId(scrapId) updateScrapCancelDialogVisibility(true) @@ -106,7 +111,7 @@ private fun CalendarWeekScreen( uiState: CalendarWeekUiState, selectedDate: LocalDate, updateSelectedDate: (LocalDate) -> Unit, - onDismissCancelDialog: () -> Unit, + onDismissCancelDialog: (Boolean) -> Unit, onDismissInternDialog: () -> Unit, onClickChangeColor: (Color) -> Unit, onClickScrapCancel: () -> Unit, @@ -119,7 +124,7 @@ private fun CalendarWeekScreen( var hideComponent by remember { mutableStateOf(false) } LaunchedEffect(hideComponent) { - if(hideComponent) { + if (hideComponent) { updateSelectedDate(selectedDate) } } @@ -173,6 +178,7 @@ private fun CalendarWeekScreen( is UiState.Empty -> { CalendarWeekEmpty() } + is UiState.Failure -> {} is UiState.Success -> { CalendarWeekSuccess( @@ -186,13 +192,12 @@ private fun CalendarWeekScreen( } if (uiState.scrapDialogVisibility) { - CalendarCancelDialog( - onDismissRequest = onDismissCancelDialog, - onClickScrapCancel = { - onClickScrapCancel() - onDismissCancelDialog() - } - ) + uiState.scrapId?.run { + ScrapCancelDialog( + scrapId = this, + onDismissRequest = onDismissCancelDialog + ) + } } if (uiState.internDialogVisibility) { diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt index 5e88c2de8..1e97014c6 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -26,6 +26,14 @@ import com.terning.core.designsystem.theme.Grey500 import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.designsystem.theme.TerningTheme +/** + * 스크랩 취소 다이얼로그입니다 + * + * @param scrapId 공고의 스크랩 ID, 공고 ID로 변경될 예정입니다. + * @param onDismissRequest 다이얼로그를 닫을 때 호출되는 콜백 함수입니다. 스크랩이 취소되면 true를 반환합니다. + * @param viewModel 스크랩 취소 API 요청을 처리하는 ViewModel입니다. + */ + @Composable fun ScrapCancelDialog( scrapId: Long, From 5f95377c0e5b6e8ebc62d4c134ac92f7f38dadd7 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sun, 1 Sep 2024 15:00:00 +0900 Subject: [PATCH 03/26] =?UTF-8?q?[UI/#212]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EC=B7=A8=EC=86=8C=20=ED=94=84=EB=A6=AC=EB=B7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialog/cancel/ScrapCancelDialog.kt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt index 1e97014c6..34ffb62c4 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -53,9 +53,20 @@ fun ScrapCancelDialog( } } + ScrapCancelScreen( + onDismissRequest = { onDismissRequest(false) }, + onClickScrapCancel = { viewModel.deleteScrap(scrapId) } + ) +} + +@Composable +private fun ScrapCancelScreen( + onDismissRequest: () -> Unit, + onClickScrapCancel: () -> Unit, +) { TerningBasicDialog( - onDismissRequest = { onDismissRequest(false) } + onDismissRequest = onDismissRequest ) { Box( modifier = Modifier @@ -95,7 +106,7 @@ fun ScrapCancelDialog( paddingVertical = 12.dp, cornerRadius = 8.dp, text = R.string.dialog_scrap_cancel_button, - onButtonClick = { viewModel.deleteScrap(scrapId) }, + onButtonClick = onClickScrapCancel, modifier = Modifier.padding(bottom = 8.dp, top = 40.dp) ) } @@ -108,8 +119,8 @@ fun ScrapCancelDialog( @Composable private fun TerningBasicDialogPreview() { TerningPointTheme { - ScrapCancelDialog( - scrapId = 1, + ScrapCancelScreen( + onClickScrapCancel = {}, onDismissRequest = {} ) } From 337c03c5187ac9d473f17962d58da3c9a661826f Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sun, 1 Sep 2024 17:15:22 +0900 Subject: [PATCH 04/26] =?UTF-8?q?[MOD=20[MOD/#212]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialog/cancel/ScrapCancelDialog.kt | 8 - .../feature/dialog/detail/ScrapDialog.kt | 334 ++++++++++++++++++ .../dialog/detail/ScrapDialogSideEffect.kt | 9 + .../dialog/detail/ScrapDialogViewModel.kt | 74 ++++ 4 files changed, 417 insertions(+), 8 deletions(-) create mode 100644 feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt create mode 100644 feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt create mode 100644 feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt index 34ffb62c4..328656e75 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -26,14 +26,6 @@ import com.terning.core.designsystem.theme.Grey500 import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.designsystem.theme.TerningTheme -/** - * 스크랩 취소 다이얼로그입니다 - * - * @param scrapId 공고의 스크랩 ID, 공고 ID로 변경될 예정입니다. - * @param onDismissRequest 다이얼로그를 닫을 때 호출되는 콜백 함수입니다. 스크랩이 취소되면 true를 반환합니다. - * @param viewModel 스크랩 취소 API 요청을 처리하는 ViewModel입니다. - */ - @Composable fun ScrapCancelDialog( scrapId: Long, diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt new file mode 100644 index 000000000..30ab99189 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -0,0 +1,334 @@ +package com.terning.feature.dialog.detail + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.flowWithLifecycle +import coil.compose.AsyncImage +import coil.request.ImageRequest +import com.terning.core.R +import com.terning.core.designsystem.component.button.RoundButton +import com.terning.core.designsystem.component.dialog.TerningBasicDialog +import com.terning.core.designsystem.component.item.ColorPalette +import com.terning.core.designsystem.theme.Grey100 +import com.terning.core.designsystem.theme.Grey200 +import com.terning.core.designsystem.theme.Grey350 +import com.terning.core.designsystem.theme.Grey400 +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.feature.intern.component.InternInfoRow + + +@Composable +fun ScrapDialog( + title: String, + scrapColor: Color, + deadline: String, + startYear: Int, + startMonth: Int, + workingPeriod: String, + scrapId: Long, + internshipAnnouncementId: Long, + companyImage: String, + isScrapped: Boolean, + onDismissRequest: () -> Unit, + onClickChangeColor: () -> Unit, + onClickNavigateButton: (Long) -> Unit, + viewModel: ScrapDialogViewModel = hiltViewModel() +) { + val lifecycleOwner = LocalLifecycleOwner.current + LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { + viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) + .collect { sideEffect -> + when (sideEffect) { + is ScrapDialogSideEffect.ShowToast -> {} + is ScrapDialogSideEffect.DismissDialog -> onDismissRequest() + is ScrapDialogSideEffect.ChangedColor -> onClickChangeColor() + is ScrapDialogSideEffect.NavigateToDetail -> onClickNavigateButton( + internshipAnnouncementId + ) + is ScrapDialogSideEffect.ScrappedAnnouncement -> {} + } + } + } + + TerningBasicDialog( + onDismissRequest = onDismissRequest + ) { + ScrapDialogScreen( + title = title, + scrapColor = scrapColor, + deadline = deadline, + startYear = startYear, + startMonth = startMonth, + workingPeriod = workingPeriod, + isScrapped = isScrapped, + companyImage = companyImage, + onClickColorChangeButton = { newColor -> + onClickChangeColor() + viewModel.patchScrap(scrapId = scrapId, color = newColor) + }, + onClickNavigateButton = viewModel::navigateToDetail, + onClickScrapButton = { viewModel.postScrap(internshipAnnouncementId, scrapColor) } + ) + } +} + + +@Composable +private fun ScrapDialogScreen( + title: String, + scrapColor: Color, + deadline: String, + startYear: Int, + startMonth: Int, + workingPeriod: String, + isScrapped: Boolean, + companyImage: String, + onClickNavigateButton: () -> Unit, + onClickColorChangeButton: (Color) -> Unit, + onClickScrapButton: () -> Unit +) { + var selectedColor by remember { mutableStateOf(scrapColor) } + + Box( + modifier = Modifier + .wrapContentSize() + .padding(top = 32.dp, bottom = 16.dp), + contentAlignment = Alignment.TopCenter + ) { + Column( + modifier = Modifier + .padding(horizontal = 11.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data(companyImage) + .build(), + contentDescription = title, + contentScale = ContentScale.Fit, + modifier = Modifier + .width(80.dp) + .aspectRatio(1f) + .clip(RoundedCornerShape(15.dp)) + .border( + width = 1.dp, + color = TerningMain, + shape = RoundedCornerShape(size = 15.dp) + ) + ) + Text( + text = title, + textAlign = TextAlign.Center, + style = TerningTheme.typography.title4, + color = Grey500, + modifier = Modifier.padding(top = 20.dp) + ) + Text( + text = stringResource(id = R.string.dialog_scrap_mine), + style = TerningTheme.typography.body5, + color = Grey350, + modifier = Modifier.padding( + top = 4.dp + ) + ) + Spacer(modifier = Modifier.height(26.dp)) + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 13.dp) + ) { + Box( + modifier = Modifier + .background( + color = Grey100, + shape = RoundedCornerShape(14.dp) + ) + .padding(horizontal = 8.dp, vertical = 5.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = stringResource(id = R.string.dialog_content_color_button), + style = TerningTheme.typography.body5, + color = Grey400, + ) + } + + Box( + modifier = Modifier + .fillMaxWidth() + .padding( + top = 12.dp, + bottom = 23.dp, + ), + contentAlignment = Alignment.Center + ) { + ColorPalette( + initialColor = selectedColor, + onColorSelected = { newColor -> + selectedColor = newColor + } + ) + } + HorizontalDivider( + thickness = 1.dp, + color = Grey200, + modifier = Modifier.padding( + bottom = 8.dp + ) + ) + Column( + modifier = Modifier.padding(bottom = 29.dp), + verticalArrangement = Arrangement.spacedBy( + 5.dp, + Alignment.CenterVertically + ), + horizontalAlignment = Alignment.Start, + ) { + InternInfoRow( + title = stringResource(id = com.terning.feature.R.string.intern_info_d_day), + value = deadline + ) + InternInfoRow( + title = stringResource(id = com.terning.feature.R.string.intern_info_working), + value = workingPeriod + ) + InternInfoRow( + title = stringResource(id = com.terning.feature.R.string.intern_info_start_date), + value = "${startYear}년 ${startMonth}월" + ) + } + } + + if(isScrapped) { + DetailScrapButton( + onClickNavigateButton = onClickNavigateButton, + onClickColorChangeButton = { onClickColorChangeButton(selectedColor) } + ) + } else { + NewScrapButton(onClickScrapButton = onClickScrapButton) + } + } + } +} + +@Composable +private fun NewScrapButton( + onClickScrapButton: () -> Unit, + modifier: Modifier = Modifier +) { + RoundButton( + style = TerningTheme.typography.button3, + paddingVertical = 12.dp, + cornerRadius = 8.dp, + text = R.string.dialog_scrap_button, + onButtonClick = onClickScrapButton, + modifier = modifier + ) +} + +@Composable +private fun DetailScrapButton( + onClickNavigateButton: () -> Unit, + onClickColorChangeButton: () -> Unit, + modifier: Modifier = Modifier +){ + Row ( + modifier = modifier + ){ + RoundButton( + style = TerningTheme.typography.button3, + paddingVertical = 12.dp, + cornerRadius = 8.dp, + text = R.string.dialog_content_calendar_color_change, + onButtonClick = onClickColorChangeButton, + modifier = Modifier.weight(1f) + ) + Spacer(modifier = Modifier.width(8.dp)) + RoundButton( + style = TerningTheme.typography.button3, + paddingVertical = 12.dp, + cornerRadius = 8.dp, + text = R.string.dialog_scrap_move_to_intern, + onButtonClick = onClickNavigateButton, + modifier = Modifier.weight(1f) + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun ScrapDialogPreview() { + TerningPointTheme { + ScrapDialogScreen( + title = "터닝 하반기 채용", + scrapColor = Color.Red, + deadline = "2024/09/07", + startYear = 2024, + startMonth = 11, + workingPeriod = "2개월", + companyImage = "", + isScrapped = false, + onClickNavigateButton = {}, + onClickColorChangeButton = {}, + onClickScrapButton = {} + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun NewScrapButtonPreview() { + TerningPointTheme { + NewScrapButton( + onClickScrapButton = {} + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun DetailScrapButtonPreview() { + TerningPointTheme { + DetailScrapButton( + onClickNavigateButton = {}, + onClickColorChangeButton = {} + ) + } +} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt new file mode 100644 index 000000000..e964bf632 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt @@ -0,0 +1,9 @@ +package com.terning.feature.dialog.detail + +sealed class ScrapDialogSideEffect{ + data class ShowToast(val message: Int): ScrapDialogSideEffect() + data object DismissDialog : ScrapDialogSideEffect() + data object ScrappedAnnouncement : ScrapDialogSideEffect() + data object ChangedColor: ScrapDialogSideEffect() + data object NavigateToDetail : ScrapDialogSideEffect() +} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt new file mode 100644 index 000000000..badacec4c --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt @@ -0,0 +1,74 @@ +package com.terning.feature.dialog.detail + +import androidx.compose.ui.graphics.Color +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.terning.core.designsystem.theme.CalBlue1 +import com.terning.core.designsystem.theme.CalBlue2 +import com.terning.core.designsystem.theme.CalGreen1 +import com.terning.core.designsystem.theme.CalGreen2 +import com.terning.core.designsystem.theme.CalOrange1 +import com.terning.core.designsystem.theme.CalOrange2 +import com.terning.core.designsystem.theme.CalPink +import com.terning.core.designsystem.theme.CalPurple +import com.terning.core.designsystem.theme.CalRed +import com.terning.core.designsystem.theme.CalYellow +import com.terning.domain.entity.CalendarScrapRequest +import com.terning.domain.repository.ScrapRepository +import com.terning.feature.R +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class ScrapDialogViewModel @Inject constructor( + private val scrapRepository: ScrapRepository +) : ViewModel() { + private var _sideEffect: MutableSharedFlow = MutableSharedFlow() + val sideEffect = _sideEffect.asSharedFlow() + + fun navigateToDetail() = viewModelScope.launch { + _sideEffect.emit(ScrapDialogSideEffect.NavigateToDetail) + } + + fun postScrap(id: Long, color: Color) { + val colorIndex = getColorIndex(color) + viewModelScope.launch { + scrapRepository.postScrap(CalendarScrapRequest(id, colorIndex)) + .onSuccess { + with(_sideEffect) { + emit(ScrapDialogSideEffect.ShowToast(R.string.intern_scrap_add_toast_message)) + emit(ScrapDialogSideEffect.ScrappedAnnouncement) + } + }.onFailure { + _sideEffect.emit(ScrapDialogSideEffect.ShowToast(R.string.server_failure)) + } + } + } + + fun patchScrap(scrapId: Long, color: Color) = viewModelScope.launch { + val colorIndex = getColorIndex(color) + scrapRepository.patchScrap(CalendarScrapRequest(scrapId, colorIndex)) + .onSuccess { + _sideEffect.emit(ScrapDialogSideEffect.ChangedColor) + }.onFailure { + _sideEffect.emit(ScrapDialogSideEffect.ShowToast(R.string.server_failure)) + } + } + + + private fun getColorIndex(color: Color): Int = listOf( + CalRed, + CalOrange1, + CalOrange2, + CalYellow, + CalGreen1, + CalGreen2, + CalBlue1, + CalBlue2, + CalPurple, + CalPink + ).indexOf(color) +} \ No newline at end of file From 72279a2c06095f7c05bda6e6f2728c73963dd86b Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sun, 1 Sep 2024 17:15:46 +0900 Subject: [PATCH 05/26] =?UTF-8?q?[FEAT/#212]=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=EC=99=80=20?= =?UTF-8?q?=EB=8B=AC=EB=A0=A5=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/res/values/strings.xml | 6 +-- .../calendar/list/CalendarListScreen.kt | 44 +++++++++++++------ .../calendar/week/CalendarWeekScreen.kt | 37 ++++++++++++++-- 3 files changed, 67 insertions(+), 20 deletions(-) diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 71380b12d..ad3c916f7 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -44,14 +44,14 @@ 공고를 캘린더에 스크랩하시겠어요? - 색상 - 색상 저장하기 + 스크랩 색상 + 색상 변경하기 내 캘린더에 스크랩하기 관심 공고가 캘린더에서 사라져요! 스크랩을 취소하시겠어요? 스크랩 취소하기 내가 스크랩한 관심 공고에요! - 공고 상세 정보 보러가기 + 공고 상세 정보 보기 오늘 마감되는 공고예요! 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 e7184ccaa..5cd132dfd 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 @@ -45,6 +45,7 @@ import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLo 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 java.time.LocalDate @@ -85,13 +86,18 @@ fun CalendarListRoute( listState = listState, uiState = uiState, modifier = modifier, - navigateToAnnouncement = navigateToAnnouncement, + navigateToAnnouncement = { announcementId -> + navigateToAnnouncement(announcementId) + viewModel.updateInternDialogVisibility(false) + }, onDismissCancelDialog = { isCancelled -> viewModel.updateScrapCancelDialogVisibility(false) if (isCancelled) { viewModel.getScrapMonthList(uiState.currentDate) } }, onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, - onClickChangeColor = { newColor -> viewModel.patchScrap(newColor) }, + onClickChangeColor = { + viewModel.getScrapMonthList(uiState.currentDate) + }, onClickScrapButton = { scrapId -> with(viewModel){ updateScrapId(scrapId) @@ -115,7 +121,7 @@ private fun CalendarListScreen( navigateToAnnouncement: (Long) -> Unit, onDismissCancelDialog: (Boolean) -> Unit, onDismissInternDialog: () -> Unit, - onClickChangeColor: (Color) -> Unit, + onClickChangeColor: () -> Unit, onClickInternship: (CalendarScrapDetail) -> Unit, onClickScrapButton: (Long) -> Unit, modifier: Modifier = Modifier @@ -203,16 +209,28 @@ private fun CalendarListScreen( } if (uiState.internDialogVisibility) { - CalendarDetailDialog( - deadline = uiState.currentDate.getFullDateStringInKorean(), - scrapDetailModel = uiState.internshipModel, - onDismissRequest = onDismissInternDialog, - onClickChangeColorButton = onClickChangeColor, - onClickNavigateButton = { announcementId -> - navigateToAnnouncement(announcementId) - onDismissInternDialog() - } - ) + uiState.internshipModel?.let { + val scrapColor = Color( + android.graphics.Color.parseColor( + uiState.internshipModel.color + ) + ) + ScrapDialog( + title = uiState.internshipModel.title, + scrapColor = scrapColor, + deadline = uiState.currentDate.getFullDateStringInKorean(), + startYear = uiState.internshipModel.startYear, + startMonth = uiState.internshipModel.startMonth, + workingPeriod = uiState.internshipModel.workingPeriod, + scrapId = uiState.internshipModel.scrapId, + internshipAnnouncementId = uiState.internshipModel.internshipAnnouncementId, + companyImage = uiState.internshipModel.companyImage, + isScrapped = true, + onDismissRequest = onDismissInternDialog, + onClickChangeColor = onClickChangeColor, + onClickNavigateButton = navigateToAnnouncement + ) + } } } 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 2ccb983d4..c5dcbffb1 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 @@ -44,6 +44,7 @@ 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 java.time.LocalDate @@ -81,7 +82,10 @@ fun CalendarWeekRoute( uiState = uiState, selectedDate = calendarUiState.selectedDate, updateSelectedDate = updateSelectedDate, - navigateToAnnouncement = navigateToAnnouncement, + navigateToAnnouncement = { announcementId -> + navigateToAnnouncement(announcementId) + viewModel.updateInternDialogVisibility(false) + }, onDismissCancelDialog = { isCancelled -> viewModel.updateScrapCancelDialogVisibility(false) if (isCancelled) { @@ -89,7 +93,7 @@ fun CalendarWeekRoute( } }, onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, - onClickChangeColor = { viewModel.patchScrap(it) }, + onClickChangeColor = { viewModel.getScrapWeekList(uiState.selectedDate) }, onClickScrapCancel = { uiState.scrapId?.let { viewModel.deleteScrap(it) } }, onClickScrapButton = { scrapId -> with(viewModel) { @@ -113,7 +117,7 @@ private fun CalendarWeekScreen( updateSelectedDate: (LocalDate) -> Unit, onDismissCancelDialog: (Boolean) -> Unit, onDismissInternDialog: () -> Unit, - onClickChangeColor: (Color) -> Unit, + onClickChangeColor: () -> Unit, onClickScrapCancel: () -> Unit, onClickInternship: (CalendarScrapDetail) -> Unit, onClickScrapButton: (Long) -> Unit, @@ -201,6 +205,31 @@ private fun CalendarWeekScreen( } 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(), + startYear = uiState.internshipModel.startYear, + startMonth = uiState.internshipModel.startMonth, + workingPeriod = uiState.internshipModel.workingPeriod, + scrapId = uiState.internshipModel.scrapId, + internshipAnnouncementId = uiState.internshipModel.internshipAnnouncementId, + companyImage = uiState.internshipModel.companyImage, + isScrapped = true, + onDismissRequest = onDismissInternDialog, + onClickChangeColor = onClickChangeColor, + onClickNavigateButton = navigateToAnnouncement + ) + } + } + + /*if (uiState.internDialogVisibility) { CalendarDetailDialog( deadline = uiState.selectedDate.getFullDateStringInKorean(), scrapDetailModel = uiState.internshipModel, @@ -211,7 +240,7 @@ private fun CalendarWeekScreen( onDismissInternDialog() } ) - } + }*/ } @Composable From 610a9a1227666cb9b825aa3f306e29bc28f4e1d9 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sun, 1 Sep 2024 17:24:39 +0900 Subject: [PATCH 06/26] =?UTF-8?q?[DEL/#212]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/CalendarCancelDialog.kt | 34 --- .../component/CalendarDetailDialog.kt | 250 ------------------ .../calendar/list/CalendarListScreen.kt | 1 - .../calendar/list/CalendarListViewModel.kt | 52 +--- .../calendar/week/CalendarWeekScreen.kt | 14 - .../calendar/week/CalendarWeekViewModel.kt | 50 +--- 6 files changed, 2 insertions(+), 399 deletions(-) delete mode 100644 feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarCancelDialog.kt delete mode 100644 feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarDetailDialog.kt diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarCancelDialog.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarCancelDialog.kt deleted file mode 100644 index 33b0e762a..000000000 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarCancelDialog.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.terning.feature.calendar.calendar.component - -import androidx.compose.runtime.Composable -import androidx.compose.ui.tooling.preview.Preview -import com.terning.core.designsystem.component.dialog.ScrapCancelDialogContent -import com.terning.core.designsystem.component.dialog.TerningBasicDialog -import com.terning.core.designsystem.theme.TerningPointTheme - -@Composable -fun CalendarCancelDialog( - onDismissRequest: () -> Unit, - onClickScrapCancel: () -> Unit, -) { - TerningBasicDialog( - onDismissRequest = onDismissRequest - ) { - ScrapCancelDialogContent( - onClickScrapCancel = onClickScrapCancel - ) - } -} - - -@Preview(showBackground = true) -@Composable -fun TerningBasicDialogPreview() { - TerningPointTheme { - TerningBasicDialog( - onDismissRequest = {}, - ) { - ScrapCancelDialogContent() - } - } -} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarDetailDialog.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarDetailDialog.kt deleted file mode 100644 index caadbfd19..000000000 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarDetailDialog.kt +++ /dev/null @@ -1,250 +0,0 @@ -package com.terning.feature.calendar.calendar.component - -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage -import coil.request.ImageRequest -import com.terning.core.R -import com.terning.core.designsystem.component.button.RoundButton -import com.terning.core.designsystem.component.dialog.TerningBasicDialog -import com.terning.core.designsystem.component.item.ColorPalette -import com.terning.core.designsystem.theme.Grey200 -import com.terning.core.designsystem.theme.Grey350 -import com.terning.core.designsystem.theme.Grey500 -import com.terning.core.designsystem.theme.TerningMain -import com.terning.core.designsystem.theme.TerningTheme -import com.terning.core.designsystem.theme.White -import com.terning.core.extension.noRippleClickable -import com.terning.domain.entity.CalendarScrapDetail -import com.terning.feature.intern.component.InternInfoRow -import java.time.LocalDate - -@Composable -fun CalendarDetailDialog( - deadline: String, - scrapDetailModel: CalendarScrapDetail?, - onDismissRequest: () -> Unit, - onClickChangeColorButton: (Color) -> Unit, - onClickNavigateButton: (Long) -> Unit, -) { - TerningBasicDialog( - onDismissRequest = onDismissRequest - ) { - InternDialogContent( - deadline = deadline, - scrapDetailModel = scrapDetailModel, - onClickChangeColorButton = onClickChangeColorButton, - onClickNavigateButton = onClickNavigateButton - ) - } -} - - -@Composable -private fun InternDialogContent( - deadline: String, - scrapDetailModel: CalendarScrapDetail?, - onClickChangeColorButton: (Color) -> Unit, - onClickNavigateButton: (Long) -> Unit -) { - var isPaletteOpen by remember { mutableStateOf(false) } - var selectedColor by remember { - mutableStateOf( - Color( - android.graphics.Color.parseColor( - scrapDetailModel?.color - ) - ) - ) - } - - Box( - modifier = Modifier - .wrapContentSize() - .padding(top = 32.dp), - contentAlignment = Alignment.TopCenter - ) { - Column( - modifier = Modifier - .padding(horizontal = 11.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - AsyncImage( - model = ImageRequest.Builder(LocalContext.current) - .data(scrapDetailModel?.companyImage) - .build(), - contentDescription = scrapDetailModel?.title, - contentScale = ContentScale.Fit, - modifier = Modifier - .width(80.dp) - .aspectRatio(1f) - .clip(RoundedCornerShape(15.dp)) - .border( - width = 1.dp, - color = TerningMain, - shape = RoundedCornerShape(size = 15.dp) - ) - ) - Text( - text = scrapDetailModel?.title.orEmpty(), - textAlign = TextAlign.Center, - style = TerningTheme.typography.title4, - color = Grey500, - modifier = Modifier.padding(top = 20.dp) - ) - Text( - text = stringResource(id = R.string.dialog_scrap_mine), - style = TerningTheme.typography.body5, - color = Grey350, - modifier = Modifier.padding( - top = 4.dp - ) - ) - Spacer(modifier = Modifier.height(26.dp)) - Column( - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.Top, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 13.dp) - ) { - Row( - modifier = Modifier - .background( - color = selectedColor, - shape = RoundedCornerShape(14.dp) - ) - .noRippleClickable { - isPaletteOpen = !isPaletteOpen - }, - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Start - ) { - Icon( - painter = painterResource( - id = if (isPaletteOpen) R.drawable.ic_up_22 - else R.drawable.ic_down_22 - ), - contentDescription = stringResource( - id = R.string.dialog_content_color_button - ), - tint = White, - modifier = Modifier.padding( - start = 7.dp, - top = 2.dp, - bottom = 2.dp - ) - ) - Text( - text = stringResource(id = R.string.dialog_content_color_button), - style = TerningTheme.typography.body5, - color = White, - modifier = Modifier.padding(end = 13.dp) - ) - } - HorizontalDivider( - thickness = 1.dp, - color = Grey200, - modifier = Modifier.padding( - top = 11.dp, - bottom = 8.dp - ) - ) - if (isPaletteOpen) { - Box( - modifier = Modifier - .fillMaxWidth() - .padding( - top = 12.dp, - bottom = 23.dp, - ), - contentAlignment = Alignment.Center - ) { - ColorPalette( - initialColor = selectedColor, - onColorSelected = { newColor -> - selectedColor = newColor - } - ) - } - } else { - Text( - text = scrapDetailModel?.dDay.orEmpty(), - style = TerningTheme.typography.body5, - color = TerningMain, - modifier = Modifier.padding(bottom = 9.dp) - ) - Column( - modifier = Modifier.padding(bottom = 29.dp), - verticalArrangement = Arrangement.spacedBy( - 5.dp, - Alignment.CenterVertically - ), - horizontalAlignment = Alignment.Start, - ) { - InternInfoRow( - title = stringResource(id = com.terning.feature.R.string.intern_info_d_day), - value = deadline - ) - InternInfoRow( - title = stringResource(id = com.terning.feature.R.string.intern_info_working), - value = scrapDetailModel?.workingPeriod.orEmpty() - ) - InternInfoRow( - title = stringResource(id = com.terning.feature.R.string.intern_info_start_date), - value = "${scrapDetailModel?.startYear ?: LocalDate.now().year}년 " + - "${scrapDetailModel?.startMonth ?: LocalDate.now().monthValue}월" - ) - } - } - } - RoundButton( - style = TerningTheme.typography.button3, - paddingVertical = 12.dp, - cornerRadius = 8.dp, - text = if (isPaletteOpen) R.string.dialog_content_calendar_color_change - else R.string.dialog_scrap_move_to_intern, - onButtonClick = { - if (isPaletteOpen) { - onClickChangeColorButton(selectedColor) - isPaletteOpen = false - } else { - onClickNavigateButton(scrapDetailModel?.internshipAnnouncementId ?: 0) - } - }, - modifier = Modifier.padding(bottom = 8.dp) - ) - - } - } -} 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 5cd132dfd..91f31fd01 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 @@ -39,7 +39,6 @@ import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.domain.entity.CalendarScrapDetail import com.terning.feature.R -import com.terning.feature.calendar.calendar.component.CalendarDetailDialog import com.terning.feature.calendar.calendar.model.CalendarDefaults.flingBehavior import com.terning.feature.calendar.calendar.model.CalendarModel.Companion.getLocalDateByPage import com.terning.feature.calendar.list.component.CalendarScrapList 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 a178a7f4d..248394035 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 @@ -34,8 +34,7 @@ import javax.inject.Inject @HiltViewModel class CalendarListViewModel @Inject constructor( - private val calendarRepository: CalendarRepository, - private val scrapRepository: ScrapRepository + private val calendarRepository: CalendarRepository ): ViewModel(){ private val _uiState = MutableStateFlow(CalendarListUiState()) val uiState = _uiState.asStateFlow() @@ -110,53 +109,4 @@ class CalendarListViewModel @Inject constructor( } ) } - - fun deleteScrap( - scrapId: Long - ) = viewModelScope.launch { - _uiState.value.loadState - .takeIf { it is UiState.Success } - ?.let { CalendarScrapRequest(scrapId, null) }?.let { scrapRequestModel -> - scrapRepository.deleteScrap( - scrapRequestModel - ).onSuccess { - runCatching { - getScrapMonthList(_uiState.value.currentDate) - }.onSuccess { - updateScrapCancelDialogVisibility(false) - } - }.onFailure { - _sideEffect.emit(CalendarListSideEffect.ShowToast(R.string.server_failure)) - } - } - } - - fun patchScrap( - color: Color - ) = viewModelScope.launch { - val scrapId = _uiState.value.internshipModel?.scrapId ?: 0 - val colorIndex = getColorIndex(color) - - scrapRepository.patchScrap(CalendarScrapRequest(scrapId, colorIndex)) - .onSuccess { - runCatching { - getScrapMonthList(_uiState.value.currentDate) - } - }.onFailure { - _sideEffect.emit(CalendarListSideEffect.ShowToast(R.string.server_failure)) - } - } - - private fun getColorIndex(color: Color): Int = listOf( - CalRed, - CalOrange1, - CalOrange2, - CalYellow, - CalGreen1, - CalGreen2, - CalBlue1, - CalBlue2, - CalPurple, - CalPink - ).indexOf(color) } \ 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 c5dcbffb1..09c4abcb3 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 @@ -38,7 +38,6 @@ import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.domain.entity.CalendarScrapDetail import com.terning.feature.R -import com.terning.feature.calendar.calendar.component.CalendarDetailDialog import com.terning.feature.calendar.calendar.model.CalendarUiState import com.terning.feature.calendar.list.component.CalendarScrapList import com.terning.feature.calendar.week.component.HorizontalCalendarWeek @@ -228,19 +227,6 @@ private fun CalendarWeekScreen( ) } } - - /*if (uiState.internDialogVisibility) { - CalendarDetailDialog( - deadline = uiState.selectedDate.getFullDateStringInKorean(), - scrapDetailModel = uiState.internshipModel, - onDismissRequest = onDismissInternDialog, - onClickChangeColorButton = onClickChangeColor, - onClickNavigateButton = { announcementId -> - navigateToAnnouncement(announcementId) - onDismissInternDialog() - } - ) - }*/ } @Composable 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 07337f7db..3f611a80b 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 @@ -34,8 +34,7 @@ import javax.inject.Inject @HiltViewModel class CalendarWeekViewModel @Inject constructor( - private val calendarRepository: CalendarRepository, - private val scrapRepository: ScrapRepository + private val calendarRepository: CalendarRepository ): ViewModel() { private val _uiState = MutableStateFlow(CalendarWeekUiState()) val uiState = _uiState.asStateFlow() @@ -105,51 +104,4 @@ class CalendarWeekViewModel @Inject constructor( } ) } - - fun deleteScrap(scrapId: Long) = viewModelScope.launch { - _uiState.value.loadState - .takeIf { it is UiState.Success } - ?.let { CalendarScrapRequest(scrapId, null) }?.let { scrapRequestModel -> - scrapRepository.deleteScrap( - scrapRequestModel - ).onSuccess { - runCatching { - getScrapWeekList(selectedDate = _uiState.value.selectedDate) - }.onSuccess { - updateScrapCancelDialogVisibility(false) - } - }.onFailure { - _sideEffect.emit( - CalendarWeekSideEffect.ShowToast(R.string.server_failure) - ) - } - } - } - - fun patchScrap(color: Color) = viewModelScope.launch { - val scrapId = _uiState.value.internshipModel?.scrapId ?: 0 - val colorIndex = getColorIndex(color) - - scrapRepository.patchScrap(CalendarScrapRequest(scrapId, colorIndex)) - .onSuccess { - runCatching { - getScrapWeekList(selectedDate = _uiState.value.selectedDate) - } - }.onFailure { - _sideEffect.emit(CalendarWeekSideEffect.ShowToast(R.string.server_failure)) - } - } - - private fun getColorIndex(color: Color): Int = listOf( - CalRed, - CalOrange1, - CalOrange2, - CalYellow, - CalGreen1, - CalGreen2, - CalBlue1, - CalBlue2, - CalPurple, - CalPink - ).indexOf(color) } \ No newline at end of file From b483d5623165b63ce7ffa02391b62cc1e2d9b74e Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sun, 1 Sep 2024 17:27:42 +0900 Subject: [PATCH 07/26] =?UTF-8?q?[DEL/#212]=20=EB=9D=BC=EC=9D=B4=EB=B8=8C?= =?UTF-8?q?=EB=9F=AC=EB=A6=AC=20import=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/calendar/list/CalendarListViewModel.kt | 13 ------------- .../feature/calendar/week/CalendarWeekScreen.kt | 2 -- .../feature/calendar/week/CalendarWeekViewModel.kt | 13 ------------- .../feature/dialog/cancel/ScrapCancelViewModel.kt | 1 - 4 files changed, 29 deletions(-) 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 248394035..cfd4f7876 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 @@ -1,23 +1,10 @@ package com.terning.feature.calendar.list -import androidx.compose.ui.graphics.Color import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.terning.core.designsystem.theme.CalBlue1 -import com.terning.core.designsystem.theme.CalBlue2 -import com.terning.core.designsystem.theme.CalGreen1 -import com.terning.core.designsystem.theme.CalGreen2 -import com.terning.core.designsystem.theme.CalOrange1 -import com.terning.core.designsystem.theme.CalOrange2 -import com.terning.core.designsystem.theme.CalPink -import com.terning.core.designsystem.theme.CalPurple -import com.terning.core.designsystem.theme.CalRed -import com.terning.core.designsystem.theme.CalYellow import com.terning.core.state.UiState import com.terning.domain.entity.CalendarScrapDetail -import com.terning.domain.entity.CalendarScrapRequest import com.terning.domain.repository.CalendarRepository -import com.terning.domain.repository.ScrapRepository import com.terning.feature.R import com.terning.feature.calendar.list.model.CalendarListUiState import dagger.hilt.android.lifecycle.HiltViewModel 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 09c4abcb3..a994b1916 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 @@ -93,7 +93,6 @@ fun CalendarWeekRoute( }, onDismissInternDialog = { viewModel.updateInternDialogVisibility(false) }, onClickChangeColor = { viewModel.getScrapWeekList(uiState.selectedDate) }, - onClickScrapCancel = { uiState.scrapId?.let { viewModel.deleteScrap(it) } }, onClickScrapButton = { scrapId -> with(viewModel) { updateScrapId(scrapId) @@ -117,7 +116,6 @@ private fun CalendarWeekScreen( onDismissCancelDialog: (Boolean) -> Unit, onDismissInternDialog: () -> Unit, onClickChangeColor: () -> Unit, - onClickScrapCancel: () -> Unit, onClickInternship: (CalendarScrapDetail) -> Unit, onClickScrapButton: (Long) -> Unit, navigateToAnnouncement: (Long) -> Unit, 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 3f611a80b..8374a610b 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 @@ -1,23 +1,10 @@ package com.terning.feature.calendar.week -import androidx.compose.ui.graphics.Color import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.terning.core.designsystem.theme.CalBlue1 -import com.terning.core.designsystem.theme.CalBlue2 -import com.terning.core.designsystem.theme.CalGreen1 -import com.terning.core.designsystem.theme.CalGreen2 -import com.terning.core.designsystem.theme.CalOrange1 -import com.terning.core.designsystem.theme.CalOrange2 -import com.terning.core.designsystem.theme.CalPink -import com.terning.core.designsystem.theme.CalPurple -import com.terning.core.designsystem.theme.CalRed -import com.terning.core.designsystem.theme.CalYellow import com.terning.core.state.UiState import com.terning.domain.entity.CalendarScrapDetail -import com.terning.domain.entity.CalendarScrapRequest import com.terning.domain.repository.CalendarRepository -import com.terning.domain.repository.ScrapRepository import com.terning.feature.R import com.terning.feature.calendar.week.model.CalendarWeekUiState import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt index 5d3c6db22..beb35c20d 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.viewModelScope import com.terning.domain.entity.CalendarScrapRequest import com.terning.domain.repository.ScrapRepository import com.terning.feature.R -import com.terning.feature.calendar.list.CalendarListSideEffect import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow From 0a9456513f7d39055bb137aaff2bf85b1091b4e9 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Sun, 1 Sep 2024 17:30:11 +0900 Subject: [PATCH 08/26] =?UTF-8?q?[CHORE/#212]=20Resource=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/dialog/cancel/ScrapCancelDialog.kt | 2 +- .../com/terning/feature/dialog/detail/ScrapDialog.kt | 2 +- feature/src/main/res/values/strings.xml | 12 ++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt index 328656e75..13329120b 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -17,7 +17,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.flowWithLifecycle -import com.terning.core.R import com.terning.core.designsystem.component.button.RoundButton import com.terning.core.designsystem.component.dialog.TerningBasicDialog import com.terning.core.designsystem.component.item.TerningLottieAnimation @@ -25,6 +24,7 @@ import com.terning.core.designsystem.theme.Grey350 import com.terning.core.designsystem.theme.Grey500 import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.designsystem.theme.TerningTheme +import com.terning.feature.R @Composable fun ScrapCancelDialog( diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt index 30ab99189..76d100325 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -37,7 +37,6 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.flowWithLifecycle import coil.compose.AsyncImage import coil.request.ImageRequest -import com.terning.core.R import com.terning.core.designsystem.component.button.RoundButton import com.terning.core.designsystem.component.dialog.TerningBasicDialog import com.terning.core.designsystem.component.item.ColorPalette @@ -49,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.feature.R import com.terning.feature.intern.component.InternInfoRow diff --git a/feature/src/main/res/values/strings.xml b/feature/src/main/res/values/strings.xml index 187a825d0..0190c1a92 100644 --- a/feature/src/main/res/values/strings.xml +++ b/feature/src/main/res/values/strings.xml @@ -58,6 +58,18 @@ 선택하신 날짜에 지원 마감인 스크랩 공고가 없어요 +%s + + 공고를 캘린더에 스크랩하시겠어요? + 스크랩 색상 + 색상 변경하기 + 내 캘린더에 스크랩하기 + 관심 공고가 캘린더에서 사라져요! + 스크랩을 취소하시겠어요? + 스크랩 취소하기 + 내가 스크랩한 관심 공고에요! + 공고 상세 정보 보기 + 오늘 마감되는 공고예요! + 오늘 마감되는 %s님의 관심 공고 아직 스크랩된 인턴 공고가 없어요!\n관심 공고를 스크랩하면 마감 당일에 알려드릴게요 From 8bb8578e80dfa1f5e374303d673750d8e8bcd880 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Tue, 3 Sep 2024 15:06:35 +0900 Subject: [PATCH 09/26] =?UTF-8?q?[ADD/#212]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EC=83=89=EC=83=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/core/designsystem/theme/Color.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/src/main/java/com/terning/core/designsystem/theme/Color.kt b/core/src/main/java/com/terning/core/designsystem/theme/Color.kt index bea5eb805..5376fd788 100644 --- a/core/src/main/java/com/terning/core/designsystem/theme/Color.kt +++ b/core/src/main/java/com/terning/core/designsystem/theme/Color.kt @@ -41,6 +41,14 @@ val CalBlue2 = Color(0xFF4AA9F2) val CalPurple = Color(0xFF9B64E2) val CalPink = Color(0xFFF260AC) +// Calendar Border Color +val CalRedLi = Color(0x7FED4E54) +val CalOrangeLi = Color(0x7FF3A649) +val CalGreenLi = Color(0x7F84D558) +val CalBlueLi = Color(0x7F4AA9F2) +val CalPurpleLi = Color(0x7F9B64E2) +val CalPinkLi = Color(0x7FF260AC) + // Other val WarningRed = Color(0xFFF54645) val SundayRed = Color(0xFFEB1211) From 4dfff2a0f8ba0259e36271f9e8ec87ec19d91452 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Tue, 3 Sep 2024 15:11:39 +0900 Subject: [PATCH 10/26] =?UTF-8?q?[ADD/#212]=20=EC=BB=AC=EB=9F=AC=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/core/type/ColorType.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 core/src/main/java/com/terning/core/type/ColorType.kt diff --git a/core/src/main/java/com/terning/core/type/ColorType.kt b/core/src/main/java/com/terning/core/type/ColorType.kt new file mode 100644 index 000000000..bcdd80fb4 --- /dev/null +++ b/core/src/main/java/com/terning/core/type/ColorType.kt @@ -0,0 +1,26 @@ +package com.terning.core.type + +import androidx.compose.ui.graphics.Color +import com.terning.core.designsystem.theme.CalBlue1 +import com.terning.core.designsystem.theme.CalBlue2 +import com.terning.core.designsystem.theme.CalBlueLi +import com.terning.core.designsystem.theme.CalGreen2 +import com.terning.core.designsystem.theme.CalOrange2 +import com.terning.core.designsystem.theme.CalPink +import com.terning.core.designsystem.theme.CalPinkLi +import com.terning.core.designsystem.theme.CalPurple +import com.terning.core.designsystem.theme.CalPurpleLi +import com.terning.core.designsystem.theme.CalRed +import com.terning.core.designsystem.theme.CalRedLi + +enum class ColorType( + main: Color, + sub: Color +) { + RED(main = CalRed, sub = CalRedLi), + ORANGE(main = CalOrange2, sub = CalRedLi), + GREEN(main = CalGreen2, sub = CalRedLi), + BLUE(main = CalBlue2, sub = CalBlueLi), + PURPLE(main = CalPurple, sub = CalPurpleLi), + PINK(main = CalPink, sub = CalPinkLi) +} \ No newline at end of file From 67dfbf9dbb122306ccf46f00fcc65e8c8cf44dec Mon Sep 17 00:00:00 2001 From: boiledegg Date: Tue, 3 Sep 2024 16:10:34 +0900 Subject: [PATCH 11/26] =?UTF-8?q?[ADD/#212]=20=EC=BB=AC=EB=9F=AC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/core/designsystem/theme/Color.kt | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/terning/core/designsystem/theme/Color.kt b/core/src/main/java/com/terning/core/designsystem/theme/Color.kt index 5376fd788..1ea24c8b6 100644 --- a/core/src/main/java/com/terning/core/designsystem/theme/Color.kt +++ b/core/src/main/java/com/terning/core/designsystem/theme/Color.kt @@ -41,13 +41,21 @@ val CalBlue2 = Color(0xFF4AA9F2) val CalPurple = Color(0xFF9B64E2) val CalPink = Color(0xFFF260AC) -// Calendar Border Color -val CalRedLi = Color(0x7FED4E54) -val CalOrangeLi = Color(0x7FF3A649) -val CalGreenLi = Color(0x7F84D558) -val CalBlueLi = Color(0x7F4AA9F2) -val CalPurpleLi = Color(0x7F9B64E2) -val CalPinkLi = Color(0x7FF260AC) +// Calendar Color (Border) +val CalRedLi = Color(0xFFDD2F36) +val CalOrangeLi = Color(0xFFF39D35) +val CalGreenLi = Color(0xFF74CE44) +val CalBlueLi = Color(0xFF3B9CE8) +val CalPurpleLi = Color(0xFF8D4EDE) +val CalPinkLi = Color(0xFFF9439A) + +// Calendar Color (Background) +val CalRedBc = Color(0x7FED4E54) +val CalOrangeBc = Color(0x7FF3A649) +val CalGreenBc = Color(0x7F84D558) +val CalBlueBc = Color(0x7F4AA9F2) +val CalPurpleBc = Color(0x7F9B64E2) +val CalPinkBc = Color(0x7FF260AC) // Other val WarningRed = Color(0xFFF54645) From 37c8b2b9d629b53f26115f94e957a32cc52ca42e Mon Sep 17 00:00:00 2001 From: boiledegg Date: Tue, 3 Sep 2024 16:10:51 +0900 Subject: [PATCH 12/26] =?UTF-8?q?[FIX/#212]=20=EC=BB=AC=EB=9F=AC=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/core/type/ColorType.kt | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/com/terning/core/type/ColorType.kt b/core/src/main/java/com/terning/core/type/ColorType.kt index bcdd80fb4..7d35c8f65 100644 --- a/core/src/main/java/com/terning/core/type/ColorType.kt +++ b/core/src/main/java/com/terning/core/type/ColorType.kt @@ -1,26 +1,38 @@ package com.terning.core.type import androidx.compose.ui.graphics.Color -import com.terning.core.designsystem.theme.CalBlue1 import com.terning.core.designsystem.theme.CalBlue2 +import com.terning.core.designsystem.theme.CalBlueBc import com.terning.core.designsystem.theme.CalBlueLi import com.terning.core.designsystem.theme.CalGreen2 +import com.terning.core.designsystem.theme.CalGreenBc +import com.terning.core.designsystem.theme.CalGreenLi import com.terning.core.designsystem.theme.CalOrange2 +import com.terning.core.designsystem.theme.CalOrangeBc +import com.terning.core.designsystem.theme.CalOrangeLi import com.terning.core.designsystem.theme.CalPink +import com.terning.core.designsystem.theme.CalPinkBc import com.terning.core.designsystem.theme.CalPinkLi import com.terning.core.designsystem.theme.CalPurple +import com.terning.core.designsystem.theme.CalPurpleBc import com.terning.core.designsystem.theme.CalPurpleLi import com.terning.core.designsystem.theme.CalRed +import com.terning.core.designsystem.theme.CalRedBc import com.terning.core.designsystem.theme.CalRedLi enum class ColorType( - main: Color, - sub: Color + val main: Color, + val border: Color, + val sub: Color ) { - RED(main = CalRed, sub = CalRedLi), - ORANGE(main = CalOrange2, sub = CalRedLi), - GREEN(main = CalGreen2, sub = CalRedLi), - BLUE(main = CalBlue2, sub = CalBlueLi), - PURPLE(main = CalPurple, sub = CalPurpleLi), - PINK(main = CalPink, sub = CalPinkLi) + RED(main = CalRed, border = CalRedLi, sub = CalRedBc), + ORANGE(main = CalOrange2, border = CalOrangeLi, sub = CalOrangeBc), + GREEN(main = CalGreen2, border = CalGreenLi, sub = CalGreenBc), + BLUE(main = CalBlue2, border = CalBlueLi, sub = CalBlueBc), + PURPLE(main = CalPurple, border = CalPurpleLi, sub = CalPurpleBc), + PINK(main = CalPink, border = CalPinkLi, sub = CalPinkBc); + + companion object { + fun findColorType(mainColor: Color): ColorType? = entries.find { it.main == mainColor } + } } \ No newline at end of file From a7ccfe7d7256202ae6323c0bec7c27526491b2fc Mon Sep 17 00:00:00 2001 From: boiledegg Date: Tue, 3 Sep 2024 16:16:51 +0900 Subject: [PATCH 13/26] =?UTF-8?q?[FEAT/#212]=20=EC=BB=AC=EB=9F=AC=20?= =?UTF-8?q?=ED=8C=94=EB=A0=88=ED=8A=B8=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/dialog/detail/ScrapDialog.kt | 10 +- .../dialog/detail/component/ColorPalette.kt | 117 ++++++++++++++++++ 2 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt index 76d100325..7a8d6dac9 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -39,7 +39,7 @@ import coil.compose.AsyncImage import coil.request.ImageRequest import com.terning.core.designsystem.component.button.RoundButton import com.terning.core.designsystem.component.dialog.TerningBasicDialog -import com.terning.core.designsystem.component.item.ColorPalette +import com.terning.core.designsystem.theme.CalRed import com.terning.core.designsystem.theme.Grey100 import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.Grey350 @@ -48,7 +48,9 @@ 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.type.ColorType import com.terning.feature.R +import com.terning.feature.dialog.detail.component.ColorPalette import com.terning.feature.intern.component.InternInfoRow @@ -123,6 +125,7 @@ private fun ScrapDialogScreen( onClickScrapButton: () -> Unit ) { var selectedColor by remember { mutableStateOf(scrapColor) } + var selectedColorType by remember { mutableStateOf(ColorType.findColorType(selectedColor)?:ColorType.RED) } Box( modifier = Modifier @@ -200,9 +203,10 @@ private fun ScrapDialogScreen( contentAlignment = Alignment.Center ) { ColorPalette( - initialColor = selectedColor, + initialColor = selectedColorType, onColorSelected = { newColor -> - selectedColor = newColor + selectedColor = newColor.main + selectedColorType = newColor } ) } diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt new file mode 100644 index 000000000..4f6df28ee --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt @@ -0,0 +1,117 @@ +package com.terning.feature.dialog.detail.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.terning.core.R +import com.terning.core.designsystem.component.item.RadioButtonGroups +import com.terning.core.extension.noRippleClickable +import com.terning.core.type.ColorType + +@Composable +fun ColorPalette( + initialColor: ColorType, + onColorSelected: (ColorType) -> Unit, + modifier: Modifier = Modifier +) { + var selectedColor by remember { mutableStateOf(initialColor) } + + RadioButtonGroups( + options = ColorType.entries, + gridCellCount = ColorType.entries.size, + onOptionSelected = { color -> + selectedColor = color + onColorSelected(color) + }, + buttonComposable = { colorType, isSelected, onOptionSelected -> + + + ColorButton( + colorType = colorType, + isSelected = isSelected,//selectedColor == colorType, + onColorSelected = onOptionSelected + ) + }, + verticalArrangementSpace = 6.dp, + horizontalArrangementSpace = 0.dp, + modifier = modifier.wrapContentSize() + ) +} + +@Composable +internal fun ColorButton( + colorType: ColorType, + isSelected: Boolean, + onColorSelected: (ColorType) -> Unit, + modifier: Modifier = Modifier, +) { + val externalColor = if (isSelected) colorType.sub else Color.Transparent + val externalBoxModifier = Modifier + .size(38.dp) + .background( + shape = CircleShape, + color = externalColor + ) + val internalBoxModifier = Modifier + .padding(4.dp) + .then( + if (isSelected) + Modifier.border( + width = 2.dp, + color = colorType.border, + shape = CircleShape, + ) + else Modifier + ) + .background( + shape = CircleShape, + color = colorType.main + ) + + + Box( + modifier = modifier.wrapContentSize(), + ) { + Box( + modifier = Modifier + .noRippleClickable { + onColorSelected(colorType) + } + .then(externalBoxModifier) + .then(internalBoxModifier), + contentAlignment = Alignment.Center + ) { + if (isSelected) { + Image( + painter = painterResource(id = R.drawable.ic_color_check), + contentDescription = "" + ) + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun ColorPalettePreview() { + ColorPalette( + initialColor = ColorType.RED, + onColorSelected = {} + ) +} From f856344c10e54ba17abf0d16f7fdb291dbc1b2be Mon Sep 17 00:00:00 2001 From: boiledegg Date: Tue, 3 Sep 2024 22:44:29 +0900 Subject: [PATCH 14/26] =?UTF-8?q?[FEAT/#212]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20UI=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/core/type/ColorType.kt | 1 + .../dialog/cancel/ScrapCancelDialog.kt | 8 +- .../feature/dialog/detail/ScrapDialog.kt | 99 +++++++++++++------ .../dialog/detail/ScrapDialogViewModel.kt | 45 +++++++-- .../dialog/detail/component/ColorPalette.kt | 15 +-- .../component/ScrapColorChangeButton.kt | 89 +++++++++++++++++ .../dialog/detail/state/ScrapDialogUiState.kt | 10 ++ feature/src/main/res/values/strings.xml | 1 + 8 files changed, 218 insertions(+), 50 deletions(-) create mode 100644 feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt create mode 100644 feature/src/main/java/com/terning/feature/dialog/detail/state/ScrapDialogUiState.kt diff --git a/core/src/main/java/com/terning/core/type/ColorType.kt b/core/src/main/java/com/terning/core/type/ColorType.kt index 7d35c8f65..073fc15d5 100644 --- a/core/src/main/java/com/terning/core/type/ColorType.kt +++ b/core/src/main/java/com/terning/core/type/ColorType.kt @@ -1,5 +1,6 @@ package com.terning.core.type +import android.util.Log import androidx.compose.ui.graphics.Color import com.terning.core.designsystem.theme.CalBlue2 import com.terning.core.designsystem.theme.CalBlueBc diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt index 13329120b..8fb590437 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -2,8 +2,10 @@ package com.terning.feature.dialog.cancel import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -93,14 +95,16 @@ private fun ScrapCancelScreen( top = 5.dp ) ) + Spacer(modifier = Modifier.height(40.dp)) + RoundButton( style = TerningTheme.typography.button3, paddingVertical = 12.dp, cornerRadius = 8.dp, text = R.string.dialog_scrap_cancel_button, - onButtonClick = onClickScrapCancel, - modifier = Modifier.padding(bottom = 8.dp, top = 40.dp) + onButtonClick = onClickScrapCancel ) + Spacer(modifier = Modifier.height(16.dp)) } } } diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt index 7a8d6dac9..24110f0cb 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -19,9 +19,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -34,12 +31,12 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle import coil.compose.AsyncImage import coil.request.ImageRequest import com.terning.core.designsystem.component.button.RoundButton import com.terning.core.designsystem.component.dialog.TerningBasicDialog -import com.terning.core.designsystem.theme.CalRed import com.terning.core.designsystem.theme.Grey100 import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.Grey350 @@ -51,7 +48,9 @@ import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.type.ColorType import com.terning.feature.R import com.terning.feature.dialog.detail.component.ColorPalette +import com.terning.feature.dialog.detail.component.ScrapColorChangeButton import com.terning.feature.intern.component.InternInfoRow +import timber.log.Timber @Composable @@ -72,6 +71,7 @@ fun ScrapDialog( viewModel: ScrapDialogViewModel = hiltViewModel() ) { val lifecycleOwner = LocalLifecycleOwner.current + val uiState by viewModel.uiState.collectAsStateWithLifecycle(lifecycleOwner = lifecycleOwner) LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { sideEffect -> @@ -82,29 +82,57 @@ fun ScrapDialog( is ScrapDialogSideEffect.NavigateToDetail -> onClickNavigateButton( internshipAnnouncementId ) + is ScrapDialogSideEffect.ScrappedAnnouncement -> {} } } } + LaunchedEffect(true) { + with(viewModel) { + val colorType = ColorType.findColorType(scrapColor).takeIf { it != null } + colorType?.let { + updateInitialColorType(colorType) + updateSelectedColorType(colorType) + } + } + } + TerningBasicDialog( onDismissRequest = onDismissRequest ) { ScrapDialogScreen( title = title, - scrapColor = scrapColor, deadline = deadline, startYear = startYear, startMonth = startMonth, workingPeriod = workingPeriod, isScrapped = isScrapped, companyImage = companyImage, - onClickColorChangeButton = { newColor -> + selectedColorType = uiState.selectedColorType, + isColorChanged = uiState.isColorChanged, + isColorChangedOnce = uiState.isColorChangedOnce, + onClickColorButton = { selectedColorType -> + with(viewModel) { + updateSelectedColorType(selectedColorType) + updateIsColorChanged() + } + }, + onClickColorChangeButton = { + with(viewModel) { + patchScrap(scrapId = scrapId, color = uiState.selectedColorType) + setIsColorChangedOnce() + updateInitialColorType(colorType = uiState.selectedColorType) + } onClickChangeColor() - viewModel.patchScrap(scrapId = scrapId, color = newColor) }, onClickNavigateButton = viewModel::navigateToDetail, - onClickScrapButton = { viewModel.postScrap(internshipAnnouncementId, scrapColor) } + onClickScrapButton = { + viewModel.postScrap( + internshipAnnouncementId, + uiState.selectedColorType + ) + } ) } } @@ -113,20 +141,20 @@ fun ScrapDialog( @Composable private fun ScrapDialogScreen( title: String, - scrapColor: Color, deadline: String, startYear: Int, startMonth: Int, workingPeriod: String, isScrapped: Boolean, companyImage: String, + selectedColorType: ColorType, + isColorChanged: Boolean, + isColorChangedOnce: Boolean, + onClickColorButton: (ColorType) -> Unit, onClickNavigateButton: () -> Unit, - onClickColorChangeButton: (Color) -> Unit, + onClickColorChangeButton: () -> Unit, onClickScrapButton: () -> Unit ) { - var selectedColor by remember { mutableStateOf(scrapColor) } - var selectedColorType by remember { mutableStateOf(ColorType.findColorType(selectedColor)?:ColorType.RED) } - Box( modifier = Modifier .wrapContentSize() @@ -203,11 +231,8 @@ private fun ScrapDialogScreen( contentAlignment = Alignment.Center ) { ColorPalette( - initialColor = selectedColorType, - onColorSelected = { newColor -> - selectedColor = newColor.main - selectedColorType = newColor - } + selectedColor = selectedColorType, + onColorSelected = onClickColorButton ) } HorizontalDivider( @@ -226,24 +251,27 @@ private fun ScrapDialogScreen( horizontalAlignment = Alignment.Start, ) { InternInfoRow( - title = stringResource(id = com.terning.feature.R.string.intern_info_d_day), + title = stringResource(id = R.string.intern_info_d_day), value = deadline ) InternInfoRow( - title = stringResource(id = com.terning.feature.R.string.intern_info_working), + title = stringResource(id = R.string.intern_info_working), value = workingPeriod ) InternInfoRow( - title = stringResource(id = com.terning.feature.R.string.intern_info_start_date), + title = stringResource(id = R.string.intern_info_start_date), value = "${startYear}년 ${startMonth}월" ) } } - if(isScrapped) { + if (isScrapped) { DetailScrapButton( + isColorChanged = isColorChanged, + isColorChangedOnce = isColorChangedOnce, onClickNavigateButton = onClickNavigateButton, - onClickColorChangeButton = { onClickColorChangeButton(selectedColor) } + onClickColorChangeButton = onClickColorChangeButton + ) } else { NewScrapButton(onClickScrapButton = onClickScrapButton) @@ -269,18 +297,20 @@ private fun NewScrapButton( @Composable private fun DetailScrapButton( + isColorChanged: Boolean, + isColorChangedOnce: Boolean, onClickNavigateButton: () -> Unit, onClickColorChangeButton: () -> Unit, modifier: Modifier = Modifier -){ - Row ( +) { + Row( modifier = modifier - ){ - RoundButton( - style = TerningTheme.typography.button3, + ) { + ScrapColorChangeButton( + isColorChanged = isColorChanged, + isColorChangedOnce = isColorChangedOnce, paddingVertical = 12.dp, cornerRadius = 8.dp, - text = R.string.dialog_content_calendar_color_change, onButtonClick = onClickColorChangeButton, modifier = Modifier.weight(1f) ) @@ -302,7 +332,6 @@ private fun ScrapDialogPreview() { TerningPointTheme { ScrapDialogScreen( title = "터닝 하반기 채용", - scrapColor = Color.Red, deadline = "2024/09/07", startYear = 2024, startMonth = 11, @@ -311,7 +340,11 @@ private fun ScrapDialogPreview() { isScrapped = false, onClickNavigateButton = {}, onClickColorChangeButton = {}, - onClickScrapButton = {} + onClickScrapButton = {}, + onClickColorButton = {}, + isColorChanged = false, + isColorChangedOnce = true, + selectedColorType = ColorType.RED ) } } @@ -332,7 +365,9 @@ private fun DetailScrapButtonPreview() { TerningPointTheme { DetailScrapButton( onClickNavigateButton = {}, - onClickColorChangeButton = {} + onClickColorChangeButton = {}, + isColorChanged = false, + isColorChangedOnce = false ) } } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt index badacec4c..e0510a3f6 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt @@ -13,28 +13,51 @@ import com.terning.core.designsystem.theme.CalPink import com.terning.core.designsystem.theme.CalPurple import com.terning.core.designsystem.theme.CalRed import com.terning.core.designsystem.theme.CalYellow +import com.terning.core.type.ColorType import com.terning.domain.entity.CalendarScrapRequest import com.terning.domain.repository.ScrapRepository import com.terning.feature.R +import com.terning.feature.dialog.detail.state.ScrapDialogUiState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @HiltViewModel class ScrapDialogViewModel @Inject constructor( private val scrapRepository: ScrapRepository ) : ViewModel() { + private var _uiState = MutableStateFlow(ScrapDialogUiState()) + val uiState = _uiState.asStateFlow() + private var _sideEffect: MutableSharedFlow = MutableSharedFlow() val sideEffect = _sideEffect.asSharedFlow() - fun navigateToDetail() = viewModelScope.launch { - _sideEffect.emit(ScrapDialogSideEffect.NavigateToDetail) + fun updateInitialColorType(colorType: ColorType) { + _uiState.update { currentState -> + currentState.copy(initialColorType = colorType) + } + } + + fun updateSelectedColorType(colorType: ColorType) { + _uiState.update { currentState -> + if (currentState.selectedColorType == colorType) return@update currentState + currentState.copy(selectedColorType = colorType) + } + } + + fun updateIsColorChanged() = _uiState.update { currentState -> + val isColorChanged = _uiState.value.selectedColorType != _uiState.value.initialColorType + currentState.copy(isColorChanged = isColorChanged) } - fun postScrap(id: Long, color: Color) { - val colorIndex = getColorIndex(color) + fun postScrap(id: Long, color: ColorType) { + val colorIndex = getColorIndex(color.main) viewModelScope.launch { scrapRepository.postScrap(CalendarScrapRequest(id, colorIndex)) .onSuccess { @@ -48,16 +71,26 @@ class ScrapDialogViewModel @Inject constructor( } } - fun patchScrap(scrapId: Long, color: Color) = viewModelScope.launch { - val colorIndex = getColorIndex(color) + fun patchScrap(scrapId: Long, color: ColorType) = viewModelScope.launch { + val colorIndex = getColorIndex(color.main) scrapRepository.patchScrap(CalendarScrapRequest(scrapId, colorIndex)) .onSuccess { _sideEffect.emit(ScrapDialogSideEffect.ChangedColor) + }.onFailure { _sideEffect.emit(ScrapDialogSideEffect.ShowToast(R.string.server_failure)) } } + fun setIsColorChangedOnce() = _uiState.update { currentState -> + if (!currentState.isColorChangedOnce) return@update currentState + currentState.copy(isColorChangedOnce = true) + } + + fun navigateToDetail() = viewModelScope.launch { + _sideEffect.emit(ScrapDialogSideEffect.NavigateToDetail) + } + private fun getColorIndex(color: Color): Int = listOf( CalRed, diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt index 4f6df28ee..13cbdfa0f 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt @@ -23,28 +23,23 @@ import com.terning.core.R import com.terning.core.designsystem.component.item.RadioButtonGroups import com.terning.core.extension.noRippleClickable import com.terning.core.type.ColorType +import timber.log.Timber @Composable fun ColorPalette( - initialColor: ColorType, + selectedColor: ColorType, onColorSelected: (ColorType) -> Unit, modifier: Modifier = Modifier ) { - var selectedColor by remember { mutableStateOf(initialColor) } RadioButtonGroups( options = ColorType.entries, gridCellCount = ColorType.entries.size, - onOptionSelected = { color -> - selectedColor = color - onColorSelected(color) - }, + onOptionSelected = onColorSelected, buttonComposable = { colorType, isSelected, onOptionSelected -> - - ColorButton( colorType = colorType, - isSelected = isSelected,//selectedColor == colorType, + isSelected = selectedColor == colorType, onColorSelected = onOptionSelected ) }, @@ -111,7 +106,7 @@ internal fun ColorButton( @Composable fun ColorPalettePreview() { ColorPalette( - initialColor = ColorType.RED, + selectedColor = ColorType.RED, onColorSelected = {} ) } diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt new file mode 100644 index 000000000..0850d024d --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt @@ -0,0 +1,89 @@ +package com.terning.feature.dialog.detail.component + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.LocalRippleTheme +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.terning.core.designsystem.theme.Grey150 +import com.terning.core.designsystem.theme.Grey400 +import com.terning.core.designsystem.theme.TerningMain +import com.terning.core.designsystem.theme.TerningSub1 +import com.terning.core.designsystem.theme.TerningSub4 +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 +import com.terning.feature.R + +@Composable +fun ScrapColorChangeButton( + isColorChanged: Boolean, + isColorChangedOnce: Boolean, + cornerRadius: Dp, + paddingVertical: Dp, + onButtonClick: () -> Unit, + modifier: Modifier = Modifier, +) { + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + val backgroundColor = when { + isColorChanged && !isPressed -> White + isColorChanged && isPressed -> TerningSub5 + isColorChangedOnce -> TerningSub4 + else -> White + } + val textColor = when { + !isColorChangedOnce && !isColorChanged -> Grey400 + else -> TerningMain + } + val borderColor = when { + !isColorChangedOnce && !isColorChanged -> Grey150 + else -> TerningMain + } + val text = when { + isColorChangedOnce && !isColorChanged -> R.string.dialog_content_calendar_color_change_complete + else -> R.string.dialog_content_calendar_color_change + } + + CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) { + Button( + contentPadding = PaddingValues(vertical = paddingVertical), + modifier = modifier + .fillMaxWidth() + .wrapContentHeight(), + interactionSource = interactionSource, + colors = ButtonDefaults.buttonColors( + containerColor = backgroundColor, + contentColor = textColor, + ), + border = BorderStroke( + width = 1.dp, + color = borderColor + ), + shape = RoundedCornerShape(cornerRadius), + onClick = { onButtonClick() } + ) { + Text( + text = stringResource(id = text), + style = TerningTheme.typography.button3, + textAlign = TextAlign.Center, + ) + } + } +} diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/state/ScrapDialogUiState.kt b/feature/src/main/java/com/terning/feature/dialog/detail/state/ScrapDialogUiState.kt new file mode 100644 index 000000000..c78c94576 --- /dev/null +++ b/feature/src/main/java/com/terning/feature/dialog/detail/state/ScrapDialogUiState.kt @@ -0,0 +1,10 @@ +package com.terning.feature.dialog.detail.state + +import com.terning.core.type.ColorType + +data class ScrapDialogUiState( + val initialColorType: ColorType = ColorType.RED, + val selectedColorType: ColorType = ColorType.RED, + val isColorChanged: Boolean = false, + val isColorChangedOnce: Boolean = false, +) \ 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 0190c1a92..46b78e88f 100644 --- a/feature/src/main/res/values/strings.xml +++ b/feature/src/main/res/values/strings.xml @@ -62,6 +62,7 @@ 공고를 캘린더에 스크랩하시겠어요? 스크랩 색상 색상 변경하기 + 색상 변경완료 내 캘린더에 스크랩하기 관심 공고가 캘린더에서 사라져요! 스크랩을 취소하시겠어요? From cd13ab8cd795e3e7367739305bc7af728fadb244 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Tue, 3 Sep 2024 22:45:26 +0900 Subject: [PATCH 15/26] =?UTF-8?q?[DEL/#212]=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 --- core/src/main/java/com/terning/core/type/ColorType.kt | 1 - .../java/com/terning/feature/dialog/detail/ScrapDialog.kt | 1 - .../terning/feature/dialog/detail/ScrapDialogViewModel.kt | 1 - .../terning/feature/dialog/detail/component/ColorPalette.kt | 5 ----- .../dialog/detail/component/ScrapColorChangeButton.kt | 1 - 5 files changed, 9 deletions(-) diff --git a/core/src/main/java/com/terning/core/type/ColorType.kt b/core/src/main/java/com/terning/core/type/ColorType.kt index 073fc15d5..7d35c8f65 100644 --- a/core/src/main/java/com/terning/core/type/ColorType.kt +++ b/core/src/main/java/com/terning/core/type/ColorType.kt @@ -1,6 +1,5 @@ package com.terning.core.type -import android.util.Log import androidx.compose.ui.graphics.Color import com.terning.core.designsystem.theme.CalBlue2 import com.terning.core.designsystem.theme.CalBlueBc diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt index 24110f0cb..dab00bf86 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -50,7 +50,6 @@ import com.terning.feature.R import com.terning.feature.dialog.detail.component.ColorPalette import com.terning.feature.dialog.detail.component.ScrapColorChangeButton import com.terning.feature.intern.component.InternInfoRow -import timber.log.Timber @Composable diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt index e0510a3f6..8714c912a 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt @@ -25,7 +25,6 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject @HiltViewModel diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt index 13cbdfa0f..cfd6b160d 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt @@ -9,10 +9,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.CircleShape import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -23,7 +19,6 @@ import com.terning.core.R import com.terning.core.designsystem.component.item.RadioButtonGroups import com.terning.core.extension.noRippleClickable import com.terning.core.type.ColorType -import timber.log.Timber @Composable fun ColorPalette( diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt index 0850d024d..9015a3f77 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt @@ -23,7 +23,6 @@ import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.Grey150 import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningMain -import com.terning.core.designsystem.theme.TerningSub1 import com.terning.core.designsystem.theme.TerningSub4 import com.terning.core.designsystem.theme.TerningSub5 import com.terning.core.designsystem.theme.TerningTheme From c424ad61a83af434d38e625e9f2490267117f337 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 00:18:07 +0900 Subject: [PATCH 16/26] =?UTF-8?q?[FIX/#212]=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=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/dialog/detail/ScrapDialog.kt | 44 +++++---------- .../dialog/detail/ScrapDialogSideEffect.kt | 2 +- .../dialog/detail/ScrapDialogViewModel.kt | 56 ++++++++++++------- .../component/ScrapColorChangeButton.kt | 9 ++- .../feature/intern/component/InternInfoRow.kt | 3 +- 5 files changed, 59 insertions(+), 55 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt index dab00bf86..b52f0d124 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -76,29 +76,24 @@ fun ScrapDialog( .collect { sideEffect -> when (sideEffect) { is ScrapDialogSideEffect.ShowToast -> {} - is ScrapDialogSideEffect.DismissDialog -> onDismissRequest() - is ScrapDialogSideEffect.ChangedColor -> onClickChangeColor() - is ScrapDialogSideEffect.NavigateToDetail -> onClickNavigateButton( - internshipAnnouncementId - ) - + is ScrapDialogSideEffect.DismissDialog -> { + viewModel.initUiState() + onDismissRequest() + } + is ScrapDialogSideEffect.PatchedScrap -> onClickChangeColor() + is ScrapDialogSideEffect.NavigateToDetail -> onClickNavigateButton(internshipAnnouncementId) is ScrapDialogSideEffect.ScrappedAnnouncement -> {} } } } LaunchedEffect(true) { - with(viewModel) { - val colorType = ColorType.findColorType(scrapColor).takeIf { it != null } - colorType?.let { - updateInitialColorType(colorType) - updateSelectedColorType(colorType) - } - } + val colorType = ColorType.findColorType(scrapColor).takeIf { it != null } + colorType?.let { viewModel.setInitialAndSelectedColorType(it) } } TerningBasicDialog( - onDismissRequest = onDismissRequest + onDismissRequest = viewModel::navigateUp ) { ScrapDialogScreen( title = title, @@ -111,26 +106,13 @@ fun ScrapDialog( selectedColorType = uiState.selectedColorType, isColorChanged = uiState.isColorChanged, isColorChangedOnce = uiState.isColorChangedOnce, - onClickColorButton = { selectedColorType -> - with(viewModel) { - updateSelectedColorType(selectedColorType) - updateIsColorChanged() - } - }, + onClickColorButton = viewModel::changeSelectedColor, onClickColorChangeButton = { - with(viewModel) { - patchScrap(scrapId = scrapId, color = uiState.selectedColorType) - setIsColorChangedOnce() - updateInitialColorType(colorType = uiState.selectedColorType) - } - onClickChangeColor() + viewModel.patchScrap(scrapId = scrapId, color = uiState.selectedColorType) }, onClickNavigateButton = viewModel::navigateToDetail, onClickScrapButton = { - viewModel.postScrap( - internshipAnnouncementId, - uiState.selectedColorType - ) + viewModel.postScrap(internshipAnnouncementId, uiState.selectedColorType) } ) } @@ -215,7 +197,7 @@ private fun ScrapDialogScreen( ) { Text( text = stringResource(id = R.string.dialog_content_color_button), - style = TerningTheme.typography.body5, + style = TerningTheme.typography.body6, color = Grey400, ) } diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt index e964bf632..a471a583a 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt @@ -4,6 +4,6 @@ sealed class ScrapDialogSideEffect{ data class ShowToast(val message: Int): ScrapDialogSideEffect() data object DismissDialog : ScrapDialogSideEffect() data object ScrappedAnnouncement : ScrapDialogSideEffect() - data object ChangedColor: ScrapDialogSideEffect() + data object PatchedScrap: ScrapDialogSideEffect() data object NavigateToDetail : ScrapDialogSideEffect() } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt index 8714c912a..0cb9c5dfe 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt @@ -37,22 +37,42 @@ class ScrapDialogViewModel @Inject constructor( private var _sideEffect: MutableSharedFlow = MutableSharedFlow() val sideEffect = _sideEffect.asSharedFlow() - fun updateInitialColorType(colorType: ColorType) { + fun initUiState() { _uiState.update { currentState -> - currentState.copy(initialColorType = colorType) + currentState.copy( + isColorChanged = false, + isColorChangedOnce = false + ) } } - fun updateSelectedColorType(colorType: ColorType) { + fun setInitialAndSelectedColorType(colorType: ColorType) { _uiState.update { currentState -> - if (currentState.selectedColorType == colorType) return@update currentState - currentState.copy(selectedColorType = colorType) + currentState.copy( + initialColorType = colorType, + selectedColorType = colorType + ) } } - fun updateIsColorChanged() = _uiState.update { currentState -> - val isColorChanged = _uiState.value.selectedColorType != _uiState.value.initialColorType - currentState.copy(isColorChanged = isColorChanged) + fun changeSelectedColor(colorType: ColorType) { + _uiState.update { currentState -> + currentState.copy( + selectedColorType = colorType, + isColorChanged = colorType != _uiState.value.initialColorType + ) + } + } + + fun navigateToDetail() = viewModelScope.launch { + with(_sideEffect) { + emit(ScrapDialogSideEffect.NavigateToDetail) + emit(ScrapDialogSideEffect.DismissDialog) + } + } + + fun navigateUp() = viewModelScope.launch { + _sideEffect.emit(ScrapDialogSideEffect.DismissDialog) } fun postScrap(id: Long, color: ColorType) { @@ -74,23 +94,19 @@ class ScrapDialogViewModel @Inject constructor( val colorIndex = getColorIndex(color.main) scrapRepository.patchScrap(CalendarScrapRequest(scrapId, colorIndex)) .onSuccess { - _sideEffect.emit(ScrapDialogSideEffect.ChangedColor) - + _sideEffect.emit(ScrapDialogSideEffect.PatchedScrap) + _uiState.update { currentState -> + currentState.copy( + initialColorType = color, + isColorChanged = (_uiState.value.selectedColorType != color), + isColorChangedOnce = true, + ) + } }.onFailure { _sideEffect.emit(ScrapDialogSideEffect.ShowToast(R.string.server_failure)) } } - fun setIsColorChangedOnce() = _uiState.update { currentState -> - if (!currentState.isColorChangedOnce) return@update currentState - currentState.copy(isColorChangedOnce = true) - } - - fun navigateToDetail() = viewModelScope.launch { - _sideEffect.emit(ScrapDialogSideEffect.NavigateToDetail) - } - - private fun getColorIndex(color: Color): Int = listOf( CalRed, CalOrange1, diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt index 9015a3f77..d353d1ed4 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt @@ -29,6 +29,7 @@ import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.util.NoRippleTheme import com.terning.feature.R +import timber.log.Timber @Composable fun ScrapColorChangeButton( @@ -41,10 +42,14 @@ fun ScrapColorChangeButton( ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() + + Timber.tag("ScrapDialog") + .d("isColorChanged: $isColorChanged\nisColorChangedOnce: $isColorChangedOnce\nisPressed: $isPressed") + val backgroundColor = when { + isColorChangedOnce && !isColorChanged -> TerningSub4 isColorChanged && !isPressed -> White isColorChanged && isPressed -> TerningSub5 - isColorChangedOnce -> TerningSub4 else -> White } val textColor = when { @@ -76,7 +81,7 @@ fun ScrapColorChangeButton( color = borderColor ), shape = RoundedCornerShape(cornerRadius), - onClick = { onButtonClick() } + onClick = onButtonClick ) { Text( text = stringResource(id = text), 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 b01654710..34d23c16f 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 @@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.Black +import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.Grey500 import com.terning.core.designsystem.theme.TerningTheme @@ -19,7 +20,7 @@ fun InternInfoRow(title: String, value: String) { Text( text = title, style = TerningTheme.typography.body2, - color = Black, + color = Grey400, ) Text( text = value, From 40156b67a741dbe0f11a047008f243f2022fffde Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 00:45:40 +0900 Subject: [PATCH 17/26] =?UTF-8?q?[UI/#212]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=EC=B0=BD=20=EA=B8=B0=ED=83=80=20UI=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/dialog/TerningBasicDialog.kt | 3 +- .../com/terning/core/extension/TextStyle.kt | 11 ++++ .../feature/dialog/detail/ScrapDialog.kt | 63 ++++++++++--------- .../feature/intern/component/InternInfoRow.kt | 3 +- 4 files changed, 49 insertions(+), 31 deletions(-) create mode 100644 core/src/main/java/com/terning/core/extension/TextStyle.kt diff --git a/core/src/main/java/com/terning/core/designsystem/component/dialog/TerningBasicDialog.kt b/core/src/main/java/com/terning/core/designsystem/component/dialog/TerningBasicDialog.kt index 2264c1cf0..ab1df8a46 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/dialog/TerningBasicDialog.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/dialog/TerningBasicDialog.kt @@ -58,7 +58,8 @@ fun TerningBasicDialog( Row( modifier = Modifier .fillMaxWidth() - .padding(18.dp), + .padding(top = 18.dp, bottom = 16.dp) + .padding(horizontal = 16.dp), horizontalArrangement = Arrangement.End ) { Icon( diff --git a/core/src/main/java/com/terning/core/extension/TextStyle.kt b/core/src/main/java/com/terning/core/extension/TextStyle.kt new file mode 100644 index 000000000..b72217e3d --- /dev/null +++ b/core/src/main/java/com/terning/core/extension/TextStyle.kt @@ -0,0 +1,11 @@ +package com.terning.core.extension + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.Dp + +@Composable +fun TextStyle.getFixHeightByMaxLine(maxLine: Int): Dp = with(LocalDensity.current) { + lineHeight.toDp() * maxLine +} diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt index b52f0d124..7d55e0a74 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -39,12 +40,12 @@ import com.terning.core.designsystem.component.button.RoundButton import com.terning.core.designsystem.component.dialog.TerningBasicDialog import com.terning.core.designsystem.theme.Grey100 import com.terning.core.designsystem.theme.Grey200 -import com.terning.core.designsystem.theme.Grey350 import com.terning.core.designsystem.theme.Grey400 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.extension.getFixHeightByMaxLine import com.terning.core.type.ColorType import com.terning.feature.R import com.terning.feature.dialog.detail.component.ColorPalette @@ -80,8 +81,12 @@ fun ScrapDialog( viewModel.initUiState() onDismissRequest() } + is ScrapDialogSideEffect.PatchedScrap -> onClickChangeColor() - is ScrapDialogSideEffect.NavigateToDetail -> onClickNavigateButton(internshipAnnouncementId) + is ScrapDialogSideEffect.NavigateToDetail -> onClickNavigateButton( + internshipAnnouncementId + ) + is ScrapDialogSideEffect.ScrappedAnnouncement -> {} } } @@ -163,22 +168,25 @@ private fun ScrapDialogScreen( shape = RoundedCornerShape(size = 15.dp) ) ) - Text( - text = title, - textAlign = TextAlign.Center, - style = TerningTheme.typography.title4, - color = Grey500, - modifier = Modifier.padding(top = 20.dp) - ) - Text( - text = stringResource(id = R.string.dialog_scrap_mine), - style = TerningTheme.typography.body5, - color = Grey350, - modifier = Modifier.padding( - top = 4.dp + + Spacer(modifier = Modifier.height(15.dp)) + Box( + modifier = Modifier + .height(TerningTheme.typography.title4.getFixHeightByMaxLine(3)) + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + Text( + text = title, + textAlign = TextAlign.Center, + style = TerningTheme.typography.title4, + color = Grey500, + overflow = TextOverflow.Ellipsis, ) - ) - Spacer(modifier = Modifier.height(26.dp)) + } + + Spacer(modifier = Modifier.height(10.dp)) + Column( horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.Top, @@ -202,13 +210,10 @@ private fun ScrapDialogScreen( ) } + Spacer(modifier = Modifier.height(8.dp)) + Box( - modifier = Modifier - .fillMaxWidth() - .padding( - top = 12.dp, - bottom = 23.dp, - ), + modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center ) { ColorPalette( @@ -219,12 +224,12 @@ private fun ScrapDialogScreen( HorizontalDivider( thickness = 1.dp, color = Grey200, - modifier = Modifier.padding( - bottom = 8.dp - ) + modifier = Modifier.padding(vertical = 8.dp) ) + + Column( - modifier = Modifier.padding(bottom = 29.dp), + modifier = Modifier.padding(vertical = 4.dp), verticalArrangement = Arrangement.spacedBy( 5.dp, Alignment.CenterVertically @@ -246,6 +251,8 @@ private fun ScrapDialogScreen( } } + Spacer(modifier = Modifier.height(8.dp)) + if (isScrapped) { DetailScrapButton( isColorChanged = isColorChanged, @@ -312,7 +319,7 @@ private fun DetailScrapButton( private fun ScrapDialogPreview() { TerningPointTheme { ScrapDialogScreen( - title = "터닝 하반기 채용", + title = "터닝 하반기 채용터닝 하반기 채용터닝 하반기 채용터닝터닝 하반기 채용터닝터닝 하반기 채용터닝터닝 하반기 채용터닝터닝 하반기 채용터닝터닝 하반기 채용터닝 하반기 채용터닝 하반기 채용터닝 하반기 채용터닝 하반기 채용터닝 하반기 채용터닝 하반기 채용", deadline = "2024/09/07", startYear = 2024, startMonth = 11, 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 34d23c16f..073e4ae7b 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 @@ -6,7 +6,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.unit.dp -import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.Grey500 import com.terning.core.designsystem.theme.TerningTheme @@ -25,7 +24,7 @@ fun InternInfoRow(title: String, value: String) { Text( text = value, style = TerningTheme.typography.body3, - color = Grey500, + color = Grey400, ) } } \ No newline at end of file From dd3d48811e786f813ccea4f5d1913f5f3c05fdd2 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 01:00:12 +0900 Subject: [PATCH 18/26] =?UTF-8?q?[UI/#212]=20=EC=B7=A8=EC=86=8C=EC=B0=BD?= =?UTF-8?q?=20=EA=B8=B0=ED=83=80=20UI=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialog/cancel/ScrapCancelDialog.kt | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt index 8fb590437..a8ceed4b3 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -62,15 +63,11 @@ private fun ScrapCancelScreen( TerningBasicDialog( onDismissRequest = onDismissRequest ) { - Box( - modifier = Modifier - .fillMaxWidth() - .padding(top = 50.dp), - contentAlignment = Alignment.TopCenter - ) { Column( modifier = Modifier .fillMaxWidth() + .wrapContentHeight() + .padding(top = 60.dp) .padding(horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { @@ -78,22 +75,24 @@ private fun ScrapCancelScreen( jsonString = "terning_scrap_cancel.json", modifier = Modifier .fillMaxWidth() - .aspectRatio(1f) + .height(203.dp) ) + Spacer(modifier = Modifier.height(20.dp)) + Text( text = stringResource(id = R.string.dialog_content_scrap_cancel_main_title), textAlign = TextAlign.Center, style = TerningTheme.typography.title4, color = Grey500, ) + + Spacer(modifier = Modifier.height(5.dp)) + Text( text = stringResource(id = R.string.dialog_content_scrap_cancel_sub_title), style = TerningTheme.typography.body5, - color = Grey350, - modifier = Modifier.padding( - top = 5.dp - ) + color = Grey350 ) Spacer(modifier = Modifier.height(40.dp)) @@ -106,7 +105,7 @@ private fun ScrapCancelScreen( ) Spacer(modifier = Modifier.height(16.dp)) } - } + } } From 6f91c700c7956f13d320d398480c03d2d4fd133c Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 01:00:45 +0900 Subject: [PATCH 19/26] =?UTF-8?q?[DEL/#212]=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 --- .../java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt index a8ceed4b3..e5ab4b317 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -1,9 +1,7 @@ package com.terning.feature.dialog.cancel -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding From 222a636e6d04cc212623d963620d2e8d348ce778 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 01:13:27 +0900 Subject: [PATCH 20/26] =?UTF-8?q?[FIX/#212]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B2=84=ED=8A=BC=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/terning/feature/dialog/detail/ScrapDialog.kt | 1 + .../com/terning/feature/dialog/detail/ScrapDialogViewModel.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt index 7d55e0a74..7e7c304ad 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -113,6 +113,7 @@ fun ScrapDialog( isColorChangedOnce = uiState.isColorChangedOnce, onClickColorButton = viewModel::changeSelectedColor, onClickColorChangeButton = { + if(uiState.isColorChanged) viewModel.patchScrap(scrapId = scrapId, color = uiState.selectedColorType) }, onClickNavigateButton = viewModel::navigateToDetail, diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt index 0cb9c5dfe..9e2de8d01 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt @@ -98,7 +98,7 @@ class ScrapDialogViewModel @Inject constructor( _uiState.update { currentState -> currentState.copy( initialColorType = color, - isColorChanged = (_uiState.value.selectedColorType != color), + isColorChanged = false, isColorChangedOnce = true, ) } From ddc1cc1f391a62ecb4ce3f11b535bbc4564f98dd Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 01:34:11 +0900 Subject: [PATCH 21/26] =?UTF-8?q?[DEL/#212]=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 --- .../feature/dialog/detail/component/ScrapColorChangeButton.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt index d353d1ed4..bc322247d 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt @@ -43,9 +43,6 @@ fun ScrapColorChangeButton( val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() - Timber.tag("ScrapDialog") - .d("isColorChanged: $isColorChanged\nisColorChangedOnce: $isColorChangedOnce\nisPressed: $isPressed") - val backgroundColor = when { isColorChangedOnce && !isColorChanged -> TerningSub4 isColorChanged && !isPressed -> White From 536c53c47e1f720553767037a82c878fdb52d195 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 01:34:39 +0900 Subject: [PATCH 22/26] =?UTF-8?q?[DEL/#212]=20=EB=9D=BC=EC=9D=B4=EB=B8=8C?= =?UTF-8?q?=EB=9F=AC=EB=A6=AC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/dialog/detail/component/ScrapColorChangeButton.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt index bc322247d..59fe57c74 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ScrapColorChangeButton.kt @@ -29,7 +29,6 @@ import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.util.NoRippleTheme import com.terning.feature.R -import timber.log.Timber @Composable fun ScrapColorChangeButton( From 05ffbe0cc20f72dbdb4b9c204d0b4abb3fa9c52d Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 22:00:41 +0900 Subject: [PATCH 23/26] =?UTF-8?q?[REFACTOR/#212]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=20=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 --- .../component/dialog/TerningBasicDialog.kt | 10 ---------- .../feature/dialog/detail/component/ColorPalette.kt | 3 +-- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/core/src/main/java/com/terning/core/designsystem/component/dialog/TerningBasicDialog.kt b/core/src/main/java/com/terning/core/designsystem/component/dialog/TerningBasicDialog.kt index ab1df8a46..2adeeaaba 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/dialog/TerningBasicDialog.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/dialog/TerningBasicDialog.kt @@ -4,30 +4,20 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row -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.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.terning.core.R -import com.terning.core.designsystem.component.button.RoundButton import com.terning.core.designsystem.theme.Grey300 -import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White import com.terning.core.extension.noRippleClickable diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt b/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt index cfd6b160d..f752e464c 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/component/ColorPalette.kt @@ -26,7 +26,6 @@ fun ColorPalette( onColorSelected: (ColorType) -> Unit, modifier: Modifier = Modifier ) { - RadioButtonGroups( options = ColorType.entries, gridCellCount = ColorType.entries.size, @@ -90,7 +89,7 @@ internal fun ColorButton( if (isSelected) { Image( painter = painterResource(id = R.drawable.ic_color_check), - contentDescription = "" + contentDescription = "color selected" ) } } From 49b2275da9afd78101d2557dfe243f2155eccb36 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 22:00:59 +0900 Subject: [PATCH 24/26] =?UTF-8?q?[DOC/#212]=20RadioButtonGroups=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/component/item/RadioButtonGroups.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/src/main/java/com/terning/core/designsystem/component/item/RadioButtonGroups.kt b/core/src/main/java/com/terning/core/designsystem/component/item/RadioButtonGroups.kt index 3ed2d3919..13d28d93b 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/item/RadioButtonGroups.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/item/RadioButtonGroups.kt @@ -12,6 +12,18 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp +/** + * 라디오버튼 그룹을 관리하기 위한 컴포넌트입니다. + * + * @param options 라디오버튼에 표시될 옵션 목록입니다. + * @param buttonComposable 라디오버튼을 표시하는 컴포저블입니다. + * @param gridCellCount Row 하나에 들어갈 버튼 개수입니다. + * @param verticalArrangementSpace Row 간격입니다. + * @param horizontalArrangementSpace Column 간격입니다. + * @param modifier 수정자입니다. + * @param onOptionSelected 옵션이 선택되었을 때 호출되는 콜백입니다. + */ + @Composable fun RadioButtonGroups( options: List, From 0eac245133e69435a6f56b390f8a3ab82ed25bd6 Mon Sep 17 00:00:00 2001 From: boiledegg Date: Wed, 4 Sep 2024 22:09:26 +0900 Subject: [PATCH 25/26] =?UTF-8?q?[CHORE/#212]=20=EB=A6=AC=EC=86=8C?= =?UTF-8?q?=EC=8A=A4=20=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/feature/dialog/cancel/ScrapCancelSideEffect.kt | 4 +++- .../terning/feature/dialog/detail/ScrapDialogSideEffect.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt index c91071090..351729eaf 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt @@ -1,6 +1,8 @@ package com.terning.feature.dialog.cancel +import androidx.annotation.StringRes + sealed class ScrapCancelSideEffect{ - data class ShowToast(val message: Int): ScrapCancelSideEffect() + data class ShowToast(@StringRes val message: Int): ScrapCancelSideEffect() data object DismissDialog : ScrapCancelSideEffect() } \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt index a471a583a..67343309b 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt @@ -1,7 +1,9 @@ package com.terning.feature.dialog.detail +import androidx.annotation.StringRes + sealed class ScrapDialogSideEffect{ - data class ShowToast(val message: Int): ScrapDialogSideEffect() + data class ShowToast(@StringRes val message: Int): ScrapDialogSideEffect() data object DismissDialog : ScrapDialogSideEffect() data object ScrappedAnnouncement : ScrapDialogSideEffect() data object PatchedScrap: ScrapDialogSideEffect() From 571e43e2d21a11ea6ef2fbdb19b2602ba493c66d Mon Sep 17 00:00:00 2001 From: boiledegg Date: Thu, 5 Sep 2024 01:29:57 +0900 Subject: [PATCH 26/26] =?UTF-8?q?[UI/#212]=20=ED=86=A0=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/feature/dialog/cancel/ScrapCancelDialog.kt | 7 ++++++- .../feature/dialog/cancel/ScrapCancelViewModel.kt | 6 +++++- .../com/terning/feature/dialog/detail/ScrapDialog.kt | 9 +++++++-- .../feature/dialog/detail/ScrapDialogViewModel.kt | 2 +- feature/src/main/res/values/strings.xml | 2 ++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt index e5ab4b317..3e3c8fd77 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelDialog.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -25,6 +26,7 @@ import com.terning.core.designsystem.theme.Grey350 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.extension.toast import com.terning.feature.R @Composable @@ -33,6 +35,7 @@ fun ScrapCancelDialog( onDismissRequest: (Boolean) -> Unit, viewModel: ScrapCancelViewModel = hiltViewModel() ) { + val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) @@ -41,7 +44,9 @@ fun ScrapCancelDialog( is ScrapCancelSideEffect.DismissDialog -> { onDismissRequest(true) } - is ScrapCancelSideEffect.ShowToast -> {} + is ScrapCancelSideEffect.ShowToast -> { + context.toast(sideEffect.message) + } } } } diff --git a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt index beb35c20d..0cf47d3a2 100644 --- a/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt +++ b/feature/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelViewModel.kt @@ -23,7 +23,11 @@ class ScrapCancelViewModel @Inject constructor( ) = viewModelScope.launch { scrapRepository.deleteScrap(CalendarScrapRequest(scrapId, null)) .onSuccess { - _sideEffect.emit(ScrapCancelSideEffect.DismissDialog) + with(_sideEffect){ + emit(ScrapCancelSideEffect.DismissDialog) + emit(ScrapCancelSideEffect.ShowToast(R.string.dialog_scrap_cancelled)) + } + }.onFailure { _sideEffect.emit(ScrapCancelSideEffect.ShowToast(R.string.server_failure)) } diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt index 7e7c304ad..e160aea7a 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialog.kt @@ -46,6 +46,7 @@ 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.extension.getFixHeightByMaxLine +import com.terning.core.extension.toast import com.terning.core.type.ColorType import com.terning.feature.R import com.terning.feature.dialog.detail.component.ColorPalette @@ -70,13 +71,16 @@ fun ScrapDialog( onClickNavigateButton: (Long) -> Unit, viewModel: ScrapDialogViewModel = hiltViewModel() ) { + val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current val uiState by viewModel.uiState.collectAsStateWithLifecycle(lifecycleOwner = lifecycleOwner) LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { sideEffect -> when (sideEffect) { - is ScrapDialogSideEffect.ShowToast -> {} + is ScrapDialogSideEffect.ShowToast -> { + context.toast(sideEffect.message) + } is ScrapDialogSideEffect.DismissDialog -> { viewModel.initUiState() onDismissRequest() @@ -87,7 +91,8 @@ fun ScrapDialog( internshipAnnouncementId ) - is ScrapDialogSideEffect.ScrappedAnnouncement -> {} + is ScrapDialogSideEffect.ScrappedAnnouncement -> { + } } } } diff --git a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt index 9e2de8d01..3f08e2e4b 100644 --- a/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt +++ b/feature/src/main/java/com/terning/feature/dialog/detail/ScrapDialogViewModel.kt @@ -81,7 +81,7 @@ class ScrapDialogViewModel @Inject constructor( scrapRepository.postScrap(CalendarScrapRequest(id, colorIndex)) .onSuccess { with(_sideEffect) { - emit(ScrapDialogSideEffect.ShowToast(R.string.intern_scrap_add_toast_message)) + emit(ScrapDialogSideEffect.ShowToast(R.string.dialog_scrap_scrapped)) emit(ScrapDialogSideEffect.ScrappedAnnouncement) } }.onFailure { diff --git a/feature/src/main/res/values/strings.xml b/feature/src/main/res/values/strings.xml index 46b78e88f..9f970dce3 100644 --- a/feature/src/main/res/values/strings.xml +++ b/feature/src/main/res/values/strings.xml @@ -70,6 +70,8 @@ 내가 스크랩한 관심 공고에요! 공고 상세 정보 보기 오늘 마감되는 공고예요! + 관심 공고가 캘린더에 스크랩되었어요! + 관심 공고가 캘린더에서 사라졌어요! 오늘 마감되는 %s님의 관심 공고