diff --git a/app/src/main/java/co/kr/bemyplan/data/api/GoogleLoginService.kt b/app/src/main/java/co/kr/bemyplan/data/api/GoogleLoginService.kt index 69752358..b5be168e 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/GoogleLoginService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/GoogleLoginService.kt @@ -6,7 +6,7 @@ import retrofit2.http.Body import retrofit2.http.POST interface GoogleLoginService { - @POST("/oauth2/v4/token") + @POST("oauth2/v4/token") suspend fun postGoogleSignInData( @Body body: RequestGoogleLogin ): ResponseGoogleLogin diff --git a/app/src/main/java/co/kr/bemyplan/data/api/HomeNewService.kt b/app/src/main/java/co/kr/bemyplan/data/api/HomeNewService.kt index 520915f3..61e2a37d 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/HomeNewService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/HomeNewService.kt @@ -5,6 +5,6 @@ import retrofit2.Call import retrofit2.http.GET interface HomeNewService { - @GET("/v1/plans?size=10&sort=createdAt,desc") + @GET("v1/plans?size=10&sort=createdAt,desc") suspend fun getNewData() : ResponseHomeData } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/data/api/HomePopularService.kt b/app/src/main/java/co/kr/bemyplan/data/api/HomePopularService.kt index ccf2fa5c..fe0263e8 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/HomePopularService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/HomePopularService.kt @@ -5,6 +5,6 @@ import retrofit2.Call import retrofit2.http.GET interface HomePopularService { - @GET("/v1/plans?size=10&sort=orderCnt,desc") + @GET("v1/plans?size=10&sort=orderCnt,desc") suspend fun getPopularData(): ResponseHomeData } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/data/api/HomeSuggestService.kt b/app/src/main/java/co/kr/bemyplan/data/api/HomeSuggestService.kt index 6ce2cffa..4a8162b7 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/HomeSuggestService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/HomeSuggestService.kt @@ -5,6 +5,6 @@ import retrofit2.Call import retrofit2.http.GET interface HomeSuggestService { - @GET("/v1/plans/bemyplanPick?size=5&sort=id,desc") + @GET("v1/plans/bemyplanPick?size=5&sort=id,desc") suspend fun getSuggestData(): ResponseHomeData } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/data/api/LocationListService.kt b/app/src/main/java/co/kr/bemyplan/data/api/LocationListService.kt index 93b3cda4..6ecc8e34 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/LocationListService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/LocationListService.kt @@ -5,14 +5,14 @@ import retrofit2.http.GET import retrofit2.http.Query interface LocationListService { - @GET("/v1/plans") + @GET("v1/plans") suspend fun fetchLocationList( @Query("region") region: String, @Query("size") size: Int, @Query("sort", encoded = true) sort: String ): ResponseLocationList - @GET("/v1/plans") + @GET("v1/plans") suspend fun fetchMoreLocationList( @Query("region") region: String, @Query("size") size: Int, diff --git a/app/src/main/java/co/kr/bemyplan/data/api/LocationService.kt b/app/src/main/java/co/kr/bemyplan/data/api/LocationService.kt index 5df1672a..8e34d787 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/LocationService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/LocationService.kt @@ -5,6 +5,6 @@ import retrofit2.Call import retrofit2.http.GET interface LocationService { - @GET("/v1/plan/regions") + @GET("v1/plan/regions") suspend fun getLocation() : ResponseLocationData } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/data/api/LoginService.kt b/app/src/main/java/co/kr/bemyplan/data/api/LoginService.kt index 16cfd9df..a7810ffe 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/LoginService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/LoginService.kt @@ -11,17 +11,17 @@ import retrofit2.http.POST import retrofit2.http.Query interface LoginService { - @POST("/v1/login") + @POST("v1/login") suspend fun postLogin( @Body body: RequestLogin ): ResponseLogin - @GET("/v1/user/name/check") + @GET("v1/user/name/check") suspend fun postDuplicatedNickname( @Query("nickname") nickname: String ): ResponseDuplicatedNickname - @POST("/v1/signup") + @POST("v1/signup") suspend fun postSignUp( @Body body: RequestSignUp ): ResponseSignUp diff --git a/app/src/main/java/co/kr/bemyplan/data/api/MyPlanService.kt b/app/src/main/java/co/kr/bemyplan/data/api/MyPlanService.kt index 1ae716e8..54961e09 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/MyPlanService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/MyPlanService.kt @@ -2,13 +2,17 @@ package co.kr.bemyplan.data.api import co.kr.bemyplan.data.entity.main.myplan.ResponseMyPlan import retrofit2.http.GET -import retrofit2.http.Path import retrofit2.http.Query interface MyPlanService { - @GET("api/v1/order") + @GET("v1/plan/orders") suspend fun getMyPlan( - @Query("page") page: Int, - @Query("pageSize") pageSize: Int + @Query("size") size: Int + ): ResponseMyPlan + + @GET("v1/plan/orders") + suspend fun getMoreMyPlan( + @Query("size") size: Int, + @Query("lastPlanId") lastPlanId: Int ): ResponseMyPlan } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/data/api/PreviewService.kt b/app/src/main/java/co/kr/bemyplan/data/api/PreviewService.kt index 161f6006..86eca7a4 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/PreviewService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/PreviewService.kt @@ -5,7 +5,7 @@ import retrofit2.http.GET import retrofit2.http.Path interface PreviewService { - @GET("/v1/plan/{planId}/preview") + @GET("v1/plan/{planId}/preview") suspend fun fetchPreviewPlan( @Path("planId") planId: Int ): ResponsePreviewPlan diff --git a/app/src/main/java/co/kr/bemyplan/data/api/PurchaseService.kt b/app/src/main/java/co/kr/bemyplan/data/api/PurchaseService.kt index 0cda9913..1863b446 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/PurchaseService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/PurchaseService.kt @@ -6,7 +6,7 @@ import retrofit2.http.Body import retrofit2.http.POST interface PurchaseService { - @POST("/v1/plan/order") + @POST("v1/plan/order") suspend fun purchase( @Body requestBody: RequestPurchase ): ResponsePurchase diff --git a/app/src/main/java/co/kr/bemyplan/data/api/ScrapListService.kt b/app/src/main/java/co/kr/bemyplan/data/api/ScrapListService.kt index 44f43805..7cfa97eb 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/ScrapListService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/ScrapListService.kt @@ -7,12 +7,12 @@ import retrofit2.http.Path import retrofit2.http.Query interface ScrapListService { - @GET("/v1/plan/bookmark") + @GET("v1/plan/bookmark") suspend fun getScrapList( @Query("size") page: Int, @Query("sort", encoded = true) sort: String ): ResponseScrapList - @GET("api/v1/post/random") + @GET("v1/post/random") suspend fun getEmptyScrapList(): ResponseEmptyScrapList } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/data/api/ScrapService.kt b/app/src/main/java/co/kr/bemyplan/data/api/ScrapService.kt index b5394cbb..a480f97c 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/ScrapService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/ScrapService.kt @@ -6,12 +6,12 @@ import retrofit2.http.POST import retrofit2.http.Path interface ScrapService { - @POST("/v1/plan/scrap/{planId}") + @POST("v1/plan/scrap/{planId}") suspend fun postScrap( @Path("planId") planId: Int ): ResponseScrap - @DELETE("/v1/plan/scrap/{planId}") + @DELETE("v1/plan/scrap/{planId}") suspend fun deleteScrap( @Path("planId") planId: Int ): ResponseScrap diff --git a/app/src/main/java/co/kr/bemyplan/data/api/SuggestListService.kt b/app/src/main/java/co/kr/bemyplan/data/api/SuggestListService.kt index 7ac51a6e..36a99a6f 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/SuggestListService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/SuggestListService.kt @@ -5,12 +5,12 @@ import retrofit2.http.GET import retrofit2.http.Query interface SuggestListService { - @GET("/v1/plans/bemyplanPick") + @GET("v1/plans/bemyplanPick") suspend fun fetchSuggestList( @Query("size") size: Int ): ResponseSuggestList - @GET("/v1/plans/bemyplanPick") + @GET("v1/plans/bemyplanPick") suspend fun fetchMoreSuggestList( @Query("size") size: Int, @Query("lastPlanId") lastPlanId: Int diff --git a/app/src/main/java/co/kr/bemyplan/data/api/UserPlanListService.kt b/app/src/main/java/co/kr/bemyplan/data/api/UserPlanListService.kt index 0e549181..db33e823 100644 --- a/app/src/main/java/co/kr/bemyplan/data/api/UserPlanListService.kt +++ b/app/src/main/java/co/kr/bemyplan/data/api/UserPlanListService.kt @@ -5,14 +5,14 @@ import retrofit2.http.GET import retrofit2.http.Query interface UserPlanListService { - @GET("/v1/plans") + @GET("v1/plans") suspend fun fetchUserPlanList( @Query("size") size: Int, @Query("sort") sort: String, @Query("userId") userId: Int ): ResponseUserPlanList - @GET("/v1/plans") + @GET("v1/plans") suspend fun fetchMoreUserPlanList( @Query("size") size: Int, @Query("sort") sort: String, diff --git a/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/MyModel.kt b/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/MyModel.kt deleted file mode 100644 index d061ba58..00000000 --- a/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/MyModel.kt +++ /dev/null @@ -1,13 +0,0 @@ -package co.kr.bemyplan.data.entity.main.myplan - -import com.google.gson.annotations.SerializedName - -data class MyModel( - @SerializedName("id") - val postId: Int, - @SerializedName("thumbnail_url") - val thumbnailUrl: String, - val title: String, - val author: String, - var isScrapped: Boolean -) diff --git a/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/ResponseMyPlan.kt b/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/ResponseMyPlan.kt index 325b1d06..7b3cf4a7 100644 --- a/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/ResponseMyPlan.kt +++ b/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/ResponseMyPlan.kt @@ -1,11 +1,9 @@ package co.kr.bemyplan.data.entity.main.myplan +import co.kr.bemyplan.domain.model.main.myplan.MyPlanData + data class ResponseMyPlan( - val data: Data -) { - data class Data( - val items: List, - val totalCount: Int, - val totalPage: Int - ) -} + val data : MyPlanData, + val message : String, + val resultCode : String +) diff --git a/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/User.kt b/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/User.kt new file mode 100644 index 00000000..88c6d2f1 --- /dev/null +++ b/app/src/main/java/co/kr/bemyplan/data/entity/main/myplan/User.kt @@ -0,0 +1,6 @@ +package co.kr.bemyplan.data.entity.main.myplan + +data class User( + val nickname: String, + val userId: Int +) \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/data/repository/main/myplan/MyPlanRepository.kt b/app/src/main/java/co/kr/bemyplan/data/repository/main/myplan/MyPlanRepository.kt deleted file mode 100644 index af8f032e..00000000 --- a/app/src/main/java/co/kr/bemyplan/data/repository/main/myplan/MyPlanRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -package co.kr.bemyplan.data.repository.main.myplan - -import co.kr.bemyplan.data.entity.main.myplan.ResponseMyPlan - -interface MyPlanRepository { - suspend fun getMyPlan(page: Int, pageSize: Int): ResponseMyPlan -} \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/data/repository/main/myplan/MyPlanRepositoryImpl.kt b/app/src/main/java/co/kr/bemyplan/data/repository/main/myplan/MyPlanRepositoryImpl.kt index 7dd8a411..168f03df 100644 --- a/app/src/main/java/co/kr/bemyplan/data/repository/main/myplan/MyPlanRepositoryImpl.kt +++ b/app/src/main/java/co/kr/bemyplan/data/repository/main/myplan/MyPlanRepositoryImpl.kt @@ -1,18 +1,27 @@ package co.kr.bemyplan.data.repository.main.myplan -import co.kr.bemyplan.data.api.ApiService import co.kr.bemyplan.data.api.MyPlanService -import co.kr.bemyplan.data.entity.main.myplan.ResponseMyPlan -import kotlinx.coroutines.Dispatchers +import co.kr.bemyplan.domain.model.main.myplan.MyPlanData +import co.kr.bemyplan.domain.repository.MyPlanRepository +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import javax.inject.Inject class MyPlanRepositoryImpl @Inject constructor( - private val service: MyPlanService -): MyPlanRepository { - override suspend fun getMyPlan(page: Int, pageSize: Int): ResponseMyPlan { - return withContext(Dispatchers.IO) { - service.getMyPlan(page, pageSize) + private val myPlanService: MyPlanService, + private val coroutineDispatcher: CoroutineDispatcher +) : MyPlanRepository { + override suspend fun getMyPlan(size: Int): MyPlanData { + return withContext(coroutineDispatcher) { + myPlanService.getMyPlan(size).data } } + + override suspend fun getMoreMyPlan(size: Int, lastPlanId: Int): MyPlanData { + return withContext(coroutineDispatcher) { + myPlanService.getMoreMyPlan(size, lastPlanId).data + } + } + + } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/di/RepositoryModule.kt b/app/src/main/java/co/kr/bemyplan/di/RepositoryModule.kt index 06186b27..2a577ee3 100644 --- a/app/src/main/java/co/kr/bemyplan/di/RepositoryModule.kt +++ b/app/src/main/java/co/kr/bemyplan/di/RepositoryModule.kt @@ -11,7 +11,7 @@ import co.kr.bemyplan.data.repository.main.home.HomeNewRepositoryImpl import co.kr.bemyplan.data.repository.main.home.HomePopularRepositoryImpl import co.kr.bemyplan.data.repository.main.home.HomeSuggestRepositoryImpl import co.kr.bemyplan.data.repository.main.location.LocationRepositoryImpl -import co.kr.bemyplan.data.repository.main.myplan.MyPlanRepository +import co.kr.bemyplan.domain.repository.MyPlanRepository import co.kr.bemyplan.data.repository.main.myplan.MyPlanRepositoryImpl import co.kr.bemyplan.domain.repository.ScrapListRepository import co.kr.bemyplan.data.repository.main.scrap.ScrapListRepositoryImpl @@ -90,15 +90,6 @@ object RepositoryModule { return UserPostListRepositoryImpl(userPlanListService, coroutineDispatcher) } - // 마이페이지 뷰 - @ViewModelScoped - @Provides - fun provideMyPlanRepository( - myPlanService: MyPlanService - ): MyPlanRepository { - return MyPlanRepositoryImpl(myPlanService) - } - // 로그인 뷰 @ViewModelScoped @Provides @@ -177,6 +168,16 @@ object RepositoryModule { return HomeSuggestRepositoryImpl(homeSuggestService, coroutineDispatcher) } + //마이플랜 구매일정 + @ViewModelScoped + @Provides + fun provideMyPlanRepository( + myPlanService: MyPlanService, + @IoDispatcher coroutineDispatcher: CoroutineDispatcher + ) : MyPlanRepository{ + return MyPlanRepositoryImpl(myPlanService, coroutineDispatcher) + } + // ?? 뭐지 왜 없는데 됐었지...? // @ViewModelScoped // @Provides diff --git a/app/src/main/java/co/kr/bemyplan/di/ServiceModule.kt b/app/src/main/java/co/kr/bemyplan/di/ServiceModule.kt index 5f631c84..486466bc 100644 --- a/app/src/main/java/co/kr/bemyplan/di/ServiceModule.kt +++ b/app/src/main/java/co/kr/bemyplan/di/ServiceModule.kt @@ -53,13 +53,6 @@ object ServiceModule { return retrofit.create(UserPlanListService::class.java) } - // 마이페이지 뷰 - @Singleton - @Provides - fun provideMyPlanService(@BeMyPlanRetrofit retrofit: Retrofit): MyPlanService { - return retrofit.create(MyPlanService::class.java) - } - // 로그인 뷰 @Singleton @Provides @@ -120,4 +113,11 @@ object ServiceModule { fun provideHomeSuggestService(@BeMyPlanRetrofit retrofit: Retrofit):HomeSuggestService{ return retrofit.create(HomeSuggestService::class.java) } + + //마이페이지 구매일정 + @Singleton + @Provides + fun provideMyPlanService(@BeMyPlanRetrofit retrofit: Retrofit):MyPlanService{ + return retrofit.create(MyPlanService::class.java) + } } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/domain/model/main/myplan/MyPlanData.kt b/app/src/main/java/co/kr/bemyplan/domain/model/main/myplan/MyPlanData.kt new file mode 100644 index 00000000..89b164b4 --- /dev/null +++ b/app/src/main/java/co/kr/bemyplan/domain/model/main/myplan/MyPlanData.kt @@ -0,0 +1,19 @@ +package co.kr.bemyplan.domain.model.main.myplan + +import co.kr.bemyplan.data.entity.main.myplan.User + +data class MyPlanData( + val contents: List, + val nextCursor: Int +){ + data class Data( + val createdAt: String, + val orderStatus: Boolean, + val planId: Int, + val scrapStatus: Boolean, + val thumbnailUrl: String, + val title: String, + val updatedAt: String, + val user: User + ) +} diff --git a/app/src/main/java/co/kr/bemyplan/domain/repository/MyPlanRepository.kt b/app/src/main/java/co/kr/bemyplan/domain/repository/MyPlanRepository.kt new file mode 100644 index 00000000..8ff3acbf --- /dev/null +++ b/app/src/main/java/co/kr/bemyplan/domain/repository/MyPlanRepository.kt @@ -0,0 +1,8 @@ +package co.kr.bemyplan.domain.repository + +import co.kr.bemyplan.domain.model.main.myplan.MyPlanData + +interface MyPlanRepository { + suspend fun getMyPlan(size: Int): MyPlanData + suspend fun getMoreMyPlan(size: Int, lastPlanId: Int): MyPlanData +} \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/ui/main/myplan/MyPlanFragment.kt b/app/src/main/java/co/kr/bemyplan/ui/main/myplan/MyPlanFragment.kt index 017f3dd3..ac053b08 100644 --- a/app/src/main/java/co/kr/bemyplan/ui/main/myplan/MyPlanFragment.kt +++ b/app/src/main/java/co/kr/bemyplan/ui/main/myplan/MyPlanFragment.kt @@ -9,11 +9,11 @@ import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.Navigation -import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView import co.kr.bemyplan.R import co.kr.bemyplan.data.local.AutoLoginData -import co.kr.bemyplan.data.entity.main.myplan.MyModel import co.kr.bemyplan.databinding.FragmentMyPlanBinding +import co.kr.bemyplan.domain.model.main.myplan.MyPlanData import co.kr.bemyplan.ui.main.myplan.adapter.MyPlanAdapter import co.kr.bemyplan.ui.main.myplan.settings.SettingsActivity import co.kr.bemyplan.ui.main.myplan.viewmodel.MyPlanViewModel @@ -25,7 +25,7 @@ class MyPlanFragment : Fragment() { private var _binding: FragmentMyPlanBinding? = null private val binding get() = _binding ?: error("Binding이 초기화 되지 않았습니다.") private val viewModel by viewModels() - private var listItem = listOf() + private var listItem = listOf() private lateinit var purchaseTourAdapter: MyPlanAdapter override fun onCreateView( @@ -42,7 +42,7 @@ class MyPlanFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) -// viewModel.setNickname(AutoLoginData.getNickname(requireContext())) + //viewModel.setNickname(AutoLoginData.getNickname(requireContext())) } private fun initList() { @@ -58,24 +58,32 @@ class MyPlanFragment : Fragment() { } private fun initAdapter() { - binding.rvMyPlanPurchase.layoutManager = GridLayoutManager(requireContext(), 2) purchaseTourAdapter = MyPlanAdapter({ val intent = Intent(requireContext(), AfterPurchaseActivity::class.java) - intent.putExtra("postId", it.postId) + intent.putExtra("postId", it.planId) startActivity(intent) }, { - when(it.isScrapped) { - true -> viewModel.deleteScrap(it.postId) - false -> viewModel.postScrap(it.postId) + when (it.scrapStatus) { + true -> viewModel.deleteScrap(it.planId) + false -> viewModel.postScrap(it.planId) } }) - purchaseTourAdapter.setItems(listItem) + binding.rvMyPlanPurchase.addOnScrollListener(object : RecyclerView.OnScrollListener(){ + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + if(!binding.rvMyPlanPurchase.canScrollVertically(1)){ + viewModel.getMoreMyPlanList() + } + } + }) + purchaseTourAdapter.submitList(listItem) binding.rvMyPlanPurchase.adapter = purchaseTourAdapter } private fun lookingAroundEvent() { binding.tvLookingAround.setOnClickListener { - Navigation.findNavController(binding.root).navigate(R.id.action_fragment_my_plan_to_fragment_home) + Navigation.findNavController(binding.root) + .navigate(R.id.action_fragment_my_plan_to_fragment_home) } } diff --git a/app/src/main/java/co/kr/bemyplan/ui/main/myplan/adapter/MyPlanAdapter.kt b/app/src/main/java/co/kr/bemyplan/ui/main/myplan/adapter/MyPlanAdapter.kt index 8a3d5c8d..bb16c468 100644 --- a/app/src/main/java/co/kr/bemyplan/ui/main/myplan/adapter/MyPlanAdapter.kt +++ b/app/src/main/java/co/kr/bemyplan/ui/main/myplan/adapter/MyPlanAdapter.kt @@ -4,70 +4,81 @@ import android.annotation.SuppressLint import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import co.kr.bemyplan.data.entity.main.myplan.MyModel import co.kr.bemyplan.databinding.ItemMyPlanPurchaseListBinding -import co.kr.bemyplan.util.clipTo +import co.kr.bemyplan.domain.model.main.myplan.MyPlanData class MyPlanAdapter( - private val itemClick: (MyModel) -> Unit, - private val scrapClick: (MyModel) -> Unit + private val itemClick: (MyPlanData.Data) -> Unit, + private val scrapClick: (MyPlanData.Data) -> Unit ) : - RecyclerView.Adapter() { - private var purchaseTourList = listOf() + ListAdapter(MyPlanComparator()) { + //private var purchaseTourList = listOf() - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExistMyPlanViewHolder { - val binding = ItemMyPlanPurchaseListBinding.inflate( - LayoutInflater.from(parent.context), - parent, false - ) - - return ExistMyPlanViewHolder(binding, itemClick, scrapClick) - } - - override fun onBindViewHolder(holder: ExistMyPlanViewHolder, position: Int) { - holder.onBind(purchaseTourList[position]) - } - - override fun getItemCount() = purchaseTourList.size - - @SuppressLint("NotifyDataSetChanged") - fun setItems(items: List) { + /*@SuppressLint("NotifyDataSetChanged") + fun setItems(items: List) { purchaseTourList = items notifyDataSetChanged() - } + }*/ class ExistMyPlanViewHolder( private val binding: ItemMyPlanPurchaseListBinding, - private val itemClick: (MyModel) -> Unit, - private val scrapClick: (MyModel) -> Unit + private val itemClick: (MyPlanData.Data) -> Unit, + private val scrapClick: (MyPlanData.Data) -> Unit ) : RecyclerView.ViewHolder(binding.root) { - fun onBind(data: MyModel) { - Log.d("mlog: MyPlanAdapter", data.postId.toString()) + fun onBind(data: MyPlanData.Data) { + Log.d("mlog: MyPlanAdapter", data.planId.toString()) binding.model = data binding.ivMyPlanSpot.clipToOutline = true clickItem(data) clickScrap(data) } - private fun clickItem(data: MyModel) { + private fun clickItem(data: MyPlanData.Data) { binding.root.setOnClickListener { itemClick(data) } } - private fun clickScrap(data: MyModel) { + private fun clickScrap(data: MyPlanData.Data) { binding.layoutScrap.setOnClickListener { scrapClick(data) - // TODO: 추후 null 처리 다시 해야합니다 !! 서버 확인하고서 ~_~ - if (data.isScrapped != null) { + // TODO: 추후 null 처리 다시 해야합니다 !! 서버 확인하고서 ~_~ + 용민:아래 머선 기능인지 모르겠어서 주석처리 해놨습니다. + /*if (data.isScrapped != null) { data.isScrapped = !data.isScrapped!! } else { data.isScrapped = false - } + }*/ binding.model = data } } } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExistMyPlanViewHolder { + val binding = ItemMyPlanPurchaseListBinding.inflate( + LayoutInflater.from(parent.context), + parent, false + ) + return ExistMyPlanViewHolder(binding, itemClick, scrapClick) + } + + override fun onBindViewHolder(holder: ExistMyPlanViewHolder, position: Int) { + holder.onBind(getItem(position)) + } + + private class MyPlanComparator():DiffUtil.ItemCallback(){ + override fun areItemsTheSame(oldItem: MyPlanData.Data, newItem: MyPlanData.Data): Boolean { + return oldItem.planId==newItem.planId + } + + override fun areContentsTheSame( + oldItem: MyPlanData.Data, + newItem: MyPlanData.Data + ): Boolean { + return oldItem==newItem + } + } } \ No newline at end of file diff --git a/app/src/main/java/co/kr/bemyplan/ui/main/myplan/viewmodel/MyPlanViewModel.kt b/app/src/main/java/co/kr/bemyplan/ui/main/myplan/viewmodel/MyPlanViewModel.kt index 0c7bf97a..23981527 100644 --- a/app/src/main/java/co/kr/bemyplan/ui/main/myplan/viewmodel/MyPlanViewModel.kt +++ b/app/src/main/java/co/kr/bemyplan/ui/main/myplan/viewmodel/MyPlanViewModel.kt @@ -1,14 +1,13 @@ package co.kr.bemyplan.ui.main.myplan.viewmodel import android.os.Bundle -import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import co.kr.bemyplan.data.entity.main.myplan.MyModel import co.kr.bemyplan.data.local.FirebaseDefaultEventParameters -import co.kr.bemyplan.data.repository.main.myplan.MyPlanRepository +import co.kr.bemyplan.domain.model.main.myplan.MyPlanData +import co.kr.bemyplan.domain.repository.MyPlanRepository import co.kr.bemyplan.domain.repository.ScrapRepository import com.google.firebase.analytics.ktx.analytics import com.google.firebase.ktx.Firebase @@ -26,14 +25,16 @@ class MyPlanViewModel @Inject constructor( setDefaultEventParameters(FirebaseDefaultEventParameters.parameters) } - private var page = 0 - private var pageSize = 10 + //private var page = 0 + //private var pageSize = 10 private var _nickname = MutableLiveData() val nickname: LiveData get() = _nickname - private var _myPlan = MutableLiveData>() - val myPlan: LiveData> get() = _myPlan + private var _myPlan = MutableLiveData>() + val myPlan: LiveData> get() = _myPlan + + private var lastPlanId: Int = -1 fun setNickname(nickname: String) { _nickname.value = nickname @@ -42,10 +43,11 @@ class MyPlanViewModel @Inject constructor( fun getMyPlanList() { viewModelScope.launch { kotlin.runCatching { - myPlanRepository.getMyPlan(page, pageSize) + myPlanRepository.getMyPlan(size = 4) }.onSuccess { - if(_myPlan.value != it.data.items) { - _myPlan.value = it.data.items + if (_myPlan.value != it.contents) { + _myPlan.value = it.contents + lastPlanId = it.nextCursor } }.onFailure { Timber.tag("mlog: MyPlanViewModel::getMyPlan error").e(it) @@ -53,12 +55,25 @@ class MyPlanViewModel @Inject constructor( } } + fun getMoreMyPlanList() { + viewModelScope.launch { + kotlin.runCatching { + myPlanRepository.getMoreMyPlan(size = 4, lastPlanId) + }.onSuccess { + _myPlan.value = _myPlan.value?.toMutableList()?.apply { addAll(it.contents) } + lastPlanId = it.nextCursor + }.onFailure { + Timber.tag("mlog: MyPlanViewModel::getMyPlan error").e(it) + } + } + } + fun postScrap(postId: Int) { viewModelScope.launch { kotlin.runCatching { scrapRepository.postScrap(postId) }.onSuccess { - if(it) { + if (it) { fb.logEvent("scrapTravelPlan", Bundle().apply { putString("source", "BeforeChargingView") putInt("postIdx", postId) @@ -75,7 +90,7 @@ class MyPlanViewModel @Inject constructor( kotlin.runCatching { scrapRepository.deleteScrap(planId) }.onSuccess { - if(it) { + if (it) { fb.logEvent("unScrapTravelPlan", Bundle().apply { putString("source", "ListView") putInt("postIdx", planId) diff --git a/app/src/main/res/layout/fragment_my_plan.xml b/app/src/main/res/layout/fragment_my_plan.xml index 95b09f0e..6229e2af 100644 --- a/app/src/main/res/layout/fragment_my_plan.xml +++ b/app/src/main/res/layout/fragment_my_plan.xml @@ -215,7 +215,8 @@ android:layout_marginTop="12dp" android:overScrollMode="never" android:visibility="@{viewModel.myPlan.empty ? View.GONE : View.VISIBLE}" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_my_plan_purchase_list_title" tools:listitem="@layout/item_my_plan_purchase_list" /> diff --git a/app/src/main/res/layout/item_my_plan_purchase_list.xml b/app/src/main/res/layout/item_my_plan_purchase_list.xml index 8730e6ab..ca60fc98 100644 --- a/app/src/main/res/layout/item_my_plan_purchase_list.xml +++ b/app/src/main/res/layout/item_my_plan_purchase_list.xml @@ -6,7 +6,7 @@ + type="co.kr.bemyplan.domain.model.main.myplan.MyPlanData.Data" />