refactor(creator-channel): 후원 카드 바인딩을 공통화한다

This commit is contained in:
2026-07-08 18:43:47 +09:00
parent 31ce0629d2
commit ff4c0104c5
3 changed files with 75 additions and 48 deletions

View File

@@ -8,15 +8,12 @@ import android.view.ViewGroup
import androidx.core.view.isVisible 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 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.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.moneyFormat
import kr.co.vividnext.sodalive.v2.creator.channel.donation.model.CreatorChannelDonationRankingUiModel import kr.co.vividnext.sodalive.v2.creator.channel.donation.model.CreatorChannelDonationRankingUiModel
import kr.co.vividnext.sodalive.v2.creator.channel.donation.model.CreatorChannelDonationUiModel import kr.co.vividnext.sodalive.v2.creator.channel.donation.model.CreatorChannelDonationUiModel
import kr.co.vividnext.sodalive.v2.creator.channel.ui.bindCreatorChannelDonationCard
class CreatorChannelDonationAdapter( class CreatorChannelDonationAdapter(
private val onRankingAllClick: () -> Unit = { }, private val onRankingAllClick: () -> Unit = { },
@@ -119,27 +116,20 @@ class CreatorChannelDonationAdapter(
) : RecyclerView.ViewHolder(binding.root) { ) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: CreatorChannelDonationUiModel) = with(binding) { fun bind(item: CreatorChannelDonationUiModel) = with(binding) {
layoutCreatorChannelDonationHeader.setBackgroundColor(root.context.getColor(item.headerColorResId)) bindCreatorChannelDonationCard(
ivCreatorChannelDonationProfile.loadUrl(item.profileImageUrl) { headerView = layoutCreatorChannelDonationHeader,
crossfade(true) profileView = ivCreatorChannelDonationProfile,
placeholder(R.drawable.ic_placeholder_profile) nicknameView = tvCreatorChannelDonationNickname,
error(R.drawable.ic_placeholder_profile) createdAtView = tvCreatorChannelDonationCreatedAt,
transformations(CircleCropTransformation()) canView = tvCreatorChannelDonationCan,
} messageView = tvCreatorChannelDonationMessage,
tvCreatorChannelDonationNickname.text = item.nickname headerColorResId = item.headerColorResId,
tvCreatorChannelDonationCreatedAt.text = item.createdAtText profileImageUrl = item.profileImageUrl,
tvCreatorChannelDonationCan.text = root.context.getString( nickname = item.nickname,
R.string.creator_channel_donation_can_format, createdAtText = item.createdAtText,
item.can.moneyFormat() can = item.can,
message = item.message
) )
tvCreatorChannelDonationMessage.text = item.message
if (item.headerColorResId == R.color.red_400) {
tvCreatorChannelDonationNickname.setTextColor(root.context.getColor(R.color.white))
tvCreatorChannelDonationCreatedAt.setTextColor(root.context.getColor(R.color.gray_100))
} else {
tvCreatorChannelDonationNickname.setTextColor(root.context.getColor(R.color.black))
tvCreatorChannelDonationCreatedAt.setTextColor(root.context.getColor(R.color.gray_700))
}
} }
} }

View File

@@ -0,0 +1,45 @@
package kr.co.vividnext.sodalive.v2.creator.channel.ui
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.ColorRes
import coil.transform.CircleCropTransformation
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.extensions.moneyFormat
internal fun bindCreatorChannelDonationCard(
headerView: View,
profileView: ImageView,
nicknameView: TextView,
createdAtView: TextView,
canView: TextView,
messageView: TextView,
@ColorRes headerColorResId: Int,
profileImageUrl: String,
nickname: String,
createdAtText: String,
can: Int,
message: String
) {
val context = headerView.context
headerView.setBackgroundColor(context.getColor(headerColorResId))
profileView.loadUrl(profileImageUrl) {
crossfade(true)
placeholder(R.drawable.ic_placeholder_profile)
error(R.drawable.ic_placeholder_profile)
transformations(CircleCropTransformation())
}
nicknameView.text = nickname
createdAtView.text = createdAtText
canView.text = context.getString(R.string.creator_channel_donation_can_format, can.moneyFormat())
messageView.text = message
if (headerColorResId == R.color.red_400) {
nicknameView.setTextColor(context.getColor(R.color.white))
createdAtView.setTextColor(context.getColor(R.color.gray_100))
} else {
nicknameView.setTextColor(context.getColor(R.color.black))
createdAtView.setTextColor(context.getColor(R.color.gray_700))
}
}

