# PRD: 크리에이터 채널 커뮤니티 게시물 상세 / 댓글 / 답글 ## 1. Overview 크리에이터 채널 `커뮤니티` 탭에서 게시글 item을 터치하면 게시물 상세 화면으로 진입하고, 게시글 본문과 좋아요, 댓글 목록, 댓글의 답글 목록을 조회/작성/수정/삭제할 수 있게 한다. --- ## 2. Problem - 기존 크리에이터 채널 `커뮤니티` 탭은 게시글 목록만 표시하고 item 터치 시 별도 동작이 없어 게시글 상세로 진입할 수 없다. - 사용자는 게시글 본문, 이미지/오디오, 좋아요 수, 댓글 수, 댓글과 최신 답글을 한 화면에서 확인하고 싶어 한다. - 사용자는 게시글에 좋아요를 누르고, 댓글과 답글을 작성/수정/삭제하고 싶어 한다. - 댓글 작성이 불가능한 게시글에서는 댓글 영역과 입력 영역이 노출되면 안 된다. - 조회용 신규 v2 API 계약과 Figma 기반 UI 요구사항이 별도 문서로 정의되어야 한다. - 2026-08-10 후속 확인에서 홈 커뮤니티 섹션의 유료 미구매 게시글에 하트·댓글 UI가 노출되고, 홈 Response에 고정/댓글 가능 여부가 없어 커뮤니티 탭·상세와 표시 상태가 달라지는 문제가 확인됐다. - 커뮤니티 탭의 유료 미구매 가격 UI와 구매 진입점이 홈·상세와 일치하지 않고, 상세 구매 결과가 커뮤니티 탭에만 반영되어 홈 섹션은 구매 전 상태로 남는다. - 게시글 관리/신고 메뉴가 상세에 없고 목록 item에 별도 액션이 남아 있어, 목록은 상세 이동만 담당하고 구매·관리 액션은 상세에 모으는 정리가 필요하다. - 2026-08-10 구현 확인 후 상세에만 둔 권한별 더보기 메뉴를 홈 커뮤니티 item과 커뮤니티 탭 리스트형에서도 바로 사용할 수 있어야 한다는 후속 요구가 확정됐다. --- ## 3. Goals - 크리에이터 채널 `커뮤니티` 탭 게시글 item 터치 시 게시물 상세 화면으로 진입하는 신규 진입점을 정의한다. - Figma 댓글 가능 + 댓글 있음 `290:9243` 기준으로 게시물 상세 UI 요구사항을 정의한다. - Figma 댓글 불가능 `290:9266` 기준으로 댓글 불가 게시물 상세 UI 요구사항을 정의한다. - Figma 답글 없음 `669:40462`, 답글 있음 `669:40468` 기준으로 댓글 답글 목록 화면 UI 요구사항을 정의한다. - 조회는 신규 v2 endpoint를 사용한다. - 상세: `GET /api/v2/creator-channels/community-posts/{postId}` - 댓글: `GET /api/v2/creator-channels/community-posts/{postId}/comments` - 답글: `GET /api/v2/creator-channels/community-comments/{commentId}/replies` - 상세 응답의 `comments` 필드는 댓글 첫 페이지(`CreatorChannelCommunityCommentsResponse`)를 포함하며, 구현은 서버 계약 필드명을 따른다. - 상세: `postId`, `creatorId`, `creatorNickname`, `creatorProfileUrl`, `createdAtUtc`, `content`, `imageUrl`, `audioUrl`, `price`, `isCommentAvailable`, `existOrdered`, `likeCount`, `commentCount`, `isPinned`, `isLiked`, `comments` - 댓글 페이지: `commentCount`, `comments`, `page`, `size`, `hasNext` - 댓글: `commentId`, `writerId`, `writerProfileImageUrl`, `writerNickname`, `content`, `isSecret`, `createdAtUtc`, `latestReply` - 최신 답글: `commentId`, `writerId`, `writerProfileImageUrl`, `writerNickname`, `content`, `createdAtUtc` - 댓글/답글 조회 query parameter 기본값은 `page=0`, `size=20`으로 둔다. - 댓글 쓰기, 답글 쓰기, 댓글 수정, 댓글 삭제, 좋아요는 기존 `CreatorCommunityRepository`(`/creator-community/*`) API를 그대로 재사용한다. - 댓글 팝업 메뉴는 기존 커뮤니티 댓글과 동일한 팝업 메뉴(`content_comment_option_menu`, `content_comment_option_menu2`)를 사용하되, 메뉴 문구는 `수정하기`, `삭제하기`로 표시한다. - 하트 터치 시 좋아요 API를 호출하고, `isLiked`에 따라 `ic_feed_community_heart_fill`/`ic_feed_community_heart` icon을 표시한다. - 댓글 작성이 불가능한 게시글(`isCommentAvailable == false`)이면 댓글 목록과 하단 입력 영역을 숨긴다. - 하단 댓글/답글 입력 영역은 화면 하단에 고정하고 키보드 표시 여부에 따라 함께 올라오게 한다. - 크리에이터 채널 홈 Response의 커뮤니티 게시글에 `isPinned`, `isCommentAvailable`을 추가하고 홈 섹션의 고정·댓글 표시 상태에 반영한다. - 홈과 커뮤니티 탭의 게시글 card 본문 터치는 상세 이동만 수행하고, 별도 더보기 버튼은 권한별 관리/신고 메뉴를 제공한다. 유료 게시글 구매는 상세에서만 시작한다. - 커뮤니티 탭 리스트형·썸네일형의 유료 미구매 가격 UI를 홈·상세와 같은 잠금/가격 표현으로 통일한다. - 상세·홈·커뮤니티 리스트형 게시글 작성자 영역 우측 끝에 `ic_seemore_vertical` 버튼을 표시하고 작성자/구매 권한에 따라 관리 또는 신고 메뉴를 제공한다. - 상세 구매·수정·삭제·고정 결과가 크리에이터 채널 홈과 커뮤니티 탭에 모두 반영되도록 결과 전파 범위를 확장한다. --- ## 4. Non-Goals - 게시글 작성/수정 화면 및 API는 이번 범위에서 구현하지 않는다(기존 화면 유지). - 유료 게시글 구매(paywall unlock) 흐름은 최초 상세 구현 범위에서는 제외했으나, 2026-07-12 후속 요구사항으로 상세에서 기존 크리에이터 커뮤니티 게시물과 동일한 구매 흐름을 재사용한다. - 팬Talk 상세 화면 자체는 이번 범위에서 구현하지 않는다(답글 화면과 UI만 동일). - 서버 API schema나 endpoint를 새로 정의하지 않는다. - 레거시 커뮤니티/댓글 관련 파일을 직접 수정하지 않는다. - 크리에이터 채널의 다른 탭 UI나 공통 스크롤 구조를 재설계하지 않는다. - v2 패키지 내부 popup dialog는 `kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialog`를 사용한다. - 레거시 커뮤니티 게시글 목록의 구매 동작을 변경하지 않는다. - 커뮤니티 게시글 화면 공통화를 위한 신규 framework, coordinator 또는 범용 abstraction을 추가하지 않는다. --- ## 5. Target Users - 크리에이터 채널 커뮤니티 게시글을 상세히 보고 댓글로 소통하려는 로그인 사용자. - 자신의 채널 게시글/댓글을 관리(수정/삭제)하려는 크리에이터. - `kr.co.vividnext.sodalive.v2` 하위 크리에이터 채널 기능을 구현/유지보수하는 Android 개발자. --- ## 6. User Stories - 사용자는 커뮤니티 탭에서 게시글을 터치해 상세 화면으로 이동하고 싶다. - 사용자는 게시글 상세에서 본문, 이미지/오디오, 좋아요 수, 댓글 수를 확인하고 싶다. - 사용자는 하트를 눌러 게시글에 좋아요를 남기거나 취소하고 싶다. - 사용자는 댓글을 작성하고, 각 댓글의 최신 답글을 확인하고 싶다. - 사용자는 댓글을 터치해 답글 목록 화면으로 이동하고 답글을 작성하고 싶다. - 사용자는 내가 쓴 댓글/답글을 수정하거나 삭제하고 싶다. - 채널 크리에이터는 자신의 채널 댓글/답글을 삭제해 관리하고 싶다. - 사용자는 댓글이 불가능한 게시글에서는 입력창 없이 게시글만 보고 싶다. - 사용자는 홈과 커뮤니티 탭에서 게시글을 터치하면 다른 중간 동작 없이 상세로 이동하고 싶다. - 사용자는 미구매 유료 게시글의 하트·댓글 정보를 홈에서 보지 않고 상세에서 구매하고 싶다. - 사용자는 고정 게시글을 홈 커뮤니티 섹션에서도 구분하고 싶다. - 작성자는 상세에서 자신의 게시글을 수정·삭제·고정/고정 해제하고 싶다. - 일반 사용자는 무료 또는 구매 완료 게시글 상세에서 게시글을 신고하고 싶다. - 작성자는 홈 또는 커뮤니티 리스트에서 자신의 게시글을 수정·삭제·고정/고정 해제하고 싶다. - 일반 사용자는 홈 또는 커뮤니티 리스트의 무료·구매 완료 게시글을 신고하고 싶다. --- ## 7. Core Features ### F0-20260810. 구매 진입점·표시 상태·권한별 메뉴 후속 정리 홈·커뮤니티 탭은 게시글 상태를 일관되게 표시하고 card 본문에서 상세로 이동한다. 구매는 상세에서만 수행하며, 권한별 게시글 관리/신고 메뉴는 상세·홈·커뮤니티 리스트형에서 제공한다. #### Home Response Contract 크리에이터 채널 홈의 `communities`와 `notices`가 사용하는 게시글 Response에 상세와 같은 필드를 추가한다. ```kotlin data class CreatorChannelCommunityPostResponse( // 기존 필드 유지 @SerializedName("isPinned") val isPinned: Boolean, @SerializedName("isCommentAvailable") val isCommentAvailable: Boolean ) ``` #### Home Community Requirements - `isPinned == true`이면 커뮤니티 탭과 같은 고정/공지 표시를 노출한다. - `price > 0 && existOrdered == false`인 유료 미구매 게시글은 하트 icon·좋아요 수·댓글 icon·댓글 수 reaction UI 전체를 숨긴다. - 무료 또는 구매 완료 게시글은 하트 icon과 좋아요 수를 표시한다. - 무료 또는 구매 완료 게시글에서 `isCommentAvailable == true`이면 댓글 icon과 댓글 수를 표시하고, `false`이면 댓글 icon과 댓글 수만 숨긴다. - 게시글 card 본문 터치 액션은 상세 이동만 제공한다. - 홈 커뮤니티 item에서 구매 dialog와 오디오 재생은 시작하지 않는다. - 권한 조건을 만족하는 홈 커뮤니티 item은 작성자 영역 우측 끝의 더보기 버튼으로 관리/신고 메뉴를 시작한다. #### Community Tab Requirements - 리스트형과 썸네일형 card 본문 터치 액션은 상세 이동만 제공한다. - 리스트형 item의 오디오 재생은 제거 상태를 유지하고, 권한 조건을 만족하는 item의 작성자 영역 우측 끝에는 더보기 버튼을 제공한다. - 썸네일형(그리드형)은 작성자 영역이 없으므로 더보기 버튼을 제공하지 않고 상세 이동만 유지한다. - 유료 미구매 게시글 item에서는 구매 dialog를 열지 않는다. - 리스트형과 썸네일형의 유료 미구매 가격 UI를 홈/상세와 같은 `lock icon + cash icon + 금액 capsule` 구조로 통일한다. - 리스트형·썸네일형의 기존 reaction 숨김, 댓글 가능 여부, 고정 표시 정책은 유지한다. #### Detail Purchase and Badge Requirements - 유료 미구매 게시글의 paywall을 터치한 경우에만 기존 `PurchaseCommunityPostDialog`를 표시한다. - 상세 작성자 영역 우측 상단에 표시하던 유료 금액 badge를 제거한다. - 유료 구매 완료 시 표시하던 구매 완료 badge를 제거한다. - paywall 내부의 잠금/가격 표시는 구매 전 구매 진입점이므로 유지한다. - 구매 성공 시 상세를 다시 조회하고 상위 화면에 변경 결과를 반환한다. - 구매 실패 시 잠금 상태를 유지하고 기존 오류 Toast 정책을 따른다. #### Detail More Menu Requirements - `ic_seemore_vertical` 버튼은 title bar가 아니라 게시글 작성자 영역의 우측 끝에 표시한다. - 작성자는 무료/유료 및 구매 여부와 관계없이 더보기 버튼을 표시한다. - 일반 사용자는 무료 게시글 또는 구매 완료 유료 게시글에서 더보기 버튼을 표시한다. - 일반 사용자의 유료 미구매 게시글에서는 더보기 버튼을 숨긴다. - 작성자 메뉴는 기존 `CreatorCommunityPostMenuBottomSheetDialog`를 재사용해 수정, 삭제, 고정/고정 해제를 제공한다. - 일반 사용자 메뉴는 같은 BottomSheet의 신고 메뉴를 제공하고 기존 `CreatorCommunityReportDialog`를 재사용한다. - 수정은 기존 `CreatorCommunityModifyActivity`, 삭제/고정은 기존 `CreatorCommunityRepository` API를 호출한다. - 신고는 기존 `ReportType.COMMUNITY_POST` 흐름을 재사용한다. #### Home and Community List More Menu Requirements - 홈 커뮤니티 item과 커뮤니티 탭 리스트형 item의 작성자 영역 우측 끝에 `ic_seemore_vertical` 버튼을 표시한다. - 작성자 판정은 게시글 `creatorId == SharedPreferenceManager.userId`로 통일한다. - 작성자는 무료/유료 및 구매 여부와 관계없이 더보기 버튼을 표시한다. - 일반 사용자는 무료 게시글 또는 구매 완료 유료 게시글에서 더보기 버튼을 표시한다. - 일반 사용자의 유료 미구매 게시글에서는 더보기 버튼을 숨긴다. - 작성자 메뉴는 기존 `CreatorCommunityPostMenuBottomSheetDialog`를 재사용해 수정, 삭제, 고정/고정 해제를 제공한다. - 일반 사용자 메뉴는 같은 BottomSheet의 신고 메뉴를 제공하고 기존 `CreatorCommunityReportDialog`를 재사용한다. - 수정은 기존 `CreatorCommunityModifyActivity`, 삭제/고정은 기존 `CreatorCommunityRepository`, 신고는 기존 `ReportType.COMMUNITY_POST` 흐름을 재사용한다. - 더보기 버튼 터치는 card의 상세 이동 click으로 전파하지 않고 메뉴만 표시한다. - 커뮤니티 탭 썸네일형(그리드형)은 이번 후속 범위에서 제외한다. #### Change Propagation Requirements - 구매·수정·삭제·고정/고정 해제 성공 시 상세는 `RESULT_OK`를 반환한다. - 수정 복귀와 고정/고정 해제 성공 시 상세를 다시 조회한다. - 삭제 성공 시 `RESULT_OK`를 설정하고 상세를 종료한다. - `CreatorChannelActivity`가 상세의 `RESULT_OK`를 받으면 홈 탭과 커뮤니티 탭을 모두 새로고침한다. - 홈·커뮤니티 리스트 메뉴의 수정·삭제·고정/고정 해제 성공도 홈 탭과 커뮤니티 탭을 모두 새로고침한다. - 신고 결과는 게시글 구매/내용/고정 상태를 바꾸지 않으므로 홈·커뮤니티 탭 새로고침을 발생시키지 않는다. #### Edge Cases - 작성자 응답의 `existOrdered == false`는 작성자의 관리 권한을 제한하지 않는다. - 서버가 유료 미구매 홈 item에 reaction count를 내려줘도 UI에는 표시하지 않는다. - `isCommentAvailable == false`인 무료/구매 완료 홈 item은 좋아요만 표시하고 댓글 UI는 숨긴다. - 상세 메뉴 mutation이 실패하면 상세 상태를 임의 변경하거나 성공 결과를 반환하지 않는다. - 홈·커뮤니티 리스트 메뉴 mutation이 실패하면 현재 목록 상태를 임의 변경하거나 성공 새로고침을 실행하지 않는다. - 더보기 버튼이 숨겨진 유료 미구매 일반 사용자 item은 card 본문 상세 이동만 가능하다. - 다른 화면에서 사용하는 `FeedItem.Community`는 신규 필드 기본값으로 기존 표시 동작을 유지한다. ### F0. 2026-07-12 후속 변경사항 크리에이터 커뮤니티 상세의 오디오/구매 동작을 기존 레거시 목록 UI와 동일한 사용성으로 보정한다. #### Requirements - 상세 게시글에 `audioUrl`과 `imageUrl`이 함께 있으면 `item_creator_community_all.xml`의 `iv_play_or_pause`와 동일하게 이미지 중앙에 play/pause 버튼을 표시한다. - 상세 오디오 버튼은 `btn_audio_content_play`, `btn_audio_content_pause` drawable을 사용한다. - 상세 유료 미구매 게시글의 paywall 가격 영역을 터치하면 기존 `PurchaseCommunityPostDialog`를 표시한다. - 구매 확인 시 기존 `CreatorCommunityRepository.purchaseCommunityPost(postId)` API를 호출하고, 성공 후 상세를 다시 조회해 구매 완료 상태와 본문 미디어를 표시한다. #### Edge Cases - 이미지가 없는 오디오 게시물은 기존 상세의 오디오 텍스트 영역 동작을 유지한다. - 구매 API 실패 시 기존 toast/error 표시 정책을 따른다. --- ### F1. 커뮤니티 게시물 상세 진입 커뮤니티 탭 게시글 item 터치 시 상세 화면으로 이동한다. #### Requirements - 커뮤니티 탭 게시글 item(리스트형/썸네일형) 터치 시 게시물 상세 화면으로 이동한다. - 상세 화면에는 `postId`를 전달한다. - 상세 진입 시 `GET /api/v2/creator-channels/community-posts/{postId}`로 상세를 조회한다. - 로그인 토큰이 없으면 기존 크리에이터 채널 로그인 이동 정책을 따른다. #### Edge Cases - `postId <= 0`이면 상세 화면으로 이동하지 않는다. - 상세 조회 실패 시 기존 toast/error 표시 정책을 따르고 화면을 종료한다. ### F2. 게시물 상세 본문/좋아요 Figma `290:9243`, `290:9266` 기준으로 게시글 본문과 좋아요를 표시한다. #### Requirements - 상단 title-bar에 뒤로가기 버튼을 표시한다. - 게시글 header에 작성자 프로필 이미지(`creatorProfileUrl`), 닉네임(`creatorNickname`), 작성 시간(`createdAtUtc`)을 표시한다. - `createdAtUtc`는 크리에이터 채널 v2 공통 날짜/시간 포맷을 따른다. - 본문(`content`), 이미지(`imageUrl`), 오디오(`audioUrl`)를 표시한다. - 오디오 재생은 기존 `CreatorCommunityMediaPlayerManager`를 재사용한다. - 유료 게시글(`price > 0`)이고 미구매(`existOrdered == false`)이면 Figma paywall(잠금 + 가격) 표시를 따른다. - 유료 게시글 구매 완료 badge는 2026-08-10 후속 요구사항에 따라 표시하지 않는다. - 하트 터치 시 좋아요 API(`communityPostLike(postId)`)를 호출한다. - `isLiked == true`이면 `ic_feed_community_heart_fill`, `false`이면 `ic_feed_community_heart`를 표시한다. - 좋아요 수(`likeCount`)를 하트 옆에 표시한다. - 댓글 가능(`isCommentAvailable == true`)이면 댓글 수(`commentCount`)와 댓글 icon을 함께 표시한다. #### Edge Cases - `imageUrl`/`audioUrl`이 `null`이면 해당 영역을 표시하지 않는다. - 좋아요 API 실패 시 하트 상태와 좋아요 수를 원래 값으로 되돌린다. - 좋아요 중복 호출을 방지한다. ### F3. 댓글 목록 (댓글 가능 게시글) Figma `290:9243` 기준으로 댓글 목록을 표시한다. #### Requirements - `GET /api/v2/creator-channels/community-posts/{postId}/comments`로 댓글을 조회한다(기본 `page=0`, `size=20`). - 상세 조회 성공 후 댓글 endpoint의 첫 페이지(`page=0`, `size=20`)를 최초 댓글 목록으로 사용한다. - 각 댓글 item에 작성자 프로필 이미지, 닉네임, 본문, 작성 시간을 표시한다. - 각 댓글에 `latestReply`가 있으면 댓글 아래에 최신 답글 1개를 중첩 표시한다. - 댓글 또는 최신 답글 영역 터치 시 해당 댓글의 답글 목록 화면으로 이동한다. - 댓글 item 우측 더보기 버튼 터치 시 기존 커뮤니티 댓글 팝업 메뉴를 표시한다. - 내 댓글: `content_comment_option_menu`(수정하기/삭제하기) - 채널 크리에이터가 보는 타인 댓글: `content_comment_option_menu2`(삭제하기 기존 항목) - 일반 타인 댓글: 커뮤니티 댓글 전용 신고 API가 없어 더보기 버튼을 노출하지 않는다. - `hasNext == true`이면 현재 `page + 1` 페이지를 추가 로딩한다. - 상단에 총 댓글 수(`commentCount`)를 표시한다. #### Edge Cases - 댓글이 없으면 댓글 목록 영역을 비운 상태로 표시한다. - 추가 로딩 중 중복 요청을 방지한다. ### F4. 댓글 답글 목록 화면 (팬Talk 상세와 동일 UI) Figma `669:40462`, `669:40468` 기준으로 답글 목록 화면을 표시한다. #### Requirements - 답글 화면에는 `commentId`를 전달한다. - `GET /api/v2/creator-channels/community-comments/{commentId}/replies`로 답글을 조회한다(기본 `page=0`, `size=20`). - 상단 title-bar에 뒤로가기 버튼을 표시한다. - 상단에 부모 댓글(프로필/닉네임/시간/본문/더보기)을 표시한다. - 부모 댓글 아래에 답글 목록을 들여쓰기하여 표시한다. - 각 답글 item에 작성자 프로필 이미지, 닉네임, 본문, 작성 시간, 더보기 버튼을 표시한다. - 답글 item 더보기 버튼은 댓글과 동일한 팝업 메뉴 규칙(내 것: 수정/삭제, 채널 크리에이터가 보는 타인 답글: 삭제, 일반 타인 답글: 미노출)을 따른다. - `hasNext == true`이면 현재 `page + 1` 페이지를 추가 로딩한다. - 하단 입력 영역 placeholder는 `답글을 입력하세요`이다. #### Edge Cases - 답글이 없으면(Figma `669:40462`) 부모 댓글만 표시하고 답글 목록 영역은 비운다. - `commentId <= 0`이면 답글 화면으로 이동하지 않는다. ### F5. 댓글/답글 입력 영역 Figma 기준 하단 고정 입력 영역을 제공한다. #### Requirements - 입력값이 없을 때 placeholder를 표시한다. - 게시물 상세 댓글 입력: `댓글을 입력하세요` - 답글 화면 입력: `답글을 입력하세요` - 글자를 입력하면 전송(쓰기) 버튼을 활성화한다. - 3줄까지는 입력창 높이가 자동 확장된다. - 4줄 이상이면 3줄 높이를 유지하고 vertical scroll로 처리한다. - 입력 영역은 화면 하단에 고정되고 키보드가 올라오면 키보드 위로 함께 올라온다. - 수정 모드 진입 시 하단 입력창에 focus를 주고 키보드를 즉시 표시한다. - 전송 버튼 비활성 상태: `ic_new_arrow_up_gray` icon, 원형 배경, 배경색 `gray_900`. - 전송 버튼 활성 상태: `ic_new_arrow_up_white` icon, 원형 배경, 배경색 `soda_400`. - 게시물 상세에서 전송 시 댓글 쓰기 API(`registerComment(postId, comment)`)를 호출한다. - 답글 화면에서 전송 시 답글 쓰기 API(`registerComment(postId, comment, parentId = commentId)`)를 호출한다. - 작성 성공 시 입력값을 비우고 목록을 새로고침한다. - 작성 또는 수정 API 성공 시 키보드를 내린다. #### Edge Cases - 공백/줄바꿈만 입력한 경우 전송 버튼은 비활성 상태다. - 전송 중 중복 전송을 막는다. - 전송 실패 시 입력값을 유지하고 기존 toast/error 표시 정책을 따른다. ### F6. 댓글/답글 수정·삭제 기존 커뮤니티 댓글 수정/삭제 흐름을 재사용한다. #### Requirements - 팝업 메뉴 `수정하기` 선택 시 별도 입력 Dialog를 띄우지 않고 화면 하단 입력창을 수정 모드로 전환한다. - 수정 모드의 하단 입력창에는 기존 댓글/답글 내용을 채우고, 취소용 X 버튼을 표시한다. - 수정 모드에서 전송 버튼을 누르면 기존 수정 흐름(`modifyComment(commentId, comment = ...)`)을 따른다. - X 버튼을 누르면 수정 모드를 취소하고 입력창을 비운 뒤 일반 작성 모드로 돌아간다. - 팝업 메뉴 `삭제하기` 선택 시 v2 공통 모달(`V2ModalDialog`)로 삭제 확인 후 삭제 흐름(`modifyComment(commentId, isActive = false)`)을 따른다. - 수정/삭제 성공 시 현재 목록(댓글 목록 또는 답글 목록)을 새로고침한다. #### Edge Cases - 삭제 확인 dialog에서 취소 시 아무 동작도 하지 않는다. - 수정 시 변경 내용이 없으면 기존 정책대로 toast를 표시한다. ### F7. 댓글 불가 게시글 처리 Figma `290:9266` 기준으로 댓글 불가 상태를 처리한다. #### Requirements - `isCommentAvailable == false`이면 댓글 목록 영역을 숨긴다. - `isCommentAvailable == false`이면 하단 댓글 입력 영역을 숨긴다. - 댓글 불가 게시글에서도 하트(좋아요)는 표시한다. - 댓글 불가 게시글에서는 댓글 수/댓글 icon을 표시하지 않는다. #### Edge Cases - 댓글 불가 게시글에서는 댓글 관련 API(`comments` 조회, 댓글 쓰기)를 호출하지 않는다. --- ## 8. UX / UI Expectations - 게시글 item 터치부터 상세 진입까지 자연스럽게 이어진다. - 홈과 커뮤니티 탭의 게시글 card 본문은 상세 이동만 수행하고, 별도 더보기 버튼은 권한별 관리/신고 메뉴만 제공한다. 구매·재생은 제공하지 않는다. - 홈·커뮤니티 탭 리스트형·썸네일형·상세의 유료 미구매 가격은 동일한 잠금/가격 capsule 구조로 표시한다. - 상세·홈·커뮤니티 리스트형 `ic_seemore_vertical` 버튼은 게시글 작성자 영역 우측 끝에 정렬하고 닉네임·작성 시간과 겹치지 않게 한다. - 커뮤니티 상세 상단 게시글 영역은 목록 카드처럼 rounded 배경을 깔지 않고, 게시글과 댓글 영역 및 댓글 사이에는 Figma `290:9243` 기준 1dp border를 표시한다. - 하트 상태와 좋아요 수는 터치 즉시 반응한다(낙관적 업데이트 후 실패 시 롤백). - 입력 영역은 키보드 있음/없음 상태를 기준으로 자연스럽게 대응한다. - 답글 화면은 팬Talk 상세와 시각적으로 동일하게 보인다. - 전송 버튼 활성/비활성 색상과 icon은 입력값 변화에 즉시 반응한다. - 댓글 불가 게시글은 입력 영역/댓글 영역 없이 게시글 본문 중심으로 표시된다. --- ## 9. Technical Constraints - Android XML View/ViewBinding 기반으로 구현한다. - 신규 Activity/Fragment/ViewModel 및 하위 코드는 `kr.co.vividnext.sodalive.v2.creator.channel.community` 하위에 작성한다. - 조회용 신규 v2 endpoint는 v2 API/Repository 계약(`ApiResponse`, RxJava3, Koin)을 따른다. - 댓글 쓰기/답글 쓰기/수정/삭제/좋아요는 기존 `CreatorCommunityRepository`를 호출해 재사용한다(레거시 파일 직접 수정 금지). - 댓글 팝업 메뉴는 기존 `content_comment_option_menu`, `content_comment_option_menu2` 리소스를 재사용하고, 문구는 `수정하기`, `삭제하기`로 표시한다. - 커뮤니티 댓글/답글 신고는 현재 전용 신고 API/레거시 흐름이 없어 이번 구현 범위에서 제외하고, 기존 레거시 메뉴2의 실제 동작인 채널 크리에이터 삭제만 재사용한다. - 신규 문자열은 `values`, `values-en`, `values-ja`에 추가하거나 기존 문자열을 재사용한다. - 오디오 재생은 기존 `CreatorCommunityMediaPlayerManager`를 재사용한다. - 홈 커뮤니티 표시는 기존 `FeedCommunityView`와 `FeedItem.Community`를 기본값 기반으로 최소 확장하며 다른 feed 호출부의 기존 동작을 유지한다. - 상세·홈·커뮤니티 리스트형 게시글 메뉴는 기존 `CreatorCommunityPostMenuBottomSheetDialog`, `CreatorCommunityReportDialog`, `CreatorCommunityModifyActivity`, `CreatorCommunityRepository`를 호출해 사용하고 레거시 파일은 수정하지 않는다. - 홈·커뮤니티 리스트형 메뉴 실행과 mutation은 `CreatorChannelActivity`의 공용 처리 흐름을 사용하고 화면별 중복 mutation 구현이나 신규 범용 coordinator를 추가하지 않는다. - UI 자동 테스트는 Response/mapper/presentation/routing/result 전파 로직만 검증하고 View 크기·간격·constraint·visibility 속성을 직접 검증하지 않는다. --- ## 10. Metrics - 별도 분석 이벤트 추가는 이번 범위에서 정의하지 않는다. - 기능 성공 기준은 게시글 상세 진입, 댓글/답글 조회, 좋아요/댓글/답글 작성·수정·삭제가 정상 동작하고 목록에 반영되는 것이다. - 2026-08-10 후속 성공 기준은 홈 Response 신규 필드가 고정/댓글 UI에 반영되고, 미구매 유료 홈 item reaction이 숨겨지며, card 본문은 상세 이동만 수행하고 권한별 더보기 메뉴가 상세·홈·커뮤니티 리스트형에 표시되며, 구매·메뉴 결과가 홈과 커뮤니티 탭에 반영되는 것이다. - UI 완료 기준은 Figma `290:9243`, `290:9266`, `669:40462`, `669:40468`의 주요 layout 구조, 하트/전송 버튼 상태, 댓글 불가 처리, 입력 영역 동작이 구현 화면에 반영되었는지 확인되는 것이다. - 자동 검증 기준은 조회 API 계약(page/size 기본값, 응답 매핑), 하트 icon/전송 버튼 상태 계약, 댓글 불가 게시글의 댓글/입력 영역 숨김 계약과 홈 신규 Response 필드, 잠금·댓글·핀 표시 조건, 상세·홈·커뮤니티 리스트형 더보기 권한, 결과 전파를 local unit test로 확인하는 것이다. --- ## 11. Open Questions & Decisions - 결정(2026-08-10, 목록 더보기 후속): 상세와 동일한 권한별 더보기 메뉴를 홈 커뮤니티 item과 커뮤니티 탭 리스트형에 적용한다. 작성자 영역이 없는 커뮤니티 그리드형은 제외한다. - 결정(2026-08-10, 목록 click): card 본문은 상세 이동, 더보기 버튼은 메뉴 표시로 분리하며 더보기 touch는 상세 이동으로 전파하지 않는다. - 결정(2026-08-10, 구현 구조): 홈·커뮤니티 리스트형은 `CreatorChannelActivity`의 공용 메뉴/mutation 흐름을 사용하고 기존 상세 메뉴 구현은 유지한다. - 결정(2026-08-10, 더보기 권한): 작성자는 구매 여부와 관계없이 관리 메뉴를 표시하고, 일반 사용자는 무료 또는 구매 완료 게시글에서만 신고 메뉴를 표시한다. - 결정(2026-08-10, 가격 UI): 커뮤니티 탭 리스트형과 썸네일형 모두 홈/상세의 잠금/가격 capsule 표현을 따른다. - 결정(2026-08-10, 홈 고정 표시): 홈 Response의 `isPinned`를 홈 커뮤니티 item 고정 표시에 사용한다. - 결정(2026-08-10, 문서 연속성): 상세 구매 후속 요구사항을 포함하는 기존 문서에 이번 홈/탭/상세 정리 범위를 이어서 기록한다. - 결정(재사용 vs 복사): 답글 목록 화면 UI는 팬Talk 상세와 동일하지만 조회 API가 다르고, 현재 팬Talk 상세 화면은 v2에 미구현이다. 따라서 이번 범위에서는 **커뮤니티 전용 답글 화면으로 신규 구현하되, layout XML과 댓글/답글 item view(ViewHolder)만 데이터/콜백 주입형으로 설계해 재사용 가능하게 둔다.** ViewModel/Repository/데이터 모델/화면 컨트롤러는 커뮤니티 전용으로 분리한다. - 근거: 아직 팬Talk 상세라는 두 번째 사용처가 없어 지금 데이터 계층까지 공통 추상화하면 단일 사용처를 위한 추측성 추상화가 된다. UI 리소스/item view만 공용화하면 추후 팬Talk 상세 구현 시 동일 UI를 그대로 재사용할 수 있다. - 남은 확인: 없음.