From 6916459c9e9550fec67015a0035b0f412ba60db6 Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 9 Jul 2026 07:43:53 +0900 Subject: [PATCH] =?UTF-8?q?feat(creator-channel):=20FanTalk=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EB=AA=A8=EB=8D=B8=EC=9D=84=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreatorChannelFanTalkDetailUiModels.kt | 101 ++++++++++++++++++ app/src/main/res/values-en/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 4 files changed, 104 insertions(+) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/detail/CreatorChannelFanTalkDetailUiModels.kt diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/detail/CreatorChannelFanTalkDetailUiModels.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/detail/CreatorChannelFanTalkDetailUiModels.kt new file mode 100644 index 00000000..52395b08 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/detail/CreatorChannelFanTalkDetailUiModels.kt @@ -0,0 +1,101 @@ +package kr.co.vividnext.sodalive.v2.creator.channel.fantalk.detail + +import android.os.Parcelable +import androidx.annotation.StringRes +import kotlinx.parcelize.Parcelize +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.v2.creator.channel.fantalk.model.CreatorChannelFanTalkReplyUiModel +import kr.co.vividnext.sodalive.v2.creator.channel.fantalk.model.CreatorChannelFanTalkRightAction +import kr.co.vividnext.sodalive.v2.creator.channel.fantalk.model.CreatorChannelFanTalkUiModel + +@Parcelize +data class CreatorChannelFanTalkDetailPayload( + val fanTalkId: Long, + val writerId: Long, + val writerNickname: String, + val writerProfileImageUrl: String, + val content: String, + val createdAtText: String, + val reply: CreatorChannelFanTalkDetailReplyPayload?, + val showEdit: Boolean, + val showDelete: Boolean +) : Parcelable { + fun toUiModel(): CreatorChannelFanTalkUiModel = CreatorChannelFanTalkUiModel( + fanTalkId = fanTalkId, + writerId = writerId, + writerNickname = writerNickname, + writerProfileImageUrl = writerProfileImageUrl, + content = content, + createdAtText = createdAtText, + reply = reply?.toUiModel(), + rightAction = CreatorChannelFanTalkRightAction.OwnerMore(showEdit = showEdit, showDelete = showDelete) + ) +} + +@Parcelize +data class CreatorChannelFanTalkDetailReplyPayload( + val fanTalkId: Long, + val writerId: Long, + val writerNickname: String, + val writerProfileImageUrl: String, + val content: String, + val createdAtText: String +) : Parcelable { + fun toUiModel(): CreatorChannelFanTalkReplyUiModel = CreatorChannelFanTalkReplyUiModel( + fanTalkId = fanTalkId, + writerId = writerId, + writerNickname = writerNickname, + writerProfileImageUrl = writerProfileImageUrl, + content = content, + createdAtText = createdAtText + ) +} + +fun CreatorChannelFanTalkUiModel.toFanTalkDetailPayload(): CreatorChannelFanTalkDetailPayload { + val ownerMore = rightAction as? CreatorChannelFanTalkRightAction.OwnerMore + return CreatorChannelFanTalkDetailPayload( + fanTalkId = fanTalkId, + writerId = writerId, + writerNickname = writerNickname, + writerProfileImageUrl = writerProfileImageUrl, + content = content, + createdAtText = createdAtText, + reply = reply?.toFanTalkDetailReplyPayload(), + showEdit = ownerMore?.showEdit == true, + showDelete = ownerMore?.showDelete == true + ) +} + +fun CreatorChannelFanTalkReplyUiModel.toFanTalkDetailReplyPayload(): CreatorChannelFanTalkDetailReplyPayload { + return CreatorChannelFanTalkDetailReplyPayload( + fanTalkId = fanTalkId, + writerId = writerId, + writerNickname = writerNickname, + writerProfileImageUrl = writerProfileImageUrl, + content = content, + createdAtText = createdAtText + ) +} + +data class CreatorChannelFanTalkReplacementModalUiModel( + @StringRes val titleResId: Int = R.string.screen_user_profile_reply_edit, + @StringRes val descriptionResId: Int = R.string.creator_channel_fantalk_reply_replace_description, + @StringRes val cancelResId: Int = R.string.cancel, + @StringRes val confirmResId: Int = R.string.confirm +) + +sealed interface CreatorChannelFanTalkDetailEditTarget { + data class Reply(val replyFanTalkId: Long) : CreatorChannelFanTalkDetailEditTarget +} + +sealed interface CreatorChannelFanTalkDetailUiState { + data class Content( + val parentFanTalk: CreatorChannelFanTalkUiModel, + val reply: CreatorChannelFanTalkReplyUiModel?, + val replyInput: String = "", + val isSubmitting: Boolean = false, + val editingTarget: CreatorChannelFanTalkDetailEditTarget? = null + ) : CreatorChannelFanTalkDetailUiState { + val isSendEnabled: Boolean = replyInput.trim().isNotEmpty() && !isSubmitting + } +} diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 7b71a160..1761cc7a 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1018,6 +1018,7 @@ Edit reply Submit Write a reply + The existing reply will be replaced with the new reply.\nDo you want to edit it? Follower list All Invalid request.\ntry again. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 7b3bcbbf..ba2bbf52 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1018,6 +1018,7 @@ 返信修正 投稿 返信を書く + 既存の返信が新しい返信に置き換えられます。\n修正しますか? フォロワーリスト 無効なリクエストです。\n恐れ入りますが、もう一度お試しください。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5e73da2e..7e5a9950 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1017,6 +1017,7 @@ 답글 수정 등록 답글 쓰기 + 기존 답글이 신규 답글로 대체됩니다.\n수정하시겠어요? 팔로워 리스트 전체 잘못된 요청입니다.\n다시 시도해 주세요.