From 051ce614b42171d512fa4d1563dff211e838df7e Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Thu, 8 Oct 2026 14:13:55 +0900 Subject: [PATCH] =?UTF-8?q?docs(gift):=20=EC=84=A0=EB=AC=BC=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=EC=9D=84=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/20261006_선물_UI_추가/prd.md | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/20261006_선물_UI_추가/prd.md b/docs/20261006_선물_UI_추가/prd.md index 8ba9bf2d..c3ed4596 100644 --- a/docs/20261006_선물_UI_추가/prd.md +++ b/docs/20261006_선물_UI_추가/prd.md @@ -85,7 +85,7 @@ ```text 크리에이터 상세 선물 보내기 버튼 - -> GiftSendView(recipientMemberId, recipientCreatorNickname) + -> GiftSendView(recipientMemberId, recipientCreatorNickname, recipientCreatorProfileImageUrl) -> success replace GiftDetailView(applicationNo) 마이 탭 @@ -102,6 +102,7 @@ GiftDetailView(applicationNo) -> inline recipient address form when recipientAddressRequired=true DeepLink GIFT_DETAIL(applicationNo) +DeepLink gift-detail/applicationNo -> GiftDetailView(applicationNo) ``` @@ -116,6 +117,7 @@ DeepLink GIFT_DETAIL(applicationNo) | `GIFT-001` | 확정 | 크리에이터 상세에 `선물 보내기` 버튼을 표시한다. | 내 채널이 아니고 `creator.isDmAvailable == true`, 한국 접속, `LanguageHeaderProvider.current == "ko"`일 때만 표시된다. | `P1-T3` | | `GIFT-002` | 확정 | 마이 탭 카테고리 그리드 첫 항목에 `선물함`을 표시한다. | `ic_my_present` 아이콘과 `선물함` 텍스트가 보관함 앞에 표시된다. | `P1-T4` | | `GIFT-003` | 확정 | 기존 inert action을 실제 선물 화면 이동으로 교체한다. | `선물 보내기`는 신청 화면, `선물함`은 리스트 화면으로 이동한다. | `P2-T3` | +| `GIFT-004` | 확정 | 크리에이터 채널의 `선물 보내기` 버튼을 흰색 capsule로 표시한다. | `ic_send_gift`가 문구 왼쪽에 표시되고 배경은 흰색, 문구는 검은색이며 기존 노출 조건과 이동 동작은 유지된다. | `P11-T3` | ### 8.2 선물 보내기 신청 @@ -128,6 +130,7 @@ DeepLink GIFT_DETAIL(applicationNo) | `SEND-005` | 확정 | 필수 입력/동의가 충족될 때만 CTA를 활성화한다. | 미충족 상태에서는 `POST /api/v2/gifts`를 호출하지 않는다. submit 중 중복 탭이 방지된다. | `P3-T3` | | `SEND-006` | 확정 | 신청 성공 후 상세 화면으로 이동한다. | 응답의 `applicationNo`로 `GiftDetailView`를 replace 방식으로 열고 뒤로가기로 입력 폼에 돌아가지 않는다. | `P3-T4` | | `SEND-007` | 확정 | 보내는 사람 이름과 휴대폰 번호를 제한한다. | 이름은 한글·영문 1~12자이며 한글 조합 중 임시 문자열을 확정값으로 덮어쓰지 않는다. 휴대폰은 편집 중 ASCII 숫자 최대 11자, 제출 시 `010`으로 시작하는 정확히 11자리만 허용한다. | `P10-T1`~`P10-T4` | +| `SEND-008` | 확정 | 크리에이터 채널에서 받은 프로필 이미지 URL을 선물 보내기 화면까지 전달한다. | 받는 크리에이터 영역에 전달받은 프로필 이미지가 표시되며 기존 닉네임과 `recipientMemberId` 전달은 유지된다. | `P11-T2` | ### 8.3 선물함 리스트 @@ -183,6 +186,8 @@ DeepLink GIFT_DETAIL(applicationNo) | `COMMON-003` | 확정 | 푸시 딥링크는 `deepLinkValue=GIFT_DETAIL`, `deepLinkId=applicationNo`를 사용한다. | 딥링크 진입 시 상세 API를 먼저 호출하고 응답으로 UI를 결정한다. | `P8-T1` | | `COMMON-004` | 확정 | API 실패는 기존 오류 노출 방식을 사용한다. | 입력값과 스크롤 상태를 불필요하게 초기화하지 않는다. | 각 Phase Gate | | `COMMON-005` | 확정 | 선물 상세의 전달 불가 `선물 정책 확인`은 약관 `(필수)` 링크와 같은 페이지로 이동한다. | 발신·수신 상세 모두 `GiftConstants.termsURL`을 시스템 브라우저로 연다. | `P2-R3`, `P5-T4`, `P7-T4` | +| `COMMON-006` | 확정 | `voiceon://gift-detail/{applicationNo}`와 `voiceon-test://gift-detail/{applicationNo}` 경로형 딥링크를 지원한다. | `gift-detail` 뒤 첫 path component를 신청번호로 사용해 기존 `GiftDetailView(applicationNo)`로 이동하며 scheme별 별도 분기는 추가하지 않는다. | `P11-T1` | +| `COMMON-007` | 확정 | 파손 면책 동의 `(필수)`는 별도 파손 정책 페이지로 이동한다. | `requiresDamageWaiver=true`인 동의 행의 `(필수)`만 `https://app.notion.com/p/3f227b3596738018ba5dea2e5205293b`를 열고 기존 sender/recipient 약관 링크는 유지한다. | `P11-T2` | ## 9. 반응형 기능 범위 @@ -288,12 +293,15 @@ DeepLink GIFT_DETAIL(applicationNo) ### 14.1 기능 수용 기준 - [ ] 선물 보내기 진입 시 전달받은 닉네임과 `memberId`가 화면/API에 연결된다. +- [ ] 선물 보내기 진입 시 전달받은 크리에이터 프로필 이미지 URL이 받는 크리에이터 영역에 표시된다. - [ ] 필수 입력/동의 누락 시 신청 API를 호출하지 않는다. - [ ] `requiresDamageWaiver=true` 카테고리에서만 파손 면책 동의가 표시되고 필수다. - [ ] 신청 성공 후 `applicationNo` 상세로 replace 이동하고 뒤로가기로 입력 폼에 돌아가지 않는다. - [ ] 선물함 리스트는 `type=ALL` 한 번 조회와 `direction` 카드 분기를 사용한다. - [ ] Figma의 `신청 내역`, `선물 내역` 섹션 타이틀이 노출되지 않는다. - [ ] 리스트 item, 푸시 딥링크, 신청 완료 이동이 같은 상세 조회 플로우를 사용한다. +- [ ] 양 앱 scheme의 `gift-detail/{applicationNo}` 경로형 딥링크가 같은 상세 조회 플로우를 사용한다. +- [ ] 파손 면책 `(필수)`는 파손 정책 페이지를 열고 기존 약관 `(필수)` 링크는 기존 페이지를 유지한다. - [ ] 상세 progress는 `statusTimeline` 5단계를 사용한다. - [ ] 운송장 등록과 배송지 입력 성공 후 상세를 재조회해 최신 상태를 표시한다. - [ ] 신청 취소는 확인 dialog 이후에만 API를 호출하고 성공 시 취소 완료 UI로 replace 된다. @@ -319,13 +327,13 @@ DeepLink GIFT_DETAIL(applicationNo) | 요구사항 범위 | API Contract | 계획 Phase | 자동 검증 | 수동 검증 | |---|---|---:|---|---| -| `GIFT-001~003` | 해당 없음 | 1, 2 | Debug build | 진입점 표시/이동 | -| `SEND-001~007` | §11.2 | 2, 3, 10 | ViewModel validation/build | 선물 신청 journey | +| `GIFT-001~004` | 해당 없음 | 1, 2, 11 | Debug build/source check | 진입점 표시/이동·버튼 UI | +| `SEND-001~008` | §11.2 | 2, 3, 10, 11 | ViewModel validation/build/source check | 선물 신청 journey·프로필 이미지 | | `LIST-001~005` | §11.2 | 2, 4 | pagination/build | 선물함 상태별 화면 | | `DETAIL-001~006` | §11.2 | 2, 5 | status mapping/build | 보낸 상세/취소 | | `TRACK-001~007` | §11.2 | 2, 6, 10 | validation/build | 운송장 등록·신청 취소 | | `RECV-001~007` | §11.2 | 2, 7, 10 | privacy/validation/build | 받은 상세/배송지 | -| `COMMON-001~004` | §11.2 | 2, 8 | deeplink parsing/build | 푸시/딥링크 | +| `COMMON-001~007` | §11.2 | 2, 8, 11 | deeplink parsing/link source/build | 푸시/딥링크·약관 링크 | ## 17. Decision Log @@ -340,6 +348,10 @@ DeepLink GIFT_DETAIL(applicationNo) | 2026-10-06 | `DEC-007` | 확정 | 선물함에서 받은 선물의 배송지 미입력 상태는 별도 파란 배너가 아니라 각 item 카드에서 표시한다. | 사용자 정정 요청 | `LIST-004`, `P4-T3` | | 2026-10-06 | `DEC-008` | 확정 | 운송장 등록 화면의 `신청 취소`는 입력 중단이 아니라 선물 신청 취소이며, 확인 이후 기존 취소 API를 호출한다. | 사용자 선택 | `TRACK-006`, `P6-T2`, `P6-T3` | | 2026-10-08 | `DEC-009` | 확정 | 휴대폰 제출은 `010`으로 시작하는 ASCII 숫자 11자리만 허용하고, 운송장 번호는 ASCII 숫자 10~14자리만 제출한다. | 사용자 선택과 현행 국내 이동전화 번호체계 조사 | `SEND-007`, `TRACK-007`, `RECV-007`, Phase 10 | +| 2026-10-08 | `DEC-010` | 정정 | `DEC-003`의 아이콘 없는 버튼 결정을 정정해 `ic_send_gift`, 흰색 배경, 검은색 문구를 적용한다. | 사용자 요청 및 설계 승인 | `GIFT-004`, `P11-T3` | +| 2026-10-08 | `DEC-011` | 확정 | 경로형 선물 상세 딥링크는 `gift-detail/{applicationNo}`를 사용하고 `voiceon`, `voiceon-test`는 기존 scheme 지원만 재사용한다. | 사용자 제공 딥링크 예시 및 설계 승인 | `COMMON-006`, `P11-T1` | +| 2026-10-08 | `DEC-012` | 확정 | 파손 면책 `(필수)`에만 별도 파손 정책 URL을 사용하고 기존 약관 링크는 유지한다. | 사용자 제공 URL 및 설계 승인 | `COMMON-007`, `P11-T2` | +| 2026-10-08 | `DEC-013` | 확정 | Gift 모듈의 브랜드 문구는 이미 모두 `소다라이브`이므로 추가 문자열 변경 없이 충족 처리한다. | 코드 검색 결과와 사용자 선택 A | Phase 11 | ## 18. 변경 관리 @@ -360,6 +372,14 @@ DeepLink GIFT_DETAIL(applicationNo) - 운송장 번호는 편집 중 ASCII 숫자 최대 14자를 허용하고 제출 시 10~14자리만 허용한다. 외부 택배 조회와 실재 운송장 검증은 제외한다. - 기존 request, repository, API, 택배사 선택, mutation/navigation lifecycle과 선물 사이즈 선택은 변경하지 않는다. +### Phase 11 선물 딥링크·정책 링크·크리에이터 표시 보정 (2026-10-08 확정) + +- 기존 딥링크 parser에 `gift-detail/{applicationNo}` path route만 추가하고 query형 `GIFT_DETAIL`과 scheme 판정은 유지한다. +- 크리에이터 채널의 기존 `creator.profileImageUrl`을 선물 보내기 route와 화면에 전달하며 별도 크리에이터 조회 API는 추가하지 않는다. +- 공용 약관 행은 호출부가 링크 URL을 지정할 수 있게 최소 확장하고 파손 면책 행에만 새 정책 URL을 전달한다. +- 선물 보내기 버튼은 기존 노출 조건과 action을 유지하면서 사용자 제공 `ic_send_gift` asset, 흰색 배경, 검은색 문구를 적용한다. +- Gift 모듈의 브랜드 문구는 이미 `소다라이브`로 확인되어 변경하지 않는다. + - 요구사항 변경 시 Decision Log에 정정 행을 추가한다. - 구현 범위가 바뀌면 이 PRD를 먼저 갱신하고 `plan-task.md`의 Phase/Task를 갱신한 뒤 코드를 수정한다. - 기존 완료된 Phase 1 기록은 삭제하지 않는다.