Skip to content

Commit

Permalink
feat/#17 : Home 화면과 Recommendation 화면 연결
Browse files Browse the repository at this point in the history
  • Loading branch information
shinythinking committed Feb 17, 2025
1 parent cbcf814 commit c742733
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ sealed class HomeIntent : UiIntent {
val end: EpisodeLatLng,
val shouldSort: Boolean = false,
) : HomeIntent()
data class NavigateToAiRecommendation(val episodes: List<String>) : HomeIntent()
}
101 changes: 62 additions & 39 deletions feature/home/src/main/java/com/boostcamp/mapisode/home/HomeScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ internal fun HomeRoute(
onTextMarkerClick: (EpisodeLatLng) -> Unit = {},
onEpisodeClick: (String) -> Unit = {},
onListFabClick: (String) -> Unit = {},
onAiRecommendationClick: (List<String>) -> Unit = {},
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val context = LocalContext.current
Expand Down Expand Up @@ -212,6 +213,10 @@ internal fun HomeRoute(
cameraPositionState.position = CameraPosition(sideEffect.position, DEFAULT_ZOOM)
loadEpisodesInBounds(cameraPositionState)
}

is HomeSideEffect.NavigateToAiRecommendation -> {
onAiRecommendationClick(sideEffect.episodes)
}
}
}
}
Expand Down Expand Up @@ -271,6 +276,9 @@ internal fun HomeRoute(
viewModel.onIntent(HomeIntent.SelectGroup(groupId))
viewModel.onIntent(HomeIntent.ShowBottomSheet)
},
onAiRecommendationClick = { episodes ->
viewModel.onIntent(HomeIntent.NavigateToAiRecommendation(episodes))
},
)
}

Expand All @@ -289,6 +297,7 @@ private fun HomeScreen(
onSwipeStart: () -> Unit = {},
onEpisodeClick: (String) -> Unit = {},
onGroupSelected: (String) -> Unit = {},
onAiRecommendationClick: (List<String>) -> Unit = {},
) {
val context = LocalContext.current
val eatIcon = remember { OverlayImage.fromResource(Design.drawable.ic_eat_marker_light) }
Expand Down Expand Up @@ -428,54 +437,68 @@ private fun HomeScreen(
}
}

if (state.isCardVisible) {
val pagerState = rememberPagerState(
initialPage = state.selectedEpisodeIndex,
initialPageOffsetFraction = 0f,
pageCount = { state.selectedEpisodes.size },
Spacer(modifier = Modifier.weight(1f))

Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.BottomCenter,
) {
MapisodeFabOverlayButton(
onClick = { onAiRecommendationClick(state.episodes.map { it.id }) },
modifier = Modifier
.align(Alignment.BottomEnd)
.padding(end = 20.dp, bottom = 20.dp),
)

LaunchedEffect(pagerState.currentPage) {
val currentEpisode = state.selectedEpisodes.getOrNull(pagerState.currentPage)
currentEpisode?.let { episode ->
val position = LatLng(episode.location.latitude, episode.location.longitude)
onSwipeStart()
cameraPositionState.position = CameraPosition(position, DEFAULT_ZOOM)
}
}
if (state.isCardVisible) {
val pagerState = rememberPagerState(
initialPage = state.selectedEpisodeIndex,
initialPageOffsetFraction = 0f,
pageCount = { state.selectedEpisodes.size },
)

LaunchedEffect(state.selectedEpisodes) {
if (pagerState.currentPage != state.selectedEpisodeIndex) {
pagerState.scrollToPage(state.selectedEpisodeIndex)
LaunchedEffect(pagerState.currentPage) {
val currentEpisode =
state.selectedEpisodes.getOrNull(pagerState.currentPage)
currentEpisode?.let { episode ->
val position =
LatLng(episode.location.latitude, episode.location.longitude)
onSwipeStart()
cameraPositionState.position = CameraPosition(position, DEFAULT_ZOOM)
}
}
}

Spacer(modifier = Modifier.weight(1f))
LaunchedEffect(state.selectedEpisodes) {
if (pagerState.currentPage != state.selectedEpisodeIndex) {
pagerState.scrollToPage(state.selectedEpisodeIndex)
}
}

HorizontalPager(
state = pagerState,
modifier = Modifier
.fillMaxWidth()
.align(Alignment.CenterHorizontally),
verticalAlignment = Alignment.CenterVertically,
contentPadding = PaddingValues(horizontal = 20.dp),
pageSpacing = 10.dp,
) { page ->
val episode = state.selectedEpisodes[page]

Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center,
) {
EpisodeCard(
episode = episode,
onClick = onEpisodeClick,
)
HorizontalPager(
state = pagerState,
modifier = Modifier
.fillMaxWidth()
.align(Alignment.BottomCenter),
verticalAlignment = Alignment.CenterVertically,
contentPadding = PaddingValues(horizontal = 20.dp),
pageSpacing = 10.dp,
) { page ->
val episode = state.selectedEpisodes[page]

Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center,
) {
EpisodeCard(
episode = episode,
onClick = onEpisodeClick,
)
}
}
}

Spacer(modifier = Modifier.height(20.dp))
}

Spacer(modifier = Modifier.height(20.dp))
}

MapisodeModalBottomSheet(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ sealed class HomeSideEffect : SideEffect {
data class NavigateToEpisode(val latLng: EpisodeLatLng) : HomeSideEffect()
data class NavigateToEpisodeDetail(val episodeId: String) : HomeSideEffect()
data class MoveCameraToPosition(val position: LatLng) : HomeSideEffect()
data class NavigateToAiRecommendation(val episodes: List<String>) : HomeSideEffect()
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ class HomeViewModel @Inject constructor(
is HomeIntent.SelectGroup -> {
selectGroup(intent.groupId)
}

is HomeIntent.NavigateToAiRecommendation -> {
postSideEffect(HomeSideEffect.NavigateToAiRecommendation(intent.episodes))
}
}
}

Expand Down

0 comments on commit c742733

Please sign in to comment.