Skip to content

기업 프로젝트 페이지 UI 구현 - #34

Merged
leemanjae02 merged 6 commits into
mainfrom
feat/company-project-page-33
Aug 18, 2026
Merged

기업 프로젝트 페이지 UI 구현#34
leemanjae02 merged 6 commits into
mainfrom
feat/company-project-page-33

Conversation

@leemanjae02

@leemanjae02 leemanjae02 commented Aug 11, 2026

Copy link
Copy Markdown
Member

#️⃣ 연관된 이슈

Close #33

🚧 Work in Progress

  • 작업 진행 중

📌 주요 변경사항

  • /company 라우팅과 기업 프로젝트 페이지(등록/기수 필터/삭제) 추가
  • ProjectThumbnailCard 공용 컴포넌트에 접근성 있는 group role·라벨 추가
  • 기업 프로젝트 모달 위치를 사이드바 시각보정에 맞춰 조정

📝 작업 내용

  • /company 라우트 등록 및 얇은 route 진입 파일 추가
  • useCompanyProjectForm으로 zod 기반 등록 폼 상태·검증·배너 blob URL 소유권 관리
  • CompanyProjectsPage에 기수별 필터, empty state, 카드 삭제 시 blob URL 해제 처리 구현
  • ProjectThumbnailCard에 접근성 있는 group role·aria-label 추가(카드 단위 삭제 테스트에서 활용)
  • CompanyProjectModal 위치를 사이드바 시각보정에 맞춰 오른쪽으로 30px 이동
  • 기수 필터·등록·취소·삭제·blob URL 해제 플로우에 대한 테스트 추가
  • 검증: pnpm lint, pnpm gen:index:check, pnpm vitest run(관련 테스트 27개), pnpm build 모두 통과

📸 스크린샷 (선택)

스크린샷 2026-08-11 오후 10 56 53 스크린샷 2026-08-11 오후 10 57 00

💬 리뷰 요구사항(선택)

  • 현재 /company 페이지는 등록 API 연동 전이라 로컬 mock 데이터로 동작합니다(이미 병합된 /meetup 페이지와 동일한 전제).
  • 이 브랜치는 /meetup 페이지가 main에 병합되기 전에 분기되어 워킹트리에 /meetup 라우트가 없습니다. 두 페이지의 페이지 셸(레이아웃·상태 관리)이 거의 동일해서 공용 컴포넌트로 추출할 여지가 있는데, 지금은 소비처가 하나뿐이라 과도한 추상화를 피하고 두 페이지가 모두 merge된 뒤 별도 refactor 브랜치에서 진행하기로 했습니다.

Summary by CodeRabbit

  • 새로운 기능

    • 회사 프로젝트 페이지와 메뉴 경로를 추가했습니다.
    • 기수별 프로젝트 필터링, 프로젝트 추가·삭제, 입력값 검증을 지원합니다.
    • 프로젝트가 없을 때 빈 상태 화면을 표시합니다.
    • 프로젝트 이름, 내용, 배너 이미지를 입력하고 관리할 수 있습니다.
  • 접근성 개선

    • 프로젝트 카드에 서비스명을 포함한 접근성 레이블을 추가했습니다.
  • 버그 수정

    • 프로젝트 모달의 기본 위치를 조정했습니다.
    • 배너 이미지 삭제 및 프로젝트 삭제 시 임시 이미지 리소스를 정리합니다.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review available on request

  • 🔍 Trigger review

Reviews should be triggered manually for repositories with fewer than 10 stars. Select Trigger review above or comment @coderabbitai review to review the latest changes. For a full review, comment @coderabbitai full review.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4a9affb1-6858-4052-b990-df06cb2003f3

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: be104a31-5ab6-4669-828a-b4c0ec42aae5

📥 Commits

Reviewing files that changed from the base of the PR and between 6856317 and dfbba18.

📒 Files selected for processing (3)
  • src/pages/projects/CompanyProjectsPage.mock.ts
  • src/pages/projects/CompanyProjectsPage.test.tsx
  • src/pages/projects/CompanyProjectsPage.tsx

📝 Walkthrough

Walkthrough

변경 요약

기업 프로젝트 페이지를 추가했습니다. 프로젝트 생성·삭제, 기수 필터, 폼 검증, Blob URL 정리, 접근성 라벨과 company 라우트를 구현했습니다.

Changes

기업 프로젝트 페이지

