feat(creator): 후원 empty 아이템을 추가한다

This commit is contained in:
2026-06-22 23:55:43 +09:00
parent 933e118c36
commit 7a705b4355
2 changed files with 92 additions and 2 deletions

View File

@@ -5,11 +5,13 @@ import android.graphics.Rect
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.databinding.ItemCreatorChannelDonationBinding import kr.co.vividnext.sodalive.databinding.ItemCreatorChannelDonationBinding
import kr.co.vividnext.sodalive.databinding.ItemCreatorChannelDonationEmptyBinding
import kr.co.vividnext.sodalive.databinding.ItemCreatorChannelDonationRankingBinding import kr.co.vividnext.sodalive.databinding.ItemCreatorChannelDonationRankingBinding
import kr.co.vividnext.sodalive.extensions.loadUrl import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.extensions.moneyFormat import kr.co.vividnext.sodalive.extensions.moneyFormat
@@ -17,7 +19,8 @@ import kr.co.vividnext.sodalive.v2.creator.channel.donation.model.CreatorChannel
import kr.co.vividnext.sodalive.v2.creator.channel.donation.model.CreatorChannelDonationUiModel import kr.co.vividnext.sodalive.v2.creator.channel.donation.model.CreatorChannelDonationUiModel
class CreatorChannelDonationAdapter( class CreatorChannelDonationAdapter(
private val onRankingAllClick: () -> Unit = { } private val onRankingAllClick: () -> Unit = { },
private val onEmptyDonationClick: () -> Unit = { }
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var items: List<CreatorChannelDonationListItem> = emptyList() private var items: List<CreatorChannelDonationListItem> = emptyList()
@@ -33,8 +36,20 @@ class CreatorChannelDonationAdapter(
notifyDataSetChanged() notifyDataSetChanged()
} }
fun submitEmpty(
rankings: List<CreatorChannelDonationRankingUiModel>,
isOwner: Boolean
) {
items = buildList {
if (rankings.isNotEmpty()) add(CreatorChannelDonationListItem.Ranking(rankings))
add(CreatorChannelDonationListItem.Empty(isOwner))
}
notifyDataSetChanged()
}
override fun getItemViewType(position: Int): Int = when (items[position]) { override fun getItemViewType(position: Int): Int = when (items[position]) {
is CreatorChannelDonationListItem.Ranking -> VIEW_TYPE_RANKING is CreatorChannelDonationListItem.Ranking -> VIEW_TYPE_RANKING
is CreatorChannelDonationListItem.Empty -> VIEW_TYPE_EMPTY
is CreatorChannelDonationListItem.Donation -> VIEW_TYPE_DONATION is CreatorChannelDonationListItem.Donation -> VIEW_TYPE_DONATION
} }
@@ -44,6 +59,10 @@ class CreatorChannelDonationAdapter(
ItemCreatorChannelDonationRankingBinding.inflate(LayoutInflater.from(parent.context), parent, false), ItemCreatorChannelDonationRankingBinding.inflate(LayoutInflater.from(parent.context), parent, false),
onRankingAllClick onRankingAllClick
) )
VIEW_TYPE_EMPTY -> EmptyViewHolder(
ItemCreatorChannelDonationEmptyBinding.inflate(LayoutInflater.from(parent.context), parent, false),
onEmptyDonationClick
)
else -> DonationViewHolder( else -> DonationViewHolder(
ItemCreatorChannelDonationBinding.inflate(LayoutInflater.from(parent.context), parent, false) ItemCreatorChannelDonationBinding.inflate(LayoutInflater.from(parent.context), parent, false)
) )
@@ -53,6 +72,7 @@ class CreatorChannelDonationAdapter(
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (val item = items[position]) { when (val item = items[position]) {
is CreatorChannelDonationListItem.Ranking -> (holder as RankingViewHolder).bind(item.rankings) is CreatorChannelDonationListItem.Ranking -> (holder as RankingViewHolder).bind(item.rankings)
is CreatorChannelDonationListItem.Empty -> (holder as EmptyViewHolder).bind(item.isOwner)
is CreatorChannelDonationListItem.Donation -> (holder as DonationViewHolder).bind(item.donation) is CreatorChannelDonationListItem.Donation -> (holder as DonationViewHolder).bind(item.donation)
} }
} }
@@ -80,6 +100,20 @@ class CreatorChannelDonationAdapter(
} }
} }
class EmptyViewHolder(
private val binding: ItemCreatorChannelDonationEmptyBinding,
private val onEmptyDonationClick: () -> Unit
) : RecyclerView.ViewHolder(binding.root) {
init {
binding.btnCreatorChannelDonationEmptyWrite.setOnClickListener { onEmptyDonationClick() }
}
fun bind(isOwner: Boolean) = with(binding) {
btnCreatorChannelDonationEmptyWrite.isVisible = !isOwner
}
}
class DonationViewHolder( class DonationViewHolder(
private val binding: ItemCreatorChannelDonationBinding private val binding: ItemCreatorChannelDonationBinding
) : RecyclerView.ViewHolder(binding.root) { ) : RecyclerView.ViewHolder(binding.root) {
@@ -104,12 +138,14 @@ class CreatorChannelDonationAdapter(
companion object { companion object {
private const val VIEW_TYPE_RANKING = 0 private const val VIEW_TYPE_RANKING = 0
private const val VIEW_TYPE_DONATION = 1 private const val VIEW_TYPE_EMPTY = 1
private const val VIEW_TYPE_DONATION = 2
} }
} }
private sealed interface CreatorChannelDonationListItem { private sealed interface CreatorChannelDonationListItem {
data class Ranking(val rankings: List<CreatorChannelDonationRankingUiModel>) : CreatorChannelDonationListItem data class Ranking(val rankings: List<CreatorChannelDonationRankingUiModel>) : CreatorChannelDonationListItem
data class Empty(val isOwner: Boolean) : CreatorChannelDonationListItem
data class Donation(val donation: CreatorChannelDonationUiModel) : CreatorChannelDonationListItem data class Donation(val donation: CreatorChannelDonationUiModel) : CreatorChannelDonationListItem
} }

View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_creator_channel_donation_empty"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top|center_horizontal"
android:orientation="vertical"
android:paddingHorizontal="@dimen/spacing_14"
android:paddingTop="@dimen/spacing_48"
android:paddingBottom="@dimen/spacing_32">
<TextView
android:id="@+id/tv_creator_channel_donation_empty_message"
style="@style/Typography.Body3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:includeFontPadding="false"
android:lineSpacingMultiplier="1.45"
android:text="@string/creator_channel_donation_empty_title"
android:textColor="@color/gray_500" />
<LinearLayout
android:id="@+id/btn_creator_channel_donation_empty_write"
android:layout_width="wrap_content"
android:layout_height="44dp"
android:layout_marginTop="@dimen/spacing_14"
android:background="@drawable/bg_creator_channel_donation_empty_button"
android:gravity="center"
android:orientation="horizontal"
android:paddingHorizontal="@dimen/spacing_12"
tools:visibility="visible">
<ImageView
android:id="@+id/iv_creator_channel_donation_empty_write"
android:layout_width="@dimen/spacing_20"
android:layout_height="@dimen/spacing_20"
android:contentDescription="@null"
android:src="@drawable/ic_new_donation"
app:tint="@color/white" />
<TextView
android:id="@+id/tv_creator_channel_donation_empty_write"
style="@style/Typography.Body2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/spacing_6"
android:gravity="center"
android:text="@string/creator_channel_donation_action"
android:textColor="@color/white" />
</LinearLayout>
</LinearLayout>