diff --git a/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt b/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt index e4f49a59..b43c7138 100644 --- a/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt +++ b/core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp import com.teamsolply.solply.designsystem.component.button.SolplySavedMarker import com.teamsolply.solply.designsystem.component.chip.CheckedBigCircle @@ -76,7 +77,12 @@ fun SolplyPlaceCard( ) { AdaptationImage( imageUrl = imgRes, - modifier = Modifier.matchParentSize() + modifier = Modifier + .size(136.dp) + .fillMaxWidth() + .clip(RoundedCornerShape(20.dp)) + .matchParentSize(), + contentScale = ContentScale.Crop ) if (saved) { SolplySavedMarker( diff --git a/data/place/src/main/java/com/teamsolply/solply/place/dto/response/GetPlacesResponseDto.kt b/data/place/src/main/java/com/teamsolply/solply/place/dto/response/GetPlacesResponseDto.kt new file mode 100644 index 00000000..88acdea3 --- /dev/null +++ b/data/place/src/main/java/com/teamsolply/solply/place/dto/response/GetPlacesResponseDto.kt @@ -0,0 +1,28 @@ +package com.teamsolply.solply.place.dto.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GetPlacesResponseDto( + @SerialName("places") + val places: List +) + +@Serializable +data class PlaceDto( + @SerialName("placeId") + val placeId: Long, + + @SerialName("placeName") + val placeName: String, + + @SerialName("thumbnailImageUrl") + val thumbnailImageUrl: String, + + @SerialName("primaryTag") + val primaryTag: String, + + @SerialName("isBookmarked") + val isBookmarked: Boolean +) diff --git a/data/place/src/main/java/com/teamsolply/solply/place/mapper/PlaceEntityMapper.kt b/data/place/src/main/java/com/teamsolply/solply/place/mapper/PlaceEntityMapper.kt new file mode 100644 index 00000000..9732d9ff --- /dev/null +++ b/data/place/src/main/java/com/teamsolply/solply/place/mapper/PlaceEntityMapper.kt @@ -0,0 +1,14 @@ +package com.teamsolply.solply.place.mapper + +import com.teamsolply.solply.place.dto.response.PlaceDto +import com.teamsolply.solply.place.model.PlaceEntity + +fun PlaceDto.toEntity(): PlaceEntity { + return PlaceEntity( + placeId = this.placeId, + placeName = this.placeName, + thumbnailImageUrl = this.thumbnailImageUrl, + primaryTag = this.primaryTag, + isBookmarked = this.isBookmarked + ) +} diff --git a/data/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepositoryImpl.kt b/data/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepositoryImpl.kt index 5cbfd1d9..58c2cd0e 100644 --- a/data/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepositoryImpl.kt +++ b/data/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepositoryImpl.kt @@ -2,6 +2,7 @@ package com.teamsolply.solply.place.repository import android.util.Log import com.teamsolply.solply.model.PlaceType +import com.teamsolply.solply.place.model.PlaceEntity import com.teamsolply.solply.place.model.RecommendPlaceInfo import com.teamsolply.solply.place.model.SaveAutoSignInEntity import com.teamsolply.solply.place.model.SelectedTownInfo @@ -90,4 +91,29 @@ class PlaceRepositoryImpl @Inject constructor( ) } } + + override suspend fun getPlaces( + townId: Long, + mainTagId: Long?, + subTagAIdList: List?, + subTagBIdList: List? + ): Result> = runCatching { + placeRemoteDataSource.getPlaces( + townId = townId, + isBookmarkSearch = false, + mainTagId = mainTagId, + subTagAIdList = subTagAIdList, + subTagBIdList = subTagBIdList + ) + }.mapCatching { responseDto -> + responseDto.places.map { dto -> + PlaceEntity( + placeId = dto.placeId, + placeName = dto.placeName, + thumbnailImageUrl = dto.thumbnailImageUrl, + primaryTag = dto.primaryTag, + isBookmarked = dto.isBookmarked + ) + } + } } diff --git a/data/place/src/main/java/com/teamsolply/solply/place/source/PlaceRemoteDataSource.kt b/data/place/src/main/java/com/teamsolply/solply/place/source/PlaceRemoteDataSource.kt index a039d229..a3d57981 100644 --- a/data/place/src/main/java/com/teamsolply/solply/place/source/PlaceRemoteDataSource.kt +++ b/data/place/src/main/java/com/teamsolply/solply/place/source/PlaceRemoteDataSource.kt @@ -1,5 +1,6 @@ package com.teamsolply.solply.place.source +import com.teamsolply.solply.place.dto.response.GetPlacesResponseDto import com.teamsolply.solply.place.dto.response.GetRecommendPlaceDto import com.teamsolply.solply.place.dto.response.GetTagResponseDto import com.teamsolply.solply.place.dto.response.GetUserInfoResponseDto @@ -8,4 +9,11 @@ interface PlaceRemoteDataSource { suspend fun getTags(parentId: Int?): List suspend fun getUserInfo(): GetUserInfoResponseDto suspend fun getRecommendPlace(townId: Long): List + suspend fun getPlaces( + townId: Long, + isBookmarkSearch: Boolean, + mainTagId: Long?, + subTagAIdList: List?, + subTagBIdList: List? + ): GetPlacesResponseDto } diff --git a/domain/place/src/main/java/com/teamsolply/solply/place/model/PlaceEntity.kt b/domain/place/src/main/java/com/teamsolply/solply/place/model/PlaceEntity.kt new file mode 100644 index 00000000..3fd50b90 --- /dev/null +++ b/domain/place/src/main/java/com/teamsolply/solply/place/model/PlaceEntity.kt @@ -0,0 +1,9 @@ +package com.teamsolply.solply.place.model + +data class PlaceEntity( + val placeId: Long, + val placeName: String, + val thumbnailImageUrl: String, + val primaryTag: String, + val isBookmarked: Boolean +) diff --git a/domain/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepository.kt b/domain/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepository.kt index c4743105..193bb88c 100644 --- a/domain/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepository.kt +++ b/domain/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepository.kt @@ -1,5 +1,6 @@ package com.teamsolply.solply.place.repository +import com.teamsolply.solply.place.model.PlaceEntity import com.teamsolply.solply.place.model.RecommendPlaceInfo import com.teamsolply.solply.place.model.SaveAutoSignInEntity import com.teamsolply.solply.place.model.TagEntity @@ -11,4 +12,10 @@ interface PlaceRepository { suspend fun getMainTags(): Result> suspend fun getSubTags(parentId: Int): Result> suspend fun getUserInfo(): Result + suspend fun getPlaces( + townId: Long, + mainTagId: Long?, + subTagAIdList: List?, + subTagBIdList: List? + ): Result> } diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt index 8ea3583b..293ea66a 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt @@ -90,10 +90,14 @@ internal class MainNavigator( fun navigateToMaps( mapsType: String, + townId: Long, + placeId: Long? = null, navOptions: NavOptions ) { navController.navigateMaps( mapsType = mapsType, + townId = townId, + placeId = placeId, navOptions = navOptions ) } diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt b/feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt index 359330cc..4dc4e80d 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt @@ -156,23 +156,38 @@ internal fun MainScreen( ) placeNavGraph( paddingValues = innerPadding, - navigateToMaps = { mapsType -> + navigateToMaps = { mapsType, townId, placeId -> val navOptions = navOptions {} - navigator.navigateToMaps(mapsType = mapsType, navOptions = navOptions) + navigator.navigateToMaps( + mapsType = mapsType, + townId = townId, + placeId = placeId, + navOptions = navOptions + ) } ) courseNavGraph( paddingValues = innerPadding, navigateToMaps = { mapsType -> val navOptions = navOptions {} - navigator.navigateToMaps(mapsType = mapsType, navOptions = navOptions) + // TODO. 타운 아이디 + navigator.navigateToMaps( + mapsType = mapsType, + townId = 0, + navOptions = navOptions + ) } ) mypageNavGraph( paddingValues = innerPadding, navigateToMaps = { mapsType -> val navOptions = navOptions {} - navigator.navigateToMaps(mapsType = mapsType, navOptions = navOptions) + // TODO. 타운 아이디 + navigator.navigateToMaps( + mapsType = mapsType, + townId = 0, + navOptions = navOptions + ) }, navigateToBack = navigator::navigateToBack, navigateToPlaceCollection = { townId, townName -> @@ -223,15 +238,19 @@ internal fun MainScreen( }, navigateToPlaceDetail = { val navOptions = navOptions {} + // TODO. 타운 아이디 navigator.navigateToMaps( mapsType = MapsType.PLACE_DETAIL.name, + townId = 0, navOptions = navOptions ) }, navigateToEditCourse = { val navOptions = navOptions {} + // TODO. 타운 아이디 navigator.navigateToMaps( mapsType = MapsType.EDIT_COURSE.name, + townId = 0, navOptions = navOptions ) }, @@ -265,7 +284,12 @@ internal fun MainScreen( paddingValues = innerPadding, navigateToMaps = { mapsType -> val navOptions = navOptions {} - navigator.navigateToMaps(mapsType = mapsType, navOptions = navOptions) + // TODO. 타운 아이디 + navigator.navigateToMaps( + mapsType = mapsType, + townId = 0, + navOptions = navOptions + ) }, navigateToBack = navigator::navigateToBack ) @@ -273,7 +297,12 @@ internal fun MainScreen( paddingValues = innerPadding, navigateToMaps = { mapsType -> val navOptions = navOptions { } - navigator.navigateToMaps(mapsType = mapsType, navOptions = navOptions) + // TODO. 타운 아이디 + navigator.navigateToMaps( + mapsType = mapsType, + townId = 0, + navOptions = navOptions + ) }, navigateToBack = navigator::navigateToBack ) diff --git a/feature/main/src/main/java/com/teamsolply/solply/main/component/MainBottomBar.kt b/feature/main/src/main/java/com/teamsolply/solply/main/component/MainBottomBar.kt index fc82d7d5..f97ea900 100644 --- a/feature/main/src/main/java/com/teamsolply/solply/main/component/MainBottomBar.kt +++ b/feature/main/src/main/java/com/teamsolply/solply/main/component/MainBottomBar.kt @@ -1,6 +1,9 @@ package com.teamsolply.solply.main.component import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -34,7 +37,17 @@ internal fun MainBottomBar( currentTab: MainNavTab?, onTabSelected: (MainNavTab) -> Unit ) { - AnimatedVisibility(visible = visible) { + AnimatedVisibility( + visible = visible, + enter = slideInHorizontally( + animationSpec = tween(250), + initialOffsetX = { it } + ), + exit = slideOutHorizontally( + animationSpec = tween(250), + targetOffsetX = { it } + ) + ) { Box(modifier = modifier.fillMaxWidth()) { Row( modifier = Modifier diff --git a/feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt b/feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt index 89004c70..31732e1c 100644 --- a/feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt +++ b/feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt @@ -81,8 +81,8 @@ import kotlin.math.abs @Composable internal fun MapsRoute( mapsType: MapsType, - townId: Long = 0, - targetId: Long = 1, + townId: Long, + placeId: Long?, showTextSnackBar: (String) -> Unit, showNotificationSnackBar: (String) -> Unit, showNavigateSnackBar: (String, () -> Unit) -> Unit, @@ -102,8 +102,10 @@ internal fun MapsRoute( LaunchedEffect(Unit) { when (mapsType) { MapsType.PLACE_DETAIL -> { - viewModel.getPlaceDetailInfo(targetId) - viewModel.getAllCourseInfo(townId = townId, placeId = targetId) + if (placeId != null) { + viewModel.getPlaceDetailInfo(placeId) + viewModel.getAllCourseInfo(townId = townId, placeId = placeId) + } } MapsType.ADD_COURSE -> { diff --git a/feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt b/feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt index 008c81d7..fd0bc95f 100644 --- a/feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt +++ b/feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt @@ -8,7 +8,9 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid @@ -22,6 +24,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.AnnotatedString @@ -172,7 +175,10 @@ fun PlaceDetailBottomSheet( AdaptationImage( imageUrl = placeImageUrls[page].url, modifier = Modifier - .clip(RoundedCornerShape(20.dp)) + .height(218.dp) + .fillMaxWidth() + .clip(RoundedCornerShape(20.dp)), + contentScale = ContentScale.Crop ) } Box( diff --git a/feature/maps/src/main/java/com/teamsolply/solply/maps/navigation/MapsNavigation.kt b/feature/maps/src/main/java/com/teamsolply/solply/maps/navigation/MapsNavigation.kt index 303399bc..4014553e 100644 --- a/feature/maps/src/main/java/com/teamsolply/solply/maps/navigation/MapsNavigation.kt +++ b/feature/maps/src/main/java/com/teamsolply/solply/maps/navigation/MapsNavigation.kt @@ -13,9 +13,11 @@ import kotlinx.serialization.Serializable fun NavController.navigateMaps( mapsType: String, + townId: Long, + placeId: Long?, navOptions: NavOptions ) { - navigate(Maps(mapsType = mapsType), navOptions) + navigate(Maps(mapsType = mapsType, townId = townId, placeId = placeId), navOptions) } fun NavGraphBuilder.mapsNavGraph( @@ -32,8 +34,13 @@ fun NavGraphBuilder.mapsNavGraph( ) { composable { backStackEntry -> val mapsType = MapsType.valueOf(backStackEntry.toRoute().mapsType) + val townId = backStackEntry.toRoute().townId + val placeId = backStackEntry.toRoute().placeId + MapsRoute( mapsType = mapsType, + townId = townId, + placeId = placeId, showTextSnackBar = showTextSnackBar, showNotificationSnackBar = showNotificationSnackBar, showNavigateSnackBar = showNavigateSnackBar, @@ -50,5 +57,7 @@ fun NavGraphBuilder.mapsNavGraph( @Serializable data class Maps( - val mapsType: String + val mapsType: String, + val townId: Long, + val placeId: Long? ) : Route diff --git a/feature/place/src/main/java/com/teamsolply/solply/place/PlaceContract.kt b/feature/place/src/main/java/com/teamsolply/solply/place/PlaceContract.kt index 45fe8d90..b7b34fb5 100644 --- a/feature/place/src/main/java/com/teamsolply/solply/place/PlaceContract.kt +++ b/feature/place/src/main/java/com/teamsolply/solply/place/PlaceContract.kt @@ -1,6 +1,5 @@ package com.teamsolply.solply.place -import com.teamsolply.solply.model.PlaceType import com.teamsolply.solply.place.model.PlaceData import com.teamsolply.solply.place.model.RecommendPlaceInfo import com.teamsolply.solply.place.model.SelectedTownInfo @@ -11,7 +10,6 @@ import com.teamsolply.solply.ui.base.UiIntent import com.teamsolply.solply.ui.base.UiState import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.persistentListOf -import okhttp3.internal.immutableListOf data class PlaceState( val townId: Long = 0, @@ -23,98 +21,14 @@ data class PlaceState( persona = "REST" ), - val recommendPlaces: List = immutableListOf( - RecommendPlaceInfo( - placeId = 0, - placeName = "장소 이름", - thumbnailImageUrl = "", - primaryTag = PlaceType.CAFE, - introduction = "장소 한 줄 소개 장소 한 줄 소개" - ), - RecommendPlaceInfo( - placeId = 1, - placeName = "장소 이름", - thumbnailImageUrl = "", - primaryTag = PlaceType.FOOD, - introduction = "장소 한 줄 소개 장소 한 줄 소개" - ), - RecommendPlaceInfo( - placeId = 2, - placeName = "장소 이름", - thumbnailImageUrl = "", - primaryTag = PlaceType.UNIQUE_SPACE, - introduction = "장소 한 줄 소개 장소 한 줄 소개 두 줄이 되어도 괜찮음음음음음음" - ) - ), - val placeList: List = immutableListOf( - PlaceData( - placeId = 1, - placeName = "바보", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.FOOD, - isBookmarked = true - ), - PlaceData( - placeId = 2, - placeName = "연남동", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.CAFE, - isBookmarked = false - ), - PlaceData( - placeId = 3, - placeName = "홍대어딘가", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.UNIQUE_SPACE, - isBookmarked = true - ), - PlaceData( - placeId = 4, - placeName = "하현상최고", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.WALKING, - isBookmarked = false - ), - PlaceData( - placeId = 5, - placeName = "크크르상회", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.CAFE, - isBookmarked = true - ), - PlaceData( - placeId = 6, - placeName = "메롱2", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.CAFE, - isBookmarked = true - ), - PlaceData( - placeId = 7, - placeName = "메롱3", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.CAFE, - isBookmarked = true - ), - PlaceData( - placeId = 8, - placeName = "불꽃놀이", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.SHOPPING, - isBookmarked = false - ), - PlaceData( - placeId = 9, - placeName = "연희동달팽이", - thumbnailUrl = com.teamsolply.solply.designsystem.R.drawable.img_course_dummy, - primaryTag = PlaceType.BOOKSTORE, - isBookmarked = false - ) - ), + val recommendPlaces: PersistentList = persistentListOf(), + + val placeList: PersistentList = persistentListOf(), + val selectedMainTagId: Int = 0, - val mainFilterItems: List = listOf(), - val subFilterItems: List? = listOf(), + val mainFilterItems: PersistentList = persistentListOf(), + val subFilterItems: PersistentList? = persistentListOf(), val isMainFilterBottomSheetVisible: Boolean = false, val selectedMainFilter: String = "ALL", @@ -129,7 +43,6 @@ sealed interface PlaceIntent : UiIntent { data class LoadPlaces(val townId: Long) : PlaceIntent data class PlaceClicked(val placeId: Long) : PlaceIntent data object Retry : PlaceIntent - data class SelectOptionFilter(val optionTagId: Int) : PlaceIntent data object ClearOptionFilter : PlaceIntent data object ChangeMainFilterBottomSheetVisible : PlaceIntent diff --git a/feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt b/feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt index c24470c0..d82e8ff3 100644 --- a/feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt +++ b/feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt @@ -64,7 +64,7 @@ import toPlaceTypeFilterItem @Composable fun PlaceRoute( paddingValues: PaddingValues, - navigateToMaps: (String) -> Unit, + navigateToMaps: (String, Long, Long) -> Unit, viewModel: PlaceViewModel = hiltViewModel() ) { val state by viewModel.uiState.collectAsState() @@ -75,8 +75,11 @@ fun PlaceRoute( viewModel.sideEffect.collectLatest { sideEffect -> when (sideEffect) { is PlaceSideEffect.NavigateToMap -> { - // TODO. maps로 placeId 전달 sideEffect.placeId - navigateToMaps(MapsType.PLACE_DETAIL.name) + navigateToMaps( + MapsType.PLACE_DETAIL.name, + state.townId, + sideEffect.placeId + ) } } } @@ -103,10 +106,17 @@ fun PlaceRoute( dragHandle = null ) { PlaceTypeFilterSheet( - filterItems = state.mainFilterItems.map { it.toPlaceType().toPlaceTypeFilterItem() }, + filterItems = state.mainFilterItems.map { + it.toPlaceType().toPlaceTypeFilterItem() + }, selectedType = state.selectedMainFilter, onSelectType = { mainFilterId, mainFilterName -> - viewModel.sendIntent(PlaceIntent.ChangeSelectedMainFilter(mainFilterId, mainFilterName)) + viewModel.sendIntent( + PlaceIntent.ChangeSelectedMainFilter( + mainFilterId, + mainFilterName + ) + ) viewModel.sendIntent(PlaceIntent.ChangeMainFilterBottomSheetVisible) }, onDismiss = { @@ -314,7 +324,7 @@ fun PlaceGridItem( ) { SolplyPlaceCard( name = place.placeName, - imgRes = "", + imgRes = place.thumbnailUrl, placeType = place.primaryTag, modifier = modifier, onClick = onClick, diff --git a/feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt b/feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt index a539edae..bd4d2635 100644 --- a/feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt +++ b/feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt @@ -1,6 +1,8 @@ package com.teamsolply.solply.place import androidx.lifecycle.viewModelScope +import com.teamsolply.solply.model.PlaceType +import com.teamsolply.solply.place.model.PlaceData import com.teamsolply.solply.place.model.SaveAutoSignInEntity import com.teamsolply.solply.place.repository.PlaceRepository import com.teamsolply.solply.ui.base.BaseViewModel @@ -42,21 +44,6 @@ class PlaceViewModel @Inject constructor( is PlaceIntent.PlaceClicked -> postSideEffect(PlaceSideEffect.NavigateToMap(intent.placeId)) PlaceIntent.Retry -> {} - is PlaceIntent.SelectOptionFilter -> { - val currentOptionFilter = intent.optionTagId - val updatedOptionFilter = - if (uiState.value.selectedOptionFilter.contains(currentOptionFilter)) { - uiState.value.selectedOptionFilter - currentOptionFilter - } else { - uiState.value.selectedOptionFilter + currentOptionFilter - } - reduce { - copy( - selectedOptionFilter = updatedOptionFilter.toPersistentList() - ) - } - } - // 메인 필터 바텀시트 visible PlaceIntent.ChangeMainFilterBottomSheetVisible -> reduce { copy(isMainFilterBottomSheetVisible = !isMainFilterBottomSheetVisible) @@ -95,7 +82,7 @@ class PlaceViewModel @Inject constructor( viewModelScope.launch { repository.getRecommendedPlace(townId) .onSuccess { placesList -> - reduce { copy(recommendPlaces = placesList) } + reduce { copy(recommendPlaces = placesList.toPersistentList()) } } } } @@ -107,7 +94,7 @@ class PlaceViewModel @Inject constructor( reduce { copy( selectedMainTagId = tagList[0].tagId, - mainFilterItems = tagList + mainFilterItems = tagList.toPersistentList() ) } // TODO 전체 선택할 때 404 예외 처리 @@ -121,7 +108,7 @@ class PlaceViewModel @Inject constructor( .onSuccess { tagList -> reduce { copy( - subFilterItems = tagList + subFilterItems = tagList.toPersistentList() ) } } @@ -133,7 +120,44 @@ class PlaceViewModel @Inject constructor( repository.getUserInfo() .onSuccess { userInfo -> reduce { copy(userInfo = userInfo) } + + loadPlaces( + townId = userInfo.selectedTown.townId, + mainTagId = null, + subTagAIdList = null, + subTagBIdList = null + ) } } } + + private fun loadPlaces( + townId: Long, + mainTagId: Long? = null, + subTagAIdList: List? = null, + subTagBIdList: List? = null + ) { + viewModelScope.launch { + repository.getPlaces( + townId = townId, + mainTagId = mainTagId, + subTagAIdList = subTagAIdList, + subTagBIdList = subTagBIdList + ).onSuccess { placeEntities -> + reduce { + copy( + placeList = placeEntities.map { + PlaceData( + placeId = it.placeId, + placeName = it.placeName, + thumbnailUrl = it.thumbnailImageUrl, + primaryTag = PlaceType.valueOf(it.primaryTag), + isBookmarked = it.isBookmarked + ) + }.toPersistentList() + ) + } + } + } + } } diff --git a/feature/place/src/main/java/com/teamsolply/solply/place/model/PlaceData.kt b/feature/place/src/main/java/com/teamsolply/solply/place/model/PlaceData.kt index 9d4389e3..0e4443d3 100644 --- a/feature/place/src/main/java/com/teamsolply/solply/place/model/PlaceData.kt +++ b/feature/place/src/main/java/com/teamsolply/solply/place/model/PlaceData.kt @@ -5,7 +5,7 @@ import com.teamsolply.solply.model.PlaceType data class PlaceData( val placeId: Long, val placeName: String, - val thumbnailUrl: Int, + val thumbnailUrl: String, val primaryTag: PlaceType, val isBookmarked: Boolean ) diff --git a/feature/place/src/main/java/com/teamsolply/solply/place/navigation/PlaceNavigation.kt b/feature/place/src/main/java/com/teamsolply/solply/place/navigation/PlaceNavigation.kt index 092cc3d8..f982a52a 100644 --- a/feature/place/src/main/java/com/teamsolply/solply/place/navigation/PlaceNavigation.kt +++ b/feature/place/src/main/java/com/teamsolply/solply/place/navigation/PlaceNavigation.kt @@ -15,7 +15,7 @@ fun NavController.navigatePlace(navOptions: NavOptions) { fun NavGraphBuilder.placeNavGraph( paddingValues: PaddingValues, - navigateToMaps: (String) -> Unit + navigateToMaps: (String, Long, Long) -> Unit ) { composable { PlaceRoute( diff --git a/remote/place/src/main/java/com/teamsolply/solply/place/datasource/PlaceRemoteDataSourceImpl.kt b/remote/place/src/main/java/com/teamsolply/solply/place/datasource/PlaceRemoteDataSourceImpl.kt index 70d14558..17be1dd6 100644 --- a/remote/place/src/main/java/com/teamsolply/solply/place/datasource/PlaceRemoteDataSourceImpl.kt +++ b/remote/place/src/main/java/com/teamsolply/solply/place/datasource/PlaceRemoteDataSourceImpl.kt @@ -1,5 +1,6 @@ package com.teamsolply.solply.place.datasource +import com.teamsolply.solply.place.dto.response.GetPlacesResponseDto import com.teamsolply.solply.place.dto.response.GetRecommendPlaceDto import com.teamsolply.solply.place.dto.response.GetTagResponseDto import com.teamsolply.solply.place.dto.response.GetUserInfoResponseDto @@ -21,4 +22,20 @@ class PlaceRemoteDataSourceImpl @Inject constructor( override suspend fun getRecommendPlace(townId: Long): List { return placeService.getRecommendPlace(townId).data.placeInfos } + + override suspend fun getPlaces( + townId: Long, + isBookmarkSearch: Boolean, + mainTagId: Long?, + subTagAIdList: List?, + subTagBIdList: List? + ): GetPlacesResponseDto { + return placeService.getPlaces( + townId = townId, + isBookmarkSearch = isBookmarkSearch, + mainTagId = mainTagId, + subTagAIdList = subTagAIdList, + subTagBIdList = subTagBIdList + ).data + } } diff --git a/remote/place/src/main/java/com/teamsolply/solply/place/service/PlaceService.kt b/remote/place/src/main/java/com/teamsolply/solply/place/service/PlaceService.kt index 76e3fa61..811b6035 100644 --- a/remote/place/src/main/java/com/teamsolply/solply/place/service/PlaceService.kt +++ b/remote/place/src/main/java/com/teamsolply/solply/place/service/PlaceService.kt @@ -1,6 +1,7 @@ package com.teamsolply.solply.place.service import com.teamsolply.solply.network.model.BaseResponse +import com.teamsolply.solply.place.dto.response.GetPlacesResponseDto import com.teamsolply.solply.place.dto.response.GetRecommendPlaceListDto import com.teamsolply.solply.place.dto.response.GetTagListResponseDto import com.teamsolply.solply.place.dto.response.GetUserInfoResponseDto @@ -22,4 +23,13 @@ interface PlaceService { @Query("townId") townId: Long ): BaseResponse + + @GET("/api/places") + suspend fun getPlaces( + @Query("townId") townId: Long, + @Query("isBookmarkSearch") isBookmarkSearch: Boolean, + @Query("mainTagId") mainTagId: Long?, + @Query("subTagAIdList") subTagAIdList: List?, + @Query("subTagBIdList") subTagBIdList: List? + ): BaseResponse }