|
|
@@ -0,0 +1,192 @@
|
|
|
+package com.adealink.weparty.room.gift
|
|
|
+
|
|
|
+import android.view.LayoutInflater
|
|
|
+import android.view.ViewGroup
|
|
|
+import androidx.core.content.ContextCompat
|
|
|
+import androidx.recyclerview.widget.GridLayoutManager
|
|
|
+import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
+import androidx.recyclerview.widget.RecyclerView
|
|
|
+import com.adealink.frame.base.fastLazy
|
|
|
+import com.adealink.frame.mvvm.view.viewBinding
|
|
|
+import com.adealink.frame.util.onClick
|
|
|
+import com.adealink.weparty.commonui.ext.gone
|
|
|
+import com.adealink.weparty.commonui.ext.show
|
|
|
+import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
|
|
|
+import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
|
|
|
+import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
|
|
|
+import com.adealink.weparty.commonui.widget.BottomDialogFragment
|
|
|
+import com.adealink.weparty.room.R
|
|
|
+import com.adealink.weparty.room.databinding.DialogRoomGiftPanelBinding
|
|
|
+import com.adealink.weparty.room.databinding.ItemRoomGiftBinding
|
|
|
+import com.adealink.weparty.room.databinding.ItemRoomGiftUserBinding
|
|
|
+
|
|
|
+data class RoomGiftUserData(
|
|
|
+ val id: String,
|
|
|
+ val avatar: String,
|
|
|
+ val tag: String,
|
|
|
+ var isSelected: Boolean = false
|
|
|
+)
|
|
|
+
|
|
|
+data class RoomGiftData(
|
|
|
+ val id: String,
|
|
|
+ val icon: String,
|
|
|
+ val name: String,
|
|
|
+ val price: Int,
|
|
|
+ var isSelected: Boolean = false
|
|
|
+)
|
|
|
+
|
|
|
+class RoomGiftUserItemViewBinder(private val listener: (RoomGiftUserData) -> Unit) :
|
|
|
+ ItemViewBinder<RoomGiftUserData, BindingViewHolder<ItemRoomGiftUserBinding>>() {
|
|
|
+
|
|
|
+ override fun onCreateViewHolder(
|
|
|
+ inflater: LayoutInflater,
|
|
|
+ parent: ViewGroup
|
|
|
+ ): BindingViewHolder<ItemRoomGiftUserBinding> {
|
|
|
+ return BindingViewHolder(ItemRoomGiftUserBinding.inflate(inflater, parent, false))
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onBindViewHolder(
|
|
|
+ holder: BindingViewHolder<ItemRoomGiftUserBinding>,
|
|
|
+ item: RoomGiftUserData
|
|
|
+ ) {
|
|
|
+ val context = holder.binding.root.context
|
|
|
+ holder.binding.ivAvatar.setImageUrl(item.avatar)
|
|
|
+ holder.binding.tvTag.text = item.tag
|
|
|
+
|
|
|
+ if (item.isSelected) {
|
|
|
+ holder.binding.ivAvatar.setBackgroundResource(R.drawable.shape_room_gift_user_avatar_border)
|
|
|
+ holder.binding.tvTag.setBackgroundResource(R.drawable.shape_room_gift_user_tag_bg_selected)
|
|
|
+ holder.binding.tvTag.setTextColor(ContextCompat.getColor(context, com.adealink.weparty.R.color.white))
|
|
|
+ } else {
|
|
|
+ holder.binding.ivAvatar.background = null
|
|
|
+ holder.binding.tvTag.setBackgroundResource(R.drawable.shape_room_gift_user_tag_bg)
|
|
|
+ holder.binding.tvTag.setTextColor(ContextCompat.getColor(context, com.adealink.weparty.R.color.color_FF2C2945))
|
|
|
+ }
|
|
|
+
|
|
|
+ holder.binding.root.onClick {
|
|
|
+ listener.invoke(item)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class RoomGiftItemViewBinder(private val listener: (RoomGiftData) -> Unit) :
|
|
|
+ ItemViewBinder<RoomGiftData, BindingViewHolder<ItemRoomGiftBinding>>() {
|
|
|
+
|
|
|
+ override fun onCreateViewHolder(
|
|
|
+ inflater: LayoutInflater,
|
|
|
+ parent: ViewGroup
|
|
|
+ ): BindingViewHolder<ItemRoomGiftBinding> {
|
|
|
+ return BindingViewHolder(ItemRoomGiftBinding.inflate(inflater, parent, false))
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onBindViewHolder(
|
|
|
+ holder: BindingViewHolder<ItemRoomGiftBinding>,
|
|
|
+ item: RoomGiftData
|
|
|
+ ) {
|
|
|
+ holder.binding.ivIcon.setImageUrl(item.icon)
|
|
|
+ holder.binding.tvName.text = item.name
|
|
|
+ holder.binding.tvPrice.text = item.price.toString()
|
|
|
+
|
|
|
+ if (item.isSelected) {
|
|
|
+ holder.binding.root.setBackgroundResource(R.drawable.shape_room_gift_item_bg_selected)
|
|
|
+ } else {
|
|
|
+ holder.binding.root.setBackgroundResource(R.drawable.shape_room_gift_item_bg)
|
|
|
+ }
|
|
|
+
|
|
|
+ holder.binding.root.onClick {
|
|
|
+ listener.invoke(item)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class RoomGiftPanelDialog : BottomDialogFragment(R.layout.dialog_room_gift_panel) {
|
|
|
+
|
|
|
+ private val binding by viewBinding(DialogRoomGiftPanelBinding::bind)
|
|
|
+
|
|
|
+ private val userAdapter by fastLazy { MultiTypeListAdapter<RoomGiftUserData>() }
|
|
|
+ private val giftAdapter by fastLazy { MultiTypeListAdapter<RoomGiftData>() }
|
|
|
+
|
|
|
+ private var giftQuantity = 1
|
|
|
+
|
|
|
+ override fun initViews() {
|
|
|
+ super.initViews()
|
|
|
+ initRecyclerViews()
|
|
|
+ initListeners()
|
|
|
+
|
|
|
+ // Mock data
|
|
|
+ val mockUsers = listOf(
|
|
|
+ RoomGiftUserData("1", "", "Host", isSelected = true),
|
|
|
+ RoomGiftUserData("2", "", "1", isSelected = false),
|
|
|
+ RoomGiftUserData("3", "", "2", isSelected = false)
|
|
|
+ )
|
|
|
+ userAdapter.submitList(mockUsers)
|
|
|
+
|
|
|
+ val mockGifts = (1..12).map {
|
|
|
+ RoomGiftData(it.toString(), "", "宇宙飞船", 32000)
|
|
|
+ }
|
|
|
+ giftAdapter.submitList(mockGifts)
|
|
|
+
|
|
|
+ updateBottomPanel()
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun initRecyclerViews() {
|
|
|
+ // Users RecyclerView
|
|
|
+ userAdapter.register(RoomGiftUserItemViewBinder { clickedItem ->
|
|
|
+ val list = userAdapter.getCurrentList().map {
|
|
|
+ it.copy(isSelected = it.id == clickedItem.id)
|
|
|
+ }
|
|
|
+ userAdapter.submitList(list)
|
|
|
+ updateBottomPanel()
|
|
|
+ })
|
|
|
+ binding.rvUsers.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
|
|
|
+ binding.rvUsers.adapter = userAdapter
|
|
|
+
|
|
|
+ // Gifts RecyclerView
|
|
|
+ giftAdapter.register(RoomGiftItemViewBinder { clickedItem ->
|
|
|
+ val list = giftAdapter.getCurrentList().map {
|
|
|
+ it.copy(isSelected = it.id == clickedItem.id)
|
|
|
+ }
|
|
|
+ giftAdapter.submitList(list)
|
|
|
+ giftQuantity = 1 // Reset quantity when a new gift is selected
|
|
|
+ updateBottomPanel()
|
|
|
+ })
|
|
|
+ binding.rvGifts.layoutManager = GridLayoutManager(context, 4)
|
|
|
+ binding.rvGifts.adapter = giftAdapter
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun initListeners() {
|
|
|
+ binding.btnPlus.onClick {
|
|
|
+ giftQuantity++
|
|
|
+ updateBottomPanel()
|
|
|
+ }
|
|
|
+ binding.btnMinus.onClick {
|
|
|
+ if (giftQuantity > 1) {
|
|
|
+ giftQuantity--
|
|
|
+ updateBottomPanel()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ binding.btnSend.onClick {
|
|
|
+ val selectedGift = giftAdapter.getCurrentList().find { it.isSelected }
|
|
|
+ if (selectedGift != null) {
|
|
|
+ // Send gift logic
|
|
|
+ dismiss()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun updateBottomPanel() {
|
|
|
+ val selectedGift = giftAdapter.getCurrentList().find { it.isSelected }
|
|
|
+ if (selectedGift != null) {
|
|
|
+ binding.llQuantity.show()
|
|
|
+ binding.tvQuantity.text = giftQuantity.toString()
|
|
|
+ binding.btnSend.setBackgroundResource(R.drawable.shape_room_gift_btn_send_bg_selected)
|
|
|
+ val color = ContextCompat.getColor(requireContext(), com.adealink.weparty.R.color.color_FF2C2945)
|
|
|
+ binding.btnSend.setTextColor(color)
|
|
|
+ } else {
|
|
|
+ binding.llQuantity.gone()
|
|
|
+ binding.btnSend.setBackgroundResource(R.drawable.shape_room_gift_btn_send_bg_unselected)
|
|
|
+ val color = ContextCompat.getColor(requireContext(), com.adealink.weparty.R.color.color_80FFFFFF)
|
|
|
+ binding.btnSend.setTextColor(color)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|