From fa142163e41474aef628ef9252ba96fafe513cab Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Thu, 28 Dec 2023 20:29:58 +0900 Subject: [PATCH 01/19] =?UTF-8?q?:recycle:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC?= =?UTF-8?q?=20=EA=B0=9C=EC=88=98=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/whyranoid/presentation/viewmodel/UserViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt index 826675b2..424f9a6f 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt @@ -86,8 +86,7 @@ class UserPageViewModel( userDetailState = UiState.Success( UserDetail( state.userDetailState.getDataOrNull()?.user ?: User.DUMMY, - state.userDetailState.getDataOrNull()?.postCount - ?: userPostPreviews.size, + userPostPreviews.size, state.userDetailState.getDataOrNull()?.followerCount ?: 0, state.userDetailState.getDataOrNull()?.followingCount ?: 0, state.userDetailState.getDataOrNull()?.isFollowing ?: false, From d54db380e2d487ba034d35704a2743474861f368 Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Wed, 17 Jan 2024 22:19:36 +0900 Subject: [PATCH 02/19] =?UTF-8?q?:sparkles:=20API=20url=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/src/main/java/com/whyranoid/data/API.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/src/main/java/com/whyranoid/data/API.kt b/data/src/main/java/com/whyranoid/data/API.kt index c65b80ff..a0b436d5 100644 --- a/data/src/main/java/com/whyranoid/data/API.kt +++ b/data/src/main/java/com/whyranoid/data/API.kt @@ -39,5 +39,7 @@ object API { const val LIKE_TOTAL = "api/walk/count-total" const val LIKE_COUNT = "api/walk/count-like" + + const val MY = "/api/walkies/my" } } From dce2ebbcf6d1451cab49a63298d5811e44aeb12e Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Wed, 17 Jan 2024 22:19:55 +0900 Subject: [PATCH 03/19] =?UTF-8?q?:sparkles:=20=EB=8B=89=EB=84=A4=EC=9E=84,?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=A0=95=EB=B3=B4=20=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EB=8D=B0=EC=9D=B4=ED=84=B0=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../whyranoid/data/model/account/NickProfileResponse.kt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 data/src/main/java/com/whyranoid/data/model/account/NickProfileResponse.kt diff --git a/data/src/main/java/com/whyranoid/data/model/account/NickProfileResponse.kt b/data/src/main/java/com/whyranoid/data/model/account/NickProfileResponse.kt new file mode 100644 index 00000000..ec6d62d8 --- /dev/null +++ b/data/src/main/java/com/whyranoid/data/model/account/NickProfileResponse.kt @@ -0,0 +1,8 @@ +package com.whyranoid.data.model.account + +import com.google.gson.annotations.SerializedName + +data class NickProfileResponse( + @SerializedName("profileImg") val profileImg: String?, + @SerializedName("nickname") val nickname: String?, +) From dfa13d2b116c6ad80a194956bfc8fb0db4bc70bf Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Wed, 17 Jan 2024 22:20:22 +0900 Subject: [PATCH 04/19] =?UTF-8?q?:sparkles:=20uid=20=EA=B8=B0=EB=B0=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=8B=89=EB=84=A4=EC=9E=84,=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/whyranoid/walkie/KoinModules.kt | 2 +- .../data/datasource/UserDataSourceImpl.kt | 21 ++++++++++++++++--- .../datasource/community/CommunityService.kt | 9 +++++++- .../data/datasource/running/RunningService.kt | 1 + 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/whyranoid/walkie/KoinModules.kt b/app/src/main/java/com/whyranoid/walkie/KoinModules.kt index 303c0e12..d7eeab57 100644 --- a/app/src/main/java/com/whyranoid/walkie/KoinModules.kt +++ b/app/src/main/java/com/whyranoid/walkie/KoinModules.kt @@ -133,7 +133,7 @@ val repositoryModule = module { val dataSourceModule = module { single { ChallengeDataSourceImpl() } single { PostDataSourceImpl(get()) } - single { UserDataSourceImpl(get()) } + single { UserDataSourceImpl(get(), get()) } single { AccountDataSourceImpl(get()) } single { FollowDataSourceImpl(get()) } single { RunningControlDataSourceImpl(get()) } diff --git a/data/src/main/java/com/whyranoid/data/datasource/UserDataSourceImpl.kt b/data/src/main/java/com/whyranoid/data/datasource/UserDataSourceImpl.kt index cda88a4f..c5a6f8bb 100644 --- a/data/src/main/java/com/whyranoid/data/datasource/UserDataSourceImpl.kt +++ b/data/src/main/java/com/whyranoid/data/datasource/UserDataSourceImpl.kt @@ -1,12 +1,17 @@ package com.whyranoid.data.datasource +import android.util.Log import com.whyranoid.data.AccountDataStore +import com.whyranoid.data.datasource.community.CommunityService import com.whyranoid.domain.datasource.UserDataSource import com.whyranoid.domain.model.user.User import com.whyranoid.domain.model.user.UserDetail import kotlinx.coroutines.flow.first -class UserDataSourceImpl(private val dataStore: AccountDataStore) : UserDataSource { +class UserDataSourceImpl( + private val dataStore: AccountDataStore, + private val communityService: CommunityService, +) : UserDataSource { // TODO: change to api call override suspend fun getUser(uid: Long): Result { val savedUId = dataStore.uId.first() @@ -20,10 +25,20 @@ class UserDataSourceImpl(private val dataStore: AccountDataStore) : UserDataSour requireNotNull(name), requireNotNull(nickName), requireNotNull(imageUrl), - ) // TODO uid 변경 사항 적용 + ) } } else { - Result.success(User.DUMMY) + kotlin.runCatching { + val response = requireNotNull(communityService.getUserNickProfile(uid).body()) + User( + uid, + requireNotNull(response.nickname), + requireNotNull(response.nickname), + requireNotNull(response.profileImg), + ) + }.onFailure { + Log.d("UserDataSourceImpl", it.message.toString()) + } } } diff --git a/data/src/main/java/com/whyranoid/data/datasource/community/CommunityService.kt b/data/src/main/java/com/whyranoid/data/datasource/community/CommunityService.kt index de950e61..a9b9de2f 100644 --- a/data/src/main/java/com/whyranoid/data/datasource/community/CommunityService.kt +++ b/data/src/main/java/com/whyranoid/data/datasource/community/CommunityService.kt @@ -1,15 +1,22 @@ package com.whyranoid.data.datasource.community import com.whyranoid.data.API +import com.whyranoid.data.model.account.NickProfileResponse import com.whyranoid.data.model.community.request.PostLikeRequest import com.whyranoid.data.model.community.response.PostLikeResponse import retrofit2.Response import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.POST +import retrofit2.http.Query interface CommunityService { @POST(API.SEND_LIKE) suspend fun likePost(@Body postLikeRequest: PostLikeRequest): Response -} \ No newline at end of file + @GET(API.WalkingControl.MY) + suspend fun getUserNickProfile( + @Query("walkieId") id: Long, + ): Response +} diff --git a/data/src/main/java/com/whyranoid/data/datasource/running/RunningService.kt b/data/src/main/java/com/whyranoid/data/datasource/running/RunningService.kt index 806d01e6..ecec6519 100644 --- a/data/src/main/java/com/whyranoid/data/datasource/running/RunningService.kt +++ b/data/src/main/java/com/whyranoid/data/datasource/running/RunningService.kt @@ -1,6 +1,7 @@ package com.whyranoid.data.datasource.running import com.whyranoid.data.API +import com.whyranoid.data.model.account.NickProfileResponse import com.whyranoid.data.model.running.LikeTotalResponse import com.whyranoid.data.model.running.RunningFinishRequest import com.whyranoid.data.model.running.RunningStartRequest From 53f17606e610d4909d4fdf60cef3991f774d63b9 Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Wed, 17 Jan 2024 22:57:09 +0900 Subject: [PATCH 05/19] =?UTF-8?q?:recycle:=20=EB=A1=9C=EC=BB=AC=20->=20?= =?UTF-8?q?=EC=84=9C=EB=B2=84=EB=A1=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EA=B5=AC=ED=98=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/whyranoid/walkie/KoinModules.kt | 4 +- .../data/datasource/UserDataSourceImpl.kt | 39 +++++-------------- 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/whyranoid/walkie/KoinModules.kt b/app/src/main/java/com/whyranoid/walkie/KoinModules.kt index d7eeab57..ff3dc190 100644 --- a/app/src/main/java/com/whyranoid/walkie/KoinModules.kt +++ b/app/src/main/java/com/whyranoid/walkie/KoinModules.kt @@ -133,7 +133,7 @@ val repositoryModule = module { val dataSourceModule = module { single { ChallengeDataSourceImpl() } single { PostDataSourceImpl(get()) } - single { UserDataSourceImpl(get(), get()) } + single { UserDataSourceImpl(get()) } single { AccountDataSourceImpl(get()) } single { FollowDataSourceImpl(get()) } single { RunningControlDataSourceImpl(get()) } @@ -148,7 +148,7 @@ val useCaseModule = module { single { GetPostUseCase(get()) } single { GetUserPostPreviewsUseCase(get(), get()) } single { GetUserBadgesUseCase(get()) } - single { GetUserDetailUseCase(get()) } + single { GetUserDetailUseCase(get(), get()) } single { GetRunningFollowerUseCase(get(), get()) } single { RunningFinishUseCase(get(), get()) } single { RunningStartUseCase(get(), get()) } diff --git a/data/src/main/java/com/whyranoid/data/datasource/UserDataSourceImpl.kt b/data/src/main/java/com/whyranoid/data/datasource/UserDataSourceImpl.kt index c5a6f8bb..24cae83f 100644 --- a/data/src/main/java/com/whyranoid/data/datasource/UserDataSourceImpl.kt +++ b/data/src/main/java/com/whyranoid/data/datasource/UserDataSourceImpl.kt @@ -1,44 +1,25 @@ package com.whyranoid.data.datasource import android.util.Log -import com.whyranoid.data.AccountDataStore import com.whyranoid.data.datasource.community.CommunityService import com.whyranoid.domain.datasource.UserDataSource import com.whyranoid.domain.model.user.User import com.whyranoid.domain.model.user.UserDetail -import kotlinx.coroutines.flow.first class UserDataSourceImpl( - private val dataStore: AccountDataStore, private val communityService: CommunityService, ) : UserDataSource { - // TODO: change to api call override suspend fun getUser(uid: Long): Result { - val savedUId = dataStore.uId.first() - return if (savedUId == uid) { - kotlin.runCatching { - val name = dataStore.userName.first() - val nickName = dataStore.nickName.first() - val imageUrl = dataStore.profileUrl.first() - User( - savedUId, - requireNotNull(name), - requireNotNull(nickName), - requireNotNull(imageUrl), - ) - } - } else { - kotlin.runCatching { - val response = requireNotNull(communityService.getUserNickProfile(uid).body()) - User( - uid, - requireNotNull(response.nickname), - requireNotNull(response.nickname), - requireNotNull(response.profileImg), - ) - }.onFailure { - Log.d("UserDataSourceImpl", it.message.toString()) - } + return kotlin.runCatching { + val response = requireNotNull(communityService.getUserNickProfile(uid).body()) + User( + uid, + requireNotNull(response.nickname), + requireNotNull(response.nickname), + requireNotNull(response.profileImg), + ) + }.onFailure { + Log.d("UserDataSourceImpl", it.message.toString()) } } From d3154658b23588a5d6651650cc0cb41d5c671f6b Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Wed, 17 Jan 2024 22:58:17 +0900 Subject: [PATCH 06/19] =?UTF-8?q?:sparkles:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=9C=A0=EC=A0=80=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/whyranoid/domain/usecase/GetUserDetailUseCase.kt | 6 +++++- .../com/whyranoid/presentation/viewmodel/UserViewModel.kt | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/domain/src/main/java/com/whyranoid/domain/usecase/GetUserDetailUseCase.kt b/domain/src/main/java/com/whyranoid/domain/usecase/GetUserDetailUseCase.kt index c60df770..5c5663ba 100644 --- a/domain/src/main/java/com/whyranoid/domain/usecase/GetUserDetailUseCase.kt +++ b/domain/src/main/java/com/whyranoid/domain/usecase/GetUserDetailUseCase.kt @@ -1,15 +1,19 @@ package com.whyranoid.domain.usecase import com.whyranoid.domain.model.user.UserDetail +import com.whyranoid.domain.repository.FollowRepository import com.whyranoid.domain.repository.UserRepository class GetUserDetailUseCase( private val userRepository: UserRepository, + private val followRepository: FollowRepository, ) { suspend operator fun invoke(uid: Long): Result { return kotlin.runCatching { val user = userRepository.getUser(uid).getOrThrow() - UserDetail(user, 0, 0, 0, true) + val followingCount = followRepository.getFollowings(user.uid).getOrThrow().size + val followerCount = followRepository.getFollowers(user.uid).getOrThrow().size + UserDetail(user, 0, followerCount, followingCount, true) } } } diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt index 424f9a6f..23cd1592 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt @@ -1,5 +1,6 @@ package com.whyranoid.presentation.viewmodel +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.whyranoid.domain.model.challenge.Badge @@ -12,6 +13,7 @@ import com.whyranoid.domain.usecase.GetUserBadgesUseCase import com.whyranoid.domain.usecase.GetUserDetailUseCase import com.whyranoid.domain.usecase.GetUserPostPreviewsUseCase import com.whyranoid.domain.usecase.SignOutUseCase +import com.whyranoid.domain.util.EMPTY import com.whyranoid.presentation.model.UiState import kotlinx.coroutines.launch import org.orbitmvi.orbit.ContainerHost @@ -52,6 +54,7 @@ class UserPageViewModel( ) } }.onFailure { + Log.d("userDetail", it.message.toString()) reduce { state.copy(userDetailState = UiState.Error(it.message.toString())) } @@ -85,7 +88,8 @@ class UserPageViewModel( userPostPreviewsState = UiState.Success(userPostPreviews), userDetailState = UiState.Success( UserDetail( - state.userDetailState.getDataOrNull()?.user ?: User.DUMMY, + state.userDetailState.getDataOrNull()?.user + ?: User.DUMMY.copy(imageUrl = String.EMPTY), userPostPreviews.size, state.userDetailState.getDataOrNull()?.followerCount ?: 0, state.userDetailState.getDataOrNull()?.followingCount ?: 0, From 482ea91378a307698485d597ac6e699733983efe Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 19:58:40 +0900 Subject: [PATCH 07/19] =?UTF-8?q?:recycle:=20=ED=8C=94=EB=A1=9C=EC=9E=89?= =?UTF-8?q?=20=EC=97=AC=EB=B6=80=20=EC=A0=95=EB=B3=B4=20nullable=20?= =?UTF-8?q?=EA=B0=92=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/whyranoid/domain/model/user/UserDetail.kt | 2 +- .../com/whyranoid/presentation/screens/mypage/MyPageScreen.kt | 2 ++ .../com/whyranoid/presentation/viewmodel/UserViewModel.kt | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/domain/src/main/java/com/whyranoid/domain/model/user/UserDetail.kt b/domain/src/main/java/com/whyranoid/domain/model/user/UserDetail.kt index f92f3b13..a8fc8ee7 100644 --- a/domain/src/main/java/com/whyranoid/domain/model/user/UserDetail.kt +++ b/domain/src/main/java/com/whyranoid/domain/model/user/UserDetail.kt @@ -7,7 +7,7 @@ data class UserDetail( val postCount: Int, val followerCount: Int, val followingCount: Int, - val isFollowing: Boolean, + val isFollowing: Boolean? = null, ) { companion object { val DUMMY = UserDetail( diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt index 1f7c6071..c382aee4 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt @@ -112,6 +112,7 @@ fun UserPageContent( onSettingsClicked: () -> Unit = {}, onLogoutClicked: () -> Unit = {}, onDateClicked: (LocalDate) -> Unit = {}, + onFollowButtonClicked: (uid: Long) -> Unit = {}, // TODO 상대방일 때 팔로잉 버튼 보이게 ) { Scaffold( topBar = { @@ -269,6 +270,7 @@ fun UserPageContent( } } } + 2 -> ChallengePage() } } diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt index 23cd1592..72c957ac 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt @@ -89,11 +89,11 @@ class UserPageViewModel( userDetailState = UiState.Success( UserDetail( state.userDetailState.getDataOrNull()?.user - ?: User.DUMMY.copy(imageUrl = String.EMPTY), + ?: User.DUMMY.copy(imageUrl = String.EMPTY), // TODO 사람 실루엣 url userPostPreviews.size, state.userDetailState.getDataOrNull()?.followerCount ?: 0, state.userDetailState.getDataOrNull()?.followingCount ?: 0, - state.userDetailState.getDataOrNull()?.isFollowing ?: false, + state.userDetailState.getDataOrNull()?.isFollowing, ), ), ) From 0bbe8d86eac6c8aabb0f92c16ffea070d4ee3c7b Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 20:30:37 +0900 Subject: [PATCH 08/19] =?UTF-8?q?:sparkles:=20=ED=8C=94=EB=A1=9C=EC=9E=89?= =?UTF-8?q?=20=EB=B2=84=ED=8A=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screens/mypage/MyPageScreen.kt | 89 ++++++++++++++----- .../presentation/viewmodel/UserViewModel.kt | 2 +- 2 files changed, 66 insertions(+), 25 deletions(-) diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt index c382aee4..3f26f4e7 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt @@ -2,7 +2,10 @@ package com.whyranoid.presentation.screens.mypage import android.annotation.SuppressLint import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row @@ -13,6 +16,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState @@ -51,6 +55,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import coil.compose.AsyncImage +import com.whyranoid.domain.util.EMPTY import com.whyranoid.presentation.component.bar.WalkieTopBar import com.whyranoid.presentation.reusable.TextWithCountSpaceBetween import com.whyranoid.presentation.screens.Screen @@ -77,7 +82,7 @@ fun MyPageScreen( LaunchedEffect(Unit) { val myUid = requireNotNull(viewModel.accountRepository.uId.first()) - viewModel.getUserDetail(myUid, true) + viewModel.getUserDetail(myUid, null) viewModel.getUserBadges(myUid) viewModel.getUserPostPreviews(myUid) } @@ -150,30 +155,66 @@ fun UserPageContent( ) Spacer(modifier = Modifier.width(20.dp)) - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceEvenly, - verticalAlignment = Alignment.CenterVertically, + Column( + modifier = Modifier + .wrapContentHeight() + .fillMaxWidth(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, ) { - // TODO: 스트링 리소스 분리 - TextWithCountSpaceBetween( - text = "게시물", - count = userDetail.postCount, - textStyle = WalkieTypography.Body1_Normal, - countTextStyle = WalkieTypography.SubTitle, - ) - TextWithCountSpaceBetween( - text = "팔로워", - count = userDetail.followerCount, - textStyle = WalkieTypography.Body1_Normal, - countTextStyle = WalkieTypography.SubTitle, - ) - TextWithCountSpaceBetween( - text = "팔로잉", - count = userDetail.followingCount, - textStyle = WalkieTypography.Body1_Normal, - countTextStyle = WalkieTypography.SubTitle, - ) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly, + verticalAlignment = Alignment.CenterVertically, + ) { + TextWithCountSpaceBetween( + text = "게시물", + count = userDetail.postCount, + textStyle = WalkieTypography.Body1_Normal, + countTextStyle = WalkieTypography.SubTitle, + ) + TextWithCountSpaceBetween( + text = "팔로워", + count = userDetail.followerCount, + textStyle = WalkieTypography.Body1_Normal, + countTextStyle = WalkieTypography.SubTitle, + ) + TextWithCountSpaceBetween( + text = "팔로잉", + count = userDetail.followingCount, + textStyle = WalkieTypography.Body1_Normal, + countTextStyle = WalkieTypography.SubTitle, + ) + } + nickname?.let { + val isFollowing = state.userDetailState.getDataOrNull()?.isFollowing + val followingButtonBackground = if (isFollowing == false) WalkieColor.Primary else Color.White + val followButtonText = + if (isFollowing == true) "팔로잉" else if (isFollowing == false) "팔로우" else String.EMPTY + Box( + modifier = Modifier + .wrapContentHeight() + .fillMaxWidth() + .padding(horizontal = 28.dp) + .padding(vertical = 12.dp) + .clip( + RoundedCornerShape(12.dp), + ) + .border( + 1.dp, + WalkieColor.GrayBorder, + RoundedCornerShape(10.dp), + ) + .background(followingButtonBackground), + contentAlignment = Alignment.Center, + ) { + Text( + modifier = Modifier.padding(vertical = 6.dp), + text = followButtonText, + style = WalkieTypography.Body1_SemiBold, + ) + } + } } } Spacer(Modifier.height(12.dp)) diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt index 72c957ac..ca2861c1 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt @@ -43,7 +43,7 @@ class UserPageViewModel( override val container = container(UserPageState()) - fun getUserDetail(uid: Long, isFollowing: Boolean) = intent { + fun getUserDetail(uid: Long, isFollowing: Boolean?) = intent { reduce { state.copy(userDetailState = UiState.Loading) } From eabea640708d9e0b6232afdfc3e67d4f9eb85e0c Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 20:38:13 +0900 Subject: [PATCH 09/19] =?UTF-8?q?:recycle:=20=ED=8C=94=EB=A1=9C=EC=9A=B0,?= =?UTF-8?q?=20=EC=96=B8=ED=8C=94=EB=A1=9C=EC=9A=B0=20=EC=9C=A0=EC=A6=88?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20uid=20=EA=B8=B0=EB=B0=98=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/whyranoid/domain/usecase/community/FollowUseCase.kt | 5 ++--- .../whyranoid/domain/usecase/community/UnFollowUseCase.kt | 5 ++--- .../presentation/viewmodel/SearchFriendViewModel.kt | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/domain/src/main/java/com/whyranoid/domain/usecase/community/FollowUseCase.kt b/domain/src/main/java/com/whyranoid/domain/usecase/community/FollowUseCase.kt index 630a249e..f83df995 100644 --- a/domain/src/main/java/com/whyranoid/domain/usecase/community/FollowUseCase.kt +++ b/domain/src/main/java/com/whyranoid/domain/usecase/community/FollowUseCase.kt @@ -1,6 +1,5 @@ package com.whyranoid.domain.usecase.community -import com.whyranoid.domain.model.user.User import com.whyranoid.domain.repository.AccountRepository import com.whyranoid.domain.repository.FollowRepository import kotlinx.coroutines.flow.first @@ -9,10 +8,10 @@ class FollowUseCase( private val accountRepository: AccountRepository, private val followRepository: FollowRepository, ) { - suspend operator fun invoke(other: User) { + suspend operator fun invoke(otherUId: Long) { runCatching { val uid = requireNotNull(accountRepository.uId.first()) - followRepository.follow(uid, other.uid) + followRepository.follow(uid, otherUId) } } } diff --git a/domain/src/main/java/com/whyranoid/domain/usecase/community/UnFollowUseCase.kt b/domain/src/main/java/com/whyranoid/domain/usecase/community/UnFollowUseCase.kt index 8457e643..ec236dd2 100644 --- a/domain/src/main/java/com/whyranoid/domain/usecase/community/UnFollowUseCase.kt +++ b/domain/src/main/java/com/whyranoid/domain/usecase/community/UnFollowUseCase.kt @@ -1,6 +1,5 @@ package com.whyranoid.domain.usecase.community -import com.whyranoid.domain.model.user.User import com.whyranoid.domain.repository.AccountRepository import com.whyranoid.domain.repository.FollowRepository import kotlinx.coroutines.flow.first @@ -9,10 +8,10 @@ class UnFollowUseCase( private val accountRepository: AccountRepository, private val followRepository: FollowRepository, ) { - suspend operator fun invoke(other: User) { + suspend operator fun invoke(otherUId: Long) { runCatching { val uid = requireNotNull(accountRepository.uId.first()) - followRepository.unfollow(uid, other.uid) + followRepository.unfollow(uid, otherUId) } } } diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/SearchFriendViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/SearchFriendViewModel.kt index 2127c8f9..a9043a01 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/SearchFriendViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/SearchFriendViewModel.kt @@ -34,13 +34,13 @@ class SearchFriendViewModel( fun follow(other: User) { viewModelScope.launch { - followUseCase(other) + followUseCase(other.uid) } } fun unFollow(other: User) { viewModelScope.launch { - unFollowUseCase(other) + unFollowUseCase(other.uid) } } } From dee2812f8657cba74acf7894b910c83304d3d300 Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 20:44:13 +0900 Subject: [PATCH 10/19] =?UTF-8?q?:recycle:=20=ED=8C=94=EB=A1=9C=EC=9A=B0,?= =?UTF-8?q?=20=EC=96=B8=ED=8C=94=EB=A1=9C=EC=9A=B0=20=EC=9C=A0=EC=A6=88?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=84=B1=EA=B3=B5=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/whyranoid/domain/usecase/community/FollowUseCase.kt | 6 +++--- .../whyranoid/domain/usecase/community/UnFollowUseCase.kt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/domain/src/main/java/com/whyranoid/domain/usecase/community/FollowUseCase.kt b/domain/src/main/java/com/whyranoid/domain/usecase/community/FollowUseCase.kt index f83df995..90c82003 100644 --- a/domain/src/main/java/com/whyranoid/domain/usecase/community/FollowUseCase.kt +++ b/domain/src/main/java/com/whyranoid/domain/usecase/community/FollowUseCase.kt @@ -8,10 +8,10 @@ class FollowUseCase( private val accountRepository: AccountRepository, private val followRepository: FollowRepository, ) { - suspend operator fun invoke(otherUId: Long) { - runCatching { + suspend operator fun invoke(otherUId: Long): Result { + return runCatching { val uid = requireNotNull(accountRepository.uId.first()) - followRepository.follow(uid, otherUId) + followRepository.follow(uid, otherUId).getOrThrow() } } } diff --git a/domain/src/main/java/com/whyranoid/domain/usecase/community/UnFollowUseCase.kt b/domain/src/main/java/com/whyranoid/domain/usecase/community/UnFollowUseCase.kt index ec236dd2..f9da79b7 100644 --- a/domain/src/main/java/com/whyranoid/domain/usecase/community/UnFollowUseCase.kt +++ b/domain/src/main/java/com/whyranoid/domain/usecase/community/UnFollowUseCase.kt @@ -8,10 +8,10 @@ class UnFollowUseCase( private val accountRepository: AccountRepository, private val followRepository: FollowRepository, ) { - suspend operator fun invoke(otherUId: Long) { - runCatching { + suspend operator fun invoke(otherUId: Long): Result { + return runCatching { val uid = requireNotNull(accountRepository.uId.first()) - followRepository.unfollow(uid, otherUId) + followRepository.unfollow(uid, otherUId).getOrThrow() } } } From a34e194ef3099e458edf1389846691f55fb028d4 Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 20:47:33 +0900 Subject: [PATCH 11/19] =?UTF-8?q?:sparkles:=20=ED=8C=94=EB=A1=9C=EC=9A=B0,?= =?UTF-8?q?=20=EC=96=B8=ED=8C=94=EB=A1=9C=EC=9A=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/whyranoid/walkie/KoinModules.kt | 2 +- .../presentation/viewmodel/UserViewModel.kt | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/whyranoid/walkie/KoinModules.kt b/app/src/main/java/com/whyranoid/walkie/KoinModules.kt index ff3dc190..b04cc7d3 100644 --- a/app/src/main/java/com/whyranoid/walkie/KoinModules.kt +++ b/app/src/main/java/com/whyranoid/walkie/KoinModules.kt @@ -103,7 +103,7 @@ val viewModelModule = module { single { ChallengeMainViewModel(get(), get(), get()) } single { ChallengeDetailViewModel(get()) } single { ChallengeExitViewModel(get()) } - factory { UserPageViewModel(get(), get(), get(), get(), get(), get()) } + factory { UserPageViewModel(get(), get(), get(), get(), get(), get(), get(), get()) } factory { RunningViewModel(get(), get(), get(), get(), get(), get()) } factory { RunningEditViewModel() } factory { SplashViewModel(get()) } diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt index ca2861c1..9d0ce7ca 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt @@ -13,6 +13,8 @@ import com.whyranoid.domain.usecase.GetUserBadgesUseCase import com.whyranoid.domain.usecase.GetUserDetailUseCase import com.whyranoid.domain.usecase.GetUserPostPreviewsUseCase import com.whyranoid.domain.usecase.SignOutUseCase +import com.whyranoid.domain.usecase.community.FollowUseCase +import com.whyranoid.domain.usecase.community.UnFollowUseCase import com.whyranoid.domain.util.EMPTY import com.whyranoid.presentation.model.UiState import kotlinx.coroutines.launch @@ -39,6 +41,8 @@ class UserPageViewModel( private val getUserPostPreviewsUseCase: GetUserPostPreviewsUseCase, private val getPostUseCase: GetPostUseCase, private val signOutUseCase: SignOutUseCase, + private val followUseCase: FollowUseCase, + private val unFollowUseCase: UnFollowUseCase, ) : ViewModel(), ContainerHost { override val container = container(UserPageState()) @@ -117,6 +121,38 @@ class UserPageViewModel( } state.copy(calendarPreviewsState = UiState.Success(filtered)) } + + fun follow(uid: Long) { + viewModelScope.launch { + followUseCase(uid).onSuccess { + reduce { + state.copy( + userDetailState = UiState.Success( + requireNotNull(state.userDetailState.getDataOrNull()).copy( + isFollowing = true, + ), + ), + ) + } + } + } + } + + fun unFollow(uid: Long) { + viewModelScope.launch { + unFollowUseCase(uid).onSuccess { + reduce { + state.copy( + userDetailState = UiState.Success( + requireNotNull(state.userDetailState.getDataOrNull()).copy( + isFollowing = false, + ), + ), + ) + } + } + } + } } fun signOut() { From 7c084ed4aab7e02ac3852861c1bec541d452284c Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 21:03:33 +0900 Subject: [PATCH 12/19] =?UTF-8?q?:bug:=20=ED=8C=94=EB=A1=9C=EC=9E=89=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/whyranoid/presentation/screens/AppScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/AppScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/AppScreen.kt index 27fd4c31..155257b6 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/AppScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/AppScreen.kt @@ -182,7 +182,7 @@ fun AppScreenContent( val arguments = requireNotNull(backStackEntry.arguments) val uid = arguments.getLong(Screen.UID_ARGUMENT) val nickname = requireNotNull(arguments.getString(Screen.NICKNAME_ARGUMENT)) - val isFollowing = arguments.getBoolean(Screen.NICKNAME_ARGUMENT) + val isFollowing = arguments.getBoolean(Screen.IS_FOLLOWING_ARGUMENT) UserPageScreen(navController, uid, nickname, isFollowing) } } From b959a983149a2bc2809425d99d7f959244fb1b6e Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 21:11:01 +0900 Subject: [PATCH 13/19] =?UTF-8?q?:bug:=20=ED=8C=94=EB=A1=9C=EC=9A=B0,=20?= =?UTF-8?q?=EC=96=B8=ED=8C=94=EB=A1=9C=EC=9A=B0=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/viewmodel/UserViewModel.kt | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt index 9d0ce7ca..93b67ec7 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt @@ -121,35 +121,35 @@ class UserPageViewModel( } state.copy(calendarPreviewsState = UiState.Success(filtered)) } + } - fun follow(uid: Long) { - viewModelScope.launch { - followUseCase(uid).onSuccess { - reduce { - state.copy( - userDetailState = UiState.Success( - requireNotNull(state.userDetailState.getDataOrNull()).copy( - isFollowing = true, - ), + fun follow(uid: Long) = intent { + viewModelScope.launch { + followUseCase(uid).onSuccess { + reduce { + state.copy( + userDetailState = UiState.Success( + requireNotNull(state.userDetailState.getDataOrNull()).copy( + isFollowing = true, ), - ) - } + ), + ) } } } + } - fun unFollow(uid: Long) { - viewModelScope.launch { - unFollowUseCase(uid).onSuccess { - reduce { - state.copy( - userDetailState = UiState.Success( - requireNotNull(state.userDetailState.getDataOrNull()).copy( - isFollowing = false, - ), + fun unFollow(uid: Long) = intent { + viewModelScope.launch { + unFollowUseCase(uid).onSuccess { + reduce { + state.copy( + userDetailState = UiState.Success( + requireNotNull(state.userDetailState.getDataOrNull()).copy( + isFollowing = false, ), - ) - } + ), + ) } } } From 314b19f0ed408ee3cdf68dec94c837021b05b6c9 Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 21:22:52 +0900 Subject: [PATCH 14/19] =?UTF-8?q?:sparkles:=20=ED=8C=94=EB=A1=9C=EC=9A=B0,?= =?UTF-8?q?=20=EC=96=B8=ED=8C=94=EB=A1=9C=EC=9A=B0=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EB=8F=99=EC=9E=91=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/screens/mypage/MyPageScreen.kt | 17 +++++++++++++---- .../screens/mypage/UserPageScreen.kt | 6 ++++++ .../presentation/viewmodel/UserViewModel.kt | 8 ++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt index 3f26f4e7..90e9e3ac 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/MyPageScreen.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -117,7 +118,8 @@ fun UserPageContent( onSettingsClicked: () -> Unit = {}, onLogoutClicked: () -> Unit = {}, onDateClicked: (LocalDate) -> Unit = {}, - onFollowButtonClicked: (uid: Long) -> Unit = {}, // TODO 상대방일 때 팔로잉 버튼 보이게 + onFollowButtonClicked: () -> Unit = {}, + onUnFollowButtonClicked: () -> Unit = {}, ) { Scaffold( topBar = { @@ -188,7 +190,8 @@ fun UserPageContent( } nickname?.let { val isFollowing = state.userDetailState.getDataOrNull()?.isFollowing - val followingButtonBackground = if (isFollowing == false) WalkieColor.Primary else Color.White + val followingButtonBackground = + if (isFollowing == false) WalkieColor.Primary else Color.White val followButtonText = if (isFollowing == true) "팔로잉" else if (isFollowing == false) "팔로우" else String.EMPTY Box( @@ -198,14 +201,20 @@ fun UserPageContent( .padding(horizontal = 28.dp) .padding(vertical = 12.dp) .clip( - RoundedCornerShape(12.dp), + RoundedCornerShape(10.dp), ) .border( 1.dp, WalkieColor.GrayBorder, RoundedCornerShape(10.dp), ) - .background(followingButtonBackground), + .background(followingButtonBackground).clickable { + if (isFollowing == true) { + onUnFollowButtonClicked() + } else if (isFollowing == false) { + onFollowButtonClicked() + } + }, contentAlignment = Alignment.Center, ) { Text( diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/UserPageScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/UserPageScreen.kt index 2e67c6c4..17901708 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/UserPageScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/UserPageScreen.kt @@ -29,5 +29,11 @@ fun UserPageScreen( nickname, state, onDateClicked = viewModel::selectDate, + onFollowButtonClicked = { + viewModel.follow(uid) + }, + onUnFollowButtonClicked = { + viewModel.unFollow(uid) + }, ) } diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt index 93b67ec7..0111700a 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/UserViewModel.kt @@ -131,6 +131,10 @@ class UserPageViewModel( userDetailState = UiState.Success( requireNotNull(state.userDetailState.getDataOrNull()).copy( isFollowing = true, + followerCount = ( + state.userDetailState.getDataOrNull()?.followerCount + ?: 0 + ) + 1, ), ), ) @@ -147,6 +151,10 @@ class UserPageViewModel( userDetailState = UiState.Success( requireNotNull(state.userDetailState.getDataOrNull()).copy( isFollowing = false, + followerCount = ( + state.userDetailState.getDataOrNull()?.followerCount + ?: 0 + ) - 1, ), ), ) From 41787bdcc90d573fb3fe5e5b385711d6e9bbcdfe Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 22:02:50 +0900 Subject: [PATCH 15/19] =?UTF-8?q?:recycle:=20=EC=B9=9C=EA=B5=AC=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EB=AA=A9=EB=A1=9D=20=ED=8C=94=EB=A1=9C?= =?UTF-8?q?=EC=9E=89=20=EC=97=AC=EB=B6=80=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screens/community/SearchedFriendItem.kt | 47 +++++++++---------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/community/SearchedFriendItem.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/community/SearchedFriendItem.kt index 0de33b71..42f3aa66 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/community/SearchedFriendItem.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/community/SearchedFriendItem.kt @@ -9,10 +9,6 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Text import androidx.compose.runtime.Composable -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.draw.clip @@ -21,7 +17,6 @@ import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.whyranoid.domain.model.user.User import com.whyranoid.domain.model.user.UserWithFollowingState -import com.whyranoid.presentation.theme.WalkieColor import com.whyranoid.presentation.theme.WalkieTypography @Composable @@ -32,7 +27,7 @@ fun SearchedFriendItem( onClickUnFollow: (User) -> Unit = {}, onClickItem: (User) -> Unit = {}, ) { - var isFollowing by remember { mutableStateOf(userWithFollowingState.isFollowing) } + // var isFollowing by remember { mutableStateOf(userWithFollowingState.isFollowing) } Row( modifier = modifier.clickable { onClickItem(userWithFollowingState.user) }, @@ -60,25 +55,25 @@ fun SearchedFriendItem( Spacer(modifier = Modifier.width(5.dp)) - Text( - modifier = Modifier.clickable { - if (isFollowing) { - onClickUnFollow(userWithFollowingState.user) - } else { - onClickFollow( - userWithFollowingState.user, - ) - } - isFollowing = isFollowing.not() - }, - text = if (isFollowing) { - "언팔로우" - } else { - "팔로우" - }, - style = WalkieTypography.Body2.copy( - color = WalkieColor.Primary, - ), - ) +// Text( +// modifier = Modifier.clickable { +// if (isFollowing) { +// onClickUnFollow(userWithFollowingState.user) +// } else { +// onClickFollow( +// userWithFollowingState.user, +// ) +// } +// isFollowing = isFollowing.not() +// }, +// text = if (isFollowing) { +// "언팔로우" +// } else { +// "팔로우" +// }, +// style = WalkieTypography.Body2.copy( +// color = WalkieColor.Primary, +// ), +// ) } } From 36606db4e3bed6131df7a6593330d883d4ac56ec Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 22:04:04 +0900 Subject: [PATCH 16/19] =?UTF-8?q?:sparkles:=20=ED=8F=AC=EC=8A=A4=ED=8C=85?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B9=9C=EA=B5=AC=20=ED=81=B4=EB=A6=AD?= =?UTF-8?q?=EC=8B=9C=20=ED=94=84=EB=A1=9C=ED=95=84=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/community/PostItem.kt | 21 +++++++++------- .../component/community/PostProfileItem.kt | 24 +++++++++++-------- .../presentation/screens/CommunityScreen.kt | 15 +++++++++--- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/presentation/src/main/java/com/whyranoid/presentation/component/community/PostItem.kt b/presentation/src/main/java/com/whyranoid/presentation/component/community/PostItem.kt index ff8c5203..1ea2c586 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/component/community/PostItem.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/component/community/PostItem.kt @@ -12,36 +12,39 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.whyranoid.domain.model.post.Post +import com.whyranoid.domain.model.user.User @Composable fun PostItem( post: Post, onLikeClicked: (Long) -> Unit = {}, + onProfileClicked: (User) -> Unit = {}, ) { Column( - modifier = Modifier - .fillMaxHeight() + Modifier.fillMaxHeight(), ) { - Divider( modifier = Modifier .fillMaxWidth() - .height(1.dp) + .height(1.dp), ) - PostProfileItem(post.author) + PostProfileItem( + post.author, + onProfileClicked, + ) AsyncImage( - model = post.imageUrl, contentDescription = "게시글 사진", + model = post.imageUrl, + contentDescription = "게시글 사진", modifier = Modifier .fillMaxWidth() .aspectRatio(1f), - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, ) PostContentItem(post) { onLikeClicked(it) } - } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/whyranoid/presentation/component/community/PostProfileItem.kt b/presentation/src/main/java/com/whyranoid/presentation/component/community/PostProfileItem.kt index 9774ba5c..56f23a48 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/component/community/PostProfileItem.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/component/community/PostProfileItem.kt @@ -1,6 +1,7 @@ package com.whyranoid.presentation.component.community import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -22,40 +23,43 @@ import com.whyranoid.presentation.theme.WalkieColor import com.whyranoid.presentation.theme.WalkieTypography @Composable -fun PostProfileItem(user: User) { +fun PostProfileItem( + user: User, + onProfileClicked: (User) -> Unit = {}, +) { Row( - modifier = Modifier + Modifier.clickable { onProfileClicked(user) } .fillMaxWidth() .padding(horizontal = 12.dp, vertical = 10.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { - Box( modifier = Modifier .size(27.dp) .border(1.dp, WalkieColor.Primary, CircleShape) .clip(CircleShape), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { AsyncImage( - model = user.imageUrl, contentDescription = "내 프로필 이미지", + model = user.imageUrl, + contentDescription = "내 프로필 이미지", modifier = Modifier .size(24.dp) .border(0.5.dp, WalkieColor.GrayBorder, CircleShape) .clip(CircleShape), - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, ) } Spacer(modifier = Modifier.size(11.dp)) Column { Text( user.nickname, - style = WalkieTypography.Body1 + style = WalkieTypography.Body1, ) Text( "Seoul, park", - style = WalkieTypography.Body2 + style = WalkieTypography.Body2, ) } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/CommunityScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/CommunityScreen.kt index c74d412d..90b23bef 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/CommunityScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/CommunityScreen.kt @@ -95,9 +95,18 @@ fun CommunityScreen( state.posts.getDataOrNull()?.forEach { post -> item { - PostItem(post = post) { postId -> - viewModel.likePost(postId) - } + PostItem( + post = post, + onLikeClicked = { postId -> + viewModel.likePost(postId) + }, + onProfileClicked = { user -> + state.following.getDataOrNull()?.let { followings -> + val isFollowing = followings.contains(user) + navController.navigate("userPage/${user.uid}/${user.nickname}/$isFollowing") + } + }, + ) } } } From ef6b85cf3c6700e207d5c1bf044e0fff39132783 Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 22:34:57 +0900 Subject: [PATCH 17/19] =?UTF-8?q?:sparkles:=20=EA=B2=8C=EC=8B=9C=EA=B8=80?= =?UTF-8?q?=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EC=9C=A0=EC=A0=80=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=97=90=20=EC=95=88=EB=82=B4=20=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screens/mypage/tabs/PostPage.kt | 94 ++++++++++++------ .../main/res/drawable/ic_circle_footprint.png | Bin 0 -> 1832 bytes 2 files changed, 63 insertions(+), 31 deletions(-) create mode 100644 presentation/src/main/res/drawable/ic_circle_footprint.png diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/tabs/PostPage.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/tabs/PostPage.kt index 42f72d93..42295f0c 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/tabs/PostPage.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/mypage/tabs/PostPage.kt @@ -1,11 +1,15 @@ package com.whyranoid.presentation.screens.mypage.tabs +import androidx.compose.foundation.Image import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -26,6 +30,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -33,8 +38,10 @@ import androidx.compose.ui.unit.sp import coil.compose.AsyncImage import com.whyranoid.domain.model.post.PostPreview import com.whyranoid.domain.model.post.TextVisibleState +import com.whyranoid.presentation.R import com.whyranoid.presentation.reusable.NonLazyGrid import com.whyranoid.presentation.theme.WalkieColor +import com.whyranoid.presentation.theme.WalkieTypography import java.text.SimpleDateFormat import java.util.* @@ -45,39 +52,64 @@ fun PostPage( onPostPreviewClicked: (id: Long) -> Unit, onPostCreateClicked: () -> Unit, ) { - NonLazyGrid( - columns = 3, - itemCount = postPreviews.size + 1, - contentPadding = 4, - ) { index -> - if (index < postPreviews.size) { - PostImagePreview( - postPreview = postPreviews[index], - onPostPreviewClicked = onPostPreviewClicked, - ) - } else if (isMyPage) { - Box( - modifier = Modifier - .fillMaxWidth() - .aspectRatio(1f) - .clip(RoundedCornerShape(4.dp)) - .border( - width = 2.dp, - color = WalkieColor.GrayDefault, - shape = RectangleShape, - ) - .clickable { - onPostCreateClicked() - }, + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + if (isMyPage.not() && postPreviews.isEmpty()) { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, ) { - Icon( - modifier = Modifier - .align(Alignment.Center) - .size(22.dp), - imageVector = Icons.Default.Add, - contentDescription = "포스트 생성", - tint = WalkieColor.GrayDefault, + Image( + modifier = Modifier.padding(top = 100.dp).size(64.dp), + painter = painterResource(id = R.drawable.ic_circle_footprint), + contentDescription = "empty post", ) + + Text( + modifier = Modifier.padding(top = 24.dp), + text = "아직 게시물이 없습니다.", + style = WalkieTypography.Body1_Normal.copy(color = WalkieColor.GrayBorder), + ) + } + } else { + NonLazyGrid( + columns = 3, + itemCount = postPreviews.size + 1, + contentPadding = 4, + ) { index -> + if (index < postPreviews.size) { + PostImagePreview( + postPreview = postPreviews[index], + onPostPreviewClicked = onPostPreviewClicked, + ) + } else if (isMyPage) { + Box( + modifier = Modifier + .fillMaxWidth() + .aspectRatio(1f) + .clip(RoundedCornerShape(4.dp)) + .border( + width = 2.dp, + color = WalkieColor.GrayDefault, + shape = RectangleShape, + ) + .clickable { + onPostCreateClicked() + }, + ) { + Icon( + modifier = Modifier + .align(Alignment.Center) + .size(22.dp), + imageVector = Icons.Default.Add, + contentDescription = "포스트 생성", + tint = WalkieColor.GrayDefault, + ) + } + } } } } diff --git a/presentation/src/main/res/drawable/ic_circle_footprint.png b/presentation/src/main/res/drawable/ic_circle_footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..5aec7518bdb0d336b1c4d354e84ef04a4f04e8ad GIT binary patch literal 1832 zcmV+@2iN$CP) z+e#F@HuG$zfAIl^FUShwtl*IqBs(CiAh3dv9V9DwWChPzL7Xo$RpGY*5c3SVM`<}m zZb{whRx7E>sZz;ULRO!?b6=@Mj&OK*=-u7j)%fG`)6i=5ix%`cToKJOd6 zeaC)bVWB||P@;yrIQatI~{QnNWfKVK&cFeYSgZx6QMgKHur*nWI`TwhvR zYLNjl69OA?e}BKmH?cv#5z6KA220B(Wke=In$4!iKm0HK@)S z@bEx9DY8>rJW;Q*NQ*Wh2L}gl_(rxUM}rv!dlecP8431LfRxM2OS-gIAD0pl1xUHLxR6~#ONEpPaZLtPqf)5^YNCqM(^I;+x#{{| zhm^9)Nq+(v0Mtqb+&jiV3P>fSC^gX~1AwuOQ!iCg5`UFrj5Rh)T1LqfQ&UsHz_Q}} z{G6_?u98l9Tdh_<#~q9%M7Y*(wMR7R-EAvp$A1uA0- z-}i~j4oc^;;eHX#mb)Z`$@oA8z=m`nYE>meplhtp2tf+ZyHzRxh&@c9Ne0xb#u`!U z{H`21K`D621Mm!r`X38~@48^gd^YB`4MAOlZ|EBp2&m1(#6%|bK^~KZ5I|(cb$srW zkToh8umML$N7@4mGv2IV#J3DI^e?lU#DTL|D z5Nk(Na_wDaXJ-?SW5z*%ET#ZiHc5zruRVw9a8@W*ai=&3c15N_d6FT1yH@5OaauW7 z1yl$zNmPaM1i0YeD=(8HV1{*~QFeuav^XTi!!J3jd4Pgk{HU{5ku{AbO7$E?HFl?^vL=s>_TJ#qoT7^nT8j$+K#)KsRsF7(^Ed@RZLDku# z-vk&uqEy(Hxb_FA7&hDS2|6EpneqR#tfSgSNCZ4j()~bUkmtY<+s=6TTHg`6JL&&S z0t!V){XvN8@P~N_fV?fm78eDV$6|OzcqHjSfmESu*>o8bkCQ~d>mo$xQ)bmkYo3FYn5Yg&KvHMwS(uDXS!<>= z#N(OV;u+4A^rbcGo2U*X39J1U%8M-~V?%a8N(g*1-{fn`5Ui<0pSr5kxxj5UsO%rheT!<8bnN>BAsE(;T9ApD3WB^KevkoaBLnpSdQ36PVDj9%sAwh=} zsDet+6gJ1?2^}&3?LxxN&dxh_ov6y`lUNlsr-8vqeORTwkcdo@ABP30=}P zvhYF`mWFMXhOa0H|1mFAi322u2eZP1S`nR(717`3MNVyreFN*xSYG7Mb<@{isNx6r W&#&Q Date: Mon, 22 Jan 2024 22:50:28 +0900 Subject: [PATCH 18/19] =?UTF-8?q?:bug:=20=EC=B9=9C=EA=B5=AC=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0=20=EA=B2=80=EC=83=89=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=BB=A4=EC=84=9C=20=EC=82=AC=EB=9D=BC?= =?UTF-8?q?=EC=A7=90=20=EB=B2=84=EA=B7=B8=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/reusable/CheckableCustomTextField.kt | 3 ++- .../presentation/screens/community/SearchFriendScreen.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/presentation/src/main/java/com/whyranoid/presentation/reusable/CheckableCustomTextField.kt b/presentation/src/main/java/com/whyranoid/presentation/reusable/CheckableCustomTextField.kt index cae9dfd6..c1899c74 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/reusable/CheckableCustomTextField.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/reusable/CheckableCustomTextField.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.dp +import com.whyranoid.presentation.theme.WalkieColor @Composable fun CheckableCustomTextField( @@ -37,7 +38,7 @@ fun CheckableCustomTextField( onTextChanged?.invoke(it) }, singleLine = true, - cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), + cursorBrush = SolidColor(WalkieColor.Primary), textStyle = textStyle, decorationBox = { innerTextField -> Row( diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/community/SearchFriendScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/community/SearchFriendScreen.kt index 9e70d16a..c4727da9 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/community/SearchFriendScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/community/SearchFriendScreen.kt @@ -116,7 +116,7 @@ fun SearchFriendScreen( }, cursorBrush = SolidColor(WalkieColor.Primary), singleLine = true, - ) { + ) { innerTextField -> if (query.value.isEmpty()) { Text( text = "워키 아이디로 친구찾기", @@ -130,6 +130,7 @@ fun SearchFriendScreen( style = WalkieTypography.Body1_Normal, ) } + innerTextField() } } } From 7f82a78c3fbd9b58ac8e00858b25b56dd10c7722 Mon Sep 17 00:00:00 2001 From: yonghanJu Date: Mon, 22 Jan 2024 22:53:48 +0900 Subject: [PATCH 19/19] :bookmark: 1.0.9 version release --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d4333745..f0af9361 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,7 +16,7 @@ android { minSdk = 26 targetSdk = 33 versionCode = 1 - versionName = "1.0.8" + versionName = "1.0.9" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" }