@@ -71,6 +71,7 @@ import com.yapp.ndgl.feature.travel.traveldetail.component.EditablePlaceItem
7171import com.yapp.ndgl.feature.travel.traveldetail.component.PlaceBottomSheet
7272import com.yapp.ndgl.feature.travel.traveldetail.component.PlaceItem
7373import com.yapp.ndgl.feature.travel.traveldetail.component.TimelineContent
74+ import com.yapp.ndgl.feature.travel.traveldetail.component.TransportBottomSheet
7475import com.yapp.ndgl.feature.travel.traveldetail.component.TransportSegment
7576import com.yapp.ndgl.feature.travel.traveldetail.component.TravelDetailToolBar
7677import com.yapp.ndgl.feature.travel.traveldetail.component.TravelMap
@@ -121,6 +122,9 @@ internal fun TravelDetailRoute(
121122 dismissTimelineBottomSheet = { viewModel.onIntent(TravelDetailIntent .DismissTimelineBottomSheet ) },
122123 confirmTimelineSetting = { startTime -> viewModel.onIntent(TravelDetailIntent .ConfirmTimelineSetting (startTime)) },
123124 reorderPlaces = { dayIndex, fromIndex, toIndex -> viewModel.onIntent(TravelDetailIntent .ReorderPlaces (dayIndex, fromIndex, toIndex)) },
125+ clickTransportSegment = { place -> viewModel.onIntent(TravelDetailIntent .ClickTransportSegment (place)) },
126+ confirmChangeTransport = { segment -> viewModel.onIntent(TravelDetailIntent .ConfirmChangeTransportSegment (segment)) },
127+ dismissTransportBottomSheet = { viewModel.onIntent(TravelDetailIntent .DismissTransportBottomSheet ) },
124128 confirmEditMode = { viewModel.onIntent(TravelDetailIntent .ConfirmEditMode ) },
125129 clickPlaceItem = { viewModel.onIntent(TravelDetailIntent .ClickPlaceItem (it)) },
126130 dismissPlaceBottomSheet = { viewModel.onIntent(TravelDetailIntent .DismissPlaceBottomSheet ) },
@@ -160,6 +164,9 @@ private fun TravelDetailScreen(
160164 confirmTimelineSetting : (Duration ) -> Unit ,
161165 reorderPlaces : (Int , Int , Int ) -> Unit ,
162166 confirmEditMode : () -> Unit ,
167+ clickTransportSegment : (TravelPlace ) -> Unit ,
168+ confirmChangeTransport : (TransportSegment ) -> Unit ,
169+ dismissTransportBottomSheet : () -> Unit ,
163170 clickPlaceItem : (TravelPlace ) -> Unit ,
164171 clickAddTime : (Int ) -> Unit ,
165172 clickAddMemo : (Int ) -> Unit ,
@@ -198,7 +205,6 @@ private fun TravelDetailScreen(
198205 val currentItineraries = if (state.isEditMode) state.tempItineraries else state.itineraries
199206 val currentItinerary = currentItineraries.getOrNull(state.selectedDay - 1 )
200207 val currentPlaces = currentItinerary?.places.orEmpty()
201- val currentTransportSegments = currentItinerary?.transportSegments.orEmpty()
202208
203209 // 헤더(0) + stickyHeader(1) + 맵 아이템(2) = 3개가 장소 아이템 앞에 위치
204210 val placesOffset = 3
@@ -309,7 +315,7 @@ private fun TravelDetailScreen(
309315 )
310316 } else {
311317 TravelDetailToolBar (
312- startTime = state .startTime,
318+ startTime = itinerary .startTime,
313319 clickStartTimeSetting = clickStartTimeSetting,
314320 clickEditTravel = clickEditTravel,
315321 )
@@ -366,14 +372,6 @@ private fun TravelDetailScreen(
366372 checked = state.selectedPlaceIds.contains(place.id),
367373 onCheck = { checkPlaceItem(place.id) },
368374 )
369-
370- // if (isDragging) {
371- // Box(
372- // modifier = Modifier
373- // .matchParentSize()
374- // .background(NDGLTheme.colors.black50.copy(0.9f)),
375- // )
376- // }
377375 }
378376 }
379377 } else {
@@ -397,9 +395,9 @@ private fun TravelDetailScreen(
397395
398396 if (index < currentPlaces.size - 1 ) {
399397 key(" transport_${state.selectedDay} _${place.id} " ) {
400- currentTransportSegments.getOrNull(index) ?.let { segment ->
398+ place.transportToNext ?.let { segment ->
401399 Box (modifier = Modifier .padding(horizontal = 24 .dp)) {
402- TransportSegment (segment = segment)
400+ TransportSegment (segment = segment, onClick = { clickTransportSegment(place) } )
403401 }
404402 }
405403 }
@@ -498,13 +496,32 @@ private fun TravelDetailScreen(
498496 title = stringResource(R .string.schedule_setting_title),
499497 ) {
500498 TimelineContent (
501- startTime = state .startTime ? : 8 .hours,
499+ startTime = currentItinerary? .startTime ? : 8 .hours,
502500 totalDuration = state.itineraries.getOrNull(state.selectedDay - 1 )?.totalDuration ? : 0 .hours,
503501 onConfirm = confirmTimelineSetting,
504502 )
505503 }
506504 }
507505
506+ if (state.showTransportBottomSheet && state.selectedPlace != null && state.selectedPlace.transportToNext != null ) {
507+ // TODO: 실제 교통수단 후보로 수정
508+ val mockAvailableTransports = mutableListOf (
509+ TransportSegment (TransportType .WALK , 15 .minutes, 1200 ),
510+ TransportSegment (TransportType .CAR , 10 .minutes, 5400 ),
511+ TransportSegment (TransportType .BUS , 25 .minutes, 4800 ),
512+ TransportSegment (TransportType .TRAIN , 40 .minutes, 12000 ),
513+ )
514+ mockAvailableTransports.remove(state.selectedPlace.transportToNext)
515+ mockAvailableTransports.add(state.selectedPlace.transportToNext)
516+
517+ TransportBottomSheet (
518+ initialTransport = state.selectedPlace.transportToNext,
519+ availableTransports = mockAvailableTransports,
520+ onDismissRequest = dismissTransportBottomSheet,
521+ onConfirm = confirmChangeTransport,
522+ )
523+ }
524+
508525 if (state.showPlaceBottomSheet && state.selectedPlace != null ) {
509526 PlaceBottomSheet (
510527 place = state.selectedPlace,
@@ -614,7 +631,6 @@ private fun TravelDetailScreenPreview() {
614631 selectedDay = 1 ,
615632 itineraries = listOf (
616633 Itinerary (
617- budget = Budget (300000 ),
618634 places = listOf (
619635 TravelPlace (
620636 id = 1 ,
@@ -629,7 +645,8 @@ private fun TravelDetailScreenPreview() {
629645 googleMapsUri = " " ,
630646 placeType = PlaceType .ATTRACTION ,
631647 userData = TravelPlace .UserData (estimatedDuration = 90 .minutes),
632- startTime = 0 .hours,
648+ transportToNext = TransportSegment (type = TransportType .CAR , duration = 25 .minutes, distance = 3500 ),
649+ startTime = 8 .hours,
633650 ),
634651 TravelPlace (
635652 id = 2 ,
@@ -645,13 +662,7 @@ private fun TravelDetailScreenPreview() {
645662 placeType = PlaceType .RESTAURANT ,
646663 userData = TravelPlace .UserData (estimatedDuration = 60 .minutes),
647664 startTime = 0 .hours,
648- ),
649- ),
650- transportSegments = listOf (
651- TransportSegment (
652- type = TransportType .CAR ,
653- duration = 25 .minutes,
654- distance = 3500 ,
665+ transportToNext = null ,
655666 ),
656667 ),
657668 ),
@@ -689,6 +700,9 @@ private fun TravelDetailScreenPreview() {
689700 confirmCost = { _ -> },
690701 dismissMemoModal = {},
691702 confirmMemo = { _ -> },
703+ clickTransportSegment = {},
704+ confirmChangeTransport = { _ -> },
705+ dismissTransportBottomSheet = {},
692706 )
693707 }
694708}
@@ -718,7 +732,6 @@ private fun TravelDetailScreenEditModePreview() {
718732 selectedDay = 1 ,
719733 itineraries = listOf (
720734 Itinerary (
721- budget = Budget (300000 ),
722735 places = listOf (
723736 TravelPlace (
724737 id = 1 ,
@@ -733,6 +746,7 @@ private fun TravelDetailScreenEditModePreview() {
733746 googleMapsUri = " " ,
734747 placeType = PlaceType .ATTRACTION ,
735748 userData = TravelPlace .UserData (estimatedDuration = 90 .minutes),
749+ transportToNext = TransportSegment (type = TransportType .CAR , duration = 25 .minutes, distance = 3500 ),
736750 startTime = 0 .hours,
737751 ),
738752 TravelPlace (
@@ -747,14 +761,9 @@ private fun TravelDetailScreenEditModePreview() {
747761 regularOpeningHours = " 11:00~22:00" ,
748762 googleMapsUri = " " ,
749763 placeType = PlaceType .RESTAURANT ,
750- userData = TravelPlace .UserData (estimatedDuration = 60 .minutes), startTime = 0 .hours,
751- ),
752- ),
753- transportSegments = listOf (
754- TransportSegment (
755- type = TransportType .CAR ,
756- duration = 25 .minutes,
757- distance = 3500 ,
764+ userData = TravelPlace .UserData (estimatedDuration = 60 .minutes),
765+ transportToNext = null ,
766+ startTime = 8 .hours,
758767 ),
759768 ),
760769 ),
@@ -792,6 +801,9 @@ private fun TravelDetailScreenEditModePreview() {
792801 confirmCost = { _ -> },
793802 dismissMemoModal = {},
794803 confirmMemo = { _ -> },
804+ clickTransportSegment = {},
805+ confirmChangeTransport = { _ -> },
806+ dismissTransportBottomSheet = {},
795807 )
796808 }
797809}
0 commit comments