Skip to content

Feat/#30/job bookmarks page#31

Merged
KyeongJooni merged 7 commits into
devfrom
feat/#30/job-bookmarks-page
Jul 27, 2026
Merged

Feat/#30/job bookmarks page#31
KyeongJooni merged 7 commits into
devfrom
feat/#30/job-bookmarks-page

Conversation

@KyeongJooni

@KyeongJooni KyeongJooni commented Jul 26, 2026

Copy link
Copy Markdown
Member

#️⃣ 연관된 이슈

📝 작업 내용

이번 PR에서 작업한 내용을 자세히 설명해주세요. 무엇을, 왜 바꿨는지가 드러나게 작성합니다.

  • 저장 공고와 열람·피드백 내역을 확인할 수 있는 저장 목록 화면을 추가했습니다.
  • 저장 목록을 savedJobs 도메인으로 분리해 목록, 내역, 빈 상태의 책임을 구분했습니다.
  • 저장·관심 없음·미처리 상태 탭과 빈 상태 안내 및 추천/탐색 이동 동선을 구현했습니다.
  • /saved?preview=empty에서 저장 공고 0건 상태를 미리 확인할 수 있게 했습니다.
  • 추천 보관함 카드의 쌓임, 좌우 이동, 상태 탭 전환 애니메이션을 보완했습니다.
  • 레터 완료 화면과 공통 탭의 활성 상태 전환을 디자인에 맞게 조정했습니다.

✅ 체크사항

  • UI 동작 및 레이아웃 확인
  • 불필요한 console 제거
  • 기능 정상 동작
  • 팀 컨벤션에 맞게 구현했는지
  • 관련 문서 또는 주석을 갱신했는지

📸 스크린샷 (UI 변경 시)

UI 변경이 있는 경우 결과 화면 스크린샷을 첨부해주세요.

image image image

📦 추가한 라이브러리 (선택)

새로 추가한 라이브러리가 있다면 이름과 추가 이유를 작성해주세요.