View File

@@ -15,12 +15,11 @@ import androidx.core.net.toUri
import androidx.core.view.isVisible 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 kr.co.vividnext.sodalive.R
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.common.formatUtcRelativeTimeText import kr.co.vividnext.sodalive.common.formatUtcRelativeTimeText
import kr.co.vividnext.sodalive.common.image.BlurTransformation import kr.co.vividnext.sodalive.common.image.BlurTransformation
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.v2.creator.channel.data.CreatorChannelAudioContentResponse import kr.co.vividnext.sodalive.v2.creator.channel.data.CreatorChannelAudioContentResponse
import kr.co.vividnext.sodalive.v2.creator.channel.data.CreatorChannelCommunityPostResponse import kr.co.vividnext.sodalive.v2.creator.channel.data.CreatorChannelCommunityPostResponse
import kr.co.vividnext.sodalive.v2.creator.channel.data.CreatorChannelLiveResponse import kr.co.vividnext.sodalive.v2.creator.channel.data.CreatorChannelLiveResponse
@@ -196,30 +195,23 @@ class CreatorChannelHomeSectionAdapter(
marginEnd = if (index == visibleDonations.lastIndex) 0 else 4.dp() marginEnd = if (index == visibleDonations.lastIndex) 0 else 4.dp()
} }
val headerColorResId = calculateCreatorChannelDonationHeaderColorRes(donation.can) val headerColorResId = calculateCreatorChannelDonationHeaderColorRes(donation.can)
row.findViewById<View>(R.id.layout_donation_header) val donationMessage = donation.message.ifBlank {
.setBackgroundColor(itemView.context.getColor(headerColorResId))
row.findViewById<ImageView>(R.id.iv_donation_profile).loadUrl(donation.profileImageUrl) {
placeholder(R.drawable.ic_placeholder_profile)
transformations(CircleCropTransformation())
}
val donationNickname = row.findViewById<TextView>(R.id.tv_donation_nickname)
val donationCreatedAt = row.findViewById<TextView>(R.id.tv_donation_created_at)
donationNickname.text = donation.nickname
donationCreatedAt.text = formatUtcRelativeTimeText(itemView.context, donation.createdAtUtc)
if (headerColorResId == R.color.red_400) {
donationNickname.setTextColor(itemView.context.getColor(R.color.white))
donationCreatedAt.setTextColor(itemView.context.getColor(R.color.gray_100))
} else {
donationNickname.setTextColor(itemView.context.getColor(R.color.black))
donationCreatedAt.setTextColor(itemView.context.getColor(R.color.gray_700))
}
row.findViewById<TextView>(R.id.tv_donation_can).text = itemView.context.getString(
R.string.creator_channel_donation_can_format,
donation.can.moneyFormat()
)
row.findViewById<TextView>(R.id.tv_donation_message).text = donation.message.ifBlank {
itemView.context.getString(R.string.creator_channel_donation_fallback_message, donation.can) itemView.context.getString(R.string.creator_channel_donation_fallback_message, donation.can)
} }
bindCreatorChannelDonationCard(
headerView = row.findViewById(R.id.layout_donation_header),
profileView = row.findViewById(R.id.iv_donation_profile),
nicknameView = row.findViewById(R.id.tv_donation_nickname),
createdAtView = row.findViewById(R.id.tv_donation_created_at),
canView = row.findViewById(R.id.tv_donation_can),
messageView = row.findViewById(R.id.tv_donation_message),
headerColorResId = headerColorResId,
profileImageUrl = donation.profileImageUrl,
nickname = donation.nickname,
createdAtText = formatUtcRelativeTimeText(itemView.context, donation.createdAtUtc),
can = donation.can,
message = donationMessage
)
donationItems?.addView(row) donationItems?.addView(row)
} }
} }