fix(fantalk): 신고 문구와 빈 상태 표시를 수정한다

This commit is contained in:
Yu Sung
2026-08-26 15:11:55 +09:00
parent 32ca4e121a
commit 05b86bf314
5 changed files with 131 additions and 10 deletions

View File

@@ -30,14 +30,16 @@ Figma 참조:
- 팬Talk 쓰기 화면의 취소 문구가 고정된 가로·세로 크기에 배치되어 언어에 따라 글자가 잘릴 수 있다.
- 팬Talk 쓰기 입력 영역에 placeholder가 없어 사용자가 입력 목적을 바로 알기 어렵다.
- 화면에 최대 글자 수 `500`이 표시되지만 실제 입력과 전송 가능 상태에는 상한이 적용되지 않는다.
- 팬Talk item의 `신고` 버튼이 한국어 문자열로 고정되어 영어·일본어 앱 설정을 따르지 않는다.
- `fanTalkCount == 0`인 empty 상태에서도 count bar가 `전체 0`으로 표시된다.
## 3. Goals
- `CreatorChannelTab.fanTalk` 선택 시 팬Talk 탭 API를 호출하고 응답 데이터로 화면을 구성한다.
- 기본 query는 `page=0`, `size=20`이다.
- sort-bar에 정렬 UI 없이 `전체 {fanTalkCount}` 표시다.
- `fanTalkCount > 0`일 때만 sort-bar에 정렬 UI 없이 `전체 {fanTalkCount}` 표시하고, empty 상태에서는 count bar 전체를 숨긴다.
- 팬Talk item은 Figma `290:9145`, `290:9147` 기준으로 작성자 프로필, 닉네임, 상대 시간, 본문, 답글 목록을 표시한다.
- 답글이 있으면 Figma처럼 좌측 라인과 답글 카드 영역을 표시한다.
- 다른 유저의 글에는 `신고` 버튼만 표시하고, 기존 `UserProfileView`의 응원글 신고 기능과 동일하게 `CheersReportDialogView``ReportType.CHEERS` 흐름을 사용한다.
- 다른 유저의 글에는 기존 `I18n.Explorer.report`를 사용하는 다국어 `신고` 버튼만 표시하고, 기존 `UserProfileView`의 응원글 신고 기능과 동일하게 `CheersReportDialogView``ReportType.CHEERS` 흐름을 사용한다.
- 내가 쓴 글 또는 내 채널의 타인 글에는 우측 액션으로 `ic_new_more` 더보기 버튼을 표시한다.
- 내가 쓴 글의 더보기 메뉴에는 공용 `I18n` 문구 기준의 `수정`, `삭제` 액션을 표시한다.
- 내가 쓴 글이 아니지만 내 채널인 경우 더보기 메뉴에는 공용 `I18n` 문구 기준의 `삭제` 액션만 표시한다.
@@ -113,7 +115,8 @@ data class CreatorChannelFanTalkReplyResponse(
### 5.2 Count bar
- 팬Talk 탭 sort-bar는 정렬이 없고 전체 개수만 포함한다.
- 좌측에 `전체` `fanTalkCount`를 표시한다.
- `fanTalkCount > 0`일 때만 좌측에 `전체` `fanTalkCount`를 표시한다.
- `fanTalkCount == 0`인 empty 상태에서는 `CreatorChannelFanTalkCountBar` 전체를 표시하지 않는다.
- 우측 정렬 버튼, 정렬 아이콘, 정렬 context popup, BottomSheet는 표시하지 않는다.
- 후원 탭의 `CreatorChannelDonationCountBar`와 같은 시각 규칙을 사용하되 FanTalk 전용 이름으로 분리하거나 공용화한다.
@@ -140,7 +143,7 @@ data class CreatorChannelFanTalkReplyResponse(
- `isMine = fanTalk.writerId == currentUserId`.
- `isOwnCreatorChannel``CreatorChannelView`에서 계산한 값을 주입한다.
- `isMine || isOwnCreatorChannel`이면 우측에 `ic_new_more` 더보기 버튼을 표시한다.
- `!isMine && !isOwnCreatorChannel`이면 우측에 `신고` 버튼만 표시한다.
- `!isMine && !isOwnCreatorChannel`이면 우측에 `I18n.Explorer.report`를 사용하는 `신고` 버튼만 표시한다.
- 더보기 버튼을 터치하면 Figma `666:36114` 기준 anchored context popup을 표시한다.
- 팬Talk 목록과 답글 상세의 anchored context popup은 동일한 공용 popup 컴포넌트를 사용한다.
- 팬Talk 목록 row의 anchored context popup은 `수정하기`, `삭제하기` 문구를 표시한다.
@@ -241,17 +244,17 @@ data class CreatorChannelFanTalkReplyResponse(
## 6. Success Criteria
- 팬Talk 탭 진입 시 `GET /api/v2/creator-channels/{creatorId}/fan-talks?page=0&size=20`가 호출된다.
- count bar에 `전체 {fanTalkCount}`만 표시되고 정렬 버튼/아이콘/popup은 표시되지 않는다.
- `fanTalkCount > 0`이면 count bar에 `전체 {fanTalkCount}`만 표시되고 정렬 버튼/아이콘/popup은 표시되지 않는다.
- 답글이 없는 item은 Figma `290:9145`와 같은 정보 구조로 표시된다.
- 답글이 있는 item은 Figma `290:9147`처럼 좌측 라인과 답글 카드가 표시된다.
- 타인의 글이면서 내 채널이 아니면 `신고` 버튼만 표시되고 신고 confirm 시 기존 응원글 신고 API가 호출된다.
- 타인의 글이면서 내 채널이 아니면 앱 언어에 맞는 `I18n.Explorer.report` 버튼만 표시되고 신고 confirm 시 기존 응원글 신고 API가 호출된다.
- 내가 쓴 글은 `ic_new_more` 버튼과 `수정하기`, `삭제하기` 메뉴를 표시한다.
- 내가 쓴 글이 아니지만 내 채널이면 `ic_new_more` 버튼과 `삭제하기` 메뉴만 표시한다.
- 팬Talk 목록과 답글 상세의 anchored context popup은 동일한 공용 popup 컴포넌트를 사용한다.
- 삭제 confirm dialog는 `SodaV2ActionModal`로 표시된다.
- 팬Talk 탭 목록의 삭제 confirm dialog는 `CreatorChannelView` 상위 wrapping `ZStack`에서 표시되어 긴 목록 스크롤 위치와 무관하게 화면 기준으로 중앙 표시된다.
- 삭제 confirm 시 기존 FanTalk 삭제 API가 호출되고 성공 후 첫 페이지가 갱신된다.
- `fanTalkCount == 0`이면 Figma `290:9001` empty view가 표시된다.
- `fanTalkCount == 0`이면 count bar 없이 Figma `290:9001` empty view가 표시된다.
- Empty 문구와 작성 버튼이 지정된 ko/en/ja 값 및 줄바꿈으로 표시된다.
- 내 채널인 경우 empty view 내부 `응원남기기` 버튼과 우측하단 글쓰기 floating button이 모두 표시되지 않는다.
- `fanTalkCount > 0`이고 내 채널이 아니면 우측하단 글쓰기 floating button이 표시된다.
@@ -282,6 +285,7 @@ data class CreatorChannelFanTalkReplyResponse(
- 작성 API 재사용을 위해 기존 `ExplorerRepository.writeCheers`를 호출한다.
- 수정 API 재사용을 위해 기존 `ExplorerRepository.modifyCheers`를 호출한다.
- 신고 기능 재사용을 위해 기존 `ReportRepository`, `ReportRequest`, `CheersReportDialogView`를 사용한다.
- item의 `신고` 버튼 문구는 신규 키를 만들지 않고 기존 `I18n.Explorer.report`를 재사용한다.
- `CheersReportDialogView`는 신고 사유 선택 전용 UI이므로 이번 확인형 V2 popup dialog 전환 범위에서 제외한다.
- 신규 문구가 필요하면 `SodaLive/Sources/I18n/I18n.swift`에 ko/en/ja를 추가한다.
- Empty 문구와 `응원남기기` 버튼은 View에 직접 작성하지 않고 기존 크리에이터 채널 I18n 구조의 `pick(ko:en:ja:)` 값으로 관리한다.
@@ -317,6 +321,8 @@ data class CreatorChannelFanTalkReplyResponse(
- 2026-08-25: 기존 `CreatorChannelFanTalkWriteView`, `CreatorChannelFanTalkWriteViewModel`, `I18n.CreatorChannelFanTalk`을 확인했으며, 이번 작업에서는 요구사항 문서만 갱신하고 Swift 구현은 수행하지 않았다.
- 2026-08-25: Phase 12를 구현해 ko/en/ja placeholder, 500자 입력 제한, 500자 초과 예외 표시·전송 비활성화, 취소 문구의 고정 frame 제거를 적용했다. `§5.10`과 성공 기준의 관련 항목을 코드 및 정적 계약과 대조해 누락이 없음을 확인했다.
- 2026-08-25: Swift 499·500·501자 경계 검사, `git diff --check`, `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`를 실행했고 `** BUILD SUCCEEDED **`를 확인했다. 사용자 요청에 따라 visual QA와 시뮬레이터 수동 검증은 수행하지 않았다.
- 2026-08-26: `CreatorChannelFanTalkTabView`, `CreatorChannelFanTalkCountBar`, `CreatorChannelFanTalkListItem`과 기존 `I18n.Explorer.report`를 정적 확인했다. empty 상태의 count bar 숨김과 item 신고 문구 다국어 요구사항만 문서에 반영했으며 Swift 구현과 빌드는 수행하지 않았다.
- 2026-08-26: Phase 13을 구현해 `I18n.Explorer.report`와 양수 count bar 조건을 적용했다. 정적 계약, `git diff --check`, `SodaLive-dev` Debug 빌드와 독립 사양·품질 리뷰가 통과했다. PRD에는 체크박스가 없으며 `§3`, `§5.2`, `§5.5`, `§6`, `§7`, `DEC-FANTALK-BUG-001~002`의 구현 누락이 없음을 대조했다. 사용자 요청에 따라 visual QA와 실제 화면 수동 검증은 수행하지 않았다.
## 11. Decision Log
@@ -325,3 +331,5 @@ data class CreatorChannelFanTalkReplyResponse(
| 2026-08-25 | `DEC-FANTALK-WRITE-001` | 확정 | 500자까지 허용하고 501번째 이후 사용자 입력은 반영하지 않는다. 이미 500자를 초과한 content는 별도 예외 상태로 유지한다. | 사용자 인터뷰 A안 선택 | `§5.10`, Phase 12 |
| 2026-08-25 | `DEC-FANTALK-WRITE-002` | 확정 | 500자 초과 예외 상태에서는 메시지 본문과 현재 글자 수를 `Color.red400`으로 표시하고 보내기 버튼을 비활성화한다. | 사용자 인터뷰 C안 선택 | `§5.10`, Phase 12 |
| 2026-08-25 | `DEC-FANTALK-WRITE-003` | 확정 | 취소 문구의 고정 `width: 64`, `height: 56`만 제거하고 내비게이션 높이 `56`과 보내기 capsule 높이 `44`는 유지한다. | 사용자 인터뷰 A안 선택 | `§5.10`, Phase 12 |
| 2026-08-26 | `DEC-FANTALK-BUG-001` | 확정 | 타인 item의 `신고` 버튼은 기존 `I18n.Explorer.report`를 사용한다. | 사용자 직접 요청과 동일 문구의 기존 I18n 확인 | `§3`, `§5.5`, `§6`, 후속 계획 |
| 2026-08-26 | `DEC-FANTALK-BUG-002` | 확정 | `fanTalkCount == 0`인 empty 상태에서는 count bar 전체를 숨긴다. | 사용자 직접 요청 | `§3`, `§5.2`, `§5.7`, `§6`, 후속 계획 |