diff --git a/app/src/main/java/com/paw/key/core/designsystem/component/ImageModal.kt b/app/src/main/java/com/paw/key/core/designsystem/component/ImageModal.kt index 72e109e6..0d8accaa 100644 --- a/app/src/main/java/com/paw/key/core/designsystem/component/ImageModal.kt +++ b/app/src/main/java/com/paw/key/core/designsystem/component/ImageModal.kt @@ -37,17 +37,6 @@ fun ImageModal( .wrapContentSize(), horizontalAlignment = Alignment.End ) { - Icon( - imageVector = Icons.Default.Close, - contentDescription = "닫기", - tint = Color.White, - modifier = Modifier - .align(Alignment.End) - .clickable { onDismiss() } - .padding(bottom = 8.dp) - .size(24.dp) - ) - AsyncImage( model = imageUrl, contentDescription = null, @@ -62,11 +51,6 @@ fun ImageModal( // contentDescription = null, // modifier = Modifier // ) - /*Image( //테스트용!! - painter = painterResource(id = R.drawable.test), - contentDescription = null, - modifier = Modifier - )*/ } } } diff --git a/app/src/main/java/com/paw/key/data/dto/response/SavedListResponseDto.kt b/app/src/main/java/com/paw/key/data/dto/response/SavedListResponseDto.kt index d10515cb..8294b16b 100644 --- a/app/src/main/java/com/paw/key/data/dto/response/SavedListResponseDto.kt +++ b/app/src/main/java/com/paw/key/data/dto/response/SavedListResponseDto.kt @@ -1,41 +1,51 @@ package com.paw.key.data.dto.response +import com.paw.key.domain.model.entity.archivedlist.ArchivedListEntity +import com.paw.key.domain.model.entity.archivedlist.ArchivedListPostsEntity +import com.paw.key.domain.model.entity.archivedlist.WriterEntity import com.paw.key.domain.model.entity.savedlist.SavedListEntity +import com.paw.key.domain.model.entity.savedlist.SavedListPostEntity import com.paw.key.domain.model.entity.savedlist.SavedWriterEntity import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class SavedListResponseDto( - @SerialName("postId") - val postId: Long, +data class SavedListResponseDataDto( + @SerialName("posts") + val posts: List +) { + fun toEntity() = SavedListPostEntity( + posts = posts.map { it.toEntity() } + ) +} +@Serializable +data class SavedDto( + @SerialName("postId") + val postId: Int, @SerialName("createdAt") val createdAt: String, - - @SerialName("isLiked") - val isLiked: Boolean, - + @SerialName("isLike") + val isLike: Boolean, @SerialName("title") val title: String, - @SerialName("representativeImageUrl") - val representativeImageUrl: String, - + val representativeImageUrl: String? = null, + @SerialName("routeId") + val routeId: Int, @SerialName("writer") - val writer: List, - + val writer: SavedWriterDto, @SerialName("descriptionTags") val descriptionTags: List - -){ +) { fun toEntity() = SavedListEntity( postId = postId, createdAt = createdAt, - isLiked = isLiked, + isLiked = isLike, title = title, - representativeImageUrl = representativeImageUrl, - writer = writer.map { it.toEntity() }, + representativeImageUrl = representativeImageUrl ?: "", + routeId = routeId, + writer = writer.toEntity(), descriptionTags = descriptionTags ) } @@ -43,17 +53,15 @@ data class SavedListResponseDto( @Serializable data class SavedWriterDto( @SerialName("userId") - val userId: Long, - + val userId: Int, @SerialName("petName") val petName: String, - @SerialName("petProfileImageUrl") val petProfileImageUrl: String -){ +) { fun toEntity() = SavedWriterEntity( userId = userId, petName = petName, petProfileImageUrl = petProfileImageUrl ) -} +} \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/data/repositoryimpl/SavedListRepositoryImpl.kt b/app/src/main/java/com/paw/key/data/repositoryimpl/SavedListRepositoryImpl.kt index 217b0270..d35c979b 100644 --- a/app/src/main/java/com/paw/key/data/repositoryimpl/SavedListRepositoryImpl.kt +++ b/app/src/main/java/com/paw/key/data/repositoryimpl/SavedListRepositoryImpl.kt @@ -2,13 +2,14 @@ package com.paw.key.data.repositoryimpl import com.paw.key.data.remote.datasource.SavedListDataSource import com.paw.key.domain.model.entity.savedlist.SavedListEntity +import com.paw.key.domain.model.entity.savedlist.SavedListPostEntity import com.paw.key.domain.repository.SavedListRepository import javax.inject.Inject class SavedListRepositoryImpl @Inject constructor( private val savedListDataSource: SavedListDataSource, ) : SavedListRepository { - override suspend fun getSavedList(userId: Int): Result> = runCatching { - savedListDataSource.getSavedList(userId).data.map { it.toEntity() } + override suspend fun getSavedList(userId: Int): Result = runCatching { + savedListDataSource.getSavedList(userId).data.toEntity() } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/data/service/LikeService.kt b/app/src/main/java/com/paw/key/data/service/LikeService.kt index a853cd0b..952a0489 100644 --- a/app/src/main/java/com/paw/key/data/service/LikeService.kt +++ b/app/src/main/java/com/paw/key/data/service/LikeService.kt @@ -8,15 +8,15 @@ import retrofit2.http.Path interface LikeService { - @POST("/api/v1/likes/{courseId}") + @POST("/api/v1/likes/{postId}") suspend fun likeCourse( @Header("X-USER-ID") userId: Int, - @Path("courseId") courseId: Int + @Path("postId") postId: Int ): BaseResponse - @DELETE("/api/v1/likes/{courseId}") + @DELETE("/api/v1/likes/{postId}") suspend fun unlikeCourse( @Header("X-USER-ID") userId: Int, - @Path("courseId") courseId: Int + @Path("postId") postId: Int ): BaseResponse } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/data/service/SavedListService.kt b/app/src/main/java/com/paw/key/data/service/SavedListService.kt index 3d44a6a5..dfa3eff6 100644 --- a/app/src/main/java/com/paw/key/data/service/SavedListService.kt +++ b/app/src/main/java/com/paw/key/data/service/SavedListService.kt @@ -1,7 +1,7 @@ package com.paw.key.data.service import com.paw.key.data.dto.response.BaseResponse -import com.paw.key.data.dto.response.SavedListResponseDto +import com.paw.key.data.dto.response.SavedListResponseDataDto import retrofit2.http.GET import retrofit2.http.Header @@ -9,5 +9,5 @@ interface SavedListService { @GET("users/me/likes") suspend fun getSavedList( @Header("X-USER-ID") userId: Int - ): BaseResponse> + ): BaseResponse } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/domain/model/entity/savedlist/SavedListEntity.kt b/app/src/main/java/com/paw/key/domain/model/entity/savedlist/SavedListEntity.kt index 8685c31b..817a53c5 100644 --- a/app/src/main/java/com/paw/key/domain/model/entity/savedlist/SavedListEntity.kt +++ b/app/src/main/java/com/paw/key/domain/model/entity/savedlist/SavedListEntity.kt @@ -1,16 +1,21 @@ package com.paw.key.domain.model.entity.savedlist + +data class SavedListPostEntity( + val posts: List +) data class SavedListEntity( - val postId: Long, + val postId: Int, val createdAt: String, val isLiked: Boolean, val title: String, val representativeImageUrl: String, - val writer: List, + val routeId: Int, + val writer: SavedWriterEntity, val descriptionTags: List ) data class SavedWriterEntity( - val userId: Long, + val userId: Int, val petName: String, val petProfileImageUrl: String ) diff --git a/app/src/main/java/com/paw/key/domain/repository/LikeRepository.kt b/app/src/main/java/com/paw/key/domain/repository/LikeRepository.kt index b3e15304..d14cf26c 100644 --- a/app/src/main/java/com/paw/key/domain/repository/LikeRepository.kt +++ b/app/src/main/java/com/paw/key/domain/repository/LikeRepository.kt @@ -1,6 +1,6 @@ package com.paw.key.domain.repository interface LikeRepository { - suspend fun likeCourse(userId: Int, courseId: Int): Result - suspend fun unlikeCourse(userId: Int, courseId: Int): Result + suspend fun likeCourse(userId: Int, postId: Int): Result + suspend fun unlikeCourse(userId: Int, postId: Int): Result } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/domain/repository/SavedListRepository.kt b/app/src/main/java/com/paw/key/domain/repository/SavedListRepository.kt index e73a515f..f59e0b95 100644 --- a/app/src/main/java/com/paw/key/domain/repository/SavedListRepository.kt +++ b/app/src/main/java/com/paw/key/domain/repository/SavedListRepository.kt @@ -1,7 +1,8 @@ package com.paw.key.domain.repository import com.paw.key.domain.model.entity.savedlist.SavedListEntity +import com.paw.key.domain.model.entity.savedlist.SavedListPostEntity interface SavedListRepository { - suspend fun getSavedList(userId: Int): Result> + suspend fun getSavedList(userId: Int): Result } \ No newline at end of file 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 c80baa63..e752db10 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 @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.paw.key.data.dto.request.list.PostsListRequestDto import com.paw.key.data.dto.request.list.TraitList +import com.paw.key.domain.repository.LikeRepository import com.paw.key.domain.repository.filter.FilterOptionRepository import com.paw.key.domain.repository.list.PostsListRepository import com.paw.key.presentation.ui.course.entire.tab.map.List.state.TapListContract @@ -18,7 +19,8 @@ import javax.inject.Inject @HiltViewModel class TapListViewModel @Inject constructor( private val filterOptionRepository: FilterOptionRepository, - private val postsListRepository: PostsListRepository + private val postsListRepository: PostsListRepository, + private val likeRepository: LikeRepository ) : ViewModel() { private val _state = MutableStateFlow(TapListContract.TapListState()) @@ -122,6 +124,13 @@ class TapListViewModel @Inject constructor( } } } + + fun toggleLike(userId: Int, postId: Int) { + viewModelScope.launch { + likeRepository.likeCourse(userId = 2, postId = 6) + } + } + fun updateMood(option: String) { _state.update { it.copy( @@ -315,19 +324,19 @@ class TapListViewModel @Inject constructor( return isAllOptionsSelected() } - fun toggleLike(postId: Int, isLiked: Boolean) { - viewModelScope.launch { - _state.update { state -> - val updatedPosts = state.postsResult?.posts?.map { - if (it.postId == postId) it.copy(isLike = isLiked) else it - } ?: emptyList() - - val updatedPostsResult = state.postsResult?.copy(posts = updatedPosts) - - state.copy( - postsResult = updatedPostsResult - ) - } - } - } +// fun toggleLike(postId: Int, isLiked: Boolean) { +// viewModelScope.launch { +// _state.update { state -> +// val updatedPosts = state.postsResult?.posts?.map { +// if (it.postId == postId) it.copy(isLike = isLiked) else it +// } ?: emptyList() +// +// val updatedPostsResult = state.postsResult?.copy(posts = updatedPosts) +// +// state.copy( +// postsResult = updatedPostsResult +// ) +// } +// } +// } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseDetailScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseDetailScreen.kt index d12d32ad..eb522a75 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseDetailScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseDetailScreen.kt @@ -115,7 +115,7 @@ fun ArchivedCourseDetailScreen( petName = petName, date = date, location = location, - isLike = isLike, + onClickLike = {}, content = content, petProfileImage = petProfileImage, routeMapImageUrl = routeMapImageUrl, 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 0c531d52..95c01cea 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 @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -25,6 +26,11 @@ fun ArchivedCourseRoute( ) { val state = viewModel.state.collectAsStateWithLifecycle() + LaunchedEffect(Unit) { + // Todo : userId 네비게이션 연결 + viewModel.getArchivedList(userId = 2) + } + ArchivedCourseListScreen( state = state.value, navigateUp = navigateUp, @@ -83,7 +89,9 @@ fun ArchivedCourseListScreenPreview() { state = ArchivedListState(), navigateUp = {}, navigateNext = {}, - onClickLike = {} + 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 338123ad..8652be0a 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 @@ -28,6 +28,7 @@ import coil.request.ImageRequest 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.presentation.ui.mypage.component.GrayChip import com.paw.key.presentation.ui.mypage.state.MyPageState import com.paw.key.presentation.ui.mypage.viewmodel.MyPageViewModel @@ -75,42 +76,49 @@ fun MyPageScreen( snackBarHostState: SnackbarHostState, modifier: Modifier = Modifier ) { - LazyColumn( + Box( modifier = modifier - .padding(paddingValues) .fillMaxSize() - .padding(bottom = 80.dp) - ) { - item { - Text( - text = "마이페이지", - style = PawKeyTheme.typography.head22B, - modifier = Modifier.padding(start = 16.dp, top = 16.dp, bottom = 12.dp) - ) - OwnerCard( - ownerName = state.ownerName, - navigateUserProfile = navigateUserProfile - ) - Spacer(modifier = Modifier.height(19.dp)) + .background(PawKeyTheme.colors.white2) + .padding(paddingValues) + ){ + LazyColumn( + modifier = modifier + .padding(paddingValues) + .fillMaxSize() + .padding(bottom = 80.dp) + ) { + item { + Text( + text = "마이페이지", + style = PawKeyTheme.typography.head22B, + modifier = Modifier.padding(start = 16.dp, top = 16.dp, bottom = 12.dp) + ) + OwnerCard( + ownerName = state.ownerName, + navigateUserProfile = navigateUserProfile + ) + Spacer(modifier = Modifier.height(19.dp)) - PetCard( - name = state.petName, - age = state.petAge, - gender = state.petGender, - tags = state.petTags, - walkCount = state.walkCount, - totalDistance = state.totalDistance, - image = state.petImageUrl, - navigatePetProfile = navigatePetProfile - ) + PetCard( + name = state.petName, + age = state.petAge, + gender = state.petGender, + tags = state.petTags, + walkCount = state.walkCount, + totalDistance = state.totalDistance, + image = state.petImageUrl, + navigatePetProfile = navigatePetProfile + ) - Spacer(modifier = Modifier.height(12.dp)) + Spacer(modifier = Modifier.height(12.dp)) - WalkRouteList( - routes = listOf("저장한 산책 루트", "내가 기록한 산책 루트"), - navigateSavedCourse = navigateSavedCourse, - navigateArchivedCourse = navigateArchivedCourse - ) + WalkRouteList( + routes = listOf("저장한 산책 루트", "내가 기록한 산책 루트"), + navigateSavedCourse = navigateSavedCourse, + navigateArchivedCourse = navigateArchivedCourse + ) + } } } } @@ -134,12 +142,13 @@ fun OwnerCard( ) { Text(text = ownerName, style = PawKeyTheme.typography.head20B2) Spacer(Modifier.width(10.dp)) - Text(text = "견주", style = PawKeyTheme.typography.body14M) + Text(text = "견주", style = PawKeyTheme.typography.body14M, color = PawKeyTheme.colors.gray400) Spacer(modifier = Modifier.weight(1f)) Icon( imageVector = ImageVector.vectorResource(id = R.drawable.ic_arrow_right), - contentDescription = "견주 프로필 이동" + contentDescription = "견주 프로필 이동", + tint = PawKeyTheme.colors.gray300 ) } } @@ -171,11 +180,19 @@ fun PetCard( .padding(12.dp), verticalAlignment = Alignment.CenterVertically ) { - Icon( - imageVector = ImageVector.vectorResource(id = R.drawable.ic_personal_card), - contentDescription = "반려견 프로필", - tint = Color.White - ) + Box( + modifier = Modifier + .size(20.dp), // Text의 베이스라인에 맞추기 위해 아이콘 크기 명시 + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.ic_personal_card), + contentDescription = "반려견 프로필", + modifier = Modifier.padding(top = 4.dp), + + tint = Color.White + ) + } Spacer(modifier.width(4.dp) ) Text( @@ -188,7 +205,7 @@ fun PetCard( imageVector = ImageVector.vectorResource(id = R.drawable.ic_arrow_right), modifier = modifier.clickable { navigatePetProfile() }, contentDescription = "반려견 프로필 이동", - tint = Color.White + tint = PawKeyTheme.colors.white1 ) } @@ -208,7 +225,7 @@ fun PetCard( Spacer(modifier.width(16.dp)) Column { Text(name, style = PawKeyTheme.typography.head20B2) - Text("$age · $gender", style = PawKeyTheme.typography.body14R) + Text("$age · $gender", style = PawKeyTheme.typography.caption12R, color = PawKeyTheme.colors.gray300) } } @@ -219,7 +236,7 @@ fun PetCard( horizontalArrangement = Arrangement.spacedBy(4.dp) ) { tags.forEach { - SubChip( + GrayChip( text = it ) } @@ -249,14 +266,14 @@ fun PetCard( modifier = modifier .height(32.dp) .width(1.dp) - .background(color = PawKeyTheme.colors.white1) + .background(color = PawKeyTheme.colors.gray100) ) Column( modifier = modifier.weight(1f), horizontalAlignment = Alignment.CenterHorizontally ) { - Text("누적 거리", style = PawKeyTheme.typography.caption12Sb1) //피그마랑 일치하는 글씨체 없음. 임의로 넣음 + Text("누적 거리", style = PawKeyTheme.typography.caption12Sb1) Text( totalDistance, style = PawKeyTheme.typography.head20Sb, @@ -288,22 +305,36 @@ fun WalkRouteList( if (index != 0) { HorizontalDivider(thickness = 1.dp, color = PawKeyTheme.colors.gray50) } + val iconRes = if (index == 0) { + R.drawable.ic_mypage_heart + } else { + R.drawable.ic_mypage_edit + } Row( modifier = Modifier .fillMaxWidth() .padding(vertical = 20.dp), verticalAlignment = Alignment.CenterVertically ) { + Icon( + imageVector = ImageVector.vectorResource(id = iconRes), + contentDescription = "산책루트 아이콘" + ) Text( + text = route, - modifier = Modifier.weight(1f), + modifier = Modifier + .padding(start = 8.dp) + .weight(1f), style = PawKeyTheme.typography.body16Sb, color = PawKeyTheme.colors.gray950 ) Icon( imageVector = ImageVector.vectorResource(id = R.drawable.ic_arrow_right), modifier = modifier.clickable { - if (index == 0) navigateSavedCourse() else navigateArchivedCourse() + if (index == 0) + navigateSavedCourse() + else navigateArchivedCourse() }, contentDescription = "산책루트 메뉴 이동" ) 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 c5e209af..74a0617d 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 @@ -30,7 +30,8 @@ fun SavedCourseRoute( navigateUp = navigateUp, navigateNext = navigateNext, onClickLike = { - //viewModel.onClickLike() + // Todo : postid 네비게이션 연결 + viewModel.toggleLike(postId = 28, isLiked = false) }, modifier = modifier ) @@ -44,7 +45,12 @@ fun SavedCourseListScreen( onClickLike: () -> Unit, modifier: Modifier = Modifier ) { - Column { + Column( + modifier = modifier + .fillMaxSize() + .background(PawKeyTheme.colors.white2) + ) { + TopBar( title = "저장한 산책 루트", onBackClick = navigateUp @@ -62,8 +68,8 @@ fun SavedCourseListScreen( title = item.title, createdAt = item.createdAt, representativeImageUrl = item.representativeImageUrl, - petName = item.writer.first().petName, - petProfileImageUrl = item.writer.first().petProfileImageUrl, + petName = item.writer.petName, + petProfileImageUrl = item.writer.petProfileImageUrl, descriptionTags = item.descriptionTags, isLiked = item.isLiked, onClickItem = navigateNext, diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/component/GrayChip.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/component/GrayChip.kt new file mode 100644 index 00000000..ae236708 --- /dev/null +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/component/GrayChip.kt @@ -0,0 +1,45 @@ +package com.paw.key.presentation.ui.mypage.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.paw.key.core.designsystem.theme.PawKeyTheme +import com.paw.key.core.util.noRippleClickable + +@Preview +@Composable +private fun PreviewGrayChip() { + GrayChip( + text = "4km", + onClick = {} + ) +} + +@Composable +fun GrayChip( + text: String, + modifier: Modifier = Modifier, + onClick : () -> Unit = {}, +) { + Box( + modifier = modifier + .background( + color = PawKeyTheme.colors.white2, + shape = RoundedCornerShape(20.dp) + ) + .noRippleClickable(onClick = onClick) + .padding(horizontal = 10.dp, vertical = 4.dp) + ) { + Text( + text = text, + color = PawKeyTheme.colors.gray400, + style = PawKeyTheme.typography.caption12R + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedListContract.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedListContract.kt index 9bc83201..ab06110b 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedListContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedListContract.kt @@ -1,24 +1,24 @@ package com.paw.key.presentation.ui.mypage.state import androidx.compose.runtime.Immutable -import com.paw.key.domain.model.entity.archivedlist.ArchivedListEntity import com.paw.key.domain.model.entity.savedlist.SavedListEntity +import com.paw.key.domain.model.entity.savedlist.SavedListPostEntity @Immutable data class SavedListState( - val courseList: List = emptyList() + val courseList: List = emptyList() ) -//@Immutable -//data class CourseCardData( -// //제목 -// val description: String, -// val petName: String, -// val createdAt: String, -// val isShared: Boolean, -// val isLiked: Boolean, -// val imageUrl: String, -//) +@Immutable +data class CourseCardData( + //제목 + val description: String, + val petName: String, + val createdAt: String, + val isShared: Boolean, + val isLiked: Boolean, + val imageUrl: String, +) sealed class SavedListSideEffect { data class ShowSnackBar(val message: String) : SavedListSideEffect() diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/MyPageViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/MyPageViewModel.kt index e475ab69..112064ec 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/MyPageViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/MyPageViewModel.kt @@ -2,6 +2,7 @@ package com.paw.key.presentation.ui.mypage.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.paw.key.domain.repository.SavedListRepository import com.paw.key.domain.repository.petprofile.PetProfileRepository import com.paw.key.domain.repository.userprofile.UserProfileRepository import com.paw.key.presentation.ui.mypage.state.MyPageSideEffect @@ -19,7 +20,7 @@ import javax.inject.Inject @HiltViewModel class MyPageViewModel @Inject constructor( private val petProfileRepository: PetProfileRepository, - private val userProfileRepository: UserProfileRepository + private val userProfileRepository: UserProfileRepository, ) : ViewModel() { private val _state = MutableStateFlow(MyPageState()) val state: StateFlow diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedListViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedListViewModel.kt index 256257b9..4d4e02f0 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedListViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedListViewModel.kt @@ -3,11 +3,8 @@ package com.paw.key.presentation.ui.mypage.viewmodel import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.paw.key.core.designsystem.component.CourseCard -import com.paw.key.domain.repository.ArchivedListRepository +import com.paw.key.domain.repository.LikeRepository import com.paw.key.domain.repository.SavedListRepository -import com.paw.key.presentation.ui.mypage.state.MyPageSideEffect -import com.paw.key.presentation.ui.mypage.state.PetProfileSideEffect.NavigateNext import com.paw.key.presentation.ui.mypage.state.SavedListSideEffect import com.paw.key.presentation.ui.mypage.state.SavedListState import dagger.hilt.android.lifecycle.HiltViewModel @@ -21,7 +18,8 @@ import javax.inject.Inject @HiltViewModel class SavedListViewModel @Inject constructor( - private val savedListRepository: ArchivedListRepository + private val savedListRepository: SavedListRepository, + private val likeRepository: LikeRepository ) : ViewModel() { private val _state = MutableStateFlow(SavedListState()) @@ -30,9 +28,13 @@ class SavedListViewModel @Inject constructor( private val _sideEffect = MutableSharedFlow() val sideEffect: MutableSharedFlow = _sideEffect + init { + getSavedList(userId = 2) + } + fun getSavedList(userId: Int) { viewModelScope.launch { - savedListRepository.getArchivedList(userId) + savedListRepository.getSavedList(userId) .onSuccess { result -> _state.update { it.copy( @@ -46,15 +48,31 @@ class SavedListViewModel @Inject constructor( } } } - fun toggleLike(postId: Int, isLiked: Boolean) { + +// fun toggleLike(postId: Int, isLiked: Boolean) { +// viewModelScope.launch { +// _state.update { state -> +// state.copy( +// courseList = state.courseList.map { +// if (it.postId == postId) it.copy(isLiked = isLiked) else it +// } +// ) +// } +// } +// } + + fun toggleLike( + postId: Int, + isLiked: Boolean + ) { + // Todo : userId 네비게이션 연결, postId 네비게이션 연결 +// viewModelScope.launch { +// likeRepository.unlikeCourse(userId = 2, postId = postId) +// savedListRepository.getSavedList(userId = 2) +// } viewModelScope.launch { - _state.update { state -> - state.copy( - courseList = state.courseList.map { - if (it.postId == postId) it.copy(isLiked = isLiked) else it - } - ) - } + likeRepository.likeCourse(userId = 2, postId = 6) + savedListRepository.getSavedList(userId = 2) } } } \ No newline at end of file