From e881178f2a6094ed9c1cb3ee377f9f6a19ab98fa Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 20 Aug 2025 03:07:35 +0900 Subject: [PATCH] =?UTF-8?q?feat(character-comment):=20=EB=8B=B5=EA=B8=80?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20API=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?=EB=B0=8F=20=EC=BB=A4=EC=84=9C=20=EA=B8=B0=EB=B0=98=20=EB=AC=B4?= =?UTF-8?q?=ED=95=9C=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EC=A0=81=EC=9A=A9=20?= =?UTF-8?q?feat(character-comment):=20=EB=8B=B5=EA=B8=80=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20API=20=EC=97=B0=EB=8F=99=20=EB=B0=8F=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=EC=8B=9C=20=EB=82=99=EA=B4=80=EC=A0=81=20UI=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CharacterCommentReplyFragment에 listReplies API 연동 - 초기 1회 로드 허용, 이후 cursor != null일 때만 추가 로드 - isLoading 플래그로 중복 요청 방지 - 어댑터 헤더(원본 댓글) 유지, replies만 순차 추가 - CharacterCommentReplyFragment에서 createReply API 호출로 스텁 제거 - 요청 중 로딩 다이얼로그 표시, 성공 시 입력 초기화 및 리스트에 즉시 추가 - 에러 처리(토스트) 적용 --- .../comment/CharacterCommentReplyFragment.kt | 92 ++++++++++++++----- 1 file changed, 69 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyFragment.kt index 85ab2464..e4c160cd 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyFragment.kt @@ -12,14 +12,14 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import coil.load import coil.transform.CircleCropTransformation +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.FragmentCharacterCommentReplyBinding import kr.co.vividnext.sodalive.extensions.dpToPx -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.schedulers.Schedulers import org.koin.android.ext.android.inject /** @@ -93,21 +93,49 @@ class CharacterCommentReplyFragment : BaseFragment + if (resp.success) { + // 성공 시 낙관적 UI 반영: 기존 스텁과 동일하게 즉시 목록에 추가 + val me = CharacterReplyResponse( + replyId = System.currentTimeMillis(), + memberId = SharedPreferenceManager.userId, + memberProfileImage = SharedPreferenceManager.profileImage, + memberNickname = SharedPreferenceManager.nickname, + createdAt = System.currentTimeMillis(), + comment = text + ) + val insertAt = adapter.items.size + adapter.items.add(me) + adapter.notifyItemInserted(insertAt) + binding.rvCommentReply.scrollToPosition(adapter.items.size - 1) + binding.etComment.setText("") + } else { + Toast.makeText( + requireContext(), + resp.message ?: "요청 중 오류가 발생했습니다", + Toast.LENGTH_SHORT + ).show() + } + }, { e -> + Toast.makeText( + requireContext(), + e.message ?: "요청 중 오류가 발생했습니다", + Toast.LENGTH_SHORT + ).show() + }) + compositeDisposable.add(d) } adapter = CharacterCommentReplyAdapter( @@ -134,16 +162,30 @@ class CharacterCommentReplyFragment : BaseFragment { outRect.top = 13.3f.dpToPx().toInt(); outRect.bottom = 12f.dpToPx().toInt() } - adapter.itemCount - 1 -> { outRect.top = 12f.dpToPx().toInt(); outRect.bottom = 13.3f.dpToPx().toInt() } - else -> { outRect.top = 12f.dpToPx().toInt(); outRect.bottom = 12f.dpToPx().toInt() } + 0 -> { + outRect.top = 13.3f.dpToPx().toInt(); outRect.bottom = 12f.dpToPx().toInt() + } + + adapter.itemCount - 1 -> { + outRect.top = 12f.dpToPx().toInt(); outRect.bottom = 13.3f.dpToPx().toInt() + } + + else -> { + outRect.top = 12f.dpToPx().toInt(); outRect.bottom = 12f.dpToPx().toInt() + } } } }) @@ -218,12 +260,16 @@ class CharacterCommentReplyFragment : BaseFragment