From a043c109e06a53d79c45603a08eb1904cc9703e5 Mon Sep 17 00:00:00 2001 From: seoggyui Date: Tue, 23 Aug 2022 15:12:45 +0900 Subject: [PATCH] =?UTF-8?q?#6=20mypage=5Ffragment/=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20:=203=20=EC=9E=91=EC=84=B1=ED=95=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=ED=99=94=EB=A9=B4=20=20-=20=EB=82=B4?= =?UTF-8?q?=EA=B0=80=20=EC=9E=91=EC=84=B1=ED=95=9C=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=EA=B0=80=20=EC=9E=88=EB=8A=94=20=EA=B2=BD=EC=9A=B0=EC=9D=98=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../di/ui/MainFragmentViewModelModule.kt | 16 ++ .../WrittenReviewListFragment.kt | 78 +++++++ .../WrittenReviewListViewModel.kt | 56 +++++ .../layout/fragment_written_review_list.xml | 22 ++ .../res/layout/list_item_written_review.xml | 202 ++++++++++++++++++ 5 files changed, 374 insertions(+) create mode 100644 app/src/main/java/com/ftw/hometerview/ui/writtenreview/writtenreviewlist/WrittenReviewListFragment.kt create mode 100644 app/src/main/java/com/ftw/hometerview/ui/writtenreview/writtenreviewlist/WrittenReviewListViewModel.kt create mode 100644 app/src/main/res/layout/fragment_written_review_list.xml create mode 100644 app/src/main/res/layout/list_item_written_review.xml diff --git a/app/src/main/java/com/ftw/hometerview/di/ui/MainFragmentViewModelModule.kt b/app/src/main/java/com/ftw/hometerview/di/ui/MainFragmentViewModelModule.kt index 566ace4..693e603 100644 --- a/app/src/main/java/com/ftw/hometerview/di/ui/MainFragmentViewModelModule.kt +++ b/app/src/main/java/com/ftw/hometerview/di/ui/MainFragmentViewModelModule.kt @@ -4,12 +4,15 @@ import com.ftw.domain.usecase.favorite.GetFavoriteBuildingsUseCase import com.ftw.domain.usecase.favorite.GetFavoriteReviewsUseCase import com.ftw.domain.usecase.review.GetLocationReviewsUseCase import com.ftw.domain.usecase.user.GetCachedUserUseCase +import com.ftw.domain.usecase.writtenreview.GetWrittenReviewsUseCase import com.ftw.hometerview.dispatcher.Dispatcher import com.ftw.hometerview.ui.main.favorite.favoritelist.FavoriteBuildingsViewModel import com.ftw.hometerview.ui.main.favorite.favoritelist.FavoriteReviewsViewModel import com.ftw.hometerview.ui.main.home.HomeViewModel import com.ftw.hometerview.ui.main.home.review.LocationReviewListViewModel import com.ftw.hometerview.ui.main.mypage.MyPageViewModel +import com.ftw.hometerview.ui.writtenreview.nonreview.NonReviewViewModel +import com.ftw.hometerview.ui.writtenreview.writtenreviewlist.WrittenReviewListViewModel import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -84,4 +87,17 @@ class MainFragmentViewModelModule { getFavoriteReviewsUseCase ) } + + @Provides + @FragmentScoped + fun provideWrittenReviewListViewModel( + dispatcher: Dispatcher, + getWrittenReviewsUseCase: GetWrittenReviewsUseCase + ): WrittenReviewListViewModel { + return WrittenReviewListViewModel( + dispatcher, + getWrittenReviewsUseCase + ) + } + } diff --git a/app/src/main/java/com/ftw/hometerview/ui/writtenreview/writtenreviewlist/WrittenReviewListFragment.kt b/app/src/main/java/com/ftw/hometerview/ui/writtenreview/writtenreviewlist/WrittenReviewListFragment.kt new file mode 100644 index 0000000..7fe11d5 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/writtenreview/writtenreviewlist/WrittenReviewListFragment.kt @@ -0,0 +1,78 @@ +package com.ftw.hometerview.ui.writtenreview.writtenreviewlist + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.ftw.hometerview.R +import com.ftw.hometerview.adapter.DataBindingRecyclerAdapter +import com.ftw.hometerview.adapter.SpacingItemDecoration +import com.ftw.hometerview.databinding.FragmentFavoriteReviewBinding +import com.ftw.hometerview.databinding.FragmentWrittenReviewListBinding +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class WrittenReviewListFragment : Fragment() { + + companion object { + fun newInstance(): WrittenReviewListFragment { + return WrittenReviewListFragment() + } + } + + private var _binding: FragmentWrittenReviewListBinding? = null + private val binding get() = _binding!! + + @Inject + lateinit var viewModel: WrittenReviewListViewModel + + private val adapter = DataBindingRecyclerAdapter() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = DataBindingUtil.inflate( + inflater, + R.layout.fragment_written_review_list, + container, + false + ).apply { + viewModel = this@WrittenReviewListFragment.viewModel + } + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + initList() + observe() + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + private fun initList() { + binding.list.adapter = adapter + context?.let { binding.list.addItemDecoration(SpacingItemDecoration(it)) } + } + + private fun observe() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.writtenRevieewItems.collect { + adapter.submitList(it) + } + } + } + } + +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/writtenreview/writtenreviewlist/WrittenReviewListViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/writtenreview/writtenreviewlist/WrittenReviewListViewModel.kt new file mode 100644 index 0000000..87178c0 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/writtenreview/writtenreviewlist/WrittenReviewListViewModel.kt @@ -0,0 +1,56 @@ +package com.ftw.hometerview.ui.writtenreview.writtenreviewlist + +import com.ftw.domain.entity.WrittenReview +import com.ftw.domain.usecase.writtenreview.GetWrittenReviewsUseCase +import com.ftw.hometerview.BR +import com.ftw.hometerview.R +import com.ftw.hometerview.adapter.RecyclerItem +import com.ftw.hometerview.dispatcher.Dispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.* + +class WrittenReviewListViewModel( + dispatcher: Dispatcher, + private val getWrittenReviewsUseCase: GetWrittenReviewsUseCase +) { + + sealed class State { + object Loading : State() + class OnClickReview(val buildingId: Long) : State() + } + + private val _state: MutableStateFlow = MutableStateFlow( + State.Loading + ) + val state: StateFlow = _state.asStateFlow() + + val writtenRevieewItems: StateFlow> = + flow { + emit( + getWrittenReviewsUseCase() + .map { writtenReview -> + RecyclerItem( + data = WrittenReviewItem( + onClickItem = { buildingId -> + _state.value = State.OnClickReview(buildingId) + }, + writtenReview = writtenReview + ), + layoutId = R.layout.list_item_written_review, + variableId = BR.item + ) + } + ) + }.stateIn(CoroutineScope(dispatcher.ui()), SharingStarted.Eagerly, emptyList()) + +} + +data class WrittenReviewItem( + val onClickItem: (buildingId: Long) -> Unit, + val writtenReview: WrittenReview +) { + + fun onItemClick() { + onClickItem(writtenReview.buildingId) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_written_review_list.xml b/app/src/main/res/layout/fragment_written_review_list.xml new file mode 100644 index 0000000..09c9d1b --- /dev/null +++ b/app/src/main/res/layout/fragment_written_review_list.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/list_item_written_review.xml b/app/src/main/res/layout/list_item_written_review.xml new file mode 100644 index 0000000..897095d --- /dev/null +++ b/app/src/main/res/layout/list_item_written_review.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +