diff --git a/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt b/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt index 2b34a8a88..f0413ebcc 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt @@ -36,6 +36,16 @@ object BindingAdapter { GlideApp.with(imageView.context).load(img).centerInside().skipMemoryCache(caching).into(imageView) } + @BindingAdapter("loadUserImage", requireAll = false) + @JvmStatic + fun loadUserImage(imageView: ImageView, img: String) { + if (img.isEmpty()) { + imageView.setImageResource(R.drawable.default_user_image) + return + } + GlideApp.with(imageView.context).load(img).circleCrop().into(imageView) + } + @BindingAdapter("img") @JvmStatic fun loadImage(imageView: ImageView, img: Bitmap) { diff --git a/feature/mypage/src/main/res/drawable/default_user_image.xml b/core/common/src/main/res/drawable/default_user_image.xml similarity index 100% rename from feature/mypage/src/main/res/drawable/default_user_image.xml rename to core/common/src/main/res/drawable/default_user_image.xml diff --git a/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepository.kt index f1ca20b72..e1133f2ed 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepository.kt @@ -1,13 +1,13 @@ package com.android.mediproject.core.data.user import com.android.mediproject.core.model.user.AccountState -import com.android.mediproject.core.model.user.remote.UserResponse +import com.android.mediproject.core.model.user.User import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow interface UserInfoRepository { val myAccountInfo: StateFlow - fun getMyAccountInfo(): Flow> + fun getMyAccountInfo(): Flow> suspend fun updateMyAccountInfo(accountState: AccountState) diff --git a/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepositoryImpl.kt index 2048399c3..ade7c9c3e 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepositoryImpl.kt @@ -2,6 +2,8 @@ package com.android.mediproject.core.data.user import com.android.mediproject.core.datastore.AppDataStore import com.android.mediproject.core.model.user.AccountState +import com.android.mediproject.core.model.user.User +import com.android.mediproject.core.model.user.remote.toUser import com.android.mediproject.core.network.datasource.user.UserInfoDataSource import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -57,13 +59,18 @@ class UserInfoRepositoryImpl @Inject constructor( */ override fun getMyAccountInfo() = channelFlow { userInfoDataSource.getUserInfo().collectLatest { - it.onSuccess { userResponse -> - _myAccountInfo.value = AccountState.SignedIn(userResponse.userId, userResponse.nickname, userResponse.email) - }.onFailure { - _myAccountInfo.value = AccountState.Unknown + it.fold( + onSuccess = { userResponse -> + _myAccountInfo.value = AccountState.SignedIn(userResponse.userId, userResponse.nickname, userResponse.email) + Result.success(userResponse.toUser()) + }, + onFailure = { + _myAccountInfo.value = AccountState.Unknown + Result.failure(it) + }, + ).also { + trySend(it) } - trySend(it) } } - } diff --git a/core/model/src/main/java/com/android/mediproject/core/model/user/User.kt b/core/model/src/main/java/com/android/mediproject/core/model/user/User.kt index b14747245..8c406c86b 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/user/User.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/user/User.kt @@ -2,7 +2,7 @@ package com.android.mediproject.core.model.user data class User( val nickName: String, -) { - var id: Long = 0 - var email: String = "" -} + val profileUrl: String, + var id: Long = 0, + var email: String = "", +) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/UserResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/UserResponse.kt index 9d801a58c..77f9da9c1 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/UserResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/UserResponse.kt @@ -1,6 +1,7 @@ package com.android.mediproject.core.model.user.remote import com.android.mediproject.core.model.user.User +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** @@ -13,10 +14,11 @@ import kotlinx.serialization.Serializable */ @Serializable data class UserResponse( - val nickname: String, val userId: Long, val email: String, val message: String, @SerialName("profile_url") val profileUrl: String? = "", + val nickname: String, val userId: Long, val email: String, val message: String, @SerialName("profile_url") val profileUrl: String = "", ) -fun UserResponse.toUserDto() = User(nickName = nickname).apply { - id = userId - email = this@toUserDto.email -} +fun UserResponse.toUser() = User( + nickName = nickname, profileUrl = profileUrl, + id = userId, + email = this@toUser.email, +) diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageFragment.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageFragment.kt index 0e6c41d2c..1ed97e408 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageFragment.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageFragment.kt @@ -132,7 +132,8 @@ class MyPageFragment : is UiState.Success -> { setSuccessUserVisible() - binding.userDto = userState.data + binding.user = userState.data + } is UiState.Error -> { @@ -141,6 +142,7 @@ class MyPageFragment : } } + private fun setLoadingUserVisible() = binding.apply { userNameTV.visibility = View.GONE userImageIV.visibility = View.GONE diff --git a/feature/mypage/src/main/res/layout/fragment_my_page.xml b/feature/mypage/src/main/res/layout/fragment_my_page.xml index c59729961..66a7a432f 100644 --- a/feature/mypage/src/main/res/layout/fragment_my_page.xml +++ b/feature/mypage/src/main/res/layout/fragment_my_page.xml @@ -10,7 +10,7 @@ type="com.android.mediproject.feature.mypage.MyPageViewModel" /> @@ -152,7 +152,7 @@ android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginTop="10dp" - android:src="@drawable/default_user_image" + loadUserImage="@{user.profileUrl}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -161,7 +161,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="20dp" - android:text="@{userDto.nickName}" + android:text="@{user.nickName}" android:textColor="@color/black" android:textSize="28sp" app:layout_constraintBottom_toBottomOf="@id/userImageIV" @@ -266,7 +266,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" /> -