Layer / File(s) Summary
프로젝트 폼 검증과 Blob URL 관리
src/hooks/projects/*, src/hooks/index.ts
useCompanyProjectForm이 이름·내용·배너 URL을 검증합니다. 배너 Blob URL을 변경·삭제·언마운트 시 정리합니다.
프로젝트 데이터와 페이지 동작
src/pages/projects/CompanyProjectsPage.mock.ts, src/pages/projects/CompanyProjectsPage.tsx
프로젝트 카드 타입과 목업 데이터를 추가했습니다. 기수 필터, 프로젝트 생성·삭제, 빈 상태와 모달 연결을 구현했습니다.
페이지 상호작용 검증
src/pages/projects/CompanyProjectsPage.test.tsx
기수 필터, 필수 입력, 생성·취소·삭제, 빈 상태와 Blob URL 해제를 테스트했습니다.
라우팅과 접근성 연결
src/routes.ts, src/routes/(main)/company.tsx, src/components/projects/ProjectThumbnailCard/ProjectThumbnailCard.tsx, src/components/projects/CompanyProjectModal/CompanyProjectModal.tsx
company 경로를 페이지에 연결했습니다. 프로젝트 카드에 접근성 속성을 추가하고 모달 기본 위치를 설정했습니다.

Possibly related PRs

Suggested labels: ✨ Feature

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
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 (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 기업 프로젝트 페이지 UI 구현이라는 주요 변경 사항을 정확하고 간결하게 설명합니다.
Linked Issues check ✅ Passed PR은 직접 연결된 이슈 #33의 기업 프로젝트 페이지 UI 구현 목표와 라우팅, 등록, 필터, 삭제 기능을 충족합니다.
Out of Scope Changes check ✅ Passed 라우팅, 폼 검증, 접근성 개선, Blob URL 정리, 테스트 변경은 모두 기업 프로젝트 페이지 구현 범위에 포함됩니다.
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
⚔️ Resolve merge conflicts 💡
  • Resolve merge conflict in branch feat/company-project-page-33
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/company-project-page-33

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.

@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: 3

🤖 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/pages/projects/CompanyProjectsPage.tsx`:
- Around line 107-123: Update CompanyProjectModal’s onOpenChange handling in
CompanyProjectsPage so every close path first calls form.reset() when open is
false, then closes the modal. Route onCancel through the same state-change
cleanup path, ensuring cancel, Escape, and outside-click closures all release
the banner Blob URL before the next open or unmount.
- Around line 47-58: Update handleSave so the newly created project preserves
the required introduction text by assigning values.content to the project
object. Extend CompanyProjectCard with a content field and ensure downstream
rendering or API integration uses the stored value.
- Around line 63-68: Update handleDelete so it finds the project to delete
before calling setProjects, then invokes revokeIfBlobUrl on that project’s
imageUrl outside the state updater. Keep the setProjects updater pure and
limited to filtering out the matching project by id.
🪄 Autofix

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: ASSERTIVE

Plan: Pro Plus

Run ID: f281de92-ef18-4dcb-9f85-4f50a43b658a

📥 Commits

Reviewing files that changed from the base of the PR and between a93bd20 and 6856317.

📒 Files selected for processing (10)
  • src/components/projects/CompanyProjectModal/CompanyProjectModal.tsx
  • src/components/projects/ProjectThumbnailCard/ProjectThumbnailCard.tsx
  • src/hooks/index.ts
  • src/hooks/projects/index.ts
  • src/hooks/projects/useCompanyProjectForm.ts
  • src/pages/projects/CompanyProjectsPage.mock.ts
  • src/pages/projects/CompanyProjectsPage.test.tsx
  • src/pages/projects/CompanyProjectsPage.tsx
  • src/routes.ts
  • src/routes/(main)/company.tsx

Comment on lines +47 to +58
function handleSave() {
void form.handleSubmit((values) => {
setProjects((prev) => [
...prev,
{
id: crypto.randomUUID(),
cardinal: CURRENT_GENERATION,
serviceName: values.name,
imageUrl: values.bannerUrl,
},
])
form.resetAfterSave()

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

프로젝트 소개 값을 보존하십시오.

values.content는 필수 입력이지만 새 CompanyProjectCard에 복사하지 않습니다. 현재 생성 직후 프로젝트 소개 값이 유실됩니다.

CompanyProjectCardcontent를 추가하고, Line 51-56에서 values.content를 저장하십시오. 이후 표시 또는 API 연동에서 이 값을 사용하십시오.

🤖 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/pages/projects/CompanyProjectsPage.tsx` around lines 47 - 58, Update
handleSave so the newly created project preserves the required introduction text
by assigning values.content to the project object. Extend CompanyProjectCard
with a content field and ensure downstream rendering or API integration uses the
stored value.

Comment thread src/pages/projects/CompanyProjectsPage.tsx Outdated
Comment on lines +107 to +123
<CompanyProjectModal
open={modalOpen}
onOpenChange={setModalOpen}
cardinal={CURRENT_GENERATION}
name={form.name}
onNameChange={form.setName}
content={form.content}
onContentChange={form.setContent}
bannerUrl={form.bannerUrl}
onBannerChange={form.onBannerChange}
onBannerDelete={form.onBannerDelete}
onCancel={() => {
setModalOpen(false)
}}
onSave={handleSave}
saveDisabled={!form.isValid}
/>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

모든 모달 닫기 경로에서 배너 Blob URL을 해제하십시오.

onCancelonOpenChange는 모달만 닫습니다. 업로드한 배너 Blob URL은 다음 openModal() 호출 또는 페이지 unmount 전까지 남습니다.

open=false인 경우 form.reset()을 호출한 뒤 모달을 닫으십시오. 취소, Escape, 외부 클릭이 같은 정리 경로를 사용해야 합니다.

🤖 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/pages/projects/CompanyProjectsPage.tsx` around lines 107 - 123, Update
CompanyProjectModal’s onOpenChange handling in CompanyProjectsPage so every
close path first calls form.reset() when open is false, then closes the modal.
Route onCancel through the same state-change cleanup path, ensuring cancel,
Escape, and outside-click closures all release the banner Blob URL before the
next open or unmount.

@github-actions

Copy link
Copy Markdown

CI 결과

항목 결과
TypeScript 🟢 통과
Prettier 🟢 통과
Generated 🟢 통과
ESLint 🟢 통과
Test 🟢 통과
Build 🟢 통과

@leemanjae02
leemanjae02 merged commit 064fe9a into main Aug 18, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] #33 - 기업 프로젝트 페이지 ui 구현

2 participants