diff --git a/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageDataSource.kt b/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageDataSource.kt index c5a6af8b..6318beb7 100644 --- a/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageDataSource.kt +++ b/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageDataSource.kt @@ -1,6 +1,7 @@ package com.sopt.geonppang.data.datasource.remote import com.sopt.geonppang.data.model.response.ResponseMypageBookmark +import com.sopt.geonppang.data.model.response.ResponseMypageInfo import com.sopt.geonppang.data.model.response.ResponseMypageReview import com.sopt.geonppang.data.service.MypageService import javax.inject.Inject @@ -8,6 +9,9 @@ import javax.inject.Inject class MypageDataSource @Inject constructor( private val mypageService: MypageService, ) { + suspend fun fetchMypageInfo(): ResponseMypageInfo = + mypageService.fetchMypageInfo() + suspend fun fetchMyBookmarkList(): ResponseMypageBookmark = mypageService.fetchMypageBookmark() diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMypageInfo.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMypageInfo.kt new file mode 100644 index 00000000..a1ffd0e5 --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMypageInfo.kt @@ -0,0 +1,42 @@ +package com.sopt.geonppang.data.model.response + +import com.sopt.geonppang.domain.model.BreadType +import com.sopt.geonppang.domain.model.Profile +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseMypageInfo( + val code: Int, + val data: Data, + val message: String +) { + @Serializable + data class Data( + val memberNickname: String, + val mainPurpose: String, + val breadType: BreadType + ) { + @Serializable + data class BreadType( + val breadTypeId: Int, + val breadTypeName: String, + val isGlutenFree: Boolean, + val isNutFree: Boolean, + val isSugarFree: Boolean, + val isVegan: Boolean + ) + } + + fun toMypageInfo() = Profile( + memberNickname = data.memberNickname, + mainPurpose = data.mainPurpose, + breadType = BreadType( + breadTypeId = data.breadType.breadTypeId, + breadTypeName = data.breadType.breadTypeName, + isGlutenFree = data.breadType.isGlutenFree, + isVegan = data.breadType.isVegan, + isNutFree = data.breadType.isNutFree, + isSugarFree = data.breadType.isSugarFree + ) + ) +} diff --git a/app/src/main/java/com/sopt/geonppang/data/repository/MypageRepositoryImpl.kt b/app/src/main/java/com/sopt/geonppang/data/repository/MypageRepositoryImpl.kt index 5ccad2f9..cf159b6a 100644 --- a/app/src/main/java/com/sopt/geonppang/data/repository/MypageRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/geonppang/data/repository/MypageRepositoryImpl.kt @@ -3,12 +3,17 @@ package com.sopt.geonppang.data.repository import com.sopt.geonppang.data.datasource.remote.MypageDataSource import com.sopt.geonppang.domain.model.Bakery import com.sopt.geonppang.domain.model.MyReview +import com.sopt.geonppang.domain.model.Profile import com.sopt.geonppang.domain.repository.MypageRepository import javax.inject.Inject class MypageRepositoryImpl @Inject constructor( private val mypageDataSource: MypageDataSource, ) : MypageRepository { + override suspend fun fetchMypageInfo(): Result = runCatching { + mypageDataSource.fetchMypageInfo().toMypageInfo() + } + override suspend fun fetchMyBookmark(): Result> = runCatching { mypageDataSource.fetchMyBookmarkList().toMypageBookmark() } diff --git a/app/src/main/java/com/sopt/geonppang/data/service/MypageService.kt b/app/src/main/java/com/sopt/geonppang/data/service/MypageService.kt index 9beebb21..abe7271a 100644 --- a/app/src/main/java/com/sopt/geonppang/data/service/MypageService.kt +++ b/app/src/main/java/com/sopt/geonppang/data/service/MypageService.kt @@ -1,10 +1,14 @@ package com.sopt.geonppang.data.service import com.sopt.geonppang.data.model.response.ResponseMypageBookmark +import com.sopt.geonppang.data.model.response.ResponseMypageInfo import com.sopt.geonppang.data.model.response.ResponseMypageReview import retrofit2.http.GET interface MypageService { + @GET("/member") + suspend fun fetchMypageInfo(): ResponseMypageInfo + @GET("member/bookMarks") suspend fun fetchMypageBookmark(): ResponseMypageBookmark diff --git a/app/src/main/java/com/sopt/geonppang/domain/repository/MypageRepository.kt b/app/src/main/java/com/sopt/geonppang/domain/repository/MypageRepository.kt index b5e3c82b..ee3f3c86 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/repository/MypageRepository.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/repository/MypageRepository.kt @@ -2,8 +2,10 @@ package com.sopt.geonppang.domain.repository import com.sopt.geonppang.domain.model.Bakery import com.sopt.geonppang.domain.model.MyReview +import com.sopt.geonppang.domain.model.Profile interface MypageRepository { + suspend fun fetchMypageInfo(): Result suspend fun fetchMyBookmark(): Result> suspend fun fetchMyReview(): Result> } diff --git a/app/src/main/java/com/sopt/geonppang/presentation/mypage/MyPageFragment.kt b/app/src/main/java/com/sopt/geonppang/presentation/mypage/MyPageFragment.kt index 3500d7dc..55067665 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/mypage/MyPageFragment.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/mypage/MyPageFragment.kt @@ -19,9 +19,14 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ binding.viewModel = viewModel binding.lifecycleOwner = this + initLayout() addListeners() } + private fun initLayout() { + viewModel.fetchMypageInfo() + } + private fun addListeners() { binding.layoutMyPageBookmark.setOnClickListener { moveToStoreBakeryList() diff --git a/app/src/main/java/com/sopt/geonppang/presentation/mypage/MyPageViewModel.kt b/app/src/main/java/com/sopt/geonppang/presentation/mypage/MyPageViewModel.kt index ede51ac9..d470c6b3 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/mypage/MyPageViewModel.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/mypage/MyPageViewModel.kt @@ -3,7 +3,6 @@ package com.sopt.geonppang.presentation.mypage import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sopt.geonppang.domain.model.Bakery -import com.sopt.geonppang.domain.model.BreadType import com.sopt.geonppang.domain.model.MyReview import com.sopt.geonppang.domain.model.Profile import com.sopt.geonppang.domain.repository.MypageRepository @@ -19,27 +18,18 @@ import javax.inject.Inject class MyPageViewModel @Inject constructor( private val mypageRepository: MypageRepository, ) : ViewModel() { - private val _profile = Profile( - memberNickname = "안빵이들", - mainPurpose = "맛 . 다이어트", - breadType = BreadType( - breadTypeId = 1, - breadTypeName = "글루텐프리", - isGlutenFree = true, - isVegan = true, - isNutFree = false, - isSugarFree = true - ) - ) - val profile = _profile + private var _mypageInfoState = MutableStateFlow(null) + val mypageInfoState get() = _mypageInfoState.asStateFlow() - private var _mypageReviewListState = MutableStateFlow>>(UiState.Loading) + private var _mypageReviewListState = + MutableStateFlow>>(UiState.Loading) val mypageReviewListState get() = _mypageReviewListState.asStateFlow() private var _myReviewCount = MutableStateFlow(null) val myReviewCount get() = _myReviewCount.asStateFlow() - private var _mypageBookmarkListState = MutableStateFlow>>(UiState.Loading) + private var _mypageBookmarkListState = + MutableStateFlow>>(UiState.Loading) val mypageBookmarkListState get() = _mypageBookmarkListState.asStateFlow() private var _myBookmarkCount = MutableStateFlow(null) @@ -50,6 +40,17 @@ class MyPageViewModel @Inject constructor( fetchMypageBookmarkList() } + fun fetchMypageInfo() { + viewModelScope.launch { + mypageRepository.fetchMypageInfo() + .onSuccess { myInfo -> + myInfo.let { + _mypageInfoState.value = myInfo + } + } + } + } + private fun fetchMypageReviewList() { viewModelScope.launch { mypageRepository.fetchMyReview().onSuccess { myReviewList -> diff --git a/app/src/main/res/layout/fragment_my_page.xml b/app/src/main/res/layout/fragment_my_page.xml index 38fd1af4..cfc449c4 100644 --- a/app/src/main/res/layout/fragment_my_page.xml +++ b/app/src/main/res/layout/fragment_my_page.xml @@ -57,7 +57,7 @@ android:layout_height="wrap_content" android:layout_marginStart="17dp" android:backgroundTint="@color/point_2" - android:text="@{viewModel.profile.mainPurpose}" + android:text="@{viewModel.mypageInfoState.mainPurpose}" app:layout_constraintStart_toEndOf="@+id/iv_my_page_profile_img" app:layout_constraintTop_toTopOf="@+id/iv_my_page_profile_img" tools:text="맛 . 다이어트" /> @@ -67,7 +67,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:text="@{viewModel.profile.memberNickname}" + android:text="@{viewModel.mypageInfoState.memberNickname}" android:textAppearance="@style/TextAppearance.Title2" android:textColor="@color/gray_600" app:layout_constraintStart_toStartOf="@+id/chip_my_page_profile_purpose" @@ -99,7 +99,7 @@