feat(home): 랭킹 탭 목록을 연결한다
This commit is contained in:
@@ -16,6 +16,7 @@ import kr.co.vividnext.sodalive.databinding.FragmentV2MainHomeBinding
|
||||
import kr.co.vividnext.sodalive.databinding.ViewSectionTitleBinding
|
||||
import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
|
||||
import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.CreatorCommunityAllActivity
|
||||
import kr.co.vividnext.sodalive.v2.main.home.HomeCreatorRankingViewModel
|
||||
import kr.co.vividnext.sodalive.v2.main.home.HomeRecommendationViewModel
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationAiCharacterSection
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerSection
|
||||
@@ -32,6 +33,7 @@ import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationPopularComm
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentlyActiveCreatorSection
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentlyActiveCreatorUiModel
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentDebutCreatorSection
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.HomeCreatorRankingUiState
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationUiState
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationBannerIntent
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationBannerRoute
|
||||
@@ -48,6 +50,8 @@ import kr.co.vividnext.sodalive.v2.main.home.ui.HomeLiveAdapter
|
||||
import kr.co.vividnext.sodalive.v2.main.home.ui.HomePopularCommunityAdapter
|
||||
import kr.co.vividnext.sodalive.v2.main.home.ui.HomeRecentActivityCreatorAdapter
|
||||
import kr.co.vividnext.sodalive.v2.main.home.ui.HomeRecentDebutCreatorAdapter
|
||||
import kr.co.vividnext.sodalive.v2.widget.creatorranking.CreatorRankingAdapter
|
||||
import kr.co.vividnext.sodalive.v2.widget.creatorranking.CreatorRankingItem
|
||||
import kr.co.vividnext.sodalive.v2.widget.feed.FeedItem
|
||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||
|
||||
@@ -55,6 +59,7 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
|
||||
FragmentV2MainHomeBinding::inflate
|
||||
) {
|
||||
private val homeRecommendationViewModel: HomeRecommendationViewModel by viewModel()
|
||||
private val homeCreatorRankingViewModel: HomeCreatorRankingViewModel by viewModel()
|
||||
private val loadingDialog: LoadingDialog by lazy { LoadingDialog(requireActivity(), layoutInflater) }
|
||||
private val liveAdapter = HomeLiveAdapter()
|
||||
private val recentActivityCreatorAdapter = HomeRecentActivityCreatorAdapter { onRecentActivityClick(it) }
|
||||
@@ -70,9 +75,11 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
|
||||
onCreatorClick = { creator -> openCreatorProfile(creator.creatorId) }
|
||||
)
|
||||
private val popularCommunityAdapter = HomePopularCommunityAdapter { openPopularCommunityPost(it) }
|
||||
private val creatorRankingAdapter = CreatorRankingAdapter { openCreatorRankingProfile(it) }
|
||||
private var bannerBinder: HomeBannerBinder? = null
|
||||
private var onGenreFollowAllClick: (List<Long>) -> Unit = {}
|
||||
private var onCheerFollowAllClick: (List<Long>) -> Unit = {}
|
||||
private var hasLoadedCreatorRankings = false
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
@@ -84,11 +91,15 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
|
||||
),
|
||||
selectedIndex = 0
|
||||
)
|
||||
binding.textTabBarHome.root.setOnTabSelectedListener { }
|
||||
binding.textTabBarHome.root.setOnTabSelectedListener { index ->
|
||||
showHomeTab(index)
|
||||
}
|
||||
setUpSectionTitles()
|
||||
setUpRecommendationAdapters()
|
||||
setUpCreatorRankingAdapter()
|
||||
setUpBusinessInfo()
|
||||
bindHomeRecommendationObservers()
|
||||
bindHomeCreatorRankingObservers()
|
||||
homeRecommendationViewModel.loadRecommendations()
|
||||
}
|
||||
|
||||
@@ -141,6 +152,52 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
|
||||
}
|
||||
}
|
||||
|
||||
private fun setUpCreatorRankingAdapter() {
|
||||
binding.rvHomeCreatorRankings.apply {
|
||||
layoutManager = CreatorRankingAdapter.createGridLayoutManager(requireContext())
|
||||
adapter = creatorRankingAdapter
|
||||
}
|
||||
}
|
||||
|
||||
private fun bindHomeCreatorRankingObservers() {
|
||||
homeCreatorRankingViewModel.rankingStateLiveData.observe(viewLifecycleOwner) { state ->
|
||||
when (state) {
|
||||
is HomeCreatorRankingUiState.Content -> creatorRankingAdapter.submitItems(state.items)
|
||||
HomeCreatorRankingUiState.Empty,
|
||||
is HomeCreatorRankingUiState.Error -> creatorRankingAdapter.submitItems(emptyList())
|
||||
HomeCreatorRankingUiState.Loading -> Unit
|
||||
}
|
||||
}
|
||||
homeCreatorRankingViewModel.isLoading.observe(viewLifecycleOwner) { isLoading ->
|
||||
if (isLoading) {
|
||||
loadingDialog.show(screenWidth)
|
||||
} else {
|
||||
loadingDialog.dismiss()
|
||||
}
|
||||
}
|
||||
homeCreatorRankingViewModel.toastLiveData.observe(viewLifecycleOwner) { toastMessage ->
|
||||
toastMessage?.let(::showToast)
|
||||
}
|
||||
}
|
||||
|
||||
private fun showHomeTab(index: Int) {
|
||||
when (index) {
|
||||
HOME_TAB_RECOMMENDATION -> {
|
||||
binding.nsvHomeRecommendationContent.visibility = View.VISIBLE
|
||||
binding.rvHomeCreatorRankings.visibility = View.GONE
|
||||
}
|
||||
HOME_TAB_RANKING -> {
|
||||
binding.nsvHomeRecommendationContent.visibility = View.GONE
|
||||
binding.rvHomeCreatorRankings.visibility = View.VISIBLE
|
||||
if (!hasLoadedCreatorRankings) {
|
||||
hasLoadedCreatorRankings = true
|
||||
homeCreatorRankingViewModel.loadCreatorRankings()
|
||||
}
|
||||
}
|
||||
HOME_TAB_FOLLOWING -> Unit
|
||||
}
|
||||
}
|
||||
|
||||
private fun bindHomeRecommendationObservers() {
|
||||
homeRecommendationViewModel.recommendationStateLiveData.observe(viewLifecycleOwner) { state ->
|
||||
when (state) {
|
||||
@@ -280,6 +337,11 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
|
||||
startActivity(route.toHomeRecommendationRecentlyActiveCreatorIntent(requireContext()))
|
||||
}
|
||||
|
||||
private fun openCreatorRankingProfile(item: CreatorRankingItem) {
|
||||
if (item.creatorId <= 0L) return
|
||||
openCreatorProfile(item.creatorId)
|
||||
}
|
||||
|
||||
private fun openCreatorProfile(creatorId: Long) {
|
||||
startActivity(
|
||||
Intent(requireContext(), UserProfileActivity::class.java).apply {
|
||||
@@ -351,6 +413,9 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
|
||||
private fun List<*>.toSectionVisibility(): Int = if (isEmpty()) View.GONE else View.VISIBLE
|
||||
|
||||
private companion object {
|
||||
const val HOME_TAB_RECOMMENDATION = 0
|
||||
const val HOME_TAB_RANKING = 1
|
||||
const val HOME_TAB_FOLLOWING = 2
|
||||
const val SECTION_KEY_CHEER_CREATORS = "cheerCreators"
|
||||
const val SECTION_KEY_GENRE_CREATORS = "genreCreators"
|
||||
}
|
||||
|
||||
@@ -238,4 +238,19 @@
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_home_creator_rankings"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:clipToPadding="false"
|
||||
android:paddingHorizontal="@dimen/spacing_14"
|
||||
android:paddingTop="@dimen/spacing_14"
|
||||
android:paddingBottom="@dimen/spacing_28"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/text_tab_bar_home"
|
||||
tools:listitem="@layout/view_creator_ranking_horizontal_card" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
Reference in New Issue
Block a user