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.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import coil.transform.CircleCropTransformation
import kr.co.vividnext.sodalive.R
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.extensions.loadUrl
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
class CreatorChannelDonationAdapter(
private val onRankingAllClick: () -> Unit = { }
private val onRankingAllClick: () -> Unit = { },
private val onEmptyDonationClick: () -> Unit = { }
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var items: List<CreatorChannelDonationListItem> = emptyList()
@@ -33,8 +36,20 @@ class CreatorChannelDonationAdapter(
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]) {
is CreatorChannelDonationListItem.Ranking -> VIEW_TYPE_RANKING
is CreatorChannelDonationListItem.Empty -> VIEW_TYPE_EMPTY
is CreatorChannelDonationListItem.Donation -> VIEW_TYPE_DONATION
}
@@ -44,6 +59,10 @@ class CreatorChannelDonationAdapter(
ItemCreatorChannelDonationRankingBinding.inflate(LayoutInflater.from(parent.context), parent, false),
onRankingAllClick
)
VIEW_TYPE_EMPTY -> EmptyViewHolder(
ItemCreatorChannelDonationEmptyBinding.inflate(LayoutInflater.from(parent.context), parent, false),
onEmptyDonationClick
)
else -> DonationViewHolder(
ItemCreatorChannelDonationBinding.inflate(LayoutInflater.from(parent.context), parent, false)
)
@@ -53,6 +72,7 @@ class CreatorChannelDonationAdapter(
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (val item = items[position]) {
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)
}
}
@@ -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(
private val binding: ItemCreatorChannelDonationBinding
) : RecyclerView.ViewHolder(binding.root) {
@@ -104,12 +138,14 @@ class CreatorChannelDonationAdapter(
companion object {
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 {
data class Ranking(val rankings: List<CreatorChannelDonationRankingUiModel>) : CreatorChannelDonationListItem
data class Empty(val isOwner: Boolean) : 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>