diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 765315af..c135515d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,9 +18,9 @@ android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" - android:icon="@mipmap/ic_launcher" + android:icon="@mipmap/ic_pawkey_launcher_round" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_pawkey_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.PawKey" android:usesCleartextTraffic="true" diff --git a/app/src/main/ic_pawkey_launcher-playstore.png b/app/src/main/ic_pawkey_launcher-playstore.png new file mode 100644 index 00000000..12c38789 Binary files /dev/null and b/app/src/main/ic_pawkey_launcher-playstore.png differ diff --git a/app/src/main/java/com/paw/key/core/designsystem/component/ChipRow.kt b/app/src/main/java/com/paw/key/core/designsystem/component/ChipRow.kt index 475c9313..a86ffd41 100644 --- a/app/src/main/java/com/paw/key/core/designsystem/component/ChipRow.kt +++ b/app/src/main/java/com/paw/key/core/designsystem/component/ChipRow.kt @@ -3,6 +3,7 @@ package com.paw.key.core.designsystem.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -36,7 +37,7 @@ fun ChipRow( val hiddenCount = tags.size - 3 //가려진 칩 개수 FlowRow( - modifier = modifier, + modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { diff --git a/app/src/main/java/com/paw/key/core/designsystem/component/CourseCard.kt b/app/src/main/java/com/paw/key/core/designsystem/component/CourseCard.kt index f4266e60..ebd078b4 100644 --- a/app/src/main/java/com/paw/key/core/designsystem/component/CourseCard.kt +++ b/app/src/main/java/com/paw/key/core/designsystem/component/CourseCard.kt @@ -34,15 +34,16 @@ fun CourseCard( postId: Int, title: String, createdAt: String, + modifier: Modifier = Modifier, isLiked: Boolean? = null, // 저장한 루트에서만 사용 isPublic: Boolean? = null, // 기록한 루트에서만 사용 + isMine : Boolean, onClickItem: () -> Unit, onClickLike: ((Boolean) -> Unit)? = null, // null이면 클릭 불가 petName: String, - modifier: Modifier = Modifier, representativeImageUrl: String? = null, petProfileImageUrl: String? = null, - descriptionTags: List = emptyList() + descriptionTags: List = emptyList(), ) { fun formatDate(dateString: String): String { return try { @@ -57,7 +58,6 @@ fun CourseCard( modifier = modifier .padding(8.dp) .fillMaxWidth() - .size(width = 328.dp, height = 240.dp) .background(Color.White, shape = RoundedCornerShape(20.dp)) .noRippleClickable { onClickItem() } ) { @@ -128,6 +128,21 @@ fun CourseCard( .clip(CircleShape), contentScale = ContentScale.Crop ) + } else { + Box( + modifier = Modifier + .size(40.dp) + .clip(CircleShape) + .background(PawKeyTheme.colors.gray200), + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.ic_heart_default), + contentDescription = null, + tint = PawKeyTheme.colors.gray400, + modifier = Modifier.size(20.dp) + ) + } } Spacer(modifier = Modifier.width(10.dp)) @@ -197,7 +212,8 @@ fun CourseCard( HorizontalDivider( color = PawKeyTheme.colors.gray50, thickness = 1.dp, - modifier = Modifier.padding(horizontal = 16.dp) + modifier = Modifier + .padding(horizontal = 16.dp) ) } } @@ -216,7 +232,8 @@ fun CourseCardPreview() { petName = "후추", representativeImageUrl = "https://pawkey-server.com/image.jpg", petProfileImageUrl = "https://pawkey-server.com/profile.jpg", - descriptionTags = listOf("이륜차 거의 없음", "물그릇 비치", "쉴 곳 있음") + descriptionTags = listOf("이륜차 거의 없음", "물그릇 비치", "쉴 곳 있음"), + isMine = true ) } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/data/dto/request/sharedwalk/WalkReviewRequestDto.kt b/app/src/main/java/com/paw/key/data/dto/request/sharedwalk/WalkReviewRequestDto.kt index fa79c61c..f0b7b1d3 100644 --- a/app/src/main/java/com/paw/key/data/dto/request/sharedwalk/WalkReviewRequestDto.kt +++ b/app/src/main/java/com/paw/key/data/dto/request/sharedwalk/WalkReviewRequestDto.kt @@ -8,15 +8,15 @@ data class SharedWalkReviewRequestDto( @SerialName("routeId") val routeId: Int, - @SerialName("selectedCategories") - val selectedCategories: List + @SerialName("selectedReviewSetList") + val selectedReviewSetList: List ) @Serializable data class SharedWalkReviewCategoryDto( - @SerialName("categoryId") - val categoryId: Int, + @SerialName("reviewCategoryId") + val reviewCategoryId: Int, - @SerialName("selectedOptionIds") - val selectedOptionIds: List + @SerialName("selectedReviewOptionIds") + val selectedReviewOptionIds: List ) \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt b/app/src/main/java/com/paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt index 954934c7..269d90c2 100644 --- a/app/src/main/java/com/paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt +++ b/app/src/main/java/com/paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt @@ -23,7 +23,7 @@ data class WalkCourseRequestDto( ) { fun toEntity(): WalkCourseEntity { return WalkCourseEntity( - coordinates = coordinates.map { CoordinateEntity(it.longitude, it.latitude) }, + coordinates = coordinates.map { CoordinateEntity(it.latitude, it.longitude) }, distance = distance, duration = duration, startedAt = startedAt, diff --git a/app/src/main/java/com/paw/key/data/remote/datasource/sharedwalk/SharedWalkDataSource.kt b/app/src/main/java/com/paw/key/data/remote/datasource/sharedwalk/SharedWalkDataSource.kt index 769a9429..6c2aebf2 100644 --- a/app/src/main/java/com/paw/key/data/remote/datasource/sharedwalk/SharedWalkDataSource.kt +++ b/app/src/main/java/com/paw/key/data/remote/datasource/sharedwalk/SharedWalkDataSource.kt @@ -12,4 +12,6 @@ class SharedWalkDataSource @Inject constructor( suspend fun postSharedWalkReviewRegister(userId: Int, reviewDto: SharedWalkReviewRequestDto) = sharedWalkService.postSharedWalkReview(userId, reviewDto) + + } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/data/repositoryimpl/sharedwalk/SharedWalkRepositoryImpl.kt b/app/src/main/java/com/paw/key/data/repositoryimpl/sharedwalk/SharedWalkRepositoryImpl.kt index 219a3482..42b332cf 100644 --- a/app/src/main/java/com/paw/key/data/repositoryimpl/sharedwalk/SharedWalkRepositoryImpl.kt +++ b/app/src/main/java/com/paw/key/data/repositoryimpl/sharedwalk/SharedWalkRepositoryImpl.kt @@ -17,9 +17,9 @@ class SharedWalkRepositoryImpl @Inject constructor( override suspend fun postSharedWalkReviewRegister( userId: Int, review: SharedWalkReviewEntity - ): Result { + ): Result { return runCatching { - sharedWalkDataSource.postSharedWalkReviewRegister(userId, review.toDto()) + sharedWalkDataSource.postSharedWalkReviewRegister(userId, review.toDto()).data } } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/data/service/sharedwalk/SharedWalkService.kt b/app/src/main/java/com/paw/key/data/service/sharedwalk/SharedWalkService.kt index 2a62d638..554355a7 100644 --- a/app/src/main/java/com/paw/key/data/service/sharedwalk/SharedWalkService.kt +++ b/app/src/main/java/com/paw/key/data/service/sharedwalk/SharedWalkService.kt @@ -20,5 +20,5 @@ interface SharedWalkService { suspend fun postSharedWalkReview( @Header("X-USER-ID") userId: Int, @Body reviewDto: SharedWalkReviewRequestDto - ) : BaseResponse + ) : BaseResponse } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/domain/model/entity/sharedwalk/SharedWalkReviewEntity.kt b/app/src/main/java/com/paw/key/domain/model/entity/sharedwalk/SharedWalkReviewEntity.kt index db684020..484915d0 100644 --- a/app/src/main/java/com/paw/key/domain/model/entity/sharedwalk/SharedWalkReviewEntity.kt +++ b/app/src/main/java/com/paw/key/domain/model/entity/sharedwalk/SharedWalkReviewEntity.kt @@ -5,15 +5,15 @@ import com.paw.key.data.dto.request.sharedwalk.SharedWalkReviewRequestDto data class SharedWalkReviewEntity( val routeId: Int, - val categories: List + val selectedReviewSetList: List ) { fun toDto(): SharedWalkReviewRequestDto { return SharedWalkReviewRequestDto( routeId = routeId, - selectedCategories = categories.map { category -> + selectedReviewSetList = selectedReviewSetList.map { category -> SharedWalkReviewCategoryDto( - categoryId = category.categoryId, - selectedOptionIds = category.selectedOptionIds + reviewCategoryId = category.reviewCategoryId, + selectedReviewOptionIds = category.selectedReviewOptionIds ) } ) @@ -21,6 +21,6 @@ data class SharedWalkReviewEntity( } data class SharedWalkReviewCategory( - val categoryId: Int, - val selectedOptionIds: List + val reviewCategoryId: Int, + val selectedReviewOptionIds: List ) \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/domain/repository/sharedwalk/SharedWalkRepository.kt b/app/src/main/java/com/paw/key/domain/repository/sharedwalk/SharedWalkRepository.kt index beb3f3e5..39a06bde 100644 --- a/app/src/main/java/com/paw/key/domain/repository/sharedwalk/SharedWalkRepository.kt +++ b/app/src/main/java/com/paw/key/domain/repository/sharedwalk/SharedWalkRepository.kt @@ -6,5 +6,5 @@ import com.paw.key.domain.model.entity.sharedwalk.SharedWalkReviewEntity interface SharedWalkRepository { suspend fun getSharedWalkTrack(userId: Int, routeId: Int): Result - suspend fun postSharedWalkReviewRegister(userId: Int, review: SharedWalkReviewEntity): Result + suspend fun postSharedWalkReviewRegister(userId: Int, review: SharedWalkReviewEntity): Result } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/TabListScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/TabListScreen.kt index e65daf4e..3e580bb8 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/TabListScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/TabListScreen.kt @@ -159,6 +159,7 @@ fun TabListScreen( descriptionTags = post.descriptionTags, postId = post.postId, createdAt = post.createdAt, + isMine = post.isMine, isLiked = post.isLike, onClickItem = { navigateToDetail(post.postId, post.routeId) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/viewmodel/TapListViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/viewmodel/TapListViewModel.kt index afe26214..55cab478 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/viewmodel/TapListViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/viewmodel/TapListViewModel.kt @@ -66,7 +66,7 @@ class TapListViewModel @Inject constructor( userId = userId.first(), request = request ).onSuccess { listEntity -> - val filteredPosts = listEntity.posts.filter { !it.isMine } + val filteredPosts = listEntity.posts//.filter { !it.isMine } println("응답 성공 - 내 게시물 제외된 posts 개수: ${filteredPosts.size}") _state.update { @@ -212,208 +212,208 @@ class TapListViewModel @Inject constructor( } -fun updateMood(option: String) { - _state.update { - it.copy( - selectedMood = if (it.selectedMood == option) "" else option - ) + fun updateMood(option: String) { + _state.update { + it.copy( + selectedMood = if (it.selectedMood == option) "" else option + ) + } } -} -fun updateDogFriend(option: String) { - _state.update { - it.copy( - selectedDogFriend = if (it.selectedDogFriend == option) "" else option - ) + fun updateDogFriend(option: String) { + _state.update { + it.copy( + selectedDogFriend = if (it.selectedDogFriend == option) "" else option + ) + } } -} - -fun updateSafety(option: String) { - _state.update { currentState -> - val newSafety = if (currentState.selectedSafety.contains(option)) { - currentState.selectedSafety.filter { it != option } - } else { - currentState.selectedSafety + option + + fun updateSafety(option: String) { + _state.update { currentState -> + val newSafety = if (currentState.selectedSafety.contains(option)) { + currentState.selectedSafety.filter { it != option } + } else { + currentState.selectedSafety + option + } + currentState.copy(selectedSafety = newSafety) } - currentState.copy(selectedSafety = newSafety) } -} - -fun updateConvenience(option: String) { - _state.update { currentState -> - val newConvenience = if (currentState.selectedConvenience.contains(option)) { - currentState.selectedConvenience.filter { it != option } - } else { - currentState.selectedConvenience + option + + fun updateConvenience(option: String) { + _state.update { currentState -> + val newConvenience = if (currentState.selectedConvenience.contains(option)) { + currentState.selectedConvenience.filter { it != option } + } else { + currentState.selectedConvenience + option + } + currentState.copy(selectedConvenience = newConvenience) } - currentState.copy(selectedConvenience = newConvenience) } -} - -fun updateEnvironment(option: String) { - _state.update { currentState -> - val newEnvironment = if (currentState.selectedEnvironment.contains(option)) { - currentState.selectedEnvironment.filter { it != option } - } else { - currentState.selectedEnvironment + option + + fun updateEnvironment(option: String) { + _state.update { currentState -> + val newEnvironment = if (currentState.selectedEnvironment.contains(option)) { + currentState.selectedEnvironment.filter { it != option } + } else { + currentState.selectedEnvironment + option + } + currentState.copy(selectedEnvironment = newEnvironment) } - currentState.copy(selectedEnvironment = newEnvironment) } -} - -fun toggleTimeExpanded() { - _state.update { it.copy(isTimeExpanded = !it.isTimeExpanded) } -} - -fun toggleMoodExpanded() { - _state.update { it.copy(isMoodExpanded = !it.isMoodExpanded) } -} - -fun toggleDogFriendExpanded() { - _state.update { it.copy(isDogFriendExpanded = !it.isDogFriendExpanded) } -} - -fun toggleSafetyExpanded() { - _state.update { it.copy(isSafetyExpanded = !it.isSafetyExpanded) } -} - -fun toggleConvenienceExpanded() { - _state.update { it.copy(isConvenienceExpanded = !it.isConvenienceExpanded) } -} - -fun toggleEnvironmentExpanded() { - _state.update { it.copy(isEnvironmentExpanded = !it.isEnvironmentExpanded) } -} - -fun resetAllOptions() { - _state.update { currentState -> - currentState.copy( - selectedSortOption = "", - selectedMood = "", - selectedDogFriend = "", - selectedSortTime = "", - selectedSafety = emptyList(), - selectedConvenience = emptyList(), - selectedEnvironment = emptyList(), - isMoodExpanded = false, - isDogFriendExpanded = false, - isSafetyExpanded = false, - isConvenienceExpanded = false, - isEnvironmentExpanded = false, - isTimeExpanded = false - ) + + fun toggleTimeExpanded() { + _state.update { it.copy(isTimeExpanded = !it.isTimeExpanded) } + } + + fun toggleMoodExpanded() { + _state.update { it.copy(isMoodExpanded = !it.isMoodExpanded) } } - loadInitialPosts() -} -fun applyOptions() { - val currentState = _state.value + fun toggleDogFriendExpanded() { + _state.update { it.copy(isDogFriendExpanded = !it.isDogFriendExpanded) } + } - viewModelScope.launch { - _state.update { it.copy(isLoading = true) } + fun toggleSafetyExpanded() { + _state.update { it.copy(isSafetyExpanded = !it.isSafetyExpanded) } + } - try { - val selectedOptions = buildSelectedOptionsList(currentState) + fun toggleConvenienceExpanded() { + _state.update { it.copy(isConvenienceExpanded = !it.isConvenienceExpanded) } + } - val request = PostsListRequestDto( - durationStart = state.value.selectedSortTimeStart, - durationEnd = state.value.selectedSortTimeEnd, - selectedOptions = selectedOptions.ifEmpty { null } + fun toggleEnvironmentExpanded() { + _state.update { it.copy(isEnvironmentExpanded = !it.isEnvironmentExpanded) } + } + + fun resetAllOptions() { + _state.update { currentState -> + currentState.copy( + selectedSortOption = "", + selectedMood = "", + selectedDogFriend = "", + selectedSortTime = "", + selectedSafety = emptyList(), + selectedConvenience = emptyList(), + selectedEnvironment = emptyList(), + isMoodExpanded = false, + isDogFriendExpanded = false, + isSafetyExpanded = false, + isConvenienceExpanded = false, + isEnvironmentExpanded = false, + isTimeExpanded = false ) + } + loadInitialPosts() + } - postsListRepository.postList( - userId = userId.first(), - request = request - ).onSuccess { listEntity -> - _state.update { - it.copy( - isLoading = false, - postsResult = listEntity - ) + fun applyOptions() { + val currentState = _state.value + + viewModelScope.launch { + _state.update { it.copy(isLoading = true) } + + try { + val selectedOptions = buildSelectedOptionsList(currentState) + + val request = PostsListRequestDto( + durationStart = state.value.selectedSortTimeStart, + durationEnd = state.value.selectedSortTimeEnd, + selectedOptions = selectedOptions.ifEmpty { null } + ) + + postsListRepository.postList( + userId = userId.first(), + request = request + ).onSuccess { listEntity -> + _state.update { + it.copy( + isLoading = false, + postsResult = listEntity + ) + } + println("필터링된 게시물 로드 성공: ${listEntity.posts.size}개") + }.onFailure { exception -> + _state.update { it.copy(isLoading = false) } + exception.printStackTrace() + println("필터링된 게시물 로드 실패: ${exception.message}") } - println("필터링된 게시물 로드 성공: ${listEntity.posts.size}개") - }.onFailure { exception -> + } catch (e: Exception) { _state.update { it.copy(isLoading = false) } - exception.printStackTrace() - println("필터링된 게시물 로드 실패: ${exception.message}") + e.printStackTrace() } - } catch (e: Exception) { - _state.update { it.copy(isLoading = false) } - e.printStackTrace() } } -} -private fun buildSelectedOptionsList(state: TapListContract.TapListState): List { - val selectedOptions = mutableListOf() - val filterOptions = state.filterOptions ?: return emptyList() + private fun buildSelectedOptionsList(state: TapListContract.TapListState): List { + val selectedOptions = mutableListOf() + val filterOptions = state.filterOptions ?: return emptyList() - filterOptions.categoryList?.forEach { category -> - val selectedOptionIds = mutableListOf() + filterOptions.categoryList?.forEach { category -> + val selectedOptionIds = mutableListOf() - when (category.categoryName) { - "분위기" -> { - if (state.selectedMood.isNotEmpty()) { - category.categoryOptions?.find { it.categoryOptionText == state.selectedMood } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + when (category.categoryName) { + "분위기" -> { + if (state.selectedMood.isNotEmpty()) { + category.categoryOptions?.find { it.categoryOptionText == state.selectedMood } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } - } - "강아지 친구" -> { - if (state.selectedDogFriend.isNotEmpty()) { - category.categoryOptions?.find { it.categoryOptionText == state.selectedDogFriend } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + "강아지 친구" -> { + if (state.selectedDogFriend.isNotEmpty()) { + category.categoryOptions?.find { it.categoryOptionText == state.selectedDogFriend } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } - } - "안전" -> { - state.selectedSafety.forEach { selectedSafety -> - category.categoryOptions?.find { it.categoryOptionText == selectedSafety } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + "안전" -> { + state.selectedSafety.forEach { selectedSafety -> + category.categoryOptions?.find { it.categoryOptionText == selectedSafety } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } - } - "편의성" -> { - state.selectedConvenience.forEach { selectedConvenience -> - category.categoryOptions?.find { it.categoryOptionText == selectedConvenience } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + "편의성" -> { + state.selectedConvenience.forEach { selectedConvenience -> + category.categoryOptions?.find { it.categoryOptionText == selectedConvenience } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } - } - "환경" -> { - state.selectedEnvironment.forEach { selectedEnvironment -> - category.categoryOptions?.find { it.categoryOptionText == selectedEnvironment } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + "환경" -> { + state.selectedEnvironment.forEach { selectedEnvironment -> + category.categoryOptions?.find { it.categoryOptionText == selectedEnvironment } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } } - } - if (selectedOptionIds.isNotEmpty()) { - selectedOptions.add( - TraitList( - categoryId = category.categoryId, - optionIds = selectedOptionIds + if (selectedOptionIds.isNotEmpty()) { + selectedOptions.add( + TraitList( + categoryId = category.categoryId, + optionIds = selectedOptionIds + ) ) - ) + } } + + return selectedOptions + } + + fun isAllOptionsSelected(): Boolean { + val currentState = _state.value + return currentState.selectedSortOption.isNotEmpty() || + currentState.selectedMood.isNotEmpty() || + currentState.selectedDogFriend.isNotEmpty() || + currentState.selectedSafety.isNotEmpty() || + currentState.selectedConvenience.isNotEmpty() || + currentState.selectedEnvironment.isNotEmpty() } - return selectedOptions -} - -fun isAllOptionsSelected(): Boolean { - val currentState = _state.value - return currentState.selectedSortOption.isNotEmpty() || - currentState.selectedMood.isNotEmpty() || - currentState.selectedDogFriend.isNotEmpty() || - currentState.selectedSafety.isNotEmpty() || - currentState.selectedConvenience.isNotEmpty() || - currentState.selectedEnvironment.isNotEmpty() -} - -fun isFilterApplied(): Boolean { - return isAllOptionsSelected() -} + fun isFilterApplied(): Boolean { + return isAllOptionsSelected() + } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt index 61cd1aab..2081d69d 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt @@ -126,6 +126,10 @@ fun TapMapRoute( } } + LaunchedEffect(Unit) { + viewModel.loadInitialLocation() + } + when (state.initialLocationState) { is UiState.Loading -> { LoadingScreen() @@ -147,6 +151,7 @@ fun TapMapRoute( navigateUp = navigateUp, navigateNext = navigateNext, snackBarHostState = snackBarHostState, + regionName = state.currentRegion ?: "영등포구 여의도동", mapView = mapView, onClickTracking = { viewModel.updateState { @@ -170,6 +175,7 @@ fun TapMapScreen( navigateUp: () -> Unit, navigateNext: () -> Unit, snackBarHostState: SnackbarHostState, + regionName: String, onClickTracking: () -> Unit, mapView: MapView, modifier: Modifier = Modifier, @@ -194,7 +200,7 @@ fun TapMapScreen( ) Text( - text = "강남구 역삼동", + text = regionName, modifier = Modifier .align(Alignment.TopStart) .padding(top = 18.dp, start = 18.dp) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/state/TapMapContract.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/state/TapMapContract.kt index d205012e..fea2cee1 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/state/TapMapContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/state/TapMapContract.kt @@ -10,6 +10,8 @@ data class TapMapState( val currentLocation: LatLng? = null, val isLocationTracking: Boolean = false, val isTrackingEnabled: Boolean = false, + + val currentRegion : String? = null, ) sealed class TapMapSideEffect { diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/viewmodel/TapMapViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/viewmodel/TapMapViewModel.kt index 2f74d20c..30d44609 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/viewmodel/TapMapViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/viewmodel/TapMapViewModel.kt @@ -1,7 +1,10 @@ package com.paw.key.presentation.ui.course.entire.tab.map.viewmodel +import android.util.Log import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.kakao.vectormap.LatLng +import com.paw.key.core.util.PreferenceDataStore import com.paw.key.core.util.UiState import com.paw.key.presentation.ui.course.entire.tab.map.state.TapMapSideEffect import com.paw.key.presentation.ui.course.entire.tab.map.state.TapMapState @@ -10,7 +13,9 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -25,6 +30,19 @@ class TapMapViewModel @Inject constructor( val sideEffect: MutableSharedFlow get() = _sideEffect + private val savedRegion = PreferenceDataStore.getActiveRegion() + + fun loadInitialLocation() { + viewModelScope.launch { + Log.e("TapMapViewModel", "savedRegion: $savedRegion") + _state.update { + it.copy( + currentRegion = savedRegion.first() + ) + } + } + } + fun updateInitialLocationState(newState: UiState) { _state.value = _state.value.copy( initialLocationState = newState diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/SharedWalkReviewScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/SharedWalkReviewScreen.kt index fb3beae6..0900c687 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/SharedWalkReviewScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/SharedWalkReviewScreen.kt @@ -26,6 +26,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource @@ -50,6 +51,7 @@ import com.paw.key.presentation.ui.course.walkreview.component.WalkReviewFeedbac import com.paw.key.presentation.ui.course.walkreview.component.WalkReviewImageRow import com.paw.key.presentation.ui.course.walkreview.component.WalkReviewInfoHolder import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) @Composable @@ -64,6 +66,7 @@ fun SharedWalkReviewRoute( isSharedWalk : Boolean = true ) { val state by viewModel.state.collectAsStateWithLifecycle() + val scope = rememberCoroutineScope() val isValid = state.isValidForm val userId = PreferenceDataStore.getUserId() @@ -103,7 +106,13 @@ fun SharedWalkReviewRoute( petName = state.petName, feedbackList = state.categoryList, onClickSharedReview = { - viewModel.onClickSharedReview() + // 다이얼로그용 + scope.launch { + viewModel.onClickSharedReview( + routeId = routeId, + userId = userId.first() + ) + } }, modifier = modifier, ) @@ -168,7 +177,7 @@ fun SharedWalkReviewScreen( feedbackList.forEachIndexed { index, category -> WalkReviewFeedbackForm( icon = R.drawable.ic_walk_review_location, - title = "${emoji[index]}${category.categoryDescription}", + title = "${emoji[index]} ${category.categoryDescription}", selectedFeedbackItems = category.options.filter { it.isSelected }.map { it.optionText }, feedbackList = category.options.map { it.optionText }, onClickFeedback = { selectedText -> diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/viewmodel/SharedWalkReviewViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/viewmodel/SharedWalkReviewViewModel.kt index 72ecd8d7..3ad85131 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/viewmodel/SharedWalkReviewViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/viewmodel/SharedWalkReviewViewModel.kt @@ -40,16 +40,16 @@ class SharedWalkReviewViewModel @Inject constructor( viewModelScope.launch { val categoryList = state.value.categoryList.map { category -> SharedWalkReviewCategory( - categoryId = category.categoryId, - selectedOptionIds = category.options.filter { it.isSelected }.map { it.optionId } + reviewCategoryId = category.categoryId, + selectedReviewOptionIds = category.options.filter { it.isSelected }.map { it.optionId } ) } val review = SharedWalkReviewEntity ( routeId = routeId, - categories = categoryList, + selectedReviewSetList = categoryList, ) - + Log.e("sharedWalkReview", "${routeId}, ${userId}") Log.d("SharedWalkReviewSideEffect", "리뷰 : $review") sharedRepository.postSharedWalkReviewRegister( userId = userId, @@ -124,11 +124,16 @@ class SharedWalkReviewViewModel @Inject constructor( } - fun onClickSharedReview() { + fun onClickSharedReview(userId: Int, routeId: Int) { _state.update { it.copy( isDialogVisible = true ) } + + postSharedWalkReview( + userId = userId, + routeId = routeId + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt index 0a9ca4a2..6a13e05f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt @@ -140,6 +140,14 @@ fun sharedWalkCourseMapView( } } + LaunchedEffect(poiPoints) { + kakaoMapState?.moveCamera( + CameraUpdateFactory.fitMapPoints( + poiPoints.toTypedArray(), 150, 15 + ) + ) + } + /*LaunchedEffect(poiPoints) { kakaoMapState?.let { map -> drawRouteOnMap(map, poiPoints) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walk/component/courseMapView.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walk/component/courseMapView.kt index 9c1b0b97..4d790049 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walk/component/courseMapView.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walk/component/courseMapView.kt @@ -125,6 +125,15 @@ fun courseMapView( } } + + LaunchedEffect(poiPoints) { + kakaoMapState?.moveCamera( + CameraUpdateFactory.fitMapPoints( + poiPoints.toTypedArray(), 150, 15 + ) + ) + } + /*val fusedLocationClient = remember { LocationServices.getFusedLocationProviderClient(context) } val locationRequest = remember { diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walk/viewmodel/WalkCourseViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walk/viewmodel/WalkCourseViewModel.kt index f52bd909..00a4692f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walk/viewmodel/WalkCourseViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walk/viewmodel/WalkCourseViewModel.kt @@ -83,7 +83,7 @@ class WalkCourseViewModel @Inject constructor( val routeEntity = WalkCourseEntity( coordinates = state.value.poiPoints.map { // la, lo - CoordinateEntity(it.longitude, it.latitude) + CoordinateEntity(it.latitude, it.longitude) }, distance = state.value.totalDistance.toInt(), duration = (_totalTime.value / 1000).toInt(), diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt index ac50af71..2ae4cb4f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt @@ -55,7 +55,7 @@ import com.paw.key.presentation.ui.course.walkreview.viewmodel.WalkReviewViewMod fun WalkReviewRoute( navigateUp: () -> Unit, navigateNext: (routeId : Int) -> Unit, - navigateShared : (routeId : Int) -> Unit, + navigateShared : (routeId : Int, pageId : Int) -> Unit, routeId : Int, snackBarHostState: SnackbarHostState, modifier: Modifier = Modifier, @@ -63,7 +63,7 @@ fun WalkReviewRoute( isSharedWalk : Boolean = false ) { val state by viewModel.state.collectAsStateWithLifecycle() - val isValid = viewModel.state.collectAsStateWithLifecycle().value.isValidForm + val isValid = state.isValidForm val lifecycleOwner = LocalLifecycleOwner.current @@ -99,7 +99,6 @@ fun WalkReviewRoute( } LaunchedEffect(routeId) { - Log.e("routeid", "$routeId") viewModel.getWalkReviewCategory() viewModel.getWalkReviewInfo(routeId) } @@ -112,7 +111,10 @@ fun WalkReviewRoute( sideEffect.message ) - is WalkReviewContract.WalkReviewSideEffect.NavigateNext -> navigateShared(sideEffect.routeId) + is WalkReviewContract.WalkReviewSideEffect.NavigateNext -> { + Log.d("WalkReviewRoute", "navigateNext") + navigateShared(sideEffect.routeId, sideEffect.pageId) + } WalkReviewContract.WalkReviewSideEffect.NavigateUp -> navigateUp() } } @@ -329,7 +331,7 @@ fun WalkReviewScreen( feedbackList.forEachIndexed { index, category -> WalkReviewFeedbackForm( icon = R.drawable.ic_walk_review_location, - title = "${emoji[index]}${category.categoryDescription}", + title = "${emoji[index]} ${category.categoryDescription}", selectedFeedbackItems = category.options.filter { it.isSelected }.map { it.optionText }, feedbackList = category.options.map { it.optionText }, onClickFeedback = { selectedText -> @@ -413,6 +415,10 @@ fun WalkReviewScreen( // 공유뷰 아님 / 현재 그냥 리뷰 if (!isSharedWalk) { onClickPublic(true) + Log.d("TAG", "WalkReviewScreen: 공유 안됨") + } else { + onClickPublic(false) + Log.d("TAG", "WalkReviewScreen: 공유 됨") } }, enabled = isFormValid, diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/navigation/WalkReviewNavigation.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/navigation/WalkReviewNavigation.kt index e23ca46a..650816d1 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/navigation/WalkReviewNavigation.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/navigation/WalkReviewNavigation.kt @@ -23,7 +23,7 @@ fun NavController.navigateWalkReview( fun NavGraphBuilder.walkReviewNavGraph( navigateUp: () -> Unit, navigateNext: (routeId : Int) -> Unit, - navigateShared : (routeId : Int) -> Unit, + navigateShared : (routeId : Int, pageId : Int) -> Unit, snackBarHostState: SnackbarHostState, ) { composable { backStackEntry -> @@ -34,8 +34,8 @@ fun NavGraphBuilder.walkReviewNavGraph( navigateNext = { navigateNext(ids.routeId) }, - navigateShared = { - navigateShared(ids.routeId) + navigateShared = { routeId, pageId -> + navigateShared(routeId, pageId) }, snackBarHostState = snackBarHostState, routeId = ids.routeId diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt index e128d969..2dd7bfcc 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt @@ -37,6 +37,6 @@ class WalkReviewContract { sealed class WalkReviewSideEffect { data class ShowSnackBar(val message: String) : WalkReviewSideEffect() data object NavigateUp: WalkReviewSideEffect() - data class NavigateNext(val routeId : Int): WalkReviewSideEffect() + data class NavigateNext(val routeId : Int, val pageId : Int): WalkReviewSideEffect() } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt index 8ddd6ace..ad9fe28d 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt @@ -19,7 +19,9 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.update @@ -36,8 +38,8 @@ class WalkReviewViewModel @Inject constructor( get() = _state.asStateFlow() private val _sideEffect = MutableSharedFlow() - val sideEffect : MutableSharedFlow - get() = _sideEffect + val sideEffect : SharedFlow + get() = _sideEffect.asSharedFlow() private val userId = PreferenceDataStore.getUserId() @@ -69,10 +71,10 @@ class WalkReviewViewModel @Inject constructor( userId = userId.first(), imageFiles = imageFiles, walkReviewRequest = requestEntity - ).onSuccess { - _sideEffect.emit(WalkReviewSideEffect.ShowSnackBar("리뷰 전송 성공!")) - _sideEffect.emit(WalkReviewSideEffect.NavigateNext(routeId)) + ).onSuccess { response -> + _sideEffect.emit(WalkReviewSideEffect.NavigateNext(response.routeId, response.postId)) Log.d("WalkReviewViewModel", "리뷰 전송 성공!") + Log.d("WalkReviewViewModel", "routeId : ${response.routeId}, postId : ${response.postId}") }.onFailure { _sideEffect.emit(WalkReviewSideEffect.ShowSnackBar("리뷰 전송 실패!")) Log.e("WalkReviewViewModel", "리뷰 전송 실패!") diff --git a/app/src/main/java/com/paw/key/presentation/ui/home/HomeScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/home/HomeScreen.kt index 542eb0d3..ab68be4f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/home/HomeScreen.kt @@ -185,6 +185,7 @@ fun HomeScreen( petProfileImageUrl = "", descriptionTags = listOf("2.2km"), isLiked = true, + isMine = true, onClickLike = { isLiked -> //onClickLike(post.postId, isLiked) }, diff --git a/app/src/main/java/com/paw/key/presentation/ui/home/viewmodel/HomeViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/home/viewmodel/HomeViewModel.kt index a56e27a0..17371a9a 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/home/viewmodel/HomeViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/home/viewmodel/HomeViewModel.kt @@ -154,7 +154,8 @@ class HomeViewModel @Inject constructor( val result = regionCurrentRepository.RegionCurrent(userId.first()) result.onSuccess { response -> Log.d("HomeViewModel", "RegionCurrent 성공: ${response.fullRegionName}") - + PreferenceDataStore.saveActiveRegion(response.fullRegionName) + Log.d("HomeViewModel", "activeRegion 저장 완료: ${response.fullRegionName}") _state.update { currentState -> currentState.copy( currentRegion = HomeContract.CurrentRegionInfo( @@ -167,13 +168,6 @@ class HomeViewModel @Inject constructor( ) ) } - try { - PreferenceDataStore.saveActiveRegion(response.fullRegionName) - Log.d("HomeViewModel", "activeRegion 저장 완료: ${response.fullRegionName}") - } catch (e: Exception) { - Log.e("HomeViewModel", "activeRegion 저장 실패: ${e.message}") - } - }.onFailure { exception -> Log.e("HomeViewModel", "RegionCurrent 실패: ${exception.message}") _state.update { currentState -> diff --git a/app/src/main/java/com/paw/key/presentation/ui/main/MainNavigator.kt b/app/src/main/java/com/paw/key/presentation/ui/main/MainNavigator.kt index ce7a85c2..bb784688 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/main/MainNavigator.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/main/MainNavigator.kt @@ -105,8 +105,16 @@ class MainNavigator( navController.navigateSavedCourse(navOptions = navOptions) } - fun navigateSavedDetail(navOptions: NavOptions? = null) { - navController.navigateSavedDetail(navOptions = navOptions) + fun navigateSavedDetail( + pageId: Int, + routeId: Int, + navOptions: NavOptions? = null) + { + navController.navigateSavedDetail( + pageId = pageId, + routeId = routeId, + navOptions = navOptions + ) } fun navigateSignUpFlow(navOptions: NavOptions? = null) { diff --git a/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt b/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt index 1f0b55aa..1c39591b 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt @@ -140,9 +140,9 @@ fun PawKeyNavHost( walkCompletionNavGraph( paddingValues = paddingValues, navigateUp = navigator::navigateUp, - navigateNext = { + navigateNext = { routeId -> navigator.navigateWalkReview( - routeId = it, + routeId = routeId, ) }, ) @@ -150,10 +150,10 @@ fun PawKeyNavHost( walkReviewNavGraph( navigateUp = navigator::navigateUp, navigateNext = navigator::navigateCourse, - navigateShared = { - navigator.navigateArchivedDetail( // Todo 새로 생성 시라 pageId 변경 - pageId = 0, - routeId = it + navigateShared = { routeId, pageId -> + navigator.navigateArchivedDetail( + pageId = pageId, + routeId = routeId ) }, snackBarHostState = snackbarHostState @@ -179,17 +179,21 @@ fun PawKeyNavHost( savedCourseNavGraph( paddingValues = paddingValues, navigateUp = navigator::navigateUp, - navigateNext = navigator::navigateSavedDetail, + navigateNext = { routeId, pageId -> + navigator.navigateSavedDetail( + pageId = pageId, + routeId = routeId + ) + }, snackBarHostState = snackbarHostState ) archivedCourseNavGraph( navigateUp = navigator::navigateUp, - navigateNext = { + navigateNext = { routeId, pageId -> navigator.navigateArchivedDetail( - // Todo : 내가 기록 저장한 리스트에서 상세정보 item id 넣어놓기 일단2 - pageId = 0, - routeId = 2 + pageId = pageId, + routeId = routeId ) }, modifier = modifier diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseListScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseListScreen.kt index d2abbd56..5181f982 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseListScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseListScreen.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.first @Composable fun ArchivedCourseRoute( navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, modifier: Modifier = Modifier, viewModel: ArchivedListViewModel = hiltViewModel() ) { @@ -36,7 +36,9 @@ fun ArchivedCourseRoute( ArchivedCourseListScreen( state = state.value, navigateUp = navigateUp, - navigateNext = navigateNext, + navigateNext = { routeId, pageId -> + navigateNext(routeId, pageId) + }, onClickLike = { postId, isLiked -> viewModel.toggleLike(postId = postId, isLiked = isLiked) }, @@ -48,7 +50,7 @@ fun ArchivedCourseRoute( fun ArchivedCourseListScreen( state: ArchivedListState, navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, onClickLike: (postId: Int, isLiked: Boolean) -> Unit, modifier: Modifier = Modifier ) { @@ -75,8 +77,11 @@ fun ArchivedCourseListScreen( descriptionTags = item.descriptionTags, isLiked = null, isPublic = item.isPublic, // 눈아이콘만 표시 - onClickItem = navigateNext, - onClickLike = null + onClickItem = { + navigateNext(item.routeId.toInt(), item.postId) + }, + onClickLike = null, + isMine = false ) } } @@ -90,7 +95,8 @@ fun ArchivedCourseListScreenPreview() { ArchivedCourseListScreen( state = ArchivedListState(), navigateUp = {}, - navigateNext = {}, + navigateNext = { _, _ -> + }, onClickLike = { _, _ -> } ) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt index f7f5d57a..aac4caff 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt @@ -30,6 +30,7 @@ import com.paw.key.R import com.paw.key.core.designsystem.component.SubChip import com.paw.key.core.designsystem.theme.PawKeyTheme import com.paw.key.core.util.PreferenceDataStore +import com.paw.key.core.util.noRippleClickable import com.paw.key.presentation.ui.mypage.component.GrayChip import com.paw.key.presentation.ui.mypage.state.MyPageState import com.paw.key.presentation.ui.mypage.viewmodel.MyPageViewModel @@ -149,7 +150,7 @@ fun OwnerCard( .fillMaxWidth() .background(Color.White, RoundedCornerShape(12.dp)) .padding(16.dp) - .clickable { navigateUserProfile() }, + .noRippleClickable { navigateUserProfile() }, verticalAlignment = Alignment.CenterVertically ) { diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/PetProfileScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/PetProfileScreen.kt index 025fa2c2..f2235975 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/PetProfileScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/PetProfileScreen.kt @@ -23,7 +23,9 @@ import coil.compose.AsyncImage import coil.request.ImageRequest import com.paw.key.core.designsystem.component.TopBar import com.paw.key.core.designsystem.theme.PawKeyTheme +import com.paw.key.core.util.PreferenceDataStore import com.paw.key.presentation.ui.mypage.viewmodel.PetProfileViewModel +import kotlinx.coroutines.flow.first @Composable fun PetProfileRoute( @@ -32,9 +34,10 @@ fun PetProfileRoute( viewModel: PetProfileViewModel = hiltViewModel() ) { val state = viewModel.state.collectAsStateWithLifecycle() + val userId = PreferenceDataStore.getUserId() LaunchedEffect(Unit) { - viewModel.getPetProfiles(2) + viewModel.getPetProfiles(userId.first()) } PetProfileScreen( @@ -43,6 +46,7 @@ fun PetProfileRoute( gender = state.value.gender, breed = state.value.breed, age = state.value.age, + isNeutered = state.value.isNeutered, energyLevel = state.value.energyLevel, socialLevel = state.value.socialLevel, navigateUp = navigateUp, @@ -59,6 +63,7 @@ fun PetProfileScreen( gender: String, breed: String, age: String, + isNeutered: Boolean, energyLevel: String, socialLevel: String ) { @@ -101,12 +106,22 @@ fun PetProfileScreen( PetProfileItem(label = "이름", value = name) PetProfileItem(label = "성별", value = displayGender) - Text( - text = "중성화했어요", - style = PawKeyTheme.typography.caption12Sb2, - color = PawKeyTheme.colors.gray300, - modifier = Modifier.padding(start = 16.dp, top = 8.dp, bottom = 8.dp) - ) + if (isNeutered) { + Text( + text = "중성화했어요", + style = PawKeyTheme.typography.caption12Sb2, + color = PawKeyTheme.colors.gray300, + modifier = Modifier.padding(start = 16.dp, top = 8.dp, bottom = 8.dp) + ) + } else { + Text( + text = "중성화했어요", + style = PawKeyTheme.typography.caption12Sb2, + color = PawKeyTheme.colors.gray300, + modifier = Modifier.padding(start = 16.dp, top = 8.dp, bottom = 8.dp) + ) + } + PetProfileItem(label = "견종", value = breed) PetProfileItem(label = "나이", value = age) @@ -166,7 +181,10 @@ fun PetProfileItem( label: String, value: String ) { - Column(modifier = Modifier.padding(start = 16.dp, bottom = 8.dp)) { + Column( + modifier = Modifier + .padding(start = 16.dp, bottom = 8.dp) + ) { Text( text = label, style = PawKeyTheme.typography.body14R, @@ -175,7 +193,7 @@ fun PetProfileItem( Text( text = value, style = PawKeyTheme.typography.head18Sb, - color = PawKeyTheme.colors.black + color = PawKeyTheme.colors.green500 ) } } @@ -192,7 +210,8 @@ fun PetProfileScreenPreview() { energyLevel = "활동적이에요", socialLevel = "불편해해요", imageUrl = null, - navigateUp = {} + navigateUp = {}, + isNeutered = true ) } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseDetailScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseDetailScreen.kt index 550abb38..ed07ff70 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseDetailScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseDetailScreen.kt @@ -1,5 +1,7 @@ package com.paw.key.presentation.ui.mypage +import android.app.Activity +import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -11,33 +13,52 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.paw.key.R import com.paw.key.core.designsystem.component.CourseDetail import com.paw.key.core.designsystem.component.ImageModal import com.paw.key.core.designsystem.component.PawkeyButton import com.paw.key.core.designsystem.component.TopBar import com.paw.key.core.designsystem.theme.PawKeyTheme import com.paw.key.core.designsystem.theme.White1 +import com.paw.key.core.util.PreferenceDataStore import com.paw.key.domain.model.entity.walklist.CategoryTop3Entity import com.paw.key.presentation.ui.mypage.viewmodel.SavedDetailViewModel +import kotlinx.coroutines.flow.first @Composable fun SavedDetailRoute( navigateUp: () -> Unit, - navigateToWalk: () -> Unit, + navigateToSharedWalk: () -> Unit, + routeId : Int, + pageId : Int, modifier: Modifier = Modifier, viewModel: SavedDetailViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() + val userId = PreferenceDataStore.getUserId() + + LaunchedEffect(Unit) { + Log.e("SavedDetailRoute", "userId: ${userId.first()}, pageId: $pageId") + viewModel.getWalkDetail(userId.first(), pageId) + viewModel.getWalkTopPopular(userId.first(), routeId) + } SavedCourseDetailScreen( title = state.postTitle, @@ -52,108 +73,115 @@ fun SavedDetailRoute( categoryTop3 = state.categoryTop3, totalReviewCount = state.totalReviewCount, walkingImageUrls = state.walkingImageUrls, + clickImage = state.clickImage, + + onClickImage = { + viewModel.onClickImage(it) + }, navigateUp = navigateUp, - navigateToWalk = navigateToWalk, + navigateToSharedWalk = navigateToSharedWalk, modifier = modifier ) } @Composable fun SavedCourseDetailScreen( - title : String, - petName : String, - date : String, - location : String, - isLike : Boolean, - content : String, - petProfileImage : String, - routeMapImageUrl : String, - categorySummary : List, - categoryTop3 : List, - totalReviewCount : Int, - walkingImageUrls : List, - + title: String, + petName: String, + date: String, + location: String, + isLike: Boolean, + content: String, + petProfileImage: String, + routeMapImageUrl: String, + categorySummary: List, + categoryTop3: List, + totalReviewCount: Int, + walkingImageUrls: List, + clickImage: String, navigateUp: () -> Unit, - navigateToWalk: () -> Unit, - modifier: Modifier = Modifier + navigateToSharedWalk: () -> Unit, + onClickImage: (String) -> Unit, + modifier: Modifier = Modifier, ) { var isImageExpanded by remember { mutableStateOf(false) } + val isLiked by remember { mutableStateOf(isLike) } + val view = LocalView.current + val statusBarColor = PawKeyTheme.colors.green500 + + val context = LocalContext.current + val window = (context as? Activity)?.window + val previousNavBarColor = remember { window?.navigationBarColor } - Column(modifier = Modifier.fillMaxSize()) { + DisposableEffect(Unit) { + window?.navigationBarColor = statusBarColor.toArgb() + + onDispose { + // 화면에서 벗어날 때 원래 색으로 복원 + previousNavBarColor?.let { + window?.navigationBarColor = it + } + } + } + + Column( + modifier = modifier + .fillMaxSize() + .background(color = White1) + ) { TopBar( - title = "내가 저장한 산책 루트", + title = "내가 기록한 산책 루트", onBackClick = navigateUp ) - Box( - modifier = Modifier.weight(1f) + LazyColumn( + modifier = modifier + .fillMaxSize() + .background(color = Color.Transparent) + .zIndex(2F) ) { - LazyColumn( - modifier = modifier - .fillMaxWidth() - .padding(16.dp) - .background(color = White1) - ) { - item { - CourseDetail( - title = title, - petName = petName, - date = date, - Icon = if(isLike) com.paw.key.R.drawable.ic_heart_default else com.paw.key.R.drawable.ic_heart_filled, - location = location, - onClickLike = {}, - content = content, - petProfileImage = petProfileImage, - routeMapImageUrl = routeMapImageUrl, - categorySummary = categorySummary, - categoryTop3 = categoryTop3, - totalReviewCount = totalReviewCount, - walkingImageUrls = walkingImageUrls, - onImageClick = { - isImageExpanded = true - } - ) - - } - - item { - Spacer(modifier = Modifier.height(16.dp)) + item { + CourseDetail( + title = title, + petName = petName, + date = date, + Icon = if(isLiked) R.drawable.ic_heart_default else R.drawable.ic_heart_filled, + location = location, + content = content, + onClickLike = {}, + petProfileImage = petProfileImage, + routeMapImageUrl = routeMapImageUrl, + categorySummary = categorySummary, + categoryTop3 = categoryTop3, + totalReviewCount = totalReviewCount, + walkingImageUrls = walkingImageUrls, + onImageClick = { + onClickImage(it) + isImageExpanded = true + } + ) - HorizontalDivider( - thickness = 8.dp, - color = PawKeyTheme.colors.gray50, - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 8.dp) - ) + Spacer(modifier = Modifier.height(36.dp)) - Spacer(modifier = Modifier.height(120.dp)) - } + PawkeyButton( + text = "해당 루트로 산책하기", + enabled = true, + onClick = navigateToSharedWalk, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .background(color = PawKeyTheme.colors.green500) + ) } - - - - PawkeyButton( - text = "해당 루트로 산책하기", - enabled = true, - onClick = { - navigateToWalk() - }, - modifier = Modifier - .fillMaxWidth() - .align(Alignment.BottomCenter) - .padding(top = 24.dp, start = 16.dp, end = 16.dp, bottom = 60.dp) - ) - } - - if (isImageExpanded) { - ImageModal( - imageUrl = routeMapImageUrl, - onDismiss = { isImageExpanded = false } - ) } } + if (isImageExpanded) { + ImageModal( + imageUrl = clickImage, + onDismiss = { isImageExpanded = false } + ) + } } @@ -203,7 +231,10 @@ fun SavedCourseDetailPreview() { "https://pawkey-server.com/etc2.jpg" ), navigateUp = {}, - navigateToWalk = {} + navigateToSharedWalk = {}, + onClickImage = { _ -> }, + modifier = Modifier, + clickImage = "" ) } } diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseListScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseListScreen.kt index 3b74f016..8d10d936 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseListScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseListScreen.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.first @Composable fun SavedCourseRoute( navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, modifier: Modifier = Modifier, viewModel: SavedListViewModel = hiltViewModel() ) { @@ -36,10 +36,14 @@ fun SavedCourseRoute( SavedCourseListScreen( state = state.value, navigateUp = navigateUp, - navigateNext = navigateNext, - onClickLike = { - // Todo : postid 네비게이션 연결 - viewModel.toggleLike(postId = 28, isLiked = false) + navigateNext = { routeId, pageId -> + navigateNext(routeId, pageId) + }, + /*onClickLike = { + //viewModel.toggleLike(postId = , isLiked = false) + },*/ + onClickItem = { + //navigateNext(state.) }, modifier = modifier ) @@ -49,8 +53,8 @@ fun SavedCourseRoute( fun SavedCourseListScreen( state: SavedListState, navigateUp: () -> Unit, - navigateNext: () -> Unit, - onClickLike: () -> Unit, + navigateNext: (Int, Int) -> Unit, + onClickItem: () -> Unit, modifier: Modifier = Modifier ) { Column( @@ -80,10 +84,11 @@ fun SavedCourseListScreen( petProfileImageUrl = item.writer.petProfileImageUrl, descriptionTags = item.descriptionTags, isLiked = item.isLiked, - onClickItem = navigateNext, - onClickLike = { - onClickLike() - } + isPublic = item.isPublic, + isMine = item.isMine, + onClickItem = { + navigateNext(item.routeId, item.postId) + }, ) } } @@ -97,8 +102,11 @@ fun SavedCourseListScreenPreview() { SavedCourseListScreen( state = SavedListState(), navigateUp = {}, - navigateNext = {}, - onClickLike = {} + navigateNext = { _, _ -> + }, + onClickItem = {} + + //onClickLike = {} ) } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/UserProfileScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/UserProfileScreen.kt index 31f418eb..f453e0ff 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/UserProfileScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/UserProfileScreen.kt @@ -62,7 +62,11 @@ fun UserProfileScreen(name: String, verticalArrangement = Arrangement.spacedBy(16.dp) ) { UserProfileItem(label = "이름", value = name) - UserProfileItem(label = "성별", value = gender) + UserProfileItem(label = "성별", value = if (gender == "M") { + "남아" + } else { + "여아" + }) UserProfileItem(label = "나이", value = age) UserProfileItem(label = "활동지역", value = activeRegion) } diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/ArchivedCourseNavigation.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/ArchivedCourseNavigation.kt index 76cc49ff..911f8636 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/ArchivedCourseNavigation.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/ArchivedCourseNavigation.kt @@ -10,6 +10,7 @@ import com.paw.key.presentation.ui.mypage.ArchivedCourseRoute import kotlinx.serialization.Serializable fun NavController.navigateArchivedCourse( + navOptions: NavOptions? ) { navigate(ArchivedCourse, navOptions) @@ -17,13 +18,15 @@ fun NavController.navigateArchivedCourse( fun NavGraphBuilder.archivedCourseNavGraph( navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, modifier: Modifier = Modifier, ) { composable { ArchivedCourseRoute( navigateUp = navigateUp, - navigateNext = navigateNext, + navigateNext = { routeId, pageId -> + navigateNext(routeId, pageId) + }, modifier = modifier ) } diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedCourseNavigation.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedCourseNavigation.kt index ad79c1a0..1f3d1208 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedCourseNavigation.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedCourseNavigation.kt @@ -8,12 +8,13 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import androidx.navigation.toRoute import com.paw.key.core.navigation.Route import com.paw.key.presentation.ui.mypage.SavedCourseRoute import kotlinx.serialization.Serializable fun NavController.navigateSavedCourse( - navOptions: NavOptions? + navOptions: NavOptions?, ) { navigate(SavedCourse, navOptions) } @@ -21,14 +22,18 @@ fun NavController.navigateSavedCourse( fun NavGraphBuilder.savedCourseNavGraph( paddingValues: PaddingValues, navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, snackBarHostState: SnackbarHostState, modifier: Modifier = Modifier, ) { - composable { + composable { backStackEntry -> + val ids = backStackEntry.toRoute() + SavedCourseRoute( navigateUp = navigateUp, - navigateNext = navigateNext, + navigateNext = { routeId, pageId -> + navigateNext(routeId, pageId) + }, modifier = modifier ) } diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedDetailNavigation.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedDetailNavigation.kt index 09263024..00102bf9 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedDetailNavigation.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedDetailNavigation.kt @@ -9,14 +9,17 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import androidx.navigation.toRoute import com.paw.key.core.navigation.Route import com.paw.key.presentation.ui.mypage.SavedCourseRoute import kotlinx.serialization.Serializable fun NavController.navigateSavedDetail( - navOptions: NavOptions? + navOptions: NavOptions?, + routeId : Int, + pageId : Int ) { - navigate(SavedDetail, navOptions) + navigate(SavedDetail(routeId, pageId), navOptions) } fun NavGraphBuilder.savedDetailNavGraph( @@ -25,14 +28,18 @@ fun NavGraphBuilder.savedDetailNavGraph( snackBarHostState: SnackbarHostState, modifier: Modifier = Modifier, ) { - composable { + composable { backStackEntry -> + val ids = backStackEntry.toRoute() + SavedDetailRoute( navigateUp = navigateUp, - navigateToWalk = navigateToWalk, + navigateToSharedWalk = navigateToWalk, + routeId = ids.routeId, + pageId = ids.pageId, modifier = modifier ) } } @Serializable -data object SavedDetail : Route \ No newline at end of file +data class SavedDetail(val routeId : Int, val pageId : Int) : Route \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/PetProfileContract.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/PetProfileContract.kt index eeddd514..e6aa2bdf 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/PetProfileContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/PetProfileContract.kt @@ -9,6 +9,7 @@ data class PetProfileState( val gender: String = "남아", val breed: String = "코리안 숏헤어", val age: String = "4세", + val isNeutered: Boolean = true, val energyLevel: String = "활동적이에요", val socialLevel: String = "불편해해요" ) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedDetailContract.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedDetailContract.kt index 2f11eb74..e00f613e 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedDetailContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedDetailContract.kt @@ -9,6 +9,7 @@ data class SavedDetailState( val routeId: Int = 0, val postTitle: String = "", val postContent: String = "", + val isPublic : Boolean = false, val isLiked: Boolean = false, val petName: String = "", val petProfileImage: String = "", @@ -19,5 +20,7 @@ data class SavedDetailState( val walkingImageUrls: List = emptyList(), val categoryTop3: List = emptyList(), - val totalReviewCount: Int = 0 + val totalReviewCount: Int = 0, + + val clickImage : String = "" ) \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/PetProfileViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/PetProfileViewModel.kt index 6fc953bd..9804253a 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/PetProfileViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/PetProfileViewModel.kt @@ -42,7 +42,8 @@ class PetProfileViewModel @Inject constructor( breed = result.first().breed, age = result.first().age.toString(), energyLevel = result.first().traits.first().option, - socialLevel = result.first().traits.first().option + socialLevel = result.first().traits.first().option, + isNeutered = result.first().isNeutered ) } } diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedDetailViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedDetailViewModel.kt index 1ea68d45..4afa606a 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedDetailViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedDetailViewModel.kt @@ -1,16 +1,73 @@ package com.paw.key.presentation.ui.mypage.viewmodel +import android.util.Log import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.paw.key.domain.repository.walklist.WalkListRepository import com.paw.key.presentation.ui.mypage.state.SavedDetailState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class SavedDetailViewModel @Inject constructor() : ViewModel() { +class SavedDetailViewModel @Inject constructor( + private val walkListDetailRepository: WalkListRepository +) : ViewModel() { private val _state = MutableStateFlow(SavedDetailState()) val state: StateFlow get() = _state.asStateFlow() + + fun onClickImage(imageUrl: String) { + _state.update { + it.copy( + clickImage = imageUrl + ) + } + } + + fun getWalkDetail(userId: Int, postId: Int) { + viewModelScope.launch { + walkListDetailRepository.getWalkListDetail(userId, postId) + .onSuccess { result -> + _state.update { + it.copy( + postTitle = result.title, + petName = result.authorInfo.petName, + createdAt = result.createdAt, + regionName = result.regionName, + categorySummary = result.categoryTags.categoryOptionSummary, + routeMapImageUrl = result.routeMapImageUrl, + walkingImageUrls = result.walkingImageUrls, + postContent = result.content, + petProfileImage = result.authorInfo.petProfileImage, + ) + } + } + .onFailure { + Log.e("getWalkDetail", "getWalkDetail: ${it.message}") + } + } + } + + fun getWalkTopPopular(userId: Int, routeId : Int) { + viewModelScope.launch { + walkListDetailRepository.getWalkTopPopular(userId, routeId) + .onSuccess { result -> + _state.update { + it.copy( + categoryTop3 = result.categoryTop3, + totalReviewCount = result.totalReviewCount + ) + } + Log.d("getWalkTopPopular", "getWalkTopPopular: ${result.categoryTop3}") + } + .onFailure { + Log.e("getWalkTopPopular", "getWalkTopPopular: 실패ㅐㅐ") + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/signup/SignUpDogScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/signup/SignUpDogScreen.kt index dc71f9e3..cdefe00d 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/signup/SignUpDogScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/signup/SignUpDogScreen.kt @@ -81,7 +81,7 @@ fun SignUpDogRoute( ) { val actualViewModel = viewModel ?: hiltViewModel() SignUpDogScreen( - step = 0.75F, + progress = 0.75F, navigateNext = navigateNext, modifier = modifier, viewModel = actualViewModel @@ -99,7 +99,6 @@ private fun isAgeValid(ageKnown: SignUpContract.AgeKnown, dogAge: String): Boole @RequiresApi(Build.VERSION_CODES.TIRAMISU) @Composable fun SignUpDogScreen( - step: Float, navigateNext: () -> Unit, modifier: Modifier = Modifier, progress: Float = 1F, @@ -192,7 +191,6 @@ fun SignUpDogScreen( Box( modifier = modifier .fillMaxSize() - .imePadding() ) { Column(modifier = Modifier.fillMaxSize()) { // 헤더 diff --git a/app/src/main/res/drawable/ic_pawkey_launcher_background.xml b/app/src/main/res/drawable/ic_pawkey_launcher_background.xml new file mode 100644 index 00000000..ca3826a4 --- /dev/null +++ b/app/src/main/res/drawable/ic_pawkey_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher.xml new file mode 100644 index 00000000..70d34dae --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher_round.xml new file mode 100644 index 00000000..70d34dae --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher.webp new file mode 100644 index 00000000..b8fe8edc Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_foreground.webp new file mode 100644 index 00000000..18afb97c Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_round.webp new file mode 100644 index 00000000..0a5d6f5b Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher.webp new file mode 100644 index 00000000..9f08656e Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_foreground.webp new file mode 100644 index 00000000..959a0fc7 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_round.webp new file mode 100644 index 00000000..ede753c4 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher.webp new file mode 100644 index 00000000..c4d83e61 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_foreground.webp new file mode 100644 index 00000000..10b2680e Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_round.webp new file mode 100644 index 00000000..3f9636ae Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher.webp new file mode 100644 index 00000000..01b62e2a Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher_foreground.webp new file mode 100644 index 00000000..523441f5 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher_round.webp new file mode 100644 index 00000000..b8279f8f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher.webp new file mode 100644 index 00000000..dc2ffa57 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_foreground.webp new file mode 100644 index 00000000..33193f93 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_round.webp new file mode 100644 index 00000000..3c5ceda3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_round.webp differ