From b37ac1e6e6de0b2e0800c2f2b412079416a93200 Mon Sep 17 00:00:00 2001 From: mj010504 Date: Wed, 25 Feb 2026 21:17:13 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[NDGL-72]=20chore:=20AddPlaceEvent=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EB=A7=A4=EA=B0=9C?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/ndgl/data/travel/model/AddPlaceEvent.kt | 4 ---- .../feature/travel/additinerary/AddItineraryViewModel.kt | 8 -------- 2 files changed, 12 deletions(-) diff --git a/data/travel/src/main/java/com/yapp/ndgl/data/travel/model/AddPlaceEvent.kt b/data/travel/src/main/java/com/yapp/ndgl/data/travel/model/AddPlaceEvent.kt index a3ac21f0..da85c558 100644 --- a/data/travel/src/main/java/com/yapp/ndgl/data/travel/model/AddPlaceEvent.kt +++ b/data/travel/src/main/java/com/yapp/ndgl/data/travel/model/AddPlaceEvent.kt @@ -12,8 +12,4 @@ data class AddPlaceEvent( val address: String?, val phoneNumber: String?, val googleMapsUri: String?, - val websiteUrl: String?, - val rating: Double?, - val userRatingCount: Int?, - val estimatedDuration: Int, // 분 단위 ) diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryViewModel.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryViewModel.kt index ab633f21..e8cb1490 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryViewModel.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryViewModel.kt @@ -295,10 +295,6 @@ class AddItineraryViewModel @AssistedInject constructor( address = placeInfo.address, phoneNumber = placeInfo.phoneNumber, googleMapsUri = placeInfo.googleMapsUri, - websiteUrl = placeInfo.websiteUrl, - rating = placeInfo.rating, - userRatingCount = placeInfo.userRatingCount, - estimatedDuration = placeInfo.estimatedDuration.inWholeMinutes.toInt(), ), ) postSideEffect(AddItinerarySideEffect.NavigateBack) @@ -327,10 +323,6 @@ class AddItineraryViewModel @AssistedInject constructor( phoneNumber = placeDetail.place.nationalPhoneNumber ?: placeDetail.place.internationalPhoneNumber, googleMapsUri = placeDetail.place.googleMapsUri, - websiteUrl = placeDetail.place.websiteUri, - rating = placeDetail.place.rating, - userRatingCount = placeDetail.place.userRatingCount, - estimatedDuration = 60, // 기본값 60분 ), ) postSideEffect(AddItinerarySideEffect.NavigateBack) From 0c076b9874643e6b9ab60810552c0df24a60e8ba Mon Sep 17 00:00:00 2001 From: mj010504 Date: Wed, 25 Feb 2026 21:17:33 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[NDGL-72]=20design:=20NDGLSnackbar=20?= =?UTF-8?q?=EC=A0=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ndgl/core/ui/designsystem/NDGLSnackbar.kt | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 core/ui/src/main/java/com/yapp/ndgl/core/ui/designsystem/NDGLSnackbar.kt diff --git a/core/ui/src/main/java/com/yapp/ndgl/core/ui/designsystem/NDGLSnackbar.kt b/core/ui/src/main/java/com/yapp/ndgl/core/ui/designsystem/NDGLSnackbar.kt new file mode 100644 index 00000000..c9326ea0 --- /dev/null +++ b/core/ui/src/main/java/com/yapp/ndgl/core/ui/designsystem/NDGLSnackbar.kt @@ -0,0 +1,68 @@ +package com.yapp.ndgl.core.ui.designsystem + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.SnackbarData +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarVisuals +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +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.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.yapp.ndgl.core.ui.theme.NDGLTheme +import com.yapp.ndgl.core.ui.util.dropShadow + +@Composable +fun NDGLSnackbar( + modifier: Modifier = Modifier, + snackbarData: SnackbarData, +) { + val message = snackbarData.visuals.message + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + .dropShadow(shape = RoundedCornerShape(8.dp), color = Color.Black.copy(alpha = 0.12f), offsetY = 3.dp, blur = 8.dp) + .clip(RoundedCornerShape(8.dp)) + .background(NDGLTheme.colors.black500) + .padding(vertical = 14.dp, horizontal = 20.dp), + ) { + Text( + text = message, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + style = NDGLTheme.typography.bodyMdSemiBold, + color = NDGLTheme.colors.white, + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun NDGLSnackbarPreview() { + NDGLTheme { + NDGLSnackbar( + snackbarData = object : SnackbarData { + override val visuals: SnackbarVisuals = object : SnackbarVisuals { + override val actionLabel = null + override val duration = SnackbarDuration.Short + override val message = "교통수단이 변경되었습니다" + override val withDismissAction = false + } + + override fun dismiss() { /* No-op */ } + override fun performAction() { /* No-op */ } + }, + ) + } +} From f31e9b2d43068b91e05616710bc727bde54e8138 Mon Sep 17 00:00:00 2001 From: mj010504 Date: Wed, 25 Feb 2026 21:18:22 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[NDGL-72]=20feature:=20=EC=8A=A4=EB=82=B5?= =?UTF-8?q?=EB=B0=94=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=83=81=ED=98=B8?= =?UTF-8?q?=EC=9E=91=EC=9A=A9=20=EC=B6=94=EA=B0=80=20-=20=EB=82=B4=20?= =?UTF-8?q?=EC=97=AC=ED=96=89=EC=97=90=20=EC=9E=A5=EC=86=8C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20PlanB=20=EC=9E=A5=EC=86=8C=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20-=20=EA=B5=90=ED=86=B5=EC=88=98=EB=8B=A8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20-=20=EC=9E=A5=EC=86=8C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../traveldetail/TravelDetailContract.kt | 15 ++- .../travel/traveldetail/TravelDetailScreen.kt | 123 ++++++++++-------- .../traveldetail/TravelDetailViewModel.kt | 19 ++- 3 files changed, 95 insertions(+), 62 deletions(-) diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt index 1c3553d3..b96a27cd 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt @@ -62,9 +62,10 @@ data class TravelDetailState( ?.let { LatLng(it.placeInfo.latitude, it.placeInfo.longitude) } ?: LatLng(37.5665, 126.9780) // FIXME: 모든 일차가 비어 있다면 '서울' 좌표 반환 } - // 헤더(0) + stickyHeader(1) + 맵 아이템(2) = 3개가 장소 아이템 앞에 위치 - val placesOffset: Int - get() = 3 + companion object { + // 헤더(0) + stickyHeader(1) + 맵 아이템(2) = 3개가 장소 아이템 앞에 위치 + const val PLACES_OFFSET = 3 + } } data class Itinerary( @@ -158,4 +159,12 @@ sealed interface TravelDetailSideEffect : UiSideEffect { data object NavigateToMyTravel : TravelDetailSideEffect data class ScrollToPlace(val placeId: Long) : TravelDetailSideEffect data class AnimatePlaceChange(val googlePlaceId: String) : TravelDetailSideEffect + data class ShowSnackbar(val message: String) : TravelDetailSideEffect + + companion object { + const val SNACKBAR_ADDED_TO_MY_TRAVEL = "내 여행에 추가되었습니다" + const val SNACKBAR_PLACE_CHANGED = "장소가 변경되었습니다" + const val SNACKBAR_TRANSPORT_CHANGED = "교통수단이 변경되었습니다" + const val SNACKBAR_PLACE_DELETED = "장소가 삭제되었습니다" + } } diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailScreen.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailScreen.kt index 113ec301..4f7c3c91 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailScreen.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailScreen.kt @@ -9,15 +9,14 @@ import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.itemsIndexed @@ -26,6 +25,9 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf @@ -62,6 +64,7 @@ import com.yapp.ndgl.core.ui.designsystem.NDGLModal import com.yapp.ndgl.core.ui.designsystem.NDGLNavigationBar import com.yapp.ndgl.core.ui.designsystem.NDGLNavigationBarAttr import com.yapp.ndgl.core.ui.designsystem.NDGLNavigationIcon +import com.yapp.ndgl.core.ui.designsystem.NDGLSnackbar import com.yapp.ndgl.core.ui.theme.NDGLTheme import com.yapp.ndgl.core.ui.util.dropShadow import com.yapp.ndgl.core.ui.util.launchBrowser @@ -106,6 +109,7 @@ internal fun TravelDetailRoute( val context = LocalContext.current val listState = rememberLazyListState() val coroutineScope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } viewModel.collectSideEffect { sideEffect -> when (sideEffect) { @@ -144,7 +148,7 @@ internal fun TravelDetailRoute( val placeIndex = places.indexOfFirst { it.id == sideEffect.placeId } if (placeIndex >= 0) { - val targetIndex = state.placesOffset + placeIndex + val targetIndex = TravelDetailState.PLACES_OFFSET + placeIndex delay(100) listState.animateScrollToItem(targetIndex) } @@ -158,60 +162,77 @@ internal fun TravelDetailRoute( val placeIndex = places.indexOfFirst { it.placeInfo.googlePlaceId == sideEffect.googlePlaceId } if (placeIndex >= 0) { - val targetIndex = state.placesOffset + placeIndex + val targetIndex = TravelDetailState.PLACES_OFFSET + placeIndex delay(100) listState.animateScrollToItem(targetIndex) } } } + + is TravelDetailSideEffect.ShowSnackbar -> { + coroutineScope.launch { + snackbarHostState.showSnackbar(sideEffect.message) + } + } } } - TravelDetailScreen( - state = state, - listState = listState, - clickBack = { viewModel.onIntent(TravelDetailIntent.ClickBack) }, - selectDay = { viewModel.onIntent(TravelDetailIntent.SelectDay(it)) }, - clickStartTimeSetting = { viewModel.onIntent(TravelDetailIntent.ClickStartTimeSetting) }, - clickEditTravel = { viewModel.onIntent(TravelDetailIntent.ClickEditTravel) }, - clickAddScheduleButton = { viewModel.onIntent(TravelDetailIntent.ClickAddScheduleButton) }, - checkPlaceItem = { placeId -> - viewModel.onIntent(TravelDetailIntent.CheckPlaceItem(placeId)) - }, - checkSelectAll = { viewModel.onIntent(TravelDetailIntent.CheckSelectAll) }, - clickDeleteSelectedPlaces = { viewModel.onIntent(TravelDetailIntent.ClickDeleteSelectedPlaces) }, - confirmDeleteSelectedPlaces = { viewModel.onIntent(TravelDetailIntent.ConfirmDeleteSelectedPlaces) }, - dismissDeleteModal = { viewModel.onIntent(TravelDetailIntent.DismissDeleteModal) }, - confirmCancelEditMode = { viewModel.onIntent(TravelDetailIntent.ConfirmCancelEditMode) }, - dismissCancelEditModal = { viewModel.onIntent(TravelDetailIntent.DismissCancelEditModal) }, - longClickPlaceItem = { viewModel.onIntent(TravelDetailIntent.LongClickPlaceItem) }, - dismissStartTimeSettingBottomSheet = { viewModel.onIntent(TravelDetailIntent.DismissStartTimeSettingBottomSheet) }, - confirmStartTimeSetting = { startTime -> viewModel.onIntent(TravelDetailIntent.ConfirmStartTimeSetting(startTime)) }, - reorderPlaces = { dayIndex, fromIndex, toIndex -> viewModel.onIntent(TravelDetailIntent.ReorderPlaces(dayIndex, fromIndex, toIndex)) }, - clickTransportSegment = { place -> viewModel.onIntent(TravelDetailIntent.ClickTransportSegment(place)) }, - confirmChangeTransport = { segment -> viewModel.onIntent(TravelDetailIntent.ConfirmChangeTransportSegment(segment)) }, - dismissTransportBottomSheet = { viewModel.onIntent(TravelDetailIntent.DismissTransportBottomSheet) }, - confirmEditMode = { viewModel.onIntent(TravelDetailIntent.ConfirmEditMode) }, - clickPlaceItem = { viewModel.onIntent(TravelDetailIntent.ClickPlaceItem(it)) }, - dismissPlaceBottomSheet = { viewModel.onIntent(TravelDetailIntent.DismissPlaceBottomSheet) }, - navigateToTravelPlaceDetail = { viewModel.onIntent(TravelDetailIntent.NavigateToTravelPlaceDetail(it)) }, - clickAddTime = { viewModel.onIntent(TravelDetailIntent.ClickAddTime(it)) }, - clickAddMemo = { viewModel.onIntent(TravelDetailIntent.ClickAddMemo(it)) }, - clickAddCost = { viewModel.onIntent(TravelDetailIntent.ClickAddCost(it)) }, - clickFindRoute = { viewModel.onIntent(TravelDetailIntent.ClickFindRoute(it)) }, - dismissTimeBottomSheet = { viewModel.onIntent(TravelDetailIntent.DismissTimeBottomSheet) }, - confirmDuration = { - viewModel.onIntent(TravelDetailIntent.ConfirmDuration(it)) + Scaffold( + modifier = Modifier.fillMaxSize(), + snackbarHost = { + SnackbarHost(snackbarHostState) { data -> + NDGLSnackbar(modifier = Modifier.padding(bottom = 106.dp), snackbarData = data) + } }, - dismissCostModal = { viewModel.onIntent(TravelDetailIntent.DismissCostModal) }, - confirmCost = { viewModel.onIntent(TravelDetailIntent.ConfirmCost(it)) }, - dismissMemoModal = { viewModel.onIntent(TravelDetailIntent.DismissMemoModal) }, - confirmMemo = { viewModel.onIntent(TravelDetailIntent.ConfirmMemo(it)) }, - ) + ) { innerPadding -> + TravelDetailScreen( + innerPadding = innerPadding, + state = state, + listState = listState, + clickBack = { viewModel.onIntent(TravelDetailIntent.ClickBack) }, + selectDay = { viewModel.onIntent(TravelDetailIntent.SelectDay(it)) }, + clickStartTimeSetting = { viewModel.onIntent(TravelDetailIntent.ClickStartTimeSetting) }, + clickEditTravel = { viewModel.onIntent(TravelDetailIntent.ClickEditTravel) }, + clickAddScheduleButton = { viewModel.onIntent(TravelDetailIntent.ClickAddScheduleButton) }, + checkPlaceItem = { placeId -> + viewModel.onIntent(TravelDetailIntent.CheckPlaceItem(placeId)) + }, + checkSelectAll = { viewModel.onIntent(TravelDetailIntent.CheckSelectAll) }, + clickDeleteSelectedPlaces = { viewModel.onIntent(TravelDetailIntent.ClickDeleteSelectedPlaces) }, + confirmDeleteSelectedPlaces = { viewModel.onIntent(TravelDetailIntent.ConfirmDeleteSelectedPlaces) }, + dismissDeleteModal = { viewModel.onIntent(TravelDetailIntent.DismissDeleteModal) }, + confirmCancelEditMode = { viewModel.onIntent(TravelDetailIntent.ConfirmCancelEditMode) }, + dismissCancelEditModal = { viewModel.onIntent(TravelDetailIntent.DismissCancelEditModal) }, + longClickPlaceItem = { viewModel.onIntent(TravelDetailIntent.LongClickPlaceItem) }, + dismissStartTimeSettingBottomSheet = { viewModel.onIntent(TravelDetailIntent.DismissStartTimeSettingBottomSheet) }, + confirmStartTimeSetting = { startTime -> viewModel.onIntent(TravelDetailIntent.ConfirmStartTimeSetting(startTime)) }, + reorderPlaces = { dayIndex, fromIndex, toIndex -> viewModel.onIntent(TravelDetailIntent.ReorderPlaces(dayIndex, fromIndex, toIndex)) }, + clickTransportSegment = { place -> viewModel.onIntent(TravelDetailIntent.ClickTransportSegment(place)) }, + confirmChangeTransport = { segment -> viewModel.onIntent(TravelDetailIntent.ConfirmChangeTransportSegment(segment)) }, + dismissTransportBottomSheet = { viewModel.onIntent(TravelDetailIntent.DismissTransportBottomSheet) }, + confirmEditMode = { viewModel.onIntent(TravelDetailIntent.ConfirmEditMode) }, + clickPlaceItem = { viewModel.onIntent(TravelDetailIntent.ClickPlaceItem(it)) }, + dismissPlaceBottomSheet = { viewModel.onIntent(TravelDetailIntent.DismissPlaceBottomSheet) }, + navigateToTravelPlaceDetail = { viewModel.onIntent(TravelDetailIntent.NavigateToTravelPlaceDetail(it)) }, + clickAddTime = { viewModel.onIntent(TravelDetailIntent.ClickAddTime(it)) }, + clickAddMemo = { viewModel.onIntent(TravelDetailIntent.ClickAddMemo(it)) }, + clickAddCost = { viewModel.onIntent(TravelDetailIntent.ClickAddCost(it)) }, + clickFindRoute = { viewModel.onIntent(TravelDetailIntent.ClickFindRoute(it)) }, + dismissTimeBottomSheet = { viewModel.onIntent(TravelDetailIntent.DismissTimeBottomSheet) }, + confirmDuration = { + viewModel.onIntent(TravelDetailIntent.ConfirmDuration(it)) + }, + dismissCostModal = { viewModel.onIntent(TravelDetailIntent.DismissCostModal) }, + confirmCost = { viewModel.onIntent(TravelDetailIntent.ConfirmCost(it)) }, + dismissMemoModal = { viewModel.onIntent(TravelDetailIntent.DismissMemoModal) }, + confirmMemo = { viewModel.onIntent(TravelDetailIntent.ConfirmMemo(it)) }, + ) + } } @Composable private fun TravelDetailScreen( + innerPadding: PaddingValues = PaddingValues(), state: TravelDetailState, listState: LazyListState, clickBack: () -> Unit, @@ -274,7 +295,7 @@ private fun TravelDetailScreen( val reorderableState = rememberReorderableState( list = tempPlaces, lazyListState = listState, - offset = state.placesOffset, + offset = TravelDetailState.PLACES_OFFSET, isReorderable = { key -> key is String && key.startsWith("place_") }, ) var isDragMode by remember { mutableStateOf(false) } @@ -283,7 +304,7 @@ private fun TravelDetailScreen( modifier = Modifier .fillMaxSize() .background(NDGLTheme.colors.white) - .navigationBarsPadding(), + .padding(bottom = innerPadding.calculateBottomPadding()), ) { LazyColumn( state = listState, @@ -295,7 +316,7 @@ private fun TravelDetailScreen( if (state.isEditMode) { Modifier.reorderable(reorderableState) { from, to -> if (from != null && to != null && from != to) { - reorderPlaces(state.selectedDay - 1, from - state.placesOffset, to - state.placesOffset) + reorderPlaces(state.selectedDay - 1, from - TravelDetailState.PLACES_OFFSET, to - TravelDetailState.PLACES_OFFSET) } } } else { @@ -309,7 +330,7 @@ private fun TravelDetailScreen( .fillMaxWidth() .clip(shape = RoundedCornerShape(bottomStart = 16.dp, bottomEnd = 16.dp)) .background(NDGLTheme.colors.black50) - .statusBarsPadding(), + .padding(top = innerPadding.calculateTopPadding()), ) { NDGLNavigationBar( textAlignType = NDGLNavigationBarAttr.TextAlignType.START, @@ -333,9 +354,7 @@ private fun TravelDetailScreen( .background(NDGLTheme.colors.white) .then( if (isHeaderSticky) { - Modifier - .statusBarsPadding() - .padding(top = 10.dp) + Modifier.padding(top = innerPadding.calculateTopPadding() + 10.dp) } else { Modifier.padding(top = 22.dp) }, @@ -416,7 +435,7 @@ private fun TravelDetailScreen( items = tempPlaces, key = { _, place -> "place_${state.selectedDay}_${place.id}" }, ) { index, place -> - val isDragging = reorderableState.currentIndex == index + state.placesOffset + val isDragging = reorderableState.currentIndex == index + TravelDetailState.PLACES_OFFSET Box( modifier = Modifier .animateItem() diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt index c15adda9..de47efeb 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt @@ -133,7 +133,7 @@ class TravelDetailViewModel @AssistedInject constructor( null } - val (distanceKm, transportation) = if (!currentItinerary.places.isNullOrEmpty()) { + val (distanceKm, transportation) = if (currentItinerary.places.isNotEmpty()) { newTransportSegment?.distanceKm to listOfNotNull(newTransportSegment?.toTransportationItem()) } else { null to null @@ -149,13 +149,12 @@ class TravelDetailViewModel @AssistedInject constructor( null } else { ( - lastPlace.startTime + lastPlace.placeInfo.estimatedDuration + ( - newTransportSegment?.duration - ?: 0.hours - ) - ).parseDurationToTimeString() + lastPlace.startTime + lastPlace.placeInfo.estimatedDuration + + (newTransportSegment?.duration ?: 0.hours) + ) + .parseDurationToTimeString() }, - estimatedDuration = event.estimatedDuration, + estimatedDuration = 60, cost = null, memo = null, distanceKm = distanceKm, @@ -215,6 +214,7 @@ class TravelDetailViewModel @AssistedInject constructor( } postSideEffect(TravelDetailSideEffect.ScrollToPlace(newPlace.id)) + postSideEffect(TravelDetailSideEffect.ShowSnackbar(TravelDetailSideEffect.SNACKBAR_ADDED_TO_MY_TRAVEL)) }.onFailure { // TODO: Handle API failure } @@ -269,6 +269,7 @@ class TravelDetailViewModel @AssistedInject constructor( } postSideEffect(TravelDetailSideEffect.AnimatePlaceChange(event.newGooglePlaceId)) + postSideEffect(TravelDetailSideEffect.ShowSnackbar(TravelDetailSideEffect.SNACKBAR_PLACE_CHANGED)) }.onFailure { // TODO: 에러 처리 } @@ -355,6 +356,8 @@ class TravelDetailViewModel @AssistedInject constructor( showDeleteModal = false, ) } + + postSideEffect(TravelDetailSideEffect.ShowSnackbar(TravelDetailSideEffect.SNACKBAR_PLACE_DELETED)) } private fun dismissDeleteModal() { @@ -562,6 +565,8 @@ class TravelDetailViewModel @AssistedInject constructor( availableTransports = emptyList(), ) } + + postSideEffect(TravelDetailSideEffect.ShowSnackbar(TravelDetailSideEffect.SNACKBAR_TRANSPORT_CHANGED)) }.onFailure { // TODO: Handle failure } From 40e1be6a7818ee94b11664dc681e883620116290 Mon Sep 17 00:00:00 2001 From: mj010504 Date: Wed, 25 Feb 2026 21:44:01 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[NDGL-72]=20fix:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=84=A4=EC=A0=95=ED=95=9C=20=EC=B2=B4?= =?UTF-8?q?=EB=A5=98=20=EC=8B=9C=EA=B0=84=EC=9D=84=20=EB=B0=98=EC=98=81?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt index de47efeb..7660f3c3 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt @@ -149,7 +149,7 @@ class TravelDetailViewModel @AssistedInject constructor( null } else { ( - lastPlace.startTime + lastPlace.placeInfo.estimatedDuration + + lastPlace.startTime + lastPlace.userData.estimatedDuration + (newTransportSegment?.duration ?: 0.hours) ) .parseDurationToTimeString()