From b6359f9b8dddc3d5155fa94d949f98f2087db18b Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 7 Sep 2023 13:37:19 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=EC=9D=98=20=EB=8B=B5=EA=B8=80=20-=20=EC=88=98?= =?UTF-8?q?=EC=A0=95/=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/AudioContentCommentFragment.kt | 1 + .../AudioContentCommentListViewModel.kt | 3 +- .../AudioContentCommentReplyAdapter.kt | 139 +++++++++++++++++- .../AudioContentCommentReplyFragment.kt | 36 ++++- .../AudioContentCommentReplyViewModel.kt | 60 +++++++- .../item_audio_content_comment_reply.xml | 102 +++++++++++-- 6 files changed, 323 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentFragment.kt index 0b25906..693322b 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentFragment.kt @@ -65,6 +65,7 @@ class AudioContentCommentFragment( fun onClickComment(comment: GetAudioContentCommentListItem) { val commentReplyFragmentTag = "COMMENT_REPLY_FRAGMENT" val commentReplyFragment = AudioContentCommentReplyFragment.newInstance( + creatorId = creatorId, audioContentId = audioContentId, comment = comment ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentListViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentListViewModel.kt index a6da738..40ec885 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentListViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentListViewModel.kt @@ -48,11 +48,12 @@ class AudioContentCommentListViewModel( if (it.success && it.data != null) { _totalCommentCount.postValue(it.data.totalCount) + page += 1 if (it.data.items.isNotEmpty()) { - page += 1 _commentList.postValue(it.data.items) } else { isLast = true + _commentList.postValue(listOf()) } } else { if (it.message != null) { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentReplyAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentReplyAdapter.kt index ef431f7..c08f3ff 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentReplyAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentReplyAdapter.kt @@ -1,18 +1,27 @@ package kr.co.vividnext.sodalive.audio_content.comment +import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.appcompat.widget.PopupMenu import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding import coil.load import coil.transform.CircleCropTransformation import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.ItemAudioContentCommentBinding import kr.co.vividnext.sodalive.databinding.ItemAudioContentCommentReplyBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.extensions.moneyFormat -class AudioContentCommentReplyAdapter : - RecyclerView.Adapter() { +class AudioContentCommentReplyAdapter( + private val creatorId: Long, + private val modifyComment: (Long, String) -> Unit, + private val onClickDelete: (Long) -> Unit +) : RecyclerView.Adapter() { var items = mutableSetOf() @@ -22,19 +31,25 @@ class AudioContentCommentReplyAdapter : ): AudioContentCommentReplyViewHolder { return if (viewType == 0) { AudioContentCommentReplyHeaderViewHolder( - ItemAudioContentCommentBinding.inflate( + binding = ItemAudioContentCommentBinding.inflate( LayoutInflater.from(parent.context), parent, false - ) + ), ) } else { AudioContentCommentReplyItemViewHolder( + context = parent.context, + creatorId = creatorId, ItemAudioContentCommentReplyBinding.inflate( LayoutInflater.from(parent.context), parent, false - ) + ), + showOptionMenu = { context, view, commentId, writerId, creatorId, onClickModify -> + showOptionMenu(context, view, commentId, writerId, creatorId, onClickModify) + }, + modifyComment = modifyComment ) } } @@ -48,6 +63,40 @@ class AudioContentCommentReplyAdapter : override fun getItemViewType(position: Int): Int { return position } + + private fun showOptionMenu( + context: Context, + v: View, + commentId: Long, + writerId: Long, + creatorId: Long, + onClickModify: () -> Unit + ) { + val popup = PopupMenu(context, v) + val inflater = popup.menuInflater + + if (writerId == SharedPreferenceManager.userId) { + inflater.inflate(R.menu.content_comment_option_menu, popup.menu) + } else if (creatorId == SharedPreferenceManager.userId) { + inflater.inflate(R.menu.content_comment_option_menu2, popup.menu) + } + + popup.setOnMenuItemClickListener { + when (it.itemId) { + R.id.menu_review_modify -> { + onClickModify() + } + + R.id.menu_review_delete -> { + onClickDelete(commentId) + } + } + + true + } + + popup.show() + } } abstract class AudioContentCommentReplyViewHolder( @@ -67,16 +116,66 @@ class AudioContentCommentReplyHeaderViewHolder( transformations(CircleCropTransformation()) } + val tvCommentLayoutParams = binding.tvComment.layoutParams as LinearLayout.LayoutParams + val can = item.donationCan + if (can > 0) { + tvCommentLayoutParams.topMargin = 0 + binding.llDonationCan.visibility = View.VISIBLE + binding.tvDonationCan.text = can.moneyFormat() + binding.llDonationCan.setBackgroundResource( + when { + can >= 100000 -> { + R.drawable.bg_round_corner_10_7_973a3a + } + + can >= 50000 -> { + R.drawable.bg_round_corner_10_7_d85e37 + } + + can >= 10000 -> { + R.drawable.bg_round_corner_10_7_d38c38 + } + + can >= 5000 -> { + R.drawable.bg_round_corner_10_7_59548f + } + + can >= 1000 -> { + R.drawable.bg_round_corner_10_7_4d6aa4 + } + + can >= 500 -> { + R.drawable.bg_round_corner_10_7_2d7390 + } + + else -> { + R.drawable.bg_round_corner_10_7_548f7d + } + } + ) + } else { + tvCommentLayoutParams.topMargin = 13.3f.dpToPx().toInt() + binding.llDonationCan.visibility = View.GONE + } + binding.tvComment.layoutParams = tvCommentLayoutParams + binding.tvComment.text = item.comment binding.tvCommentDate.text = item.date binding.tvCommentNickname.text = item.nickname binding.tvWriteReply.visibility = View.GONE + binding.ivMenu.visibility = View.GONE } } class AudioContentCommentReplyItemViewHolder( - private val binding: ItemAudioContentCommentReplyBinding + private val context: Context, + private val creatorId: Long, + private val binding: ItemAudioContentCommentReplyBinding, + private val showOptionMenu: ( + Context, View, Long, Long, Long, onClickModify: () -> Unit + ) -> Unit, + private val modifyComment: (Long, String) -> Unit ) : AudioContentCommentReplyViewHolder(binding) { override fun bind(item: GetAudioContentCommentListItem) { @@ -89,5 +188,33 @@ class AudioContentCommentReplyItemViewHolder( binding.tvComment.text = item.comment binding.tvCommentDate.text = item.date binding.tvCommentNickname.text = item.nickname + + if ( + item.writerId == SharedPreferenceManager.userId || + creatorId == SharedPreferenceManager.userId + ) { + binding.etCommentModify.setText(item.comment) + binding.ivMenu.visibility = View.VISIBLE + binding.ivMenu.setOnClickListener { + showOptionMenu( + context, + binding.ivMenu, + item.id, + item.writerId, + creatorId + ) { + binding.rlCommentModify.visibility = View.VISIBLE + binding.tvComment.visibility = View.GONE + } + } + + binding.tvModify.setOnClickListener { + binding.rlCommentModify.visibility = View.GONE + binding.tvComment.visibility = View.VISIBLE + modifyComment(item.id, binding.etCommentModify.text.toString()) + } + } else { + binding.ivMenu.visibility = View.GONE + } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentReplyFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentReplyFragment.kt index 253a607..9e95910 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentReplyFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/comment/AudioContentCommentReplyFragment.kt @@ -16,6 +16,7 @@ import coil.load import coil.transform.CircleCropTransformation import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.base.SodaDialog import kr.co.vividnext.sodalive.common.Constants import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.SharedPreferenceManager @@ -34,6 +35,8 @@ class AudioContentCommentReplyFragment : BaseFragment + hideKeyboard() + viewModel.modifyComment( + commentId = commentId, + parentCommentId = originalComment!!.id, + comment = comment + ) + }, + onClickDelete = { + SodaDialog( + activity = requireActivity(), + layoutInflater = layoutInflater, + title = "댓글 삭제", + desc = "삭제하시겠습니까?", + confirmButtonTitle = "삭제", + confirmButtonClick = { + viewModel.modifyComment( + commentId = it, + parentCommentId = originalComment!!.id, + isActive = false + ) + }, + cancelButtonTitle = "취소", + cancelButtonClick = {} + ).show(screenWidth) + } + ).apply { items.add(originalComment!!) } @@ -189,11 +221,13 @@ class AudioContentCommentReplyFragment : BaseFragment Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } } diff --git a/app/src/main/res/layout/item_audio_content_comment_reply.xml b/app/src/main/res/layout/item_audio_content_comment_reply.xml index 8cc07c4..abb0bd8 100644 --- a/app/src/main/res/layout/item_audio_content_comment_reply.xml +++ b/app/src/main/res/layout/item_audio_content_comment_reply.xml @@ -22,11 +22,21 @@ android:fontFamily="@font/gmarket_sans_medium" android:textColor="@color/color_eeeeee" android:textSize="13.3sp" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@+id/iv_menu" app:layout_constraintStart_toEndOf="@+id/iv_comment_profile" app:layout_constraintTop_toTopOf="@+id/iv_comment_profile" tools:text="alkfje203" /> + + - + app:layout_constraintTop_toBottomOf="@+id/tv_comment_date"> + + + + + + + + + + + + + + + + +