From 2025ff027db2e2aa5190f56dd39f910d8e53bdc2 Mon Sep 17 00:00:00 2001 From: jooyyoo Date: Tue, 18 Jul 2023 13:21:54 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[chore]=20#35=20AuthInterceptor=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sopt/geonppang/data/interceptor/AuthInterceptor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/sopt/geonppang/data/interceptor/AuthInterceptor.kt b/app/src/main/java/com/sopt/geonppang/data/interceptor/AuthInterceptor.kt index 50bcf816..39862991 100644 --- a/app/src/main/java/com/sopt/geonppang/data/interceptor/AuthInterceptor.kt +++ b/app/src/main/java/com/sopt/geonppang/data/interceptor/AuthInterceptor.kt @@ -10,7 +10,7 @@ class AuthInterceptor @Inject constructor() : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() val authRequest = - originalRequest.newBuilder().addHeader("accesstoken", BuildConfig.ACCESS_TOKEN).build() + originalRequest.newBuilder().addHeader("Authorization ", BuildConfig.ACCESS_TOKEN).build() val response = chain.proceed(authRequest) when (response.code) { From 16b5981f016f1c101cbc6efb6076ebc97608f7c8 Mon Sep 17 00:00:00 2001 From: jooyyoo Date: Wed, 19 Jul 2023 22:19:45 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[feat]=20#35=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=20=ED=9A=8C=EC=9B=90=EC=A0=95=EB=B3=B4=20api=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20-=20=EC=88=98=EC=A0=95=20=ED=95=84?= =?UTF-8?q?=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/remote/MypageInfoDataSource.kt | 12 ++++++ .../data/model/response/ResponseMypageInfo.kt | 41 +++++++++++++++++++ .../repository/MypageInfoRepsitoryImpl.kt | 15 +++++++ .../data/service/MypageInfoService.kt | 9 ++++ .../com/sopt/geonppang/di/RepositoryModule.kt | 8 ++++ .../com/sopt/geonppang/di/ServiceModule.kt | 8 ++++ .../domain/repository/MypageInfoRepository.kt | 7 ++++ .../presentation/mypage/MyPageFragment.kt | 23 +++++++++++ .../presentation/mypage/MyPageViewModel.kt | 29 ++++++++++++- 9 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageInfoDataSource.kt create mode 100644 app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMypageInfo.kt create mode 100644 app/src/main/java/com/sopt/geonppang/data/repository/MypageInfoRepsitoryImpl.kt create mode 100644 app/src/main/java/com/sopt/geonppang/data/service/MypageInfoService.kt create mode 100644 app/src/main/java/com/sopt/geonppang/domain/repository/MypageInfoRepository.kt diff --git a/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageInfoDataSource.kt b/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageInfoDataSource.kt new file mode 100644 index 00000000..be3bb622 --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageInfoDataSource.kt @@ -0,0 +1,12 @@ +package com.sopt.geonppang.data.datasource.remote + +import com.sopt.geonppang.data.model.response.ResponseMypageInfo +import com.sopt.geonppang.data.service.MypageInfoService +import javax.inject.Inject + +class MypageInfoDataSource @Inject constructor( + private val mypageInfoService: MypageInfoService, +) { + suspend fun fetchMypageInfo(): + ResponseMypageInfo = mypageInfoService.fetchMypageInfo() +} \ No newline at end of file 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..53463675 --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMypageInfo.kt @@ -0,0 +1,41 @@ +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 + +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 + ) + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/geonppang/data/repository/MypageInfoRepsitoryImpl.kt b/app/src/main/java/com/sopt/geonppang/data/repository/MypageInfoRepsitoryImpl.kt new file mode 100644 index 00000000..b5c8ffef --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/data/repository/MypageInfoRepsitoryImpl.kt @@ -0,0 +1,15 @@ +package com.sopt.geonppang.data.repository + +import com.sopt.geonppang.data.datasource.remote.MypageInfoDataSource +import com.sopt.geonppang.data.model.response.ResponseMypageInfo +import com.sopt.geonppang.domain.model.Profile +import com.sopt.geonppang.domain.repository.MypageInfoRepository +import javax.inject.Inject + +class MypageInfoRepsitoryImpl @Inject constructor( + private val mypageInfoDataSource: MypageInfoDataSource, +) : MypageInfoRepository { + override suspend fun fetchMypageInfo(): Result = runCatching { + mypageInfoDataSource.fetchMypageInfo().toMypageInfo() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/geonppang/data/service/MypageInfoService.kt b/app/src/main/java/com/sopt/geonppang/data/service/MypageInfoService.kt new file mode 100644 index 00000000..ca667248 --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/data/service/MypageInfoService.kt @@ -0,0 +1,9 @@ +package com.sopt.geonppang.data.service + +import com.sopt.geonppang.data.model.response.ResponseMypageInfo +import retrofit2.http.GET + +interface MypageInfoService { + @GET("/member") + suspend fun fetchMypageInfo() : ResponseMypageInfo +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/geonppang/di/RepositoryModule.kt b/app/src/main/java/com/sopt/geonppang/di/RepositoryModule.kt index 98c225ba..5add9ac9 100644 --- a/app/src/main/java/com/sopt/geonppang/di/RepositoryModule.kt +++ b/app/src/main/java/com/sopt/geonppang/di/RepositoryModule.kt @@ -2,10 +2,12 @@ package com.sopt.geonppang.di import com.sopt.geonppang.data.repository.BakeryRepositoryImpl import com.sopt.geonppang.data.repository.DummyRepositoryImpl +import com.sopt.geonppang.data.repository.MypageInfoRepsitoryImpl import com.sopt.geonppang.data.repository.HomeRepositoryImpl import com.sopt.geonppang.data.repository.SearchRepositoryImpl import com.sopt.geonppang.domain.repository.BakeryRepository import com.sopt.geonppang.domain.repository.DummyRepository +import com.sopt.geonppang.domain.repository.MypageInfoRepository import com.sopt.geonppang.domain.repository.HomeRepository import com.sopt.geonppang.domain.repository.SearchRepository import dagger.Binds @@ -23,6 +25,12 @@ interface RepositoryModule { dummyRepositoryImpl: DummyRepositoryImpl, ): DummyRepository + @Binds + @Singleton + fun bindMypageInfoRepository( + mypageInfoRepsitoryImpl: MypageInfoRepsitoryImpl + ): MypageInfoRepository + @Binds @Singleton fun bindHomeRepository( diff --git a/app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt b/app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt index 3461b824..38a26335 100644 --- a/app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt +++ b/app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt @@ -1,7 +1,9 @@ package com.sopt.geonppang.di +import androidx.annotation.RestrictTo import com.sopt.geonppang.data.service.BakeryService import com.sopt.geonppang.data.service.DummyService +import com.sopt.geonppang.data.service.MypageInfoService import com.sopt.geonppang.data.service.HomeService import com.sopt.geonppang.data.service.SearchService import dagger.Module @@ -9,6 +11,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import retrofit2.Retrofit +import retrofit2.create import javax.inject.Singleton @Module @@ -19,6 +22,11 @@ object ServiceModule { fun provideDummyService(retrofit: Retrofit): DummyService = retrofit.create(DummyService::class.java) + @Singleton + @Provides + fun provideMypageInfoService(retrofit: Retrofit): MypageInfoService = + retrofit.create(MypageInfoService::class.java) + @Singleton @Provides fun provideHomeService(retrofit: Retrofit): HomeService = diff --git a/app/src/main/java/com/sopt/geonppang/domain/repository/MypageInfoRepository.kt b/app/src/main/java/com/sopt/geonppang/domain/repository/MypageInfoRepository.kt new file mode 100644 index 00000000..d94cc301 --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/domain/repository/MypageInfoRepository.kt @@ -0,0 +1,7 @@ +package com.sopt.geonppang.domain.repository + +import com.sopt.geonppang.domain.model.Profile + +interface MypageInfoRepository { + suspend fun fetchMypageInfo(): Result +} \ No newline at end of file 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 29b9627e..56be20b5 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 @@ -4,9 +4,14 @@ import android.content.Intent import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import com.sopt.geonppang.R import com.sopt.geonppang.databinding.FragmentMyPageBinding +import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingFragment +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach class MyPageFragment : BindingFragment(R.layout.fragment_my_page) { private val viewModel by viewModels() @@ -18,6 +23,8 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ binding.lifecycleOwner = this addListeners() + initLayout() + collectData() } private fun addListeners() { @@ -30,6 +37,22 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ } } + private fun initLayout() { + viewModel.fetchMypageInfo() + } + + private fun collectData() { + viewModel.mypageInfoState.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + binding.viewModel?.profile = it.data + } + + else -> {} + } + }.launchIn(lifecycleScope) + } + private fun moveToStoreBakeryList() { startActivity(Intent(requireContext(), MyStoreListActivity::class.java)) } 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 c29572f7..ea90a74e 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 @@ -1,12 +1,37 @@ package com.sopt.geonppang.presentation.mypage import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.sopt.geonppang.R 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.MypageInfoRepository +import com.sopt.geonppang.util.UiState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class MyPageViewModel @Inject constructor(private val mypageInfoRepository: MypageInfoRepository) : + ViewModel() { + private val _mypageInfoState = MutableStateFlow>(UiState.Loading) + val mypageInfoState get() = _mypageInfoState.asStateFlow() + fun fetchMypageInfo() { + viewModelScope.launch { + mypageInfoRepository.fetchMypageInfo() + .onSuccess { myInfo -> + _mypageInfoState.value = UiState.Success(myInfo) + } + .onFailure { throwable -> + _mypageInfoState.value = UiState.Error(throwable.message) + } + } + } -class MyPageViewModel : ViewModel() { private val _profile = Profile( memberNickname = "안빵이들", mainPurpose = "맛 . 다이어트", @@ -19,7 +44,7 @@ class MyPageViewModel : ViewModel() { isSugarFree = true ) ) - val profile = _profile + var profile = _profile // 마이페이지 북마크 더미데이터 val mockStoreList = listOf( From 17009158810ec499ad8e9526969a0739921e3450 Mon Sep 17 00:00:00 2001 From: jooyyoo Date: Thu, 20 Jul 2023 13:12:38 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[del]=20#35=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=ED=9A=8C=EC=9B=90=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20api=20=ED=8C=8C=EC=9D=BC=20=ED=86=B5?= =?UTF-8?q?=EC=9D=BC=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/remote/MypageInfoDataSource.kt | 12 ------------ .../data/repository/MypageInfoRepsitoryImpl.kt | 15 --------------- .../geonppang/data/service/MypageInfoService.kt | 9 --------- .../domain/repository/MypageInfoRepository.kt | 7 ------- 4 files changed, 43 deletions(-) delete mode 100644 app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageInfoDataSource.kt delete mode 100644 app/src/main/java/com/sopt/geonppang/data/repository/MypageInfoRepsitoryImpl.kt delete mode 100644 app/src/main/java/com/sopt/geonppang/data/service/MypageInfoService.kt delete mode 100644 app/src/main/java/com/sopt/geonppang/domain/repository/MypageInfoRepository.kt diff --git a/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageInfoDataSource.kt b/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageInfoDataSource.kt deleted file mode 100644 index be3bb622..00000000 --- a/app/src/main/java/com/sopt/geonppang/data/datasource/remote/MypageInfoDataSource.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.sopt.geonppang.data.datasource.remote - -import com.sopt.geonppang.data.model.response.ResponseMypageInfo -import com.sopt.geonppang.data.service.MypageInfoService -import javax.inject.Inject - -class MypageInfoDataSource @Inject constructor( - private val mypageInfoService: MypageInfoService, -) { - suspend fun fetchMypageInfo(): - ResponseMypageInfo = mypageInfoService.fetchMypageInfo() -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/geonppang/data/repository/MypageInfoRepsitoryImpl.kt b/app/src/main/java/com/sopt/geonppang/data/repository/MypageInfoRepsitoryImpl.kt deleted file mode 100644 index b5c8ffef..00000000 --- a/app/src/main/java/com/sopt/geonppang/data/repository/MypageInfoRepsitoryImpl.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.sopt.geonppang.data.repository - -import com.sopt.geonppang.data.datasource.remote.MypageInfoDataSource -import com.sopt.geonppang.data.model.response.ResponseMypageInfo -import com.sopt.geonppang.domain.model.Profile -import com.sopt.geonppang.domain.repository.MypageInfoRepository -import javax.inject.Inject - -class MypageInfoRepsitoryImpl @Inject constructor( - private val mypageInfoDataSource: MypageInfoDataSource, -) : MypageInfoRepository { - override suspend fun fetchMypageInfo(): Result = runCatching { - mypageInfoDataSource.fetchMypageInfo().toMypageInfo() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/geonppang/data/service/MypageInfoService.kt b/app/src/main/java/com/sopt/geonppang/data/service/MypageInfoService.kt deleted file mode 100644 index ca667248..00000000 --- a/app/src/main/java/com/sopt/geonppang/data/service/MypageInfoService.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.sopt.geonppang.data.service - -import com.sopt.geonppang.data.model.response.ResponseMypageInfo -import retrofit2.http.GET - -interface MypageInfoService { - @GET("/member") - suspend fun fetchMypageInfo() : ResponseMypageInfo -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/geonppang/domain/repository/MypageInfoRepository.kt b/app/src/main/java/com/sopt/geonppang/domain/repository/MypageInfoRepository.kt deleted file mode 100644 index d94cc301..00000000 --- a/app/src/main/java/com/sopt/geonppang/domain/repository/MypageInfoRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.sopt.geonppang.domain.repository - -import com.sopt.geonppang.domain.model.Profile - -interface MypageInfoRepository { - suspend fun fetchMypageInfo(): Result -} \ No newline at end of file From 2d8669726180828d960c2e944a6828556bafe218 Mon Sep 17 00:00:00 2001 From: jooyyoo Date: Thu, 20 Jul 2023 13:13:52 +0900 Subject: [PATCH 4/7] =?UTF-8?q?[feat]=20#35=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=ED=9A=8C=EC=9B=90=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9D=AC=20api=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/remote/MypageDataSource.kt | 3 ++ .../data/model/response/ResponseMypageInfo.kt | 2 +- .../data/repository/MypageRepositoryImpl.kt | 5 +++ .../geonppang/data/service/MypageService.kt | 4 +++ .../com/sopt/geonppang/di/RepositoryModule.kt | 8 ----- .../com/sopt/geonppang/di/ServiceModule.kt | 8 ----- .../sopt/geonppang/domain/model/Profile.kt | 4 ++- .../domain/repository/MypageRepository.kt | 2 ++ .../presentation/mypage/MyPageFragment.kt | 25 ++----------- .../presentation/mypage/MyPageViewModel.kt | 35 +++++++++---------- .../review/ReviewWritingActivity.kt | 16 ++++++++- app/src/main/res/layout/fragment_my_page.xml | 12 +++---- 12 files changed, 57 insertions(+), 67 deletions(-) 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..15fc7ebb 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,8 @@ 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 index 53463675..af1ad8db 100644 --- 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 @@ -3,7 +3,7 @@ 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, 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/di/RepositoryModule.kt b/app/src/main/java/com/sopt/geonppang/di/RepositoryModule.kt index 3c374909..e957abec 100644 --- a/app/src/main/java/com/sopt/geonppang/di/RepositoryModule.kt +++ b/app/src/main/java/com/sopt/geonppang/di/RepositoryModule.kt @@ -3,14 +3,12 @@ package com.sopt.geonppang.di import com.sopt.geonppang.data.repository.BakeryRepositoryImpl import com.sopt.geonppang.data.repository.DetailRepositoryImpl import com.sopt.geonppang.data.repository.DummyRepositoryImpl -import com.sopt.geonppang.data.repository.MypageInfoRepsitoryImpl import com.sopt.geonppang.data.repository.HomeRepositoryImpl import com.sopt.geonppang.data.repository.MypageRepositoryImpl import com.sopt.geonppang.data.repository.SearchRepositoryImpl import com.sopt.geonppang.domain.repository.BakeryRepository import com.sopt.geonppang.domain.repository.DetailRepository import com.sopt.geonppang.domain.repository.DummyRepository -import com.sopt.geonppang.domain.repository.MypageInfoRepository import com.sopt.geonppang.domain.repository.HomeRepository import com.sopt.geonppang.domain.repository.MypageRepository import com.sopt.geonppang.domain.repository.SearchRepository @@ -29,12 +27,6 @@ interface RepositoryModule { dummyRepositoryImpl: DummyRepositoryImpl, ): DummyRepository - @Binds - @Singleton - fun bindMypageInfoRepository( - mypageInfoRepsitoryImpl: MypageInfoRepsitoryImpl - ): MypageInfoRepository - @Binds @Singleton fun bindHomeRepository( diff --git a/app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt b/app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt index 5f1c6c2f..fa445fb5 100644 --- a/app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt +++ b/app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt @@ -1,10 +1,8 @@ package com.sopt.geonppang.di -import androidx.annotation.RestrictTo import com.sopt.geonppang.data.service.BakeryService import com.sopt.geonppang.data.service.DetailService import com.sopt.geonppang.data.service.DummyService -import com.sopt.geonppang.data.service.MypageInfoService import com.sopt.geonppang.data.service.HomeService import com.sopt.geonppang.data.service.MypageService import com.sopt.geonppang.data.service.SearchService @@ -13,7 +11,6 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import retrofit2.Retrofit -import retrofit2.create import javax.inject.Singleton @Module @@ -24,11 +21,6 @@ object ServiceModule { fun provideDummyService(retrofit: Retrofit): DummyService = retrofit.create(DummyService::class.java) - @Singleton - @Provides - fun provideMypageInfoService(retrofit: Retrofit): MypageInfoService = - retrofit.create(MypageInfoService::class.java) - @Singleton @Provides fun provideHomeService(retrofit: Retrofit): HomeService = diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt index c76f7dc2..ef7ee873 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt @@ -4,4 +4,6 @@ data class Profile( val memberNickname: String, val mainPurpose: String, val breadType: BreadType -) +) { + constructor() : this("", "", BreadType(0,"",false,false,false,false)) +} 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 87818f9d..e546aa51 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 @@ -4,14 +4,9 @@ import android.content.Intent import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels -import androidx.lifecycle.flowWithLifecycle -import androidx.lifecycle.lifecycleScope import com.sopt.geonppang.R import com.sopt.geonppang.databinding.FragmentMyPageBinding -import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingFragment -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -24,9 +19,9 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ binding.viewModel = viewModel binding.lifecycleOwner = this + viewModel.fetchMypageInfo() + addListeners() - initLayout() - collectData() } private fun addListeners() { @@ -39,22 +34,6 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ } } - private fun initLayout() { - viewModel.fetchMypageInfo() - } - - private fun collectData() { - viewModel.mypageInfoState.flowWithLifecycle(lifecycle).onEach { - when (it) { - is UiState.Success -> { - binding.viewModel?.profile = it.data - } - - else -> {} - } - }.launchIn(lifecycleScope) - } - private fun moveToStoreBakeryList() { startActivity(Intent(requireContext(), MyStoreListActivity::class.java)) } 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 594e5cf0..b1f99ccd 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,31 +18,18 @@ import javax.inject.Inject class MyPageViewModel @Inject constructor( private val mypageRepository: MypageRepository, ) : ViewModel() { -@HiltViewModel -class MyPageViewModel @Inject constructor(private val mypageInfoRepository: MypageInfoRepository) : - ViewModel() { - private val _mypageInfoState = MutableStateFlow>(UiState.Loading) + private var _mypageInfoState = MutableStateFlow(Profile()) val mypageInfoState get() = _mypageInfoState.asStateFlow() - fun fetchMypageInfo() { - viewModelScope.launch { - mypageInfoRepository.fetchMypageInfo() - .onSuccess { myInfo -> - _mypageInfoState.value = UiState.Success(myInfo) - } - .onFailure { throwable -> - _mypageInfoState.value = UiState.Error(throwable.message) - } - } - } - - 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) @@ -54,6 +40,17 @@ class MyPageViewModel @Inject constructor(private val mypageInfoRepository: Mypa 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/java/com/sopt/geonppang/presentation/review/ReviewWritingActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/review/ReviewWritingActivity.kt index e043a145..39956d42 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/review/ReviewWritingActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/review/ReviewWritingActivity.kt @@ -5,7 +5,9 @@ import androidx.activity.viewModels import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ActivityReviewWritingBinding import com.sopt.geonppang.util.binding.BindingActivity +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class ReviewWritingActivity : BindingActivity(R.layout.activity_review_writing) { private val viewModel: ReviewViewModel by viewModels() @@ -39,10 +41,22 @@ class ReviewWritingActivity : } private fun showReviewSuccessDialog() { - ReviewSuccessBottomDialogFragment().show(supportFragmentManager, "reviewSuccessDialog") + val bakeryId = intent.getIntExtra(BAKERY_ID, -1) + val reviewSuccessDialogFragment = ReviewSuccessBottomDialogFragment().apply { + arguments = Bundle().apply { + bakeryId?.let { bakeryId -> + putInt(BAKERY_ID, bakeryId) + } + } + } + reviewSuccessDialogFragment.show(supportFragmentManager, "reviewSuccessDialog") } private fun showReviewCancelDialog() { ReviewCancelBottomDialogFragment().show(supportFragmentManager, "reviewCancelDialog") } + + companion object { + const val BAKERY_ID = "bakeryId" + } } 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 @@ Date: Thu, 20 Jul 2023 13:21:37 +0900 Subject: [PATCH 5/7] =?UTF-8?q?[chore]=20#35=20klint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../geonppang/data/datasource/remote/MypageDataSource.kt | 5 +++-- .../sopt/geonppang/data/model/response/ResponseMypageInfo.kt | 3 ++- app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) 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 15fc7ebb..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 @@ -9,8 +9,9 @@ import javax.inject.Inject class MypageDataSource @Inject constructor( private val mypageService: MypageService, ) { - suspend fun fetchMypageInfo(): - ResponseMypageInfo = mypageService.fetchMypageInfo() + 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 index af1ad8db..a1ffd0e5 100644 --- 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 @@ -3,6 +3,7 @@ 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, @@ -38,4 +39,4 @@ data class ResponseMypageInfo( isSugarFree = data.breadType.isSugarFree ) ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt index ef7ee873..61539bd6 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt @@ -5,5 +5,5 @@ data class Profile( val mainPurpose: String, val breadType: BreadType ) { - constructor() : this("", "", BreadType(0,"",false,false,false,false)) + constructor() : this("", "", BreadType(0, "", false, false, false, false)) } From 8e9bae56c77ba5c2a7305eef4d8016e1ef5f6ef1 Mon Sep 17 00:00:00 2001 From: jooyyoo Date: Thu, 20 Jul 2023 22:33:18 +0900 Subject: [PATCH 6/7] =?UTF-8?q?[mod]=20#35=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=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/sopt/geonppang/domain/model/Profile.kt | 5 ++--- .../sopt/geonppang/presentation/mypage/MyPageFragment.kt | 7 +++++-- .../sopt/geonppang/presentation/mypage/MyPageViewModel.kt | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt index 61539bd6..9d3103c3 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt @@ -4,6 +4,5 @@ data class Profile( val memberNickname: String, val mainPurpose: String, val breadType: BreadType -) { - constructor() : this("", "", BreadType(0, "", false, false, false, false)) -} +) + 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 e546aa51..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,11 +19,14 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ binding.viewModel = viewModel binding.lifecycleOwner = this - viewModel.fetchMypageInfo() - + 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 b1f99ccd..c1b13902 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 @@ -18,7 +18,7 @@ import javax.inject.Inject class MyPageViewModel @Inject constructor( private val mypageRepository: MypageRepository, ) : ViewModel() { - private var _mypageInfoState = MutableStateFlow(Profile()) + private var _mypageInfoState = MutableStateFlow(null) val mypageInfoState get() = _mypageInfoState.asStateFlow() private var _mypageReviewListState = From 29784480c0ba9c45c30cb7864149e19789771a31 Mon Sep 17 00:00:00 2001 From: jooyyoo Date: Thu, 20 Jul 2023 22:40:34 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[chore]=20#35=20klint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt index 9d3103c3..c76f7dc2 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt @@ -5,4 +5,3 @@ data class Profile( val mainPurpose: String, val breadType: BreadType ) -