💬 리뷰 요구사항 (선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요.

  • 레이아웃과 탭·캐러셀 전환을 확인 부탁드립니다.

Summary by CodeRabbit

  • 새 기능

    • 저장한 채용 공고와 열람·건너뛰기·지원 의향 이력을 확인할 수 있는 저장 목록 화면을 추가했습니다.
    • 상태별 필터와 날짜별 그룹화, 다시 보기/저장으로 되돌리기 기능을 제공합니다.
    • 저장된 공고가 없을 때 추천 보기와 탐색으로 이동할 수 있는 빈 상태 UI를 추가했습니다.
  • 개선 사항

    • 탭/추천 결과 전환 애니메이션과 레이아웃을 조정하고, 모션 감소 설정에서도 안정적으로 표시되도록 했습니다.

@KyeongJooni KyeongJooni self-assigned this Jul 26, 2026
@KyeongJooni KyeongJooni added the ✨ Feature 새로운 기능 label Jul 26, 2026
@KyeongJooni KyeongJooni linked an issue Jul 26, 2026 that may be closed by this pull request
1 task
@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 54d7f663-b50f-4fde-8c90-78cfdcd31029

📥 Commits

Reviewing files that changed from the base of the PR and between cd97243 and 0c359cc.

📒 Files selected for processing (3)
  • src/features/recommendations/components/RecommendationFlowContent.tsx
  • src/features/savedJobs/SavedJobsList.tsx
  • src/routes/router.tsx
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/routes/router.tsx
  • src/features/savedJobs/SavedJobsList.tsx
  • src/features/recommendations/components/RecommendationFlowContent.tsx

Walkthrough

추천 레터의 archive 화면과 저장목록 페이지를 추가·연결했습니다. 저장 공고 및 히스토리 탭, 필터링·빈 상태 UI, 관련 라우팅과 전환 애니메이션을 구현하고 추천 화면 스타일을 조정했습니다.

Changes

추천 아카이브 및 저장목록

Layer / File(s) Summary
추천 아카이브 화면 및 전환 UI
src/features/recommendations/components/*, src/components/common/Tab.tsx
추천 화면의 revisitarchive로 변경하고, 캐러셀의 빈 상태·애니메이션·접근성 속성 및 추천 관련 스타일을 수정했습니다.
저장목록 데이터 계약과 목데이터
src/features/savedJobs/savedJobsMock.ts
저장 공고와 히스토리 항목의 타입, 배지 상태, 목데이터를 추가했습니다.
저장목록 탭과 콘텐츠 렌더링
src/features/savedJobs/*
저장 공고·히스토리 탭, 상태 필터, 날짜별 그룹화, 복원 조건, 빈 상태 및 탐색 액션을 구현했습니다.
저장목록 라우팅과 콘텐츠 전환
src/pages/SavedJobsPage/*, src/routes/router.tsx, src/styles/global.css
/saved 페이지와 추천 아카이브 경로를 연결하고, preview=empty 처리 및 탭 콘텐츠 진입 애니메이션을 추가했습니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant SavedJobsPage
  participant SavedJobsList
  participant SavedJobsSavedContent
  participant SavedJobsHistoryContent
  Browser->>SavedJobsPage: /saved 접근
  SavedJobsPage->>SavedJobsList: preview 상태 전달
  SavedJobsList->>SavedJobsSavedContent: 저장 탭 콘텐츠 렌더링
  SavedJobsList->>SavedJobsHistoryContent: 히스토리 탭 콘텐츠 렌더링
  SavedJobsHistoryContent->>SavedJobsHistoryContent: 필터링 및 날짜별 그룹화
Loading

Possibly related PRs

Suggested reviewers: dahyun174, j2nnif2r

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning 저장목록 외에 추천 완료/공통 탭/전역 애니메이션 수정이 섞여 있어 #30 범위를 넘습니다. 저장목록 페이지와 필수 라우팅만 유지하고, 추천 완료·공통 탭 스타일 변경은 별도 PR로 분리하세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 저장 목록/북마크 페이지 추가를 직접 가리켜 변경사항과 잘 맞습니다.
Linked Issues check ✅ Passed [#30] 저장 목록 페이지, 빈 상태, 내역/탭 UI와 라우팅이 구현돼 요구사항을 충족합니다.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#30/job-bookmarks-page

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

🚦 CI 검증 결과

항목 결과
🧠 TypeScript 타입 체크 success
🧹 ESLint 검사 success
🎨 Prettier 검사 success
🏗️ Build 검증 success

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/components/common/Tab.tsx (1)

43-47: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

활성 탭 상태를 보조기술에 제공하세요.

두 구현 모두 색상과 테두리만으로 선택 상태를 표시하므로 스크린 리더 사용자는 현재 필터를 알 수 없습니다.

  • src/components/common/Tab.tsx#L43-L47: 버튼에 aria-pressed={Boolean(active)}를 추가하세요.
  • src/features/recommendations/components/RecommendationStatusTabs.tsx#L27-L36: 버튼에 aria-pressed={active}를 추가하세요.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/common/Tab.tsx` around lines 43 - 47, Expose the active tab
state to assistive technology by adding aria-pressed={Boolean(active)} to the
button in src/components/common/Tab.tsx lines 43-47 and aria-pressed={active} to
the button in
src/features/recommendations/components/RecommendationStatusTabs.tsx lines
27-36.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/features/recommendations/components/RecommendationFlowContent.tsx`:
- Around line 186-189: Update the RecommendationFlowContent carousel contentKey
to change when filteredLetters or the displayed letter changes, rather than
relying only on displayIndex. Ensure removing the current letter or
transitioning to an empty filtered result refreshes the carousel’s internal
activeContent and renders the correct next or empty state.

In `@src/features/savedJobs/SavedJobsList.tsx`:
- Around line 23-29: 연결되지 않은 목록 액션을 상태와 콜백으로 동작하게 수정하세요.
src/features/savedJobs/SavedJobsList.tsx의 SavedJobsList에서 저장·복원·페이지네이션 상태와
onView/onRemove/onRestore/onLoadMore 콜백을 소유하고 하위 컴포넌트에 전달하세요.
src/features/savedJobs/SavedJobsSavedContent.tsx 35-47의 보기·해제 액션을 연결하되 마감 공고도 해제
가능하게 유지하세요. src/features/savedJobs/SavedJobsHistoryContent.tsx 48-52의 다시 보기·복원
액션을 상세 이동과 상태 전환에 연결하고, 108의 더보기는 다음 페이지가 있을 때만 표시해 로드 콜백을 실행하도록 수정하세요.
- Around line 35-38: Update the summary paragraph in SavedJobsList to derive the
saved-job count from the SAVED_JOBS data instead of hardcoding 12, and calculate
the application-intent count from each job’s corresponding data field. Keep the
summary hidden when the list is empty and preserve the existing Korean label
format.

In `@src/routes/router.tsx`:
- Around line 82-84: 라우터의 `/recommendations/archive` 항목에서 `RecommendationsPage`의
아카이브 화면이 추천 탭으로 표시되도록 `handle.header.activeIndex`를 0으로 변경하세요. 또한 기존
`/recommendations/revisit` 경로가 누락되지 않도록 해당 경로에 `Navigate`를 추가해 새 아카이브 경로로
리다이렉트하세요.

---

Outside diff comments:
In `@src/components/common/Tab.tsx`:
- Around line 43-47: Expose the active tab state to assistive technology by
adding aria-pressed={Boolean(active)} to the button in
src/components/common/Tab.tsx lines 43-47 and aria-pressed={active} to the
button in src/features/recommendations/components/RecommendationStatusTabs.tsx
lines 27-36.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5c1168ba-ba01-45d1-b740-60edbd0fda0f

📥 Commits

Reviewing files that changed from the base of the PR and between 4515bfb and cd97243.

📒 Files selected for processing (14)
  • src/components/common/Tab.tsx
  • src/features/recommendations/components/RecommendationCompletion.tsx
  • src/features/recommendations/components/RecommendationFlowContent.tsx
  • src/features/recommendations/components/RecommendationLetterCard.tsx
  • src/features/recommendations/components/RecommendationLetterCarousel.tsx
  • src/features/recommendations/components/RecommendationStatusTabs.tsx
  • src/features/savedJobs/SavedJobsEmptyState.tsx
  • src/features/savedJobs/SavedJobsHistoryContent.tsx
  • src/features/savedJobs/SavedJobsList.tsx
  • src/features/savedJobs/SavedJobsSavedContent.tsx
  • src/features/savedJobs/savedJobsMock.ts
  • src/pages/SavedJobsPage/SavedJobsPage.tsx
  • src/routes/router.tsx
  • src/styles/global.css

Comment on lines +23 to +29
export default function SavedJobsList({ isEmptyPreview = false }: SavedJobsListProps) {
const [activeTab, setActiveTab] = useState<SavedJobsTab>('saved');
const [activeFilter, setActiveFilter] = useState<SavedJobHistoryStatus | 'all'>('all');
const navigate = useNavigate();
const savedJobs = isEmptyPreview ? [] : SAVED_JOBS;
const handleBrowseRecommendations = () => navigate('/recommendations');
const handleExplore = () => navigate('/explore');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

목록 액션을 상태와 콜백으로 연결하세요.

현재 데이터가 불변 목데이터로만 전달되고 액션 콜백이 없어 “보기”, “해제”, “다시 보기”, “저장으로 되돌리기”, “더보기”가 모두 클릭 후 아무 변화가 없습니다.

  • src/features/savedJobs/SavedJobsList.tsx#L23-L29: 저장·복원·페이지네이션 상태와 onView/onRemove/onRestore/onLoadMore 콜백을 소유하고 하위 컴포넌트로 전달하세요.
  • src/features/savedJobs/SavedJobsSavedContent.tsx#L35-L47: 보기·해제 버튼에 콜백을 연결하고, 마감 공고도 저장 해제는 가능하도록 유지하세요.
  • src/features/savedJobs/SavedJobsHistoryContent.tsx#L48-L52: 다시 보기와 복원 버튼을 실제 상세 이동·상태 전환에 연결하세요.
  • src/features/savedJobs/SavedJobsHistoryContent.tsx#L108-L108: 다음 페이지가 없으면 버튼을 숨기고, 있으면 로드 동작을 연결하세요.
📍 Affects 3 files
  • src/features/savedJobs/SavedJobsList.tsx#L23-L29 (this comment)
  • src/features/savedJobs/SavedJobsSavedContent.tsx#L35-L47
  • src/features/savedJobs/SavedJobsHistoryContent.tsx#L48-L52
  • src/features/savedJobs/SavedJobsHistoryContent.tsx#L108-L108
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/features/savedJobs/SavedJobsList.tsx` around lines 23 - 29, 연결되지 않은 목록
액션을 상태와 콜백으로 동작하게 수정하세요. src/features/savedJobs/SavedJobsList.tsx의
SavedJobsList에서 저장·복원·페이지네이션 상태와 onView/onRemove/onRestore/onLoadMore 콜백을 소유하고
하위 컴포넌트에 전달하세요. src/features/savedJobs/SavedJobsSavedContent.tsx 35-47의 보기·해제
액션을 연결하되 마감 공고도 해제 가능하게 유지하세요.
src/features/savedJobs/SavedJobsHistoryContent.tsx 48-52의 다시 보기·복원 액션을 상세 이동과 상태
전환에 연결하고, 108의 더보기는 다음 페이지가 있을 때만 표시해 로드 콜백을 실행하도록 수정하세요.

Comment thread src/features/savedJobs/SavedJobsList.tsx
Comment thread src/routes/router.tsx Outdated
<CarouselIndicator variant="number" current={current} total={total} />
<CarouselIndicator variant="dot" total={total} activeIndex={current - 1} />
{hasItems && (
<CarouselArrow direction="right" onClick={handleNext} disabled={nextDisabled} />

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

카드 전환 애니메이션이 진행되는 동안에도 화살표 입력이 가능하더라고요. 이 경우 연속으로 클릭하면 애니메이션이 끝나기 전에 handlePrev/handleNext가 다시 호출돼 전환이 꼬일 수 있을 것 같습니다.
의도적으로 제외하신 게 아니라면 || isAnimating 조건 다시 넣어주시면 좋을 것 같습니다

@KyeongJooni KyeongJooni Jul 26, 2026

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이미 handlePrev/handleNext에서 isAnimating에서 가드하고 있어 애니메이션 중 추가 전환은 실행되지 않도록 작성했습니다! 시각적으로만 반영이 안되게 해놨습니다~

@j2nnif2r j2nnif2r left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

머지 부탁드립니다

@KyeongJooni
KyeongJooni merged commit 0ad93b5 into dev Jul 27, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 저장목록 페이지 ui 제작

2 participants