Skip to content

Commit 971136d

Browse files
committed
[NDGL-104] feat: 내 여행 및 트래블 헬퍼 내 장소 상세 이동 및 텍스트 생략 처리
1 parent 4569b2e commit 971136d

15 files changed

Lines changed: 215 additions & 85 deletions

File tree

feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeContract.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ data class HomeState(
4949
}
5050

5151
data class TravelPlace(
52+
val googlePlaceId: String,
5253
val category: PlaceCategory,
5354
val estimatedDuration: Int,
5455
val name: String,
@@ -73,6 +74,7 @@ sealed interface HomeIntent : UiIntent {
7374
data class ClickTravel(val travelId: Long, val days: Int) : HomeIntent
7475
data object ClickTravelMore : HomeIntent
7576
data class ClickMyTravel(val travelId: Long, val days: Int) : HomeIntent
77+
data class ClickMyTravelPlace(val placeId: String) : HomeIntent
7678
}
7779

7880
sealed interface HomeSideEffect : UiSideEffect {
@@ -81,4 +83,5 @@ sealed interface HomeSideEffect : UiSideEffect {
8183
data class NavigateToFollowTravel(val travelId: Long, val days: Int) : HomeSideEffect
8284
data object NavigateToTravelMore : HomeSideEffect
8385
data class NavigateToTravelDetail(val travelId: Long, val days: Int) : HomeSideEffect
86+
data class NavigateToPlaceDetail(val placeId: String) : HomeSideEffect
8487
}

feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeScreen.kt

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ internal fun HomeRoute(
3333
navigateToFollowTravel: (Long, Int) -> Unit,
3434
navigateToPopularTravelList: () -> Unit,
3535
navigateToTravelDetail: (Long, Int) -> Unit,
36+
navigateToPlaceDetail: (String) -> Unit,
3637
) {
3738
val state by viewModel.collectAsState()
3839

@@ -53,22 +54,30 @@ internal fun HomeRoute(
5354
onTravelMoreClick = {
5455
viewModel.onIntent(HomeIntent.ClickTravelMore)
5556
},
56-
onMyTravelCardClick = {
57-
when (val myTravel = state.myTravel) {
58-
is HomeState.MyTravel.Upcoming -> viewModel.onIntent(HomeIntent.ClickMyTravel(myTravel.travelId, myTravel.days))
59-
is HomeState.MyTravel.InProgress -> viewModel.onIntent(HomeIntent.ClickMyTravel(myTravel.travelId, myTravel.days))
60-
HomeState.MyTravel.None -> {} // Do nothing
61-
}
57+
onMyTravelClick = { travelId, days ->
58+
viewModel.onIntent(HomeIntent.ClickMyTravel(travelId, days))
59+
},
60+
onPlaceClick = {
61+
viewModel.onIntent(HomeIntent.ClickMyTravelPlace(it))
6262
},
6363
)
6464

6565
viewModel.collectSideEffect { sideEffect ->
6666
when (sideEffect) {
6767
HomeSideEffect.NavigateToSearchTravelTemplate -> navigateToTemplateSearch()
6868
HomeSideEffect.NavigateToSettings -> navigateToSettings()
69-
is HomeSideEffect.NavigateToFollowTravel -> navigateToFollowTravel(sideEffect.travelId, sideEffect.days)
69+
is HomeSideEffect.NavigateToFollowTravel -> navigateToFollowTravel(
70+
sideEffect.travelId,
71+
sideEffect.days,
72+
)
73+
7074
HomeSideEffect.NavigateToTravelMore -> navigateToPopularTravelList()
71-
is HomeSideEffect.NavigateToTravelDetail -> navigateToTravelDetail(sideEffect.travelId, sideEffect.days)
75+
is HomeSideEffect.NavigateToTravelDetail -> navigateToTravelDetail(
76+
sideEffect.travelId,
77+
sideEffect.days,
78+
)
79+
80+
is HomeSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(sideEffect.placeId)
7281
}
7382
}
7483
}
@@ -81,7 +90,8 @@ private fun HomeScreen(
8190
onTabSelected: (Int) -> Unit,
8291
onTravelClick: (Long, Int) -> Unit,
8392
onTravelMoreClick: () -> Unit,
84-
onMyTravelCardClick: () -> Unit,
93+
onMyTravelClick: (Long, Int) -> Unit,
94+
onPlaceClick: (String) -> Unit,
8595
) {
8696
Scaffold(
8797
topBar = {
@@ -116,7 +126,9 @@ private fun HomeScreen(
116126
UpcomingTravelCardSection(
117127
modifier = Modifier.fillMaxWidth(),
118128
myTravel = state.myTravel,
119-
onCardClick = onMyTravelCardClick,
129+
onMyTravelClick = onMyTravelClick,
130+
onPlaceClick = onPlaceClick,
131+
onEmptyTravelClick = onTravelMoreClick,
120132
)
121133
}
122134

@@ -197,6 +209,7 @@ private fun HomeScreenPreview() {
197209
startDate = LocalDate.of(2024, 12, 23),
198210
endDate = LocalDate.of(2024, 12, 26),
199211
currentPlace = HomeState.TravelPlace(
212+
googlePlaceId = "",
200213
category = PlaceCategory.TRANSPORT,
201214
estimatedDuration = 60,
202215
name = "인도 국제 공항",
@@ -228,7 +241,8 @@ private fun HomeScreenPreview() {
228241
onTabSelected = {},
229242
onTravelClick = { _, _ -> },
230243
onTravelMoreClick = {},
231-
onMyTravelCardClick = {},
244+
onMyTravelClick = { _, _ -> },
245+
onPlaceClick = {},
232246
)
233247
}
234248
}

feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeViewModel.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ class HomeViewModel @Inject constructor(
3939
}
4040

4141
private fun subscribeToTravelCreatedEvent() = viewModelScope.launch {
42-
userTravelRepository.travelCreatedEvent.collect { event ->
43-
// 새 여행 생성 시 내 여행 섹션만 새로고침
42+
userTravelRepository.travelCreatedEvent.collect { _ ->
4443
loadMyTravel()
4544
}
4645
}
@@ -82,6 +81,7 @@ class HomeViewModel @Inject constructor(
8281
endDate = travel.endDate,
8382
currentPlace = upcomingPlace?.place?.let { place ->
8483
HomeState.TravelPlace(
84+
googlePlaceId = place.googlePlaceId,
8585
category = place.category,
8686
estimatedDuration = upcomingPlace.estimatedDuration,
8787
name = place.name,
@@ -193,6 +193,7 @@ class HomeViewModel @Inject constructor(
193193
is HomeIntent.ClickTravel -> postNavigateToTravelTemplate(travelId = intent.travelId, days = intent.days)
194194
HomeIntent.ClickTravelMore -> postNavigateToTravelMore()
195195
is HomeIntent.ClickMyTravel -> postNavigateToTravelDetail(travelId = intent.travelId, days = intent.days)
196+
is HomeIntent.ClickMyTravelPlace -> postNavigateToPlaceDetail(placeId = intent.placeId)
196197
}
197198
}
198199

@@ -216,6 +217,10 @@ class HomeViewModel @Inject constructor(
216217
postSideEffect(HomeSideEffect.NavigateToTravelDetail(travelId = travelId, days = days))
217218
}
218219

220+
private fun postNavigateToPlaceDetail(placeId: String) {
221+
postSideEffect(HomeSideEffect.NavigateToPlaceDetail(placeId))
222+
}
223+
219224
companion object {
220225
private const val MAX_POPULAR_TRAVEL_COUNT = 9
221226
}

feature/home/src/main/java/com/yapp/ndgl/feature/home/main/UpcomingTravelCardSection.kt

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.ui.layout.ContentScale
2525
import androidx.compose.ui.res.painterResource
2626
import androidx.compose.ui.res.stringResource
2727
import androidx.compose.ui.res.vectorResource
28+
import androidx.compose.ui.text.style.TextOverflow
2829
import androidx.compose.ui.tooling.preview.Preview
2930
import androidx.compose.ui.unit.dp
3031
import coil3.compose.AsyncImage
@@ -43,25 +44,27 @@ import com.yapp.ndgl.core.ui.R as CoreR
4344
@Composable
4445
internal fun UpcomingTravelCardSection(
4546
myTravel: MyTravel,
47+
onMyTravelClick: (Long, Int) -> Unit,
48+
onPlaceClick: (String) -> Unit,
49+
onEmptyTravelClick: () -> Unit,
4650
modifier: Modifier = Modifier,
47-
onCardClick: () -> Unit = {},
4851
) {
4952
when (myTravel) {
5053
MyTravel.None -> EmptyTravelCard(
5154
modifier = modifier,
52-
onCardClick = { /* FIXME: 인기 여행 컨텐츠 전체보기 페이지 이동 */ },
55+
onCardClick = onEmptyTravelClick,
5356
)
5457

5558
is MyTravel.Upcoming -> UpcomingTravelCard(
5659
modifier = modifier,
5760
travel = myTravel,
58-
onCardClick = onCardClick,
61+
onCardClick = { onMyTravelClick(myTravel.travelId, myTravel.days) },
5962
)
6063

6164
is MyTravel.InProgress -> InProgressTravelCard(
6265
travel = myTravel,
63-
onCardClick = onCardClick,
64-
onPlaceClick = { /* FIXME: 장소 상세 보기 페이지 이동 */ },
66+
onCardClick = { onMyTravelClick(myTravel.travelId, myTravel.days) },
67+
onPlaceClick = onPlaceClick,
6568
)
6669
}
6770
}
@@ -143,8 +146,10 @@ private fun UpcomingTravelCard(
143146
DayTag(dDay = travel.dDay)
144147
Text(
145148
text = travel.title,
146-
style = NDGLTheme.typography.subtitleMdSemiBold,
147149
color = NDGLTheme.colors.black700,
150+
overflow = TextOverflow.Ellipsis,
151+
maxLines = 1,
152+
style = NDGLTheme.typography.subtitleMdSemiBold,
148153
)
149154
}
150155
val dateFormatter = DateTimeFormatter.ofPattern(
@@ -193,13 +198,13 @@ private fun DayTag(
193198
@Composable
194199
private fun InProgressTravelCard(
195200
travel: MyTravel.InProgress,
196-
onCardClick: () -> Unit,
197-
onPlaceClick: () -> Unit,
201+
onCardClick: (Long) -> Unit,
202+
onPlaceClick: (String) -> Unit,
198203
modifier: Modifier = Modifier,
199204
) {
200205
CardContainer(
201206
modifier = modifier,
202-
onCardClick = onCardClick,
207+
onCardClick = { onCardClick(travel.travelId) },
203208
) {
204209
Column(
205210
modifier = Modifier
@@ -208,15 +213,28 @@ private fun InProgressTravelCard(
208213
verticalArrangement = Arrangement.spacedBy(16.dp),
209214
) {
210215
Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
211-
Text(
212-
text = stringResource(
213-
R.string.home_my_travel_card_in_progress_title,
214-
travel.title,
215-
travel.dayCount,
216-
),
217-
style = NDGLTheme.typography.subtitleMdSemiBold,
218-
color = NDGLTheme.colors.black700,
219-
)
216+
Row(
217+
modifier = Modifier.fillMaxWidth(),
218+
verticalAlignment = Alignment.CenterVertically,
219+
) {
220+
Text(
221+
text = travel.title + " ",
222+
modifier = Modifier.weight(1f, fill = false),
223+
style = NDGLTheme.typography.subtitleMdSemiBold,
224+
color = NDGLTheme.colors.black700,
225+
maxLines = 1,
226+
overflow = TextOverflow.Ellipsis,
227+
)
228+
Text(
229+
text = stringResource(
230+
R.string.home_my_travel_card_in_progress_day_count,
231+
travel.dayCount,
232+
),
233+
style = NDGLTheme.typography.subtitleMdSemiBold,
234+
color = NDGLTheme.colors.black700,
235+
maxLines = 1,
236+
)
237+
}
220238
val dateFormatter = DateTimeFormatter.ofPattern(
221239
stringResource(R.string.home_my_travel_card_date_format),
222240
)
@@ -234,7 +252,7 @@ private fun InProgressTravelCard(
234252
if (travel.currentPlace != null) {
235253
PlaceInfoCard(
236254
place = travel.currentPlace,
237-
onPlaceClick = onPlaceClick,
255+
onPlaceClick = { onPlaceClick(travel.currentPlace.googlePlaceId) },
238256
)
239257
}
240258
}
@@ -293,6 +311,8 @@ private fun PlaceInfoCard(
293311
Text(
294312
text = place.name,
295313
color = NDGLTheme.colors.black900,
314+
overflow = TextOverflow.Ellipsis,
315+
maxLines = 1,
296316
style = NDGLTheme.typography.bodyLgSemiBold,
297317
)
298318
}
@@ -332,6 +352,9 @@ private fun EmptyTravelCardPreview() {
332352
UpcomingTravelCardSection(
333353
modifier = Modifier,
334354
myTravel = MyTravel.None,
355+
onMyTravelClick = { _, _ -> },
356+
onPlaceClick = {},
357+
onEmptyTravelClick = {},
335358
)
336359
}
337360
}
@@ -351,6 +374,9 @@ private fun UpcomingTravelCardPreview() {
351374
endDate = LocalDate.of(2025, 2, 20),
352375
imageUrl = "",
353376
),
377+
onMyTravelClick = { _, _ -> },
378+
onPlaceClick = {},
379+
onEmptyTravelClick = {},
354380
)
355381
}
356382
}
@@ -369,12 +395,16 @@ private fun InProgressTravelCardPreview() {
369395
startDate = LocalDate.of(2025, 2, 1),
370396
endDate = LocalDate.of(2025, 2, 10),
371397
currentPlace = TravelPlace(
398+
googlePlaceId = "",
372399
category = PlaceCategory.TRANSPORT,
373400
estimatedDuration = 60,
374401
name = "인도 국제 공항",
375402
thumbnailUrl = "",
376403
),
377404
),
405+
onMyTravelClick = { _, _ -> },
406+
onPlaceClick = {},
407+
onEmptyTravelClick = {},
378408
)
379409
}
380410
}

feature/home/src/main/java/com/yapp/ndgl/feature/home/navigation/HomeEntry.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ fun EntryProviderScope<NavKey>.homeEntry(
2929
navigateToTravelDetail = { travelId, days ->
3030
navigator.navigate(Route.TravelDetail(travelId = travelId, days = days))
3131
},
32+
navigateToPlaceDetail = { placeId ->
33+
navigator.navigate(Route.PlaceDetail(googlePlaceId = placeId))
34+
},
3235
)
3336
}
3437
entry<Route.TemplateSearch> {

feature/home/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<string name="home_my_travel_card_empty_description">새 여행 일정을 만들어 보세요!</string>
99
<string name="home_my_travel_card_travel_duration">%s~%s</string>
1010
<string name="home_my_travel_card_date_format">M월 d일</string>
11-
<string name="home_my_travel_card_in_progress_title">%1$s %2$d일차 입니다!</string>
11+
<string name="home_my_travel_card_in_progress_day_count"> %d일차 입니다!</string>
1212
<string name="home_my_travel_card_d_day_minus">D-%d</string>
1313
<string name="home_my_travel_card_d_day_plus">D+%d</string>
1414

0 commit comments

Comments
 (0)