Skip to content

Commit 21230c3

Browse files
committed
[NDGL-100] feature: PlanB 장소를 눌렀을 때 PlaceDetailScreen 화면으로 전환
1 parent a16e9b3 commit 21230c3

9 files changed

Lines changed: 76 additions & 16 deletions

File tree

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/component/AlternativePlaceContent.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.yapp.ndgl.feature.travel.model.PlaceType
3333
@Composable
3434
internal fun AlternativePlaceContent(
3535
alternativePlaces: List<AlternativePlace>,
36+
onClick: (String) -> Unit,
3637
onChangePlaceClick: ((AlternativePlace) -> Unit)? = null,
3738
) {
3839
Column(
@@ -46,6 +47,7 @@ internal fun AlternativePlaceContent(
4647
modifier = Modifier
4748
.fillMaxWidth()
4849
.clip(RoundedCornerShape(16.dp))
50+
.clickable { onClick(alternativePlace.id) }
4951
.border(1.dp, NDGLTheme.colors.black50, RoundedCornerShape(16.dp))
5052
.padding(horizontal = 20.dp, vertical = 16.dp),
5153
horizontalArrangement = Arrangement.spacedBy(12.dp),
@@ -118,6 +120,6 @@ private fun AlternativePlaceContentPreview() {
118120
)
119121

120122
NDGLTheme {
121-
AlternativePlaceContent(alternativePlaces)
123+
AlternativePlaceContent(alternativePlaces, onClick = {}, onChangePlaceClick = {})
122124
}
123125
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/component/PlaceInfoTab.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ internal fun PlaceInfoTab(
3838
placeInfo: PlaceInfo,
3939
onAddressClick: () -> Unit = {},
4040
onMenuClick: () -> Unit = {},
41+
onAlternativePlaceClick: (String) -> Unit = {},
4142
onChangePlaceClick: (AlternativePlace) -> Unit = {},
4243
) {
4344
Column(
@@ -113,7 +114,11 @@ internal fun PlaceInfoTab(
113114
Spacer(modifier = Modifier.height(32.dp))
114115
Text(stringResource(R.string.place_detail_plan_b_message), color = NDGLTheme.colors.black700, style = NDGLTheme.typography.bodyLgSemiBold)
115116
Spacer(modifier = Modifier.height(16.dp))
116-
AlternativePlaceContent(alternativePlaces = placeInfo.alternativePlaces, onChangePlaceClick = onChangePlaceClick)
117+
AlternativePlaceContent(
118+
alternativePlaces = placeInfo.alternativePlaces,
119+
onClick = onAlternativePlaceClick,
120+
onChangePlaceClick = onChangePlaceClick,
121+
)
117122
}
118123
}
119124
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/placedetail/FollowPlaceDetailContract.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ sealed interface FollowPlaceDetailIntent : UiIntent {
1717
data class SelectTab(val tab: PlaceDetailTab) : FollowPlaceDetailIntent
1818
data object ClickAddress : FollowPlaceDetailIntent
1919
data object ClickMenu : FollowPlaceDetailIntent
20+
data class ClickAlternativePlace(val googlePlaceId: String) : FollowPlaceDetailIntent
2021
}
2122

2223
sealed interface FollowPlaceDetailSideEffect : UiSideEffect {
2324
data class NavigateToBrowser(val url: String) : FollowPlaceDetailSideEffect
25+
data class NavigateToAlternativePlaceDetail(val googlePlaceId: String) : FollowPlaceDetailSideEffect
2426
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/placedetail/FollowPlaceDetailScreen.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,28 @@ import com.yapp.ndgl.core.ui.util.launchBrowser
5151
import com.yapp.ndgl.feature.travel.component.PlaceDetailTabRow
5252
import com.yapp.ndgl.feature.travel.component.PlaceInfoTab
5353
import com.yapp.ndgl.feature.travel.component.PlacePhotoTab
54+
import com.yapp.ndgl.feature.travel.model.AlternativePlace
5455
import com.yapp.ndgl.feature.travel.model.PlaceDetailTab
5556
import com.yapp.ndgl.feature.travel.model.PlaceInfo
5657
import com.yapp.ndgl.feature.travel.model.PlacePhoto
5758
import com.yapp.ndgl.feature.travel.model.PlaceType
5859
import com.yapp.ndgl.feature.travel.model.Price
5960
import com.yapp.ndgl.feature.travel.model.PriceRange
61+
import com.yapp.ndgl.feature.travel.model.TipContent
6062

6163
@Composable
6264
internal fun FollowPlaceDetailRoute(
6365
viewModel: FollowPlaceDetailViewModel = hiltViewModel(),
6466
navigateBack: () -> Unit,
67+
navigateToAlternativePlaceDetail: (String) -> Unit,
6568
) {
6669
val state by viewModel.collectAsState()
6770
val context = LocalContext.current
6871

6972
viewModel.collectSideEffect { sideEffect ->
7073
when (sideEffect) {
7174
is FollowPlaceDetailSideEffect.NavigateToBrowser -> context.launchBrowser(sideEffect.url)
75+
is FollowPlaceDetailSideEffect.NavigateToAlternativePlaceDetail -> navigateToAlternativePlaceDetail(sideEffect.googlePlaceId)
7276
}
7377
}
7478

@@ -78,6 +82,7 @@ internal fun FollowPlaceDetailRoute(
7882
selectTab = { viewModel.onIntent(FollowPlaceDetailIntent.SelectTab(it)) },
7983
clickAddress = { viewModel.onIntent(FollowPlaceDetailIntent.ClickAddress) },
8084
clickMenu = { viewModel.onIntent(FollowPlaceDetailIntent.ClickMenu) },
85+
clickAlternativePlace = { viewModel.onIntent(FollowPlaceDetailIntent.ClickAlternativePlace(it)) },
8186
)
8287
}
8388

@@ -88,6 +93,7 @@ private fun FollowPlaceDetailScreen(
8893
selectTab: (PlaceDetailTab) -> Unit,
8994
clickAddress: () -> Unit,
9095
clickMenu: () -> Unit,
96+
clickAlternativePlace: (String) -> Unit,
9197
) {
9298
val placeInfo = state.placeInfo
9399
val listState = rememberLazyListState()
@@ -236,6 +242,7 @@ private fun FollowPlaceDetailScreen(
236242
placeInfo = state.placeInfo,
237243
onAddressClick = clickAddress,
238244
onMenuClick = clickMenu,
245+
onAlternativePlaceClick = clickAlternativePlace,
239246
)
240247
}
241248
}
@@ -284,12 +291,35 @@ private fun FollowPlaceDetailScreenPreview() {
284291
startPrice = Price(currencyCode = "EUR", units = "5", symbol = ""),
285292
endPrice = Price(currencyCode = "EUR", units = "15", symbol = ""),
286293
),
294+
tipContent = TipContent(
295+
creatorName = "빠니보틀",
296+
tips = listOf(
297+
"젤라또는 오후 3시쯤 먹는 게 가장 맛있어요",
298+
"피스타치오와 헤이즐넛 맛을 꼭 드셔보세요",
299+
"웨이팅이 길 수 있으니 평일 방문을 추천해요",
300+
),
301+
),
302+
alternativePlaces = listOf(
303+
AlternativePlace(
304+
id = "",
305+
name = "젤라또 디 산 크리스피노",
306+
thumbnail = "",
307+
placeType = PlaceType.CAFE,
308+
),
309+
AlternativePlace(
310+
id = "",
311+
name = "지올리티",
312+
thumbnail = "",
313+
placeType = PlaceType.CAFE,
314+
),
315+
),
287316
),
288317
),
289318
clickBackButton = {},
290319
selectTab = {},
291320
clickAddress = {},
292321
clickMenu = {},
322+
clickAlternativePlace = {},
293323
)
294324
}
295325
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/placedetail/FollowPlaceDetailViewModel.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,15 @@ class FollowPlaceDetailViewModel @AssistedInject constructor(
9090
postSideEffect(FollowPlaceDetailSideEffect.NavigateToBrowser(it))
9191
}
9292
}
93+
94+
is FollowPlaceDetailIntent.ClickAlternativePlace -> clickAlternativePlace(intent.googlePlaceId)
9395
}
9496
}
9597

