25 KiB
PRD: 크리에이터 채널 팬Talk 탭
1. Overview
크리에이터 채널 공통 shell의 팬Talk 탭에서 팬이 남긴 응원글 목록과 크리에이터 답글을 제공한다. 상단 title bar, header, sticky tab-bar는 기존 크리에이터 채널 홈/라이브/오디오/시리즈/후원 구현을 재사용하고, tab-bar 아래 콘텐츠만 팬Talk 탭 전용 API 응답으로 구성한다.
API는 GET /api/v2/creator-channels/{creatorId}/fan-talks를 사용한다. creatorId는 path variable이며, query parameter는 page, size를 사용한다. 기본값은 page=0, size=20이다.
Figma 참조:
- 전체 화면:
290:9139,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=290-9139&m=dev - 아이템 뷰(답글 없음):
290:9145,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=290-9145&m=dev - 아이템 뷰(답글 있음):
290:9147,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=290-9147&m=dev - 더보기 anchored context popup:
666:36114,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=666-36114&m=dev - Empty:
290:9001,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=290-9001&m=dev - 글 입력(입력 값 없음, 키보드 있음):
290:9235,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=290-9235&m=dev - 글 입력(입력 값 있음, 키보드 있음):
290:9282,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=290-9282&m=dev - 글 입력(입력 값 있음, 키보드 없음):
290:9290,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=290-9290&m=dev - 입력 종료 모달:
308:19046,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=308-19046&m=dev - 공용 모달(버튼 1개):
567:17662,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=567-17662&m=dev - 공용 모달(버튼 2개):
567:17666,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=567-17666&m=dev - 공용 모달 dimmed 포함:
567:17712,https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=567-17712&m=dev
2. Problem
- 현재
CreatorChannelTab.fanTalk은 placeholder로 표시되어 팬Talk 목록을 확인할 수 없다. - 기존 홈 탭에는 최신 팬Talk 요약만 있고, 팬Talk 탭 전용 목록 API, 페이징, 답글 표시, 신고/삭제 액션이 없다.
- 기존 프로필 FanTalk 구현은 구 API와 구 UI 구조를 사용하므로 V2 크리에이터 채널 탭에 그대로 붙이기 어렵다.
- 팬Talk 탭의 글쓰기 floating button과 empty state
응원 남기기버튼이 실제 글 입력 화면으로 연결되지 않는다. - 내가 쓴 팬Talk의
수정하기액션이 실제 수정 화면으로 연결되지 않는다. - V2 화면에서 재사용할 수 있는 Figma 기준 액션 모달이 없어 입력 종료 안내 모달을 일관되게 표시하기 어렵다.
3. Goals
CreatorChannelTab.fanTalk선택 시 팬Talk 탭 API를 호출하고 응답 데이터로 화면을 구성한다.- 기본 query는
page=0,size=20이다. - sort-bar에는 정렬 UI 없이
전체 {fanTalkCount}만 표시한다. - 팬Talk item은 Figma
290:9145,290:9147기준으로 작성자 프로필, 닉네임, 상대 시간, 본문, 답글 목록을 표시한다. - 답글이 있으면 Figma처럼 좌측 라인과 답글 카드 영역을 표시한다.
- 다른 유저의 글에는
신고버튼만 표시하고, 기존UserProfileView의 응원글 신고 기능과 동일하게CheersReportDialogView및ReportType.CHEERS흐름을 사용한다. - 내가 쓴 글 또는 내 채널의 타인 글에는 우측 액션으로
ic_new_more더보기 버튼을 표시한다. - 내가 쓴 글의 더보기 메뉴에는 공용
I18n문구 기준의수정,삭제액션을 표시한다. - 내가 쓴 글이 아니지만 내 채널인 경우 더보기 메뉴에는 공용
I18n문구 기준의삭제액션만 표시한다. 삭제액션은 기존 FanTalk에서 사용하던 삭제 API와 동일하게ExplorerRepository.modifyCheers(..., isActive: false)를 사용한다.fanTalkCount == 0이면 Figma empty view(290:9001)를 표시한다.- 내 채널인 경우 우측하단 글쓰기 floating button과 empty view 내부
응원 남기기버튼을 모두 표시하지 않는다. - 크리에이터 채널 팬Talk 탭의 우측하단 plus button과 empty state
응원 남기기버튼에서 팬Talk 글 입력 화면으로 진입한다. - 팬Talk 글 입력 화면은 입력 값 없음, 입력 값 있음, 키보드 없음 상태를 Figma 기준으로 표시한다.
- 입력 값이 없으면 보내기 버튼을 비활성화하고, 입력 값이 있으면 보내기 버튼을 활성화한다.
- 입력 값이 있는 상태에서 취소 버튼을 터치하면 입력 종료 안내 모달을 표시한다.
- 입력 종료 안내 모달은 V2 공용 액션 모달로 구현해 제목, 안내 문구, 버튼 1, 버튼 2의 label/action을 바꿔 재사용할 수 있게 한다.
- 팬Talk 작성과 수정은 이번에 작성하는 같은 쓰기 페이지에서 수행한다.
- 작성/수정 API는 기존 팬Talk API인
ExplorerRepository.writeCheers와ExplorerRepository.modifyCheers를 사용한다.
4. Non-Goals
- 크리에이터 채널 공통 shell, header, sticky tab-bar 동작을 다시 설계하지 않는다.
- 팬Talk 작성/수정용 새 API endpoint를 만들지 않는다.
- 신고 API나 신고 dialog를 새로 만들지 않는다.
- 삭제 API를 새로 만들지 않고 기존 FanTalk 삭제 흐름을 재사용한다.
- 기존 구 UI
SodaDialog를 V2 공용 모달로 대체하는 전역 리팩터링은 하지 않는다. - 신고 사유 선택 UI인
CheersReportDialogView는 기존 신고 플로우 재사용 범위로 유지하고, 이번 V2 popup dialog 전환 대상에서 제외한다. - Figma localhost asset URL을 앱 코드에 직접 사용하지 않는다.
Pods/**,generated/**,build/**는 수정하지 않는다.
5. Core Requirements
5.1 API
- Method:
GET - Path:
/api/v2/creator-channels/{creatorId}/fan-talks - Path parameter:
creatorId
- Query parameters:
page: 기본값0size: 기본값20
- 응답 래퍼는 기존 패턴대로
ApiResponse<CreatorChannelFanTalkTabResponse>로 디코딩한다.
data class CreatorChannelFanTalkTabResponse(
val fanTalkCount: Int,
val fanTalks: List<CreatorChannelFanTalkResponse>,
val page: Int,
val size: Int,
@JsonProperty("hasNext")
val hasNext: Boolean
)
data class CreatorChannelFanTalkResponse(
val fanTalkId: Long,
val writerId: Long,
val writerNickname: String,
val writerProfileImageUrl: String,
val content: String,
val createdAtUtc: String,
val creatorReplies: List<CreatorChannelFanTalkReplyResponse>
)
data class CreatorChannelFanTalkReplyResponse(
val fanTalkId: Long,
val writerId: Long,
val writerNickname: String,
val writerProfileImageUrl: String,
val content: String,
val createdAtUtc: String
)
- Kotlin
Long은 기존 V2 모델 관례대로 SwiftInt로 선언한다. CreatorChannelFanTalkResponse는 홈 탭 모델과 이름이 충돌하므로 홈 탭 모델명을 변경하거나 팬Talk 탭 모델명을 분리해 컴파일 충돌을 피한다.
5.2 Count bar
- 팬Talk 탭 sort-bar는 정렬이 없고 전체 개수만 포함한다.
- 좌측에
전체과fanTalkCount를 표시한다. - 우측 정렬 버튼, 정렬 아이콘, 정렬 context popup, BottomSheet는 표시하지 않는다.
- 후원 탭의
CreatorChannelDonationCountBar와 같은 시각 규칙을 사용하되 FanTalk 전용 이름으로 분리하거나 공용화한다.
5.3 FanTalk item
- item 전체 배경은
Color.black, 하단 separator는Color.gray800기준을 사용한다. - item padding은 Figma 기준 14pt를 사용한다.
- 작성자 프로필 이미지는 42pt 원형으로 표시한다.
- 작성자 닉네임은 14pt medium, 작성 시간은 14pt regular와
Color.gray500으로 표시한다. - 본문은 16pt regular,
Color.white, 좌측 50pt inset으로 표시한다. - 본문과 답글은 서버 응답의 문자열을 그대로 표시한다.
- 작성 시간은 기존 프로젝트의 상대 시간 표시 helper를 우선 재사용한다.
- 이미지 로딩은 기존 V2 관례대로
DownsampledKFImage또는 Kingfisher 기반 컴포넌트를 사용한다.
5.4 Creator replies
creatorReplies가 비어 있으면 답글 영역을 표시하지 않는다.creatorReplies가 있으면 각 답글을 Figma290:9147기준으로 표시한다.- 답글 카드 배경은
Color.gray900, radius는 14pt, padding은 14pt를 사용한다. - 답글 작성자 프로필은 20pt 원형으로 표시하고 닉네임과 상대 시간을 한 줄에 표시한다.
- 답글 본문은 16pt regular,
Color.white로 표시한다. - 답글 영역 왼쪽에는 Figma처럼 세로 라인을 표시한다.
5.5 Item action rules
- 현재 로그인 사용자의 id는 기존 관례대로
UserDefaults.int(forKey: .userId)를 사용한다. isMine = fanTalk.writerId == currentUserId.isOwnCreatorChannel은CreatorChannelView에서 계산한 값을 주입한다.isMine || isOwnCreatorChannel이면 우측에ic_new_more더보기 버튼을 표시한다.!isMine && !isOwnCreatorChannel이면 우측에신고버튼만 표시한다.- 더보기 버튼을 터치하면 Figma
666:36114기준 anchored context popup을 표시한다. - 팬Talk 목록과 답글 상세의 anchored context popup은 동일한 공용 popup 컴포넌트를 사용한다.
- 팬Talk 목록 row의 anchored context popup은
수정하기,삭제하기문구를 표시한다. - 내가 쓴 글이면
수정하기,삭제하기액션을 표시한다. - 내가 쓴 글이 아니지만 내 채널이면
삭제하기액션만 표시한다. 수정하기액션을 터치하면 이번에 작성하는 팬Talk 쓰기 페이지를 수정 모드로 연다.삭제하기액션은 확인 dialog 후 기존 삭제 API를 호출한다.
5.6 Report and delete
- 신고 버튼을 터치하면 기존 크리에이터 페이지의 응원글 신고와 동일하게
CheersReportDialogView를 표시한다. - 신고 confirm 시
ReportRequest(type: .CHEERS, cheersId: fanTalkId, reason: reason)흐름을 사용한다. - 삭제 confirm dialog는 기존
I18n.MemberChannel.cheersDeleteTitle,I18n.Common.confirmDeleteQuestion,I18n.Common.delete,I18n.Common.cancel을 재사용한다. - 삭제 confirm dialog는
SodaV2ActionModal을 사용한다. - 팬Talk 탭 목록의 삭제 confirm dialog는 스크롤되는 탭 내부가 아니라
CreatorChannelView의 상위 wrappingZStack에서 표시한다. - 삭제 API는 기존 FanTalk 삭제 흐름과 동일하게
ExplorerRepository.modifyCheers(cheersId: fanTalkId, content: nil, isActive: false)를 호출한다. - 삭제 성공 후 팬Talk 탭 첫 페이지를 다시 조회한다.
5.7 Empty and writing button
fanTalkCount == 0이면 Figma290:9001기준 empty view를 표시한다.- Empty 문구는
아직 응원이 없습니다.\n처음으로 크리에이터를 응원해 보세요!를 표시한다. - Empty view에는
+아이콘과응원 남기기텍스트가 있는 capsule button을 표시한다. - 단, 내 채널인 경우 empty view 내부
응원 남기기버튼을 표시하지 않는다. fanTalkCount > 0이면 홈 탭 plus button 위치에 글쓰기 floating button을 표시한다.- 단, 내 채널인 경우 글쓰기 floating button을 표시하지 않는다.
- 글쓰기 floating button은
CreatorChannelFloatingActionMenu내부floatingButton과 동일한 66pt 원형 버튼, 38pt 아이콘,Color.soda400배경을 사용한다. - 동일 UI를 중복 구현하지 않기 위해
SodaLive/Sources/V2/CreatorChannel/Components/**아래에 공용 icon floating button을 분리하고,CreatorChannelFloatingActionMenu와 팬Talk 글쓰기 floating button이 이를 재사용한다. - 글쓰기 floating button에는 plus 아이콘만 표시하고 텍스트는 표시하지 않는다.
- 글쓰기 버튼 tap action은 이번에 작성하는 팬Talk 쓰기 페이지의 작성 모드로 연결한다.
5.8 Pagination
- 첫 진입 시
page=0,size=20으로 조회한다. - 다음 페이지 로딩 중 중복 호출을 막는다.
- 마지막 item이 화면에 나타났고
hasNext == true이면page + 1을 조회한다. - 다음 페이지 성공 시 기존
fanTalks뒤에 append한다. - 첫 페이지 재조회 시 기존 목록을 교체한다.
5.9 FanTalk write/modify entry
- 쓰기 페이지는 크리에이터 채널 팬Talk 탭에서 진입한다.
- 진입 경로는
fanTalkCount > 0일 때 표시되는 우측하단 plus button과fanTalkCount == 0일 때 empty state에 표시되는응원 남기기버튼이다. - 내가 쓴 글의 더보기 메뉴에서
수정하기액션을 터치하면 같은 쓰기 페이지를 수정 모드로 연다. - 수정 모드로 진입할 때는 수정 대상
fanTalkId와 기존 글 content를 반드시 함께 전달한다. - 내 채널인 경우 기존 규칙대로 plus button과 empty state
응원 남기기버튼을 모두 표시하지 않으므로 작성 모드로 진입할 수 없다. - 쓰기 route는
AppStep에 추가하고creatorId, 작성/수정 mode, 수정 대상fanTalkId, 초기 content,onSuccess를 전달할 수 있게 한다. - 작성 모드에서는
fanTalkId와 초기 content를 전달하지 않거나 비어 있는 값으로 전달한다. - 수정 모드에서는
fanTalkId가 0보다 커야 하고 초기 content가 기존 글 content와 같아야 한다. - 작성 또는 수정 성공 후
onSuccess로 팬Talk 첫 페이지를 다시 조회한다.
5.10 FanTalk write/modify screen
- 쓰기 화면은 Figma
290:9235,290:9282,290:9290을 기준으로 한다. - Figma
290:9235,290:9282는 키보드가 올라와 있는 상태를 기준으로 한다. - 화면 진입 시 입력 영역에 focus를 주어 키보드가 올라오게 한다.
- 작성 모드는 빈 content로 시작한다.
- 수정 모드는 선택한 fanTalk의 기존 content를 입력값으로 채운 상태에서 시작한다.
- 수정 모드의 보내기 API 호출에는 route로 받은
fanTalkId와 현재 입력 content를 사용한다. - 입력 값이 없으면 보내기 버튼을 비활성화한다.
- 입력 값이 있으면 보내기 버튼을 활성화한다.
- 보내기 버튼 활성화 기준은
content.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == false이다. - 키보드가 내려가도 입력 값과 보내기 버튼 활성화 상태는 유지한다.
- 입력 값이 없는 상태에서 취소 버튼을 터치하면 이전 화면으로 닫는다.
- 입력 값이 있는 상태에서 취소 버튼을 터치하면 입력 종료 안내 모달을 표시한다.
5.11 Reusable V2 action modal
- 입력 종료 안내 모달은 Figma
308:19046기준으로 표시한다. - 공용 모달 컴포넌트는 Figma
567:17662,567:17666,567:17712을 기준으로 한다. - 공용 모달은 제목, 안내 문구, button 1, button 2를 외부에서 주입받는다.
- button 1은 오른쪽, button 2는 왼쪽에 표시한다.
- 각 버튼은 label과 action이 모두 있을 때만 표시한다.
- 버튼 1개만 표시할 수 있어야 하며, 버튼 2개 표시도 지원해야 한다.
- Dimmed는 Black, opacity 60%를 사용한다.
- Dimmed tap은 별도 action 없이 모달만 닫는다.
- 저장소 경로 관례에 맞춰 공용 모달은
SodaLive/Sources/V2/Component/Modal/**아래에 둔다.
5.12 FanTalk write/modify submission
- 작성 API는 기존 팬Talk API인
ExplorerRepository.writeCheers(parentCheersId:nil, creatorId:content:)를 사용한다. - 수정 API는 기존 팬Talk API인
ExplorerRepository.modifyCheers(cheersId:content:isActive:)를 사용하고,content에는 수정한 입력값을 전달하며isActive는nil로 전달한다. - 작성 또는 수정 성공 시 쓰기 화면을 닫고 팬Talk 탭 첫 페이지를 재조회한다.
- 작성 또는 수정 실패 시 기존 V2 화면 관례대로 toast 또는 오류 팝업을 표시한다.
6. Success Criteria
- 팬Talk 탭 진입 시
GET /api/v2/creator-channels/{creatorId}/fan-talks?page=0&size=20가 호출된다. - count bar에는
전체 {fanTalkCount}만 표시되고 정렬 버튼/아이콘/popup은 표시되지 않는다. - 답글이 없는 item은 Figma
290:9145와 같은 정보 구조로 표시된다. - 답글이 있는 item은 Figma
290:9147처럼 좌측 라인과 답글 카드가 표시된다. - 타인의 글이면서 내 채널이 아니면
신고버튼만 표시되고 신고 confirm 시 기존 응원글 신고 API가 호출된다. - 내가 쓴 글은
ic_new_more버튼과수정하기,삭제하기메뉴를 표시한다. - 내가 쓴 글이 아니지만 내 채널이면
ic_new_more버튼과삭제하기메뉴만 표시한다. - 팬Talk 목록과 답글 상세의 anchored context popup은 동일한 공용 popup 컴포넌트를 사용한다.
- 삭제 confirm dialog는
SodaV2ActionModal로 표시된다. - 팬Talk 탭 목록의 삭제 confirm dialog는
CreatorChannelView상위 wrappingZStack에서 표시되어 긴 목록 스크롤 위치와 무관하게 화면 기준으로 중앙 표시된다. - 삭제 confirm 시 기존 FanTalk 삭제 API가 호출되고 성공 후 첫 페이지가 갱신된다.
fanTalkCount == 0이면 Figma290:9001empty view가 표시된다.- 내 채널인 경우 empty view 내부
응원 남기기버튼과 우측하단 글쓰기 floating button이 모두 표시되지 않는다. fanTalkCount > 0이고 내 채널이 아니면 우측하단 글쓰기 floating button이 표시된다.fanTalkCount > 0이고 내 채널이 아니면 우측하단 글쓰기 floating button tap 시 팬Talk 글 입력 화면으로 이동한다.fanTalkCount == 0이고 내 채널이 아니면 empty state응원 남기기버튼 tap 시 팬Talk 글 입력 화면으로 이동한다.- 팬Talk 글 입력 화면은 입력 값이 없을 때 보내기 버튼을 비활성화한다.
- 팬Talk 글 입력 화면은 입력 값이 있을 때 보내기 버튼을 활성화한다.
- 입력 값이 있는 상태에서 취소 버튼을 터치하면 입력 종료 안내 모달이 표시된다.
- 입력 종료 안내 모달의 dimmed를 터치하면 모달만 닫히고 입력 화면과 입력 값은 유지된다.
- 작성 성공 후 팬Talk 탭 첫 페이지가 다시 조회된다.
- 내가 쓴 글의
수정하기액션 tap 시 같은 팬Talk 쓰기 페이지가 수정 모드로 열린다. - 수정 모드 진입 시 수정 대상
fanTalkId와 기존 글 content가 함께 전달된다. - 수정 모드는 선택한 fanTalk의 기존 content를 입력값으로 표시한다.
- 수정 성공 후 팬Talk 탭 첫 페이지가 다시 조회된다.
7. Technical Constraints
- 기능 변경은
SodaLive/Sources/V2/CreatorChannel/**하위에서 해결한다. - 팬Talk 탭 전용 View, ViewModel, Repository, API, 모델은
SodaLive/Sources/V2/CreatorChannel/FanTalk/**아래에 둔다. - 우측하단 icon floating button은 팬Talk 전용 컴포넌트로 중복 생성하지 않고
CreatorChannelFloatingActionMenu의 privatefloatingButton패턴을 공용 컴포넌트로 추출해 재사용한다. - 팬Talk 작성/수정 공용 쓰기 View와 ViewModel은
SodaLive/Sources/V2/CreatorChannel/FanTalk/Write/**아래에 둔다. - V2 공용 액션 모달은
SodaLive/Sources/V2/Component/Modal/**아래에 둔다. - 삭제 API 재사용을 위해 기존
ExplorerRepository.modifyCheers를 호출할 수 있다. - 작성 API 재사용을 위해 기존
ExplorerRepository.writeCheers를 호출한다. - 수정 API 재사용을 위해 기존
ExplorerRepository.modifyCheers를 호출한다. - 신고 기능 재사용을 위해 기존
ReportRepository,ReportRequest,CheersReportDialogView를 사용한다. CheersReportDialogView는 신고 사유 선택 전용 UI이므로 이번 확인형 V2 popup dialog 전환 범위에서 제외한다.- 신규 문구가 필요하면
SodaLive/Sources/I18n/I18n.swift에 ko/en/ja를 추가한다. - 프로젝트 설정 변경은 신규 Swift 파일 target 등록이 필요한 경우에만 수행한다.
8. Assumptions
- 신규 API의
fanTalkId는 기존 신고/삭제 API가 요구하는cheersId와 동일한 식별자로 사용할 수 있다. - 기존
ExplorerRepository.writeCheers와ExplorerRepository.modifyCheers는 이번 팬Talk 작성/수정 API로 사용한다.
9. Open Questions
- 해당 없음
10. Verification Notes
-
2026-07-04: Figma
get_design_context와get_screenshot으로290:9139,290:9145,290:9147,666:36114,290:9001을 확인했다. -
2026-07-04:
CreatorChannelView, 후원 탭 구현, 기존UserProfileFanTalkViewModel,UserProfileFanTalkCheersItemView,UserProfileView의 신고/삭제 흐름을 확인했다. -
2026-07-06: 사용자 요청에 따라 Swift 구현 없이 PRD에 팬Talk 글 입력 화면 Figma URL(
290:9235,290:9282,290:9290), 입력 종료 모달(308:19046), 공용 모달(567:17662,567:17666,567:17712)과 요구사항을 추가했다. -
2026-07-06:
rg "290:9235|290:9282|290:9290|308:19046|567:17662|567:17666|567:17712|SodaV2ActionModal|ExplorerRepository.writeCheers" docs/20260704_크리에이터_채널_팬Talk_탭/prd.md docs/20260704_크리에이터_채널_팬Talk_탭/plan-task.md로 Figma node, 공용 모달, 기존 작성 API 재사용 방침이 문서에 포함된 것을 확인했다. -
2026-07-06:
git diff --check -- docs/20260704_크리에이터_채널_팬Talk_탭/prd.md docs/20260704_크리에이터_채널_팬Talk_탭/plan-task.md실행 결과 출력 없이 종료되어 공백 오류가 없음을 확인했다. -
2026-07-06: 사용자 요청에 따라 팬Talk 작성/수정 모두 같은 쓰기 페이지에서 수행하고, 작성/수정 API는 기존 팬Talk API(
ExplorerRepository.writeCheers,ExplorerRepository.modifyCheers)를 사용하도록 PRD를 보완했다. -
2026-07-06:
rg "작성/수정|쓰기 페이지|수정 모드|작성 모드|ExplorerRepository.writeCheers|ExplorerRepository.modifyCheers|modifyCheers\\(cheersId:fanTalkId, content:content, isActive:nil\\)|creatorChannelFanTalkWrite|showFanTalkModifyView" docs/20260704_크리에이터_채널_팬Talk_탭/prd.md docs/20260704_크리에이터_채널_팬Talk_탭/plan-task.md로 작성/수정 공용 쓰기 페이지와 기존 팬Talk API 사용 방침을 확인했다. -
2026-07-06:
rg -n "no-op|수정 페이지는|수정 mutation|작성용 새 API|재사용 가능 여부|불가능한 것이 확인|미결정 사항|수정하기 tap은 수정 페이지" docs/20260704_크리에이터_채널_팬Talk_탭/prd.md docs/20260704_크리에이터_채널_팬Talk_탭/plan-task.md실행 결과 매칭이 없어 이전 충돌 문구가 남지 않았음을 확인했다. -
2026-07-06: 사용자 확인에 따라 수정 모드 진입 시 수정 대상
fanTalkId와 기존 글 content를 반드시 함께 전달하도록 PRD를 보완했다. -
2026-07-06:
rg '수정 모드.*fanTalkId|fanTalkId.*기존 글 content|fanTalkId.*초기 content|fanTalkId.*initialContent|기존 content.*content 초기값|수정 대상.*fanTalkId.*기존 글 content|fanTalkId.*0보다 커야' docs/20260704_크리에이터_채널_팬Talk_탭/prd.md docs/20260704_크리에이터_채널_팬Talk_탭/plan-task.md로 수정 모드 route에fanTalkId와 기존 글 content를 함께 전달한다는 조건을 확인했다. -
2026-07-07: 사용자 후속 요청에 따라 팬Talk row 더보기의 삭제 확인 dialog는 팬Talk 탭 내부가 아니라
CreatorChannelView상위 wrappingZStack에서 표시한다. 삭제 확인 UI는 이번에 추가된 V2 공용 모달SodaV2ActionModal을 사용하며, 팬Talk 리스트와 상세보기의 anchored context popup은 동일한 공용 컴포넌트와 동일한I18n문구를 사용한다. 신고 사유 선택 UI인CheersReportDialogView는 기존 신고 플로우 재사용 범위로 유지하고 이번 확인형 V2 popup dialog 전환 범위에서 제외한다.