feat: 확정 경기·AI 예측 영역을 Tale of the Tape 비교 카드로 리디자인#30
Conversation
- 확정 경기 카드를 다크 대전 카드 스타일로 전면 교체함. 이벤트 스트립(대회·날짜·장소) + 페이스오프(D-day 배지) + 전적/나이/신장·체중/리치/스타일/국가 양측 비교 테이블 구성 - AI 예측 후보 카드도 다크 카드로 통일하고 전적(승률%)·나이·신장·리치 미니 그리드에 고석현(KO) 값 병기, AI 승률 바 추가함 - ConfirmedFight 타입에 age/height/weight/reach 옵셔널 필드 추가하고 analyzeConfirmedOpponent가 나이·신장·체중·리치·전적까지 보강하도록 확장함 - 기존 저장 데이터는 height 없으면 다음 크롤 때 Gemini 재호출로 자동 백필됨. 전적은 크롤값 우선·누락 시 Gemini 폴백, 재사용 경로에서 0-0-0 다운그레이드 방지 처리 - 고석현 비교 스탯 빌더를 src/lib/ko-stats.ts로 분리해 메인·예측 페이지 중복 로직 제거함 - 예측 네임스페이스에 height/winRate/country 번역 키 추가 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (13)
📝 WalkthroughWalkthrough고석현 비교 통계를 공통 헬퍼와 타입으로 통합하고 예측·확정 경기 UI에 연결했습니다. 확정 경기 감지는 상대 스펙 보강 여부에 따라 기존 데이터를 재사용하거나 Gemini로 상대 정보를 보강하며, 전적 우선순위도 조정되었습니다. ChangesKO 비교 통계와 데이터 연결
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant Crawl as detectKoConfirmedFight
participant Gemini as analyzeConfirmedOpponent
participant Stats as buildKoComparisonStats
participant UI as PredictionPreview
Crawl->>Crawl: 기존 상대·이벤트·height 비교
alt 스펙이 이미 존재함
Crawl->>Crawl: 기존 확정 정보 재사용
else 신규 또는 스펙 미보강
Crawl->>Gemini: 상대 정보 보강 요청
Gemini-->>Crawl: 이름·국적·스타일·신체 정보·전적 반환
end
Stats-->>UI: 고석현 비교 통계 전달
Crawl-->>UI: 확정 상대 정보 전달
Possibly related PRs
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
확정 경기 영역과 AI 예측 영역을 “Tale of the Tape” 비교 카드 UI로 전면 리디자인하고, 이를 위해 확정 경기 상대 데이터(Gemini 보강) 및 고석현 비교 스탯 빌더를 공통화한 PR입니다.
Changes:
- 확정 경기 카드 및 예측 후보 카드 UI를 다크 대전 카드 스타일로 리디자인(비교 테이블/승률 바 포함)
ConfirmedFight에 age/height/weight/reach 옵셔널 필드 추가 및 크롤 파이프라인에서 Gemini 보강/재사용 로직 확장- 고석현 비교 스탯 생성 로직을
buildKoComparisonStats로 분리하여 메인/예측 페이지 중복 제거, i18n 키 일부 추가
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/types/prediction.ts | ConfirmedFight 상대 스펙(age/height/weight/reach) 옵셔널 필드 추가 |
| src/messages/ko.json | predictions 네임스페이스에 height/country/winRate 라벨 추가 |
| src/messages/en.json | predictions 네임스페이스에 height/country/winRate 라벨 추가 |
| src/lib/ko-stats.ts | 고석현 Tale of the Tape 비교용 스탯 빌더 분리/공유 |
| src/lib/gemini.ts | 확정 경기 상대 보강 스키마에 age/신체스펙/record 확장 |
| src/lib/crawl/confirmed-fight.ts | 확정 경기 감지 시 기존 데이터 재사용/백필 및 전적 폴백 로직 개선 |
| src/components/predictions/PredictionDetail.tsx | ConfirmedFightCard에 koStats 전달 및 타입 공통화 |
| src/components/predictions/FighterComparison.tsx | koStats 타입 공통화 및 Tailwind 색상 표기 정리 |
| src/components/predictions/ConfirmedFightCard.tsx | 확정 경기 카드 UI를 Tale of the Tape 비교 카드로 리디자인 |
| src/components/fighter/PredictionPreview.tsx | 예측 후보 카드 다크 스타일 통일 + 미니 비교 그리드/AI 승률 바 추가 |
| src/app/[locale]/predictions/page.tsx | koComparisonStats 생성 로직을 buildKoComparisonStats로 대체 |
| src/app/[locale]/page.tsx | 메인에서 koStats 생성 후 PredictionPreview로 주입 |
| CLAUDE.md | Phase 2.5 확정 경기 감지/보강 로직 문서 업데이트 |
Comments suppressed due to low confidence (1)
src/lib/gemini.ts:341
analyzeConfirmedOpponent()에서 Gemini 응답 검증이nameKo/fightingStyle만 체크하고 있어, age/height/weight/reach/record가 누락되거나 타입이 깨진 응답이 그대로 통과할 수 있습니다. 이 값들은 이후 UI/저장 로직에서 문자열/숫자 전제를 가지므로, 최소한 필수 필드 존재 및 타입(특히 age의 유한한 숫자)을 함께 검증하는 게 안전합니다.
if (!parsed.nameKo || !parsed.fightingStyle) {
throw new Error("Invalid confirmed opponent response from Gemini");
}
| // 신체 스펙(height)까지 이미 보강된 기존 데이터면 Gemini 재호출 없이 재사용. | ||
| // height가 없으면 Tale of the Tape 도입 이전 데이터이므로 아래 enrich 경로로 백필. | ||
| if (sameAsExisting && existing.opponent.height) { | ||
| return reuseExisting(); | ||
| } |
| <p className="text-center text-[10px] font-bold text-white/25 tracking-[0.3em] uppercase mb-2.5"> | ||
| Tale of the Tape | ||
| </p> |
| age && { | ||
| label: t("age"), | ||
| left: String(koStats.age), | ||
| right: String(age), | ||
| }, |
Summary by CodeRabbit
새로운 기능
개선 사항