98+
private fun clickAlternativePlace(googlePlaceId: String) {
99+
postSideEffect(FollowPlaceDetailSideEffect.NavigateToAlternativePlaceDetail(googlePlaceId))
100+
}
101+
96102
@AssistedFactory
97103
interface Factory {
98104
fun create(googlePlaceId: String, tipContent: RouteTipContent?, alternativePlaces: List<RouteAlternativePlace>): FollowPlaceDetailViewModel

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ fun EntryProviderScope<NavKey>.travelEntry(navigator: Navigator) {
106106
FollowPlaceDetailRoute(
107107
viewModel = viewModel,
108108
navigateBack = { navigator.goBack() },
109+
navigateToAlternativePlaceDetail = { googlePlaceId -> navigator.navigate(Route.PlaceDetail(googlePlaceId)) },
109110
)
110111
}
111112
entry<Route.PlaceDetail> { route ->
@@ -120,6 +121,7 @@ fun EntryProviderScope<NavKey>.travelEntry(navigator: Navigator) {
120121
PlaceDetailRoute(
121122
viewModel = viewModel,
122123
navigateBack = { navigator.goBack() },
124+
navigateToAlternativePlaceDetail = { googlePlaceId -> navigator.navigate(Route.PlaceDetail(googlePlaceId)) },
123125
)
124126
}
125127
entry<Route.DatePicker> { route ->

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/placedetail/PlaceDetailContract.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ sealed interface PlaceDetailIntent : UiIntent {
2323
data object DismissChangeModal : PlaceDetailIntent
2424
data object ClickAddress : PlaceDetailIntent
2525
data object ClickMenu : PlaceDetailIntent
26+
data class ClickAlternativePlace(val googlePlaceId: String) : PlaceDetailIntent
2627
}
2728

2829
sealed interface PlaceDetailSideEffect : UiSideEffect {
2930
data class NavigateToBrowser(val url: String) : PlaceDetailSideEffect
31+
data class NavigateToAlternativePlaceDetail(val googlePlaceId: String) : PlaceDetailSideEffect
3032
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/placedetail/PlaceDetailScreen.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,25 +65,28 @@ import com.yapp.ndgl.feature.travel.model.TipContent
6565
internal fun PlaceDetailRoute(
6666
viewModel: PlaceDetailViewModel = hiltViewModel(),
6767
navigateBack: () -> Unit,
68+
navigateToAlternativePlaceDetail: (String) -> Unit,
6869
) {
6970
val state by viewModel.collectAsState()
7071
val context = LocalContext.current
7172

7273
viewModel.collectSideEffect { sideEffect ->
7374
when (sideEffect) {
7475
is PlaceDetailSideEffect.NavigateToBrowser -> context.launchBrowser(sideEffect.url)
76+
is PlaceDetailSideEffect.NavigateToAlternativePlaceDetail -> navigateToAlternativePlaceDetail(sideEffect.googlePlaceId)
7577
}
7678
}
7779

7880
PlaceDetailScreen(
7981
state = state,
8082
clickBackButton = navigateBack,
8183
selectTab = { viewModel.onIntent(PlaceDetailIntent.SelectTab(it)) },
84+
clickAddress = { viewModel.onIntent(PlaceDetailIntent.ClickAddress) },
85+
clickMenu = { viewModel.onIntent(PlaceDetailIntent.ClickMenu) },
86+
clickAlternativePlace = { viewModel.onIntent(PlaceDetailIntent.ClickAlternativePlace(it)) },
8287
clickChangePlace = { viewModel.onIntent(PlaceDetailIntent.ClickChangePlace(it)) },
8388
confirmChangePlace = { viewModel.onIntent(PlaceDetailIntent.ConfirmChangePlace) },
8489
dismissChangeModal = { viewModel.onIntent(PlaceDetailIntent.DismissChangeModal) },
85-
clickAddress = { viewModel.onIntent(PlaceDetailIntent.ClickAddress) },
86-
clickMenu = { viewModel.onIntent(PlaceDetailIntent.ClickMenu) },
8790
)
8891
}
8992

@@ -92,11 +95,12 @@ private fun PlaceDetailScreen(
9295
state: PlaceDetailState,
9396
clickBackButton: () -> Unit,
9497
selectTab: (PlaceDetailTab) -> Unit,
98+
clickAddress: () -> Unit,
99+
clickMenu: () -> Unit,
100+
clickAlternativePlace: (String) -> Unit,
95101
clickChangePlace: (AlternativePlace) -> Unit,
96102
confirmChangePlace: () -> Unit,
97103
dismissChangeModal: () -> Unit,
98-
clickAddress: () -> Unit,
99-
clickMenu: () -> Unit,
100104
) {
101105
val placeInfo = state.placeInfo
102106
val listState = rememberLazyListState()
@@ -245,6 +249,7 @@ private fun PlaceDetailScreen(
245249
placeInfo = state.placeInfo,
246250
onAddressClick = clickAddress,
247251
onMenuClick = clickMenu,
252+
onAlternativePlaceClick = clickAlternativePlace,
248253
onChangePlaceClick = clickChangePlace,
249254
)
250255
}
@@ -344,6 +349,7 @@ private fun PlaceDetailScreenPreview() {
344349
dismissChangeModal = {},
345350
clickAddress = {},
346351
clickMenu = {},
352+
clickAlternativePlace = {},
347353
)
348354
}
349355
}

feature/travel/src/main/java/com/yapp/ndgl/feature/travel/placedetail/PlaceDetailViewModel.kt

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,31 @@ class PlaceDetailViewModel @AssistedInject constructor(
8181
override suspend fun handleIntent(intent: PlaceDetailIntent) {
8282
when (intent) {
8383
is PlaceDetailIntent.SelectTab -> selectTab(intent.tab)
84+
is PlaceDetailIntent.ClickAddress -> clickAddress()
85+
is PlaceDetailIntent.ClickMenu -> clickMenu()
86+
is PlaceDetailIntent.ClickAlternativePlace -> clickAlternativePlace(intent.googlePlaceId)
8487
is PlaceDetailIntent.ClickChangePlace -> clickChangePlace(intent.alternativePlace)
8588
is PlaceDetailIntent.ConfirmChangePlace -> confirmChangePlace()
8689
is PlaceDetailIntent.DismissChangeModal -> dismissChangeModal()
87-
is PlaceDetailIntent.ClickAddress -> clickAddress()
88-
is PlaceDetailIntent.ClickMenu -> clickMenu()
8990
}
9091
}
9192

9293
private fun selectTab(tab: PlaceDetailTab) {
9394
reduce { copy(selectedTab = tab) }
9495
}
9596

97+
private fun clickAddress() {
98+
state.value.placeInfo.googleMapsUri?.let { postSideEffect(PlaceDetailSideEffect.NavigateToBrowser(it)) }
99+
}
100+
101+
private fun clickMenu() {
102+
state.value.placeInfo.websiteUrl?.let { postSideEffect(PlaceDetailSideEffect.NavigateToBrowser(it)) }
103+
}
104+
105+
private fun clickAlternativePlace(googlePlaceId: String) {
106+
postSideEffect(PlaceDetailSideEffect.NavigateToAlternativePlaceDetail(googlePlaceId))
107+
}
108+
96109
private fun clickChangePlace(alternativePlace: AlternativePlace) {
97110
reduce { copy(selectedAlternativePlace = alternativePlace, showChangeModal = true) }
98111
}
@@ -110,14 +123,6 @@ class PlaceDetailViewModel @AssistedInject constructor(
110123
reduce { copy(showChangeModal = false) }
111124
}
112125

113-
private fun clickAddress() {
114-
state.value.placeInfo.googleMapsUri?.let { postSideEffect(PlaceDetailSideEffect.NavigateToBrowser(it)) }
115-
}
116-
117-
private fun clickMenu() {
118-
state.value.placeInfo.websiteUrl?.let { postSideEffect(PlaceDetailSideEffect.NavigateToBrowser(it)) }
119-
}
120-
121126
@AssistedFactory
122127
interface Factory {
123128
fun create(

0 commit comments

Comments
 (0)