Skip to content

Commit e205a4a

Browse files
committed
[NDGL-66] feature: TravelDetail과 AddItinerary 화면 연결
1 parent 15bfa16 commit e205a4a

4 files changed

Lines changed: 83 additions & 8 deletions

File tree

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/navigation/TravelEntry.kt

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ package com.yapp.ndgl.feature.travel.navigation
33
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
44
import androidx.navigation3.runtime.EntryProviderScope
55
import androidx.navigation3.runtime.NavKey
6+
import com.google.android.gms.maps.model.LatLng
7+
import com.yapp.ndgl.feature.travel.additinerary.AddItineraryRoute
8+
import com.yapp.ndgl.feature.travel.additinerary.AddItineraryViewModel
9+
import com.yapp.ndgl.feature.travel.addplace.AddPlaceRoute
10+
import com.yapp.ndgl.feature.travel.addplace.AddPlaceViewModel
611
import com.yapp.ndgl.feature.travel.datepicker.DatePickerRoute
712
import com.yapp.ndgl.feature.travel.datepicker.DatePickerViewModel
813
import com.yapp.ndgl.feature.travel.followtravel.FollowTravelRoute
@@ -26,8 +31,7 @@ fun EntryProviderScope<NavKey>.travelEntry(navigator: Navigator) {
2631
navigator.navigate(Route.FollowTravel(travelId, days))
2732
},
2833
navigateToTravelDetail = { travelId ->
29-
// FIXME: Travel id long 타입으로 변경
30-
navigator.navigate(Route.TravelDetail(travelId.toInt()))
34+
navigator.navigate(Route.TravelDetail(travelId))
3135
},
3236
navigateToTravelPlace = { placeId ->
3337
navigator.navigate(Route.PlaceDetail(placeId))
@@ -73,10 +77,13 @@ fun EntryProviderScope<NavKey>.travelEntry(navigator: Navigator) {
7377
tipContent = tipContent?.let { RouteTipContent(creatorName = it.creatorName, tips = it.tips) },
7478
alternativePlaces = alternativePlaces?.map {
7579
RouteAlternativePlace(id = it.id, name = it.name, thumbnail = it.thumbnail, placeType = it.placeType.name)
76-
} ?: emptyList(),
80+
},
7781
),
7882
)
7983
},
84+
navigateToAddItinerary = { travelId, day, country, representativeLatitude, representativeLongitude ->
85+
navigator.navigate(Route.AddItinerary(travelId, day, country, representativeLatitude, representativeLongitude))
86+
},
8087
)
8188
}
8289
entry<Route.FollowPlaceDetail> { route ->
@@ -117,4 +124,30 @@ fun EntryProviderScope<NavKey>.travelEntry(navigator: Navigator) {
117124
navigateBack = { navigator.goBack() },
118125
)
119126
}
127+
entry<Route.AddItinerary> { route ->
128+
val viewModel =
129+
hiltViewModel<AddItineraryViewModel, AddItineraryViewModel.Factory> { factory ->
130+
factory.create(
131+
travelId = route.travelId,
132+
day = route.day,
133+
country = route.country,
134+
representativeLatLng = LatLng(route.representativeLatitude, route.representativeLongitude),
135+
)
136+
}
137+
AddItineraryRoute(
138+
viewModel = viewModel,
139+
navigateBack = { navigator.goBack() },
140+
navigateToAddPlace = { placeId -> navigator.navigate(Route.AddPlace(placeId)) },
141+
)
142+
}
143+
entry<Route.AddPlace> { route ->
144+
val viewModel =
145+
hiltViewModel<AddPlaceViewModel, AddPlaceViewModel.Factory> { factory ->
146+
factory.create(placeId = route.placeId)
147+
}
148+
AddPlaceRoute(
149+
viewModel = viewModel,
150+
navigateBack = { navigator.goBack() },
151+
)
152+
}
120153
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.yapp.ndgl.feature.travel.traveldetail
22

3+
import com.google.android.gms.maps.model.LatLng
34
import com.yapp.ndgl.core.base.UiIntent
45
import com.yapp.ndgl.core.base.UiSideEffect
56
import com.yapp.ndgl.core.base.UiState
@@ -12,6 +13,7 @@ import kotlin.time.Duration.Companion.hours
1213

1314
data class TravelDetailState(
1415
val contentInfo: ContentInfo = ContentInfo(),
16+
val country: String = "",
1517
val selectedDay: Int = 1,
1618
val itineraries: List<Itinerary> = emptyList(),
1719
val tempItineraries: List<Itinerary> = emptyList(),
@@ -26,7 +28,22 @@ data class TravelDetailState(
2628
val showTransportBottomSheet: Boolean = false,
2729
val showCostModal: Boolean = false,
2830
val showMemoModal: Boolean = false,
29-
) : UiState
31+
) : UiState {
32+
val representativeLatLng: LatLng
33+
get() {
34+
val currentDayPlaces = itineraries.getOrNull(selectedDay - 1)?.places
35+
val firstPlaceInSelectedDay = currentDayPlaces?.firstOrNull()
36+
37+
if (firstPlaceInSelectedDay != null) {
38+
return LatLng(firstPlaceInSelectedDay.latitude, firstPlaceInSelectedDay.longitude)
39+
}
40+
41+
return itineraries
42+
.flatMap { it.places }
43+
.firstOrNull()
44+
?.let { LatLng(it.latitude, it.longitude) } ?: LatLng(37.5665, 126.9780) // 모든 일차가 비어 있다면 '서울' 좌표 반환
45+
}
46+
}
3047

3148
data class ContentInfo(
3249
val travelId: String = "",
@@ -95,7 +112,7 @@ data class TravelPlace(
95112
data class UserData(
96113
val memo: String? = null,
97114
val cost: Int? = null,
98-
val estimatedDuration: Duration = 0.hours,
115+
val estimatedDuration: Duration = 1.hours,
99116
)
100117
}
101118

@@ -144,4 +161,10 @@ sealed interface TravelDetailSideEffect : UiSideEffect {
144161
) : TravelDetailSideEffect
145162

146163
data class NavigateToBrowser(val url: String) : TravelDetailSideEffect
164+
data class NavigateToAddItinerary(
165+
val travelId: Long,
166+
val day: Int,
167+
val country: String,
168+
val representativeLatLng: LatLng,
169+
) : TravelDetailSideEffect
147170
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailScreen.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ internal fun TravelDetailRoute(
9393
viewModel: TravelDetailViewModel = hiltViewModel(),
9494
navigateBack: () -> Unit,
9595
navigateToTravelPlaceDetail: (String, TipContent?, List<AlternativePlace>?) -> Unit,
96+
navigateToAddItinerary:
97+
(travelId: Long, day: Int, country: String, representativeLatitude: Double, representativeLongitude: Double) -> Unit,
9698
) {
9799
val state by viewModel.collectAsState()
98100
val context = LocalContext.current
@@ -107,6 +109,16 @@ internal fun TravelDetailRoute(
107109
is TravelDetailSideEffect.NavigateToBrowser -> {
108110
context.launchBrowser(sideEffect.url)
109111
}
112+
113+
is TravelDetailSideEffect.NavigateToAddItinerary -> {
114+
navigateToAddItinerary(
115+
sideEffect.travelId,
116+
sideEffect.day,
117+
sideEffect.country,
118+
sideEffect.representativeLatLng.latitude,
119+
sideEffect.representativeLatLng.longitude,
120+
)
121+
}
110122
}
111123
}
112124

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ private const val TEST_THUMBNAIL_URL =
2121

2222
@HiltViewModel(assistedFactory = TravelDetailViewModel.Factory::class)
2323
class TravelDetailViewModel @AssistedInject constructor(
24-
@Assisted private val travelId: Int,
24+
@Assisted private val travelId: Long,
2525
) : BaseViewModel<TravelDetailState, TravelDetailIntent, TravelDetailSideEffect>(
2626
initialState = TravelDetailState(),
2727
) {
@@ -234,7 +234,14 @@ class TravelDetailViewModel @AssistedInject constructor(
234234
}
235235

236236
private fun clickAddScheduleButton() {
237-
// TODO: Handle add schedule
237+
postSideEffect(
238+
TravelDetailSideEffect.NavigateToAddItinerary(
239+
travelId = travelId,
240+
day = state.value.selectedDay,
241+
country = state.value.country,
242+
representativeLatLng = state.value.representativeLatLng,
243+
),
244+
)
238245
}
239246

240247
private fun checkPlaceItem(placeId: Int) {
@@ -587,7 +594,7 @@ class TravelDetailViewModel @AssistedInject constructor(
587594

588595
@AssistedFactory
589596
interface Factory {
590-
fun create(travelId: Int): TravelDetailViewModel
597+
fun create(travelId: Long): TravelDetailViewModel
591598
}
592599

593600
companion object {

0 commit comments

Comments
 (0)