diff --git a/feature/auth/.gitignore b/feature/auth/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/feature/auth/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts deleted file mode 100644 index 9a255a00..00000000 --- a/feature/auth/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id("ndgl.feature") -} - -android { - namespace = "com.yapp.ndgl.feature.auth" -} - -dependencies { - implementation(project(":data:auth")) -} diff --git a/feature/auth/consumer-rules.pro b/feature/auth/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature/auth/src/main/AndroidManifest.xml b/feature/auth/src/main/AndroidManifest.xml deleted file mode 100644 index 8bdb7e14..00000000 --- a/feature/auth/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/feature/auth/src/main/java/com/yapp/ndgl/feature/auth/AuthScreen.kt b/feature/auth/src/main/java/com/yapp/ndgl/feature/auth/AuthScreen.kt deleted file mode 100644 index 1dd4f994..00000000 --- a/feature/auth/src/main/java/com/yapp/ndgl/feature/auth/AuthScreen.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.yapp.ndgl.feature.auth - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel - -@Composable -fun AuthRoute( - viewModel: AuthViewModel = hiltViewModel(), -) { - AuthScreen() -} - -@Composable -private fun AuthScreen() { - LazyColumn( - modifier = Modifier.fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, - ) { - item { - Text(text = "Auth Screen") - } - } -} - -@Preview(showBackground = true) -@Composable -private fun AuthScreenPreview() { - AuthScreen() -} diff --git a/feature/auth/src/main/java/com/yapp/ndgl/feature/auth/AuthViewModel.kt b/feature/auth/src/main/java/com/yapp/ndgl/feature/auth/AuthViewModel.kt deleted file mode 100644 index 06c610f6..00000000 --- a/feature/auth/src/main/java/com/yapp/ndgl/feature/auth/AuthViewModel.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.yapp.ndgl.feature.auth - -import androidx.lifecycle.ViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject - -@HiltViewModel -class AuthViewModel @Inject constructor() : ViewModel() diff --git a/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeContract.kt b/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeContract.kt index 9de90b73..ab292400 100644 --- a/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeContract.kt +++ b/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeContract.kt @@ -74,7 +74,7 @@ sealed interface HomeIntent : UiIntent { data class ClickTravel(val travelId: Long, val days: Int) : HomeIntent data object ClickTravelMore : HomeIntent data class ClickMyTravel(val travelId: Long, val days: Int) : HomeIntent - data class ClickMyTravelPlace(val placeId: String) : HomeIntent + data class ClickMyTravelPlace(val googlePlaceId: String) : HomeIntent } sealed interface HomeSideEffect : UiSideEffect { @@ -83,5 +83,5 @@ sealed interface HomeSideEffect : UiSideEffect { data class NavigateToFollowTravel(val travelId: Long, val days: Int) : HomeSideEffect data object NavigateToTravelMore : HomeSideEffect data class NavigateToTravelDetail(val travelId: Long, val days: Int) : HomeSideEffect - data class NavigateToPlaceDetail(val placeId: String) : HomeSideEffect + data class NavigateToPlaceDetail(val googlePlaceId: String) : HomeSideEffect } diff --git a/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeScreen.kt b/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeScreen.kt index ca91c9eb..373f840f 100644 --- a/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeScreen.kt @@ -77,7 +77,7 @@ internal fun HomeRoute( sideEffect.days, ) - is HomeSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(sideEffect.placeId) + is HomeSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(sideEffect.googlePlaceId) } } } diff --git a/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeViewModel.kt index 50f7d033..5984d7d6 100644 --- a/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeViewModel.kt @@ -204,7 +204,7 @@ class HomeViewModel @Inject constructor( is HomeIntent.ClickTravel -> postNavigateToTravelTemplate(travelId = intent.travelId, days = intent.days) HomeIntent.ClickTravelMore -> postNavigateToTravelMore() is HomeIntent.ClickMyTravel -> postNavigateToTravelDetail(travelId = intent.travelId, days = intent.days) - is HomeIntent.ClickMyTravelPlace -> postNavigateToPlaceDetail(placeId = intent.placeId) + is HomeIntent.ClickMyTravelPlace -> postNavigateToPlaceDetail(googlePlaceId = intent.googlePlaceId) } } @@ -228,8 +228,8 @@ class HomeViewModel @Inject constructor( postSideEffect(HomeSideEffect.NavigateToTravelDetail(travelId = travelId, days = days)) } - private fun postNavigateToPlaceDetail(placeId: String) { - postSideEffect(HomeSideEffect.NavigateToPlaceDetail(placeId)) + private fun postNavigateToPlaceDetail(googlePlaceId: String) { + postSideEffect(HomeSideEffect.NavigateToPlaceDetail(googlePlaceId)) } companion object { diff --git a/feature/home/src/main/java/com/yapp/ndgl/feature/home/navigation/HomeEntry.kt b/feature/home/src/main/java/com/yapp/ndgl/feature/home/navigation/HomeEntry.kt index fc2b8270..fabe4119 100644 --- a/feature/home/src/main/java/com/yapp/ndgl/feature/home/navigation/HomeEntry.kt +++ b/feature/home/src/main/java/com/yapp/ndgl/feature/home/navigation/HomeEntry.kt @@ -29,8 +29,8 @@ fun EntryProviderScope.homeEntry( navigateToTravelDetail = { travelId, days -> navigator.navigate(Route.TravelDetail(travelId = travelId, days = days)) }, - navigateToPlaceDetail = { placeId -> - navigator.navigate(Route.PlaceDetail(googlePlaceId = placeId)) + navigateToPlaceDetail = { googlePlaceId -> + navigator.navigate(Route.PlaceDetail(googlePlaceId = googlePlaceId)) }, ) } diff --git a/feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashScreen.kt b/feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashScreen.kt index c264a7bc..5a50bfe5 100644 --- a/feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashScreen.kt +++ b/feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashScreen.kt @@ -37,16 +37,7 @@ fun SplashRoute( ) onDispose { - activity?.enableEdgeToEdge( - statusBarStyle = SystemBarStyle.auto( - android.graphics.Color.TRANSPARENT, - android.graphics.Color.TRANSPARENT, - ), - navigationBarStyle = SystemBarStyle.auto( - android.graphics.Color.TRANSPARENT, - android.graphics.Color.TRANSPARENT, - ), - ) + activity?.enableEdgeToEdge() } } diff --git a/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperContract.kt b/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperContract.kt index 71bf4ac5..e50ec536 100644 --- a/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperContract.kt +++ b/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperContract.kt @@ -102,12 +102,12 @@ sealed interface TravelHelperIntent : UiIntent { data object SwapCurrency : TravelHelperIntent data class SelectCurrency(val currencyCode: String) : TravelHelperIntent data class ClickTravelCard(val travelId: Long, val days: Int) : TravelHelperIntent - data class ClickPlace(val placeId: String) : TravelHelperIntent + data class ClickPlace(val googlePlaceId: String) : TravelHelperIntent } sealed interface TravelHelperSideEffect : UiSideEffect { data object NavigateToSearch : TravelHelperSideEffect data object ShowExchangeRateError : TravelHelperSideEffect data class NavigateToTravelDetail(val travelId: Long, val days: Int) : TravelHelperSideEffect - data class NavigateToPlaceDetail(val placeId: String) : TravelHelperSideEffect + data class NavigateToPlaceDetail(val googlePlaceId: String) : TravelHelperSideEffect } diff --git a/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperScreen.kt b/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperScreen.kt index c723eca4..16db2d05 100644 --- a/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperScreen.kt +++ b/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperScreen.kt @@ -89,7 +89,7 @@ internal fun TravelHelperRoute( } } - is TravelHelperSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(sideEffect.placeId) + is TravelHelperSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(sideEffect.googlePlaceId) } } } diff --git a/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperViewModel.kt b/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperViewModel.kt index d7bfa220..4e00ad6b 100644 --- a/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperViewModel.kt +++ b/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/main/TravelHelperViewModel.kt @@ -283,7 +283,7 @@ class TravelHelperViewModel @Inject constructor( } is TravelHelperIntent.ClickPlace -> { - postSideEffect(TravelHelperSideEffect.NavigateToPlaceDetail(intent.placeId)) + postSideEffect(TravelHelperSideEffect.NavigateToPlaceDetail(intent.googlePlaceId)) } } } diff --git a/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/navigation/TravelHelperEntry.kt b/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/navigation/TravelHelperEntry.kt index 07338c2e..062b5830 100644 --- a/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/navigation/TravelHelperEntry.kt +++ b/feature/travel-helper/src/main/java/com/yapp/ndgl/feature/travelhelper/navigation/TravelHelperEntry.kt @@ -14,7 +14,7 @@ fun EntryProviderScope.travelHelperEntry(navigator: Navigator) { navigator.navigate(Route.TravelDetail(travelId, days)) }, navigateToPopularTravelList = { navigator.navigate(Route.PopularTravelList) }, - navigateToPlaceDetail = { placeId -> navigator.navigate(Route.PlaceDetail(placeId)) }, + navigateToPlaceDetail = { googlePlaceId -> navigator.navigate(Route.PlaceDetail(googlePlaceId)) }, ) } } diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryContract.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryContract.kt index 5cf6389f..4e4f71c8 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryContract.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryContract.kt @@ -82,12 +82,12 @@ sealed interface AddItineraryIntent : UiIntent { data object ClickAddItinerary : AddItineraryIntent data object ClickAddress : AddItineraryIntent data object ClickMenu : AddItineraryIntent - data class BookMarkPlace(val placeId: String) : AddItineraryIntent + data class BookMarkPlace(val googlePlaceId: String) : AddItineraryIntent data class ClickSelectablePlace(val googlePlaceId: String) : AddItineraryIntent } sealed interface AddItinerarySideEffect : UiSideEffect { data object NavigateBack : AddItinerarySideEffect data class NavigateToBrowser(val url: String) : AddItinerarySideEffect - data class NavigateToAddPlace(val placeId: String) : AddItinerarySideEffect + data class NavigateToAddPlace(val googlePlaceId: String) : AddItinerarySideEffect } diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryScreen.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryScreen.kt index b0b68301..d3645ea1 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryScreen.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryScreen.kt @@ -45,7 +45,7 @@ internal fun AddItineraryRoute( when (sideEffect) { is AddItinerarySideEffect.NavigateBack -> navigateBack() is AddItinerarySideEffect.NavigateToBrowser -> context.launchBrowser(sideEffect.url) - is AddItinerarySideEffect.NavigateToAddPlace -> navigateToAddPlace(sideEffect.placeId) + is AddItinerarySideEffect.NavigateToAddPlace -> navigateToAddPlace(sideEffect.googlePlaceId) } } diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryViewModel.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryViewModel.kt index e8cb1490..7f1c2751 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryViewModel.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/additinerary/AddItineraryViewModel.kt @@ -119,7 +119,7 @@ class AddItineraryViewModel @AssistedInject constructor( is AddItineraryIntent.ClickAddItinerary -> clickAddItinerary() is AddItineraryIntent.ClickAddress -> clickAddress() is AddItineraryIntent.ClickMenu -> clickMenu() - is AddItineraryIntent.BookMarkPlace -> bookmarkPlace(intent.placeId) + is AddItineraryIntent.BookMarkPlace -> bookmarkPlace(intent.googlePlaceId) is AddItineraryIntent.ClickSelectablePlace -> clickSelectablePlace(intent.googlePlaceId) } } @@ -217,11 +217,11 @@ class AddItineraryViewModel @AssistedInject constructor( } } - private fun loadPlaceDetail(placeId: String) = viewModelScope.launch { + private fun loadPlaceDetail(googlePlaceId: String) = viewModelScope.launch { suspendRunCatching { - placeRepository.getPlace(placeId) + placeRepository.getPlace(googlePlaceId) }.onSuccess { response -> - loadPlacePhotos(placeId) + loadPlacePhotos(googlePlaceId) reduce { val currentDetail = selectedPlaceDetail ?: SelectedPlaceDetail() copy( @@ -235,10 +235,10 @@ class AddItineraryViewModel @AssistedInject constructor( } } - private fun loadPlacePhotos(placeId: String) = viewModelScope.launch { + private fun loadPlacePhotos(googlePlaceId: String) = viewModelScope.launch { repeat(3) { delay(1000) - val result = suspendRunCatching { placeRepository.getPlacePhotos(placeId) } + val result = suspendRunCatching { placeRepository.getPlacePhotos(googlePlaceId) } val photos = result.getOrNull()?.photos if (!photos.isNullOrEmpty()) { reduce { @@ -346,15 +346,15 @@ class AddItineraryViewModel @AssistedInject constructor( postSideEffect(AddItinerarySideEffect.NavigateToBrowser(url)) } - private fun bookmarkPlace(placeId: String) = viewModelScope.launch { + private fun bookmarkPlace(googlePlaceId: String) = viewModelScope.launch { val currentPlaceDetail = state.value.selectedPlaceDetail val isBookmarked = currentPlaceDetail?.placeInfo?.isBookMarked ?: false suspendRunCatching { if (isBookmarked) { - placeRepository.unBookmarkPlace(placeId) + placeRepository.unBookmarkPlace(googlePlaceId) } else { - placeRepository.bookmarkPlace(placeId) + placeRepository.bookmarkPlace(googlePlaceId) } }.onSuccess { currentPlaceDetail?.let { detail -> diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/addplace/AddPlaceViewModel.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/addplace/AddPlaceViewModel.kt index 2ef75fb9..739cfb65 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/addplace/AddPlaceViewModel.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/addplace/AddPlaceViewModel.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.launch @HiltViewModel(assistedFactory = AddPlaceViewModel.Factory::class) class AddPlaceViewModel @AssistedInject constructor( - @Assisted private val placeId: String, + @Assisted private val googlePlaceId: String, private val placeRepository: PlaceRepository, ) : BaseViewModel( initialState = AddPlaceState(), @@ -27,7 +27,7 @@ class AddPlaceViewModel @AssistedInject constructor( private fun loadPlaceDetail() = viewModelScope.launch { suspendRunCatching { - placeRepository.getPlace(placeId) + placeRepository.getPlace(googlePlaceId) }.onSuccess { response -> loadPlacePhotos() reduce { @@ -41,7 +41,7 @@ class AddPlaceViewModel @AssistedInject constructor( private fun loadPlacePhotos() = viewModelScope.launch { repeat(3) { delay(1000) - val result = suspendRunCatching { placeRepository.getPlacePhotos(placeId) } + val result = suspendRunCatching { placeRepository.getPlacePhotos(googlePlaceId) } val photos = result.getOrNull()?.photos if (!photos.isNullOrEmpty()) { @@ -91,6 +91,6 @@ class AddPlaceViewModel @AssistedInject constructor( @AssistedFactory interface Factory { - fun create(placeId: String): AddPlaceViewModel + fun create(googlePlaceId: String): AddPlaceViewModel } } diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/component/PlaceInfoTab.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/component/PlaceInfoTab.kt index ed6c2fec..fdc7e637 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/component/PlaceInfoTab.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/component/PlaceInfoTab.kt @@ -39,7 +39,7 @@ internal fun PlaceInfoTab( onAddressClick: () -> Unit = {}, onMenuClick: () -> Unit = {}, onAlternativePlaceClick: (String) -> Unit = {}, - onChangePlaceClick: (AlternativePlace) -> Unit = {}, + onChangePlaceClick: ((AlternativePlace) -> Unit)? = null, ) { Column( modifier = Modifier.fillMaxSize(), diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelContract.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelContract.kt index 86fc3007..abc25da3 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelContract.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelContract.kt @@ -38,7 +38,7 @@ sealed interface FollowTravelIntent : UiIntent { sealed interface FollowTravelSideEffect : UiSideEffect { data class NavigateToFollowPlaceDetail( - val placeId: String, + val googlePlaceId: String, val tipContent: TipContent?, val alternativePlaces: List?, ) : diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelScreen.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelScreen.kt index 55cf9a10..991cb318 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelScreen.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelScreen.kt @@ -59,7 +59,7 @@ internal fun FollowTravelRoute( viewModel.collectSideEffect { sideEffect -> when (sideEffect) { is FollowTravelSideEffect.NavigateToFollowPlaceDetail -> - navigateToFollowPlaceDetail(sideEffect.placeId, sideEffect.tipContent, sideEffect.alternativePlaces) + navigateToFollowPlaceDetail(sideEffect.googlePlaceId, sideEffect.tipContent, sideEffect.alternativePlaces) } } diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelViewModel.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelViewModel.kt index f42fef5d..d51e4ee9 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelViewModel.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/FollowTravelViewModel.kt @@ -83,7 +83,7 @@ class FollowTravelViewModel @AssistedInject constructor( is FollowTravelIntent.ClickPlaceItem -> { postSideEffect( FollowTravelSideEffect.NavigateToFollowPlaceDetail( - placeId = intent.place.placeInfo.googlePlaceId, + googlePlaceId = intent.place.placeInfo.googlePlaceId, tipContent = intent.place.placeInfo.tipContent?.let { TipContent(creatorName = state.value.creatorName, tips = it.tips) }, diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/component/TravelMap.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/component/TravelMap.kt index 6a5e7e84..3072cf8e 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/component/TravelMap.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/followtravel/component/TravelMap.kt @@ -42,6 +42,8 @@ internal fun TravelMap( places: List, onScrollEnabledChange: (Boolean) -> Unit, ) { + require(places.isNotEmpty()) { "TravelMap requires at least one place" } + val routePoints = remember(places) { places.map { place -> LatLng(place.placeInfo.latitude, place.placeInfo.longitude) diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelContract.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelContract.kt index 29262ac1..f4a6c5db 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelContract.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelContract.kt @@ -47,7 +47,7 @@ data class MyTravelState( @Immutable data class TravelPlace( - val placeId: String, + val googlePlaceId: String, val category: PlaceCategory, val estimatedDuration: Int, val name: String, @@ -83,7 +83,7 @@ sealed interface MyTravelIntent : UiIntent { data object ClickSettings : MyTravelIntent data class ClickTravel(val travelId: Long, val days: Int) : MyTravelIntent data class ClickTravelDetail(val travelId: Long, val days: Int) : MyTravelIntent - data class ClickPlaceDetail(val placeId: String) : MyTravelIntent + data class ClickPlaceDetail(val googlePlaceId: String) : MyTravelIntent data object ClickFindNewTravel : MyTravelIntent } @@ -92,6 +92,6 @@ sealed interface MyTravelSideEffect : UiSideEffect { data object NavigateToSettings : MyTravelSideEffect data class NavigateToFollowTravel(val travelId: Long, val days: Int) : MyTravelSideEffect data class NavigateToTravelDetail(val travelId: Long, val days: Int) : MyTravelSideEffect - data class NavigateToTravelPlace(val placeId: String) : MyTravelSideEffect + data class NavigateToTravelPlace(val googlePlaceId: String) : MyTravelSideEffect data object NavigateToPopularTravelList : MyTravelSideEffect } diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelScreen.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelScreen.kt index 952f7eb2..ee286f07 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelScreen.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelScreen.kt @@ -45,8 +45,8 @@ internal fun MyTravelRoute( onTravelClick = { travelId, days -> viewModel.onIntent(MyTravelIntent.ClickTravelDetail(travelId = travelId, days = days)) }, - onPlaceClick = { placeId -> - viewModel.onIntent(MyTravelIntent.ClickPlaceDetail(placeId = placeId)) + onPlaceClick = { googlePlaceId -> + viewModel.onIntent(MyTravelIntent.ClickPlaceDetail(googlePlaceId = googlePlaceId)) }, onNewTravelFindClick = { viewModel.onIntent(MyTravelIntent.ClickFindNewTravel) @@ -73,7 +73,7 @@ internal fun MyTravelRoute( ) is MyTravelSideEffect.NavigateToTravelPlace -> navigateToTravelPlace( - sideEffect.placeId, + sideEffect.googlePlaceId, ) MyTravelSideEffect.NavigateToPopularTravelList -> navigateToPopularTravelList() diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelViewModel.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelViewModel.kt index c5872caf..57ae711f 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelViewModel.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/MyTravelViewModel.kt @@ -77,7 +77,7 @@ class MyTravelViewModel @Inject constructor( dayCount = dayCount, currentPlace = upcomingPlace?.place?.let { place -> MyTravelState.TravelPlace( - placeId = place.googlePlaceId, + googlePlaceId = place.googlePlaceId, category = place.category, estimatedDuration = upcomingPlace.estimatedDuration, name = place.name, @@ -159,7 +159,7 @@ class MyTravelViewModel @Inject constructor( MyTravelIntent.ClickSettings -> postNavigateToSettings() is MyTravelIntent.ClickTravel -> postNavigateToFollowTravel(travelId = intent.travelId, days = intent.days) is MyTravelIntent.ClickTravelDetail -> postNavigateToTravelDetail(travelId = intent.travelId, days = intent.days) - is MyTravelIntent.ClickPlaceDetail -> postNavigateToPlaceDetail(placeId = intent.placeId) + is MyTravelIntent.ClickPlaceDetail -> postNavigateToPlaceDetail(googlePlaceId = intent.googlePlaceId) MyTravelIntent.ClickFindNewTravel -> postNavigateToPopularTravelList() } } @@ -180,8 +180,8 @@ class MyTravelViewModel @Inject constructor( postSideEffect(MyTravelSideEffect.NavigateToTravelDetail(travelId = travelId, days = days)) } - private fun postNavigateToPlaceDetail(placeId: String) { - postSideEffect(MyTravelSideEffect.NavigateToTravelPlace(placeId = placeId)) + private fun postNavigateToPlaceDetail(googlePlaceId: String) { + postSideEffect(MyTravelSideEffect.NavigateToTravelPlace(googlePlaceId = googlePlaceId)) } private fun postNavigateToPopularTravelList() { diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/UpcomingTravelCardSection.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/UpcomingTravelCardSection.kt index 653c232d..f4fd271a 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/UpcomingTravelCardSection.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/mytravel/UpcomingTravelCardSection.kt @@ -220,7 +220,7 @@ private fun InProgressTravelCard( if (travel.currentPlace != null) { PlaceInfoCard( place = travel.currentPlace, - onPlaceClick = { onPlaceClick(travel.currentPlace.placeId) }, + onPlaceClick = { onPlaceClick(travel.currentPlace.googlePlaceId) }, ) } } @@ -346,7 +346,7 @@ private fun InProgressTravelCardPreview() { endDate = LocalDate.of(2025, 2, 10), dayCount = 3, currentPlace = TravelPlace( - placeId = "place1", + googlePlaceId = "", category = PlaceCategory.ATTRACTION, estimatedDuration = 60, name = "인도 국제 공항", diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/navigation/TravelEntry.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/navigation/TravelEntry.kt index ca001dee..100201de 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/navigation/TravelEntry.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/navigation/TravelEntry.kt @@ -39,8 +39,8 @@ fun EntryProviderScope.travelEntry(navigator: Navigator) { navigateToTravelDetail = { travelId, days -> navigator.navigate(Route.TravelDetail(travelId, days)) }, - navigateToTravelPlace = { placeId -> - navigator.navigate(Route.PlaceDetail(placeId)) + navigateToTravelPlace = { googlePlaceId -> + navigator.navigate(Route.PlaceDetail(googlePlaceId)) }, navigateToPopularTravelList = { navigator.navigate(Route.PopularTravelList) @@ -171,13 +171,13 @@ fun EntryProviderScope.travelEntry(navigator: Navigator) { AddItineraryRoute( viewModel = viewModel, navigateBack = { navigator.goBack() }, - navigateToAddPlace = { placeId -> navigator.navigate(Route.AddPlace(placeId)) }, + navigateToAddPlace = { googlePlaceId -> navigator.navigate(Route.AddPlace(googlePlaceId)) }, ) } entry { route -> val viewModel = hiltViewModel { factory -> - factory.create(placeId = route.placeId) + factory.create(googlePlaceId = route.googlePlaceId) } AddPlaceRoute( viewModel = viewModel, diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt index b96a27cd..06b1dbb1 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailContract.kt @@ -129,7 +129,7 @@ sealed interface TravelDetailIntent : UiIntent { data class ClickAddMemo(val placeId: Long) : TravelDetailIntent data class ClickFindRoute(val googleMapsUri: String) : TravelDetailIntent data object DismissPlaceBottomSheet : TravelDetailIntent - data class NavigateToTravelPlaceDetail(val placeId: String) : TravelDetailIntent + data class NavigateToTravelPlaceDetail(val googlePlaceId: String) : TravelDetailIntent data object DismissTimeBottomSheet : TravelDetailIntent data class ConfirmDuration(val duration: Duration) : TravelDetailIntent data object DismissCostModal : TravelDetailIntent diff --git a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt index ed92fc4a..e8894201 100644 --- a/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt +++ b/feature/travel/src/main/java/com/yapp/ndgl/feature/travel/traveldetail/TravelDetailViewModel.kt @@ -114,6 +114,72 @@ class TravelDetailViewModel @AssistedInject constructor( } private suspend fun handleAddPlace(event: AddPlaceEvent) { + if (state.value.isEditMode) { + handleAddPlaceInEditMode(event) + } else { + handleAddPlaceNormally(event) + } + } + + private fun handleAddPlaceInEditMode(event: AddPlaceEvent) = viewModelScope.launch { + val dayIndex = event.day - 1 + val currentItinerary = state.value.tempItineraries.getOrNull(dayIndex) ?: return@launch + val newSequence = currentItinerary.places.size + 1 + + suspendRunCatching { + userTravelRepository.addItinerary( + travelId = travelId, + googlePlaceId = event.googlePlaceId, + day = event.day, + sequence = newSequence, + startTime = null, + estimatedDuration = 60, + cost = null, + memo = null, + distanceKm = null, + transportation = null, + ) + }.onSuccess { response -> + val newPlace = TravelPlace( + id = response.id, + placeInfo = PlaceInfo( + googlePlaceId = response.place.googlePlaceId, + name = response.place.name, + placeType = response.place.category.toPlaceType(), + day = response.day, + sequence = response.sequence, + thumbnail = response.place.thumbnail, + latitude = response.place.latitude, + longitude = response.place.longitude, + googleMapsUri = response.place.googleMapsUri, + estimatedDuration = response.estimatedDuration.minutes, + ), + regularOpeningHours = response.place.regularOpeningHours, + userData = TravelPlace.UserData( + estimatedDuration = response.estimatedDuration.minutes, + ), + startTime = 0.hours, + transportToNext = null, + ) + + reduce { + val updatedItineraries = tempItineraries.mapIndexed { index, itinerary -> + if (index == dayIndex) { + itinerary.copy(places = itinerary.places + newPlace) + } else { + itinerary + } + } + copy(tempItineraries = updatedItineraries) + } + + postSideEffect(TravelDetailSideEffect.ScrollToPlace(newPlace.id)) + }.onFailure { + // TODO: Handle API failure + } + } + + private suspend fun handleAddPlaceNormally(event: AddPlaceEvent) { val dayIndex = event.day - 1 val currentItinerary = state.value.itineraries.getOrNull(dayIndex) ?: return val newSequence = currentItinerary.places.size + 1 @@ -133,8 +199,8 @@ class TravelDetailViewModel @AssistedInject constructor( null } - val (distanceKm, transportation) = if (currentItinerary.places.isNotEmpty()) { - newTransportSegment?.distanceKm to listOfNotNull(newTransportSegment?.toTransportationItem()) + val (distanceKm, transportation) = if (currentItinerary.places.isNotEmpty() && newTransportSegment != null) { + newTransportSegment.distanceKm to listOf(newTransportSegment.toTransportationItem()) } else { null to null } @@ -384,6 +450,7 @@ class TravelDetailViewModel @AssistedInject constructor( copy( isEditMode = true, selectedPlaceIds = emptySet(), + tempItineraries = itineraries, ) } } @@ -468,7 +535,7 @@ class TravelDetailViewModel @AssistedInject constructor( } private fun confirmEditMode() = viewModelScope.launch { - // 일차별로 변경 사항 감지, 교통수단 재계산 및 시간 재계산 + // 교통수단 재계산 및 시간 재계산 val updatedItineraries = state.value.tempItineraries.mapIndexed { dayIndex, tempItinerary -> val originalItinerary = state.value.itineraries.getOrNull(dayIndex) val hasChanges = originalItinerary == null || tempItinerary.places.map { it.id } != originalItinerary.places.map { it.id } @@ -484,6 +551,7 @@ class TravelDetailViewModel @AssistedInject constructor( } } + // updateItinerary API로 순서 및 교통수단 업데이트 updateItinerary(updatedItineraries).onSuccess { reduce { copy( @@ -797,11 +865,12 @@ class TravelDetailViewModel @AssistedInject constructor( travelMode = mode, ) }.getOrNull()?.let { routeInfo -> - if (routeInfo.distanceMeters > 0) { + val durationSeconds = routeInfo.duration.removeSuffix("s").toLongOrNull()?.seconds + if (routeInfo.distanceMeters > 0 && durationSeconds != null) { TransportSegment( googlePlaceId = to.placeInfo.googlePlaceId, type = mode.toTransportTypeFromMode(), - duration = routeInfo.duration.removeSuffix("s").toInt().seconds, + duration = durationSeconds, distance = routeInfo.distanceMeters, ) } else { @@ -831,11 +900,12 @@ class TravelDetailViewModel @AssistedInject constructor( travelMode = travelMode, ) }.getOrNull()?.let { routeInfo -> - if (routeInfo.distanceMeters > 0) { + val durationSeconds = routeInfo.duration.removeSuffix("s").toLongOrNull()?.seconds + if (routeInfo.distanceMeters > 0 && durationSeconds != null) { TransportSegment( googlePlaceId = newGooglePlaceId, type = travelMode.toTransportType(), - duration = routeInfo.duration.removeSuffix("s").toLong().seconds, + duration = durationSeconds, distance = routeInfo.distanceMeters, ) } else { @@ -1024,7 +1094,7 @@ class TravelDetailViewModel @AssistedInject constructor( is TravelDetailIntent.ConfirmChangeTransportSegment -> confirmChangeTransportSegment(intent.segment) is TravelDetailIntent.ClickPlaceItem -> clickPlaceItem(intent.place) is TravelDetailIntent.DismissPlaceBottomSheet -> dismissPlaceBottomSheet() - is TravelDetailIntent.NavigateToTravelPlaceDetail -> navigateToPlaceDetail(intent.placeId) + is TravelDetailIntent.NavigateToTravelPlaceDetail -> navigateToPlaceDetail(intent.googlePlaceId) is TravelDetailIntent.ClickAddTime -> clickAddTime() is TravelDetailIntent.ClickAddCost -> clickAddCost() is TravelDetailIntent.ClickAddMemo -> clickAddMemo() diff --git a/navigation/src/main/java/com/yapp/ndgl/navigation/Route.kt b/navigation/src/main/java/com/yapp/ndgl/navigation/Route.kt index 22fe6a01..6c2d7cee 100644 --- a/navigation/src/main/java/com/yapp/ndgl/navigation/Route.kt +++ b/navigation/src/main/java/com/yapp/ndgl/navigation/Route.kt @@ -61,7 +61,7 @@ sealed interface Route : NavKey { ) : Route @Serializable - data class AddPlace(val placeId: String) : Route + data class AddPlace(val googlePlaceId: String) : Route @Serializable data object TravelHelper : Route