Skip to content

feat(community): Try 업로드 페이지 /request/try 및 CTA 라우트 정합 #25

@cocoyoon

Description

@cocoyoon

목표

TryGallerySection CTA가 이동하는 /request/try?parent=<uuid> 라우트를 구현하고, Try 이미지 업로드 + 스팟 태깅 후 원본 포스트로 복귀·캐시 무효화까지 동작하게 한다.

배경 / 버그

  • packages/web/lib/components/detail/TryGallerySection.tsx 48행: router.push(`/request/try?parent=${postId}`) (아이템 없을 때)
  • packages/web/app/request/에는 upload/, detect/만 있고 try/ 없음 → 404
  • packages/web/app/request/page.tsx/request/upload로만 redirect

스펙

  • specs/screens/creation/SCR-CREA-TRY-01-try-upload.md
  • 플로우: specs/flows/FLW-08-my-try.md Step 2~3 (로그인 필수, 단일 이미지, 스팟 태깅, 선택 코멘트, 성공 시 부모 포스트로)

구현 체크리스트

라우트·UI

  • packages/web/app/request/try/page.tsx 추가
  • searchParams.parent 검증: 유효한 UUID 아니면 에러/리다이렉트
  • 상단: 원본 포스트 썸네일·제목(부모 GET /api/v1/posts/{id} 또는 기존 훅으로 로드)
  • 중앙: 단일 이미지 DropZone (기존 packages/web/lib/components/request/DropZone.tsx 재사용 검토)
  • 스팟 태깅: 원본 포스트의 아이템(스팟) 목록을 chip으로 표시, 유저가 0개 이상 토글 선택 (SpotTagSelector 컴포넌트)
  • 하단: 한줄 코멘트(선택, 100자 제한)
  • 미로그인 시: 스펙대로 로그인 유도 (기존 업로드 플로우의 auth 패턴 맞춤)

제출

완료 후 UX

  • 성공 시 router.push(`/posts/${parentId}`) + useQueryClient().invalidateQueries({ queryKey: ['tries', parentId] })
  • 실패 시 sonner 토스트
  • VTON 분기: 같은 파일에서 items.length > 0이면 VTON 모달만 열리므로 라우트는 아이템 없을 때만 타는지 UX 검증

수용 기준

  1. 로그인 유저가 /request/try?parent=<valid>에서 이미지 + 스팟 태깅 제출 후 부모 /posts/:id로 이동한다.
  2. 제출 후 Try 갤러리 쿼리가 갱신되어 새 Try가 보인다(feat(community): Try 포스트 백엔드 — parent_post_id, tries API, OpenAPI/Orval #24 연동 후).
  3. 잘못된 parent로는 안전하게 실패 처리한다.
  4. 스팟이 없는 포스트에서는 SpotTagSelector가 표시되지 않는다.

의존

참고 파일

  • specs/screens/creation/SCR-CREA-TRY-01-try-upload.md
  • packages/web/app/request/upload/page.tsx (플로우·헤더·상태 패턴)
  • packages/web/lib/hooks/useImageUpload.ts, packages/web/lib/api/posts.ts

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions