159 lines
12 KiB
Markdown
159 lines
12 KiB
Markdown
# 20260225 채널후원 구현
|
|
|
|
## 구현 체크리스트
|
|
- [x] 기존 라이브 후원하기 UI/프로필 섹션 패턴 기준 정리
|
|
- [x] `ExplorerApi`에 채널 후원 GET/POST 엔드포인트 추가 (`/explorer/profile/channel-donation`)
|
|
- [x] `ExplorerRepository`에 채널 후원 목록 조회/등록 메서드 추가
|
|
- [x] `Sources/Explorer/Profile/ChannelDonation`에 화면/뷰모델/아이템 파일 추가
|
|
- [x] 크리에이터 채널(`UserProfileView`)에 채널 후원 섹션 추가 (제목 + 전체보기 + 가로 리스트)
|
|
- [x] 채널 후원하기 버튼 UI 적용 (배경 `#525252`, radius 16, 좌측 선물 아이콘)
|
|
- [x] 후원 아이템 UI 적용 (프로필/닉네임/시간/내용, 캔 텍스트 색상 구분)
|
|
- [x] `createdAt` UTC -> 기기 타임존 상대시간(`OO분전/OO시간전/OO일전`) 변환 적용
|
|
- [x] 채널 후원 전체보기 별도 페이지 추가 및 라우팅 연결
|
|
- [x] 채널 후원 UI 문자열 국제화(`I18n`) 적용
|
|
- [x] 검증 수행 (`lsp_diagnostics`, 빌드, 테스트) 및 결과 기록
|
|
|
|
## 검증 기록
|
|
- 무엇: 채널 후원 API/섹션/전체보기/아이템 UI/시간 변환/국제화 적용 후 컴파일 검증
|
|
왜: 요청 기능이 실제 스킴에서 정상 컴파일되는지 확인 필요
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`
|
|
결과: `** BUILD SUCCEEDED **`
|
|
|
|
- 무엇: 개발 스킴 회귀 확인
|
|
왜: 공통 코드 변경이 dev 스킴에도 영향이 없는지 확인 필요
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
|
|
결과: `** BUILD SUCCEEDED **`
|
|
|
|
- 무엇: 테스트 액션 실행 가능 여부 확인
|
|
왜: 저장소 검증 절차에 테스트 명령이 포함됨
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test` 및 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test`
|
|
결과: 두 스킴 모두 `Scheme ... is not currently configured for the test action.`로 실행 불가(테스트 액션 미구성)
|
|
|
|
## 추가 요구사항 반영 체크리스트 (2차)
|
|
- [x] 채널 후원 섹션을 최신 콘텐츠 바로 아래로 이동
|
|
- [x] 후원 데이터가 없을 때 크리에이터 채널 섹션의 `전체보기` 숨김
|
|
- [x] 크리에이터 채널 섹션에서 후원 개수 미표시, 전체보기 페이지에서만 개수 표시
|
|
- [x] 크리에이터 채널 섹션은 별도 채널후원 GET 호출 없이 `GetCreatorProfileResponse.channelDonationList` 사용
|
|
- [x] 문구를 `OO캔을 후원했습니다.` 형태로 통일하고 `OO캔`만 강조 색상 적용
|
|
- [x] 채널 후원 메시지 입력 길이 제한을 100자로 적용(라이브 후원 기본 제한은 유지)
|
|
- [x] 채널 후원 아이템 배경색 규칙을 라이브룸 후원 아이템(캔 수/비밀후원)과 동일하게 적용
|
|
- [x] 후원하기 UI를 중앙 고정 오버레이가 아닌 라이브룸과 동일한 하단 시트 형태로 표시
|
|
- [x] 국제화 문자열(`I18n.MemberChannel.*`) 반영 유지
|
|
|
|
- 무엇: `LiveRoomDonationDialogView`의 `messageLimit` 초기화 충돌 컴파일 오류 수정
|
|
왜: 채널 전용 100자 제한 전달을 위해 init 파라미터를 추가한 뒤 immutable 재할당 오류가 발생함
|
|
어떻게: `let messageLimit: Int = 1000` -> `let messageLimit: Int`로 변경하고 init에서만 초기화
|
|
결과: 컴파일 오류(`immutable value 'self.messageLimit' may only be initialized once`) 해소
|
|
|
|
- 무엇: 2차 반영 이후 기본 스킴 빌드 재검증
|
|
왜: 후원 다이얼로그/프로필 섹션 변경 회귀 여부 확인
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`
|
|
결과: `** BUILD SUCCEEDED **`
|
|
|
|
- 무엇: 2차 반영 이후 dev 스킴 빌드 재검증
|
|
왜: 공통 코드 변경이 `SodaLive-dev`에도 정상 적용되는지 확인
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
|
|
결과: `** BUILD SUCCEEDED **`
|
|
|
|
- 무엇: 2차 반영 이후 테스트 액션 재확인
|
|
왜: 변경 이후 테스트 실행 가능 상태 확인
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test` 및 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test`
|
|
결과: 두 스킴 모두 `Scheme ... is not currently configured for the test action.`로 실행 불가(테스트 액션 미구성)
|
|
|
|
## 추가 요구사항 반영 체크리스트 (3차)
|
|
- [x] 채널 후원 다이얼로그를 `fullScreenCover`가 아닌 라이브룸(`LiveRoomViewV2`)과 동일한 조건부 오버레이 표시 방식으로 변경
|
|
- [x] 채널 후원 아이템 메시지는 서버 응답 원문(`item.message`)을 그대로 사용하고, 해당 메시지 내 `OO캔`만 하이라이트
|
|
- [x] 채널 후원 아이템 메시지를 30자로 말줄임(`...`) 표시
|
|
- [x] 채널 후원 전체보기 페이지에서만 아이템 탭 시 전체 메시지 표시(크리에이터 채널 페이지는 탭 동작 없음)
|
|
|
|
- 무엇: 채널 후원 다이얼로그 표시 방식 수정
|
|
왜: 라이브룸과 동일한 하단 시트형 노출 방식으로 통일 필요
|
|
어떻게: `UserProfileChannelDonationView`에서 `.fullScreenCover` 제거 후 `if isShowDonationDialog { LiveRoomDonationDialogView(...) }` 조건부 오버레이로 변경
|
|
결과: 라이브룸과 동일한 표시 패턴으로 동작
|
|
|
|
- 무엇: 채널 후원 메시지 렌더링 규칙 수정
|
|
왜: `OO캔` 색상 분리 과정에서 서버 메시지 원문이 제거되던 문제 복구 필요
|
|
어떻게: `ChannelDonationItemView`에서 고정 문구 합성 제거, `item.message` 원문 기반 렌더링 + 메시지 내 `\(item.can)캔` 부분만 `#FDCA2F` 하이라이트 적용
|
|
결과: 서버 메시지 원문 유지 + `OO캔`만 강조 표시
|
|
|
|
- 무엇: 30자 말줄임 및 전체보기 탭 확장 동작 적용
|
|
왜: 100자 메시지 도입 후 카드 높이/가독성 요구사항 충족 필요
|
|
어떻게: `ChannelDonationItemView(previewLimit: 30)` 적용, 전체보기(`ChannelDonationAllView`)는 `isShowFullMessageOnTap: true`로 탭 시 전체 메시지 다이얼로그 표시, 크리에이터 채널(`UserProfileChannelDonationView`)은 `isShowFullMessageOnTap: false` 유지
|
|
결과: 크리에이터 채널은 30자 고정 표시, 전체보기는 탭으로 전체 메시지 확인 가능
|
|
|
|
- 무엇: 3차 반영 이후 기본 스킴 빌드 재검증
|
|
왜: 채널 후원 뷰/아이템 렌더링 로직 변경 후 컴파일 회귀 확인
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`
|
|
결과: `** BUILD SUCCEEDED **`
|
|
|
|
- 무엇: 3차 반영 이후 dev 스킴 빌드 재검증
|
|
왜: 동일 변경이 `SodaLive-dev`에도 정상 반영되는지 확인
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
|
|
결과: `** BUILD SUCCEEDED **`
|
|
|
|
- 무엇: 3차 반영 이후 테스트 액션 재확인
|
|
왜: 변경 이후 테스트 실행 가능 상태 확인
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test` 및 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test`
|
|
결과: 두 스킴 모두 `Scheme ... is not currently configured for the test action.`로 실행 불가(테스트 액션 미구성)
|
|
|
|
## 추가 요구사항 반영 체크리스트 (4차)
|
|
- [x] 스크롤 뷰 영향이 있는 인라인 오버레이 방식 제거
|
|
- [x] `fullScreenCover` 없이 모달 표시로 복원
|
|
- [x] 후원 UI가 화면 전체가 아닌 모달 영역 기준으로 표시되도록 변경
|
|
|
|
- 무엇: 채널 후원 다이얼로그 표시 방식 재수정
|
|
왜: 라이브룸 방식 인라인 오버레이 적용 시 스크롤 컨텍스트 영향으로 UI 표시가 어긋남
|
|
어떻게: `UserProfileChannelDonationView`에서 인라인 `if isShowDonationDialog` 오버레이 제거 후 `.sheet(isPresented:)`로 전환
|
|
결과: `fullScreenCover` 없이 별도 모달 레이어에서 안정적으로 표시
|
|
|
|
- 무엇: 4차 반영 이후 기본 스킴 빌드 재검증
|
|
왜: 표시 방식 변경 후 컴파일 회귀 확인
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`
|
|
결과: `** BUILD SUCCEEDED **`
|
|
|
|
## 추가 요구사항 반영 체크리스트 (5차)
|
|
- [x] 채널 후원 전체 리스트에서 말줄임 메시지 탭 시 AlertDialog 대신 아이템 내부에서 전체 내용 확장
|
|
|
|
- 무엇: 전체보기 메시지 확장 동작 변경
|
|
왜: 탭 시 팝업 표시가 아닌 아이템 내부 확장 표시 요구
|
|
어떻게: `ChannelDonationItemView`에서 `SodaDialog` 오버레이 제거, `isExpanded` 상태로 말줄임 텍스트를 인라인 전체 텍스트로 확장
|
|
결과: 전체보기 페이지에서 탭 시 해당 아이템 내에서 전체 메시지가 그대로 표시
|
|
|
|
## 추가 요구사항 반영 체크리스트 (6차)
|
|
- [x] `LiveRoomDonationDialogView` 표시 책임을 `UserProfileChannelDonationView`에서 `UserProfileView`로 이동
|
|
- [x] 라이브룸(`LiveRoomViewV2`)과 동일하게 상위 View의 `ZStack` 조건부 렌더링으로 후원 다이얼로그 표시
|
|
|
|
- 무엇: 채널 후원 다이얼로그 표시 위치/책임 변경
|
|
왜: 하위 섹션 뷰가 아닌 프로필 루트 뷰에서 라이브룸과 동일 패턴으로 제어하기 위함
|
|
어떻게: `UserProfileChannelDonationView`는 `onTapDonationButton` 콜백만 전달하도록 단순화하고, `UserProfileView`에서 `isShowChannelDonationDialog` 상태와 `ChannelDonationViewModel`로 `LiveRoomDonationDialogView`를 `if` 조건부 렌더링
|
|
결과: `UserProfileView`가 후원 다이얼로그 표시와 후원 API 호출을 직접 제어
|
|
|
|
- 무엇: 6차 반영 이후 기본 스킴 빌드 재검증
|
|
왜: 다이얼로그 표시 책임 이전 후 컴파일 회귀 확인
|
|
어떻게: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`
|
|
결과: `** BUILD SUCCEEDED **`
|
|
|
|
## 추가 요구사항 반영 체크리스트 (7차)
|
|
- [x] 채널 후원 아이템 시간 표시를 `GetCommunityPostListResponse` 상대시간 규칙으로 정렬
|
|
|
|
- 무엇: 채널 후원 시간 문자열 계산 로직 수정
|
|
왜: 기존 채널 후원 시간 표시가 커뮤니티와 다르게 표시되어 사용자 기대와 불일치
|
|
어떻게: `GetChannelDonationListItem.relativeTimeText`에서 `DateParser.parse(createdAt)` 기반으로 파싱하고, `GetCommunityPostListResponse.relativeTimeText`와 동일하게 연/월/방금 전/분/시간/일 단위로 계산
|
|
결과: 채널 후원 시간 표시가 커뮤니티 포스트와 동일 기준으로 노출
|
|
|
|
## 추가 요구사항 반영 체크리스트 (8차)
|
|
- [x] 서버 `ISO_LOCAL_DATE_TIME`(`yyyy-MM-dd'T'HH:mm:ss`) 응답 포맷 파싱 지원
|
|
|
|
- 무엇: 공통 날짜 파서 포맷 확장
|
|
왜: 서버가 Kotlin `ISO_LOCAL_DATE_TIME`으로 시간을 내려줄 때 기존 파서가 실패해 상대 시간 계산이 깨짐
|
|
어떻게: `DateParser`의 파서 체인에 `yyyy-MM-dd'T'HH:mm:ss` 포맷(`DF.isoLocalDateTime`) 추가
|
|
결과: 채널 후원 `createdAt`이 `ISO_LOCAL_DATE_TIME`이어도 커뮤니티 게시물과 동일한 상대 시간으로 정상 표시
|
|
|
|
## 추가 요구사항 반영 체크리스트 (9차)
|
|
- [x] 채널 후원 메시지 내 `OO캔` 하이라이트가 천 단위 comma(`1,000캔`)에도 적용되도록 수정
|
|
|
|
- 무엇: 채널 후원 메시지 하이라이트 토큰 탐색 로직 수정
|
|
왜: 기존 로직이 `\(item.can)캔`만 찾고 있어 서버 메시지에 comma가 포함되면 강조 색상이 적용되지 않음
|
|
어떻게: `ChannelDonationItemView.highlightedMessageText`에서 `\(item.can.comma())캔` 우선, 실패 시 `\(item.can)캔` 순서로 range 탐색
|
|
결과: `1,000캔`/`1000캔` 모두 `OO캔` 구간에 강조 색상(`FDCA2F`) 정상 적용
|