Skip to content

feat: 데스크톱 최적화 레이아웃 적용#576

Open
manNomi wants to merge 21 commits into
mainfrom
feat/desktop-mode-poc
Open

feat: 데스크톱 최적화 레이아웃 적용#576
manNomi wants to merge 21 commits into
mainfrom
feat/desktop-mode-poc

Conversation

@manNomi

@manNomi manNomi commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

관련 이슈

작업 내용

  • university-web SSG 정책을 다시 강화했습니다.
    • 전체 대학 목록 API 실패 시 빈 배열로 숨기던 fallback을 제거했습니다.
    • /university/[homeUniversity]/[id]dynamicParams = false로 유지해 생성된 정적 상세 경로만 제공합니다.
    • 전체 대학 목록 API가 500을 반환하면 SSG 단계에서 그대로 실패합니다.
  • university-web 대학 페이지 데스크톱 뷰를 보강했습니다.
    • /university, /university/search, /university/[homeUniversity], /university/[homeUniversity]/search의 데스크톱 카드/검색/필터 화면을 모바일 흐름과 분리했습니다.
    • /university/[homeUniversity]/[id] 상세 페이지를 데스크톱 전용 hero, 본문, sticky 요약 패널 구조로 제작했습니다.
    • 상세 fallback도 모바일/데스크톱으로 분리했습니다.
    • Google embed map은 국가 단위 위치 파악에 맞게 상세 페이지 기본 zoom을 5로 낮췄습니다.
    • 상세 아이콘 SVG의 React DOM attribute 경고를 정리했습니다.
  • web 주요 페이지의 데스크톱 뷰를 모바일 variant 구조에서 분리했습니다.
    • 홈, 멘토 홈, 대학 지원/성적, 회원가입 플로우의 Desktop/Mobile 진입 컴포넌트 분리
    • 커뮤니티 목록/상세/댓글/글쓰기/수정 화면을 Desktop* / Mobile* view entrypoint로 분리
    • 멘토 신청 단계, 멘토 채팅 목록/상세/상단바를 데스크톱 전용 view와 모바일 view로 분리
    • 로그인, 이메일 가입, 학교 이메일 인증, 멘토 상세/대기/수정 화면을 데스크톱/모바일 view 컴포넌트로 분리
  • CodeRabbit 최신 unresolved 리뷰를 반영했습니다.

검증

  • pnpm --filter @solid-connect/university-web run ci:check 통과
  • UNIVERSITY_TERM_ID=1 NEXT_PUBLIC_UNIVERSITY_TERM_ID=1 pnpm --filter @solid-connect/university-web run build 통과
    • 상세 포함 149개 정적 페이지 생성 확인
  • pnpm --filter @solid-connect/university-web run build는 기본 환경에서 전체 대학 목록 API 500(executeWithLock) 때문에 /university/[homeUniversity]/[id] SSG page data 수집 단계에서 실패하는 것을 확인했습니다.
    • 이번 요청 기준으로 API 500이 fallback 없이 SSG 에러로 드러나는 것이 정상 동작입니다.
  • 브라우저 확인
    • http://localhost:3001/university
    • http://localhost:3001/university/search
    • UNIVERSITY_TERM_ID=1 dev 환경에서 http://localhost:3001/university/inha/1432
    • 상세 데스크톱 1280px 기준 가로 overflow 없음
    • Google map iframe zoom=5 적용 확인
  • 기존 PR 범위 검증
    • pnpm --filter @solid-connect/web run ci:check 통과
    • UNIVERSITY_WEB_DOMAIN=http://localhost:3001 pnpm --filter @solid-connect/web run build 통과

참고

  • 로컬 Node 버전은 v23.10.0이라 repository engines의 Node 22.x 경고가 출력됩니다.
  • API가 500을 반환하면 GitHub/Vercel university-web 빌드도 실패할 수 있습니다. 이 PR은 해당 실패를 숨기지 않도록 되돌린 상태입니다.

@vercel

vercel Bot commented Jun 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
solid-connect-university-web Error Error Jun 25, 2026 4:54am
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
solid-connect-web-admin Skipped Skipped Jun 25, 2026 4:54am
solid-connection-web Skipped Skipped Jun 25, 2026 4:54am

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

1. 전역 레이아웃에 데스크톱 내비게이션이 추가되고, 모바일 전용 상단·하단 네비게이션은 md 이상에서 숨겨지도록 바뀌었습니다.
2. 홈과 대학 탐색 화면은 모바일/데스크톱 전용 뷰와 fallback 구조로 재배치됐고, 대학 상세·검색 화면의 레이아웃이 분리됐습니다.
3. 커뮤니티와 멘토 화면은 variant와 뷰포트 판별 훅을 기준으로 목록, 상세, 작성, 채팅, 대기 화면이 분기되도록 바뀌었습니다.
4. 마이, 로그인, 회원가입, 약관, 비밀번호, 학교 이메일 화면은 데스크톱용 레이아웃과 공통 props 구조로 정리됐습니다.
5. 성적·지원 화면과 제출 컴포넌트는 데스크톱/모바일 전용 뷰, 공통 base 컴포넌트, 상단 탭과 하단 액션바 분리로 재구성됐습니다.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning 멘토 채팅 관련 변경은 있으나, 프로필/기본 이미지/날짜 색상/최신 메시지 스크롤 수정이 명시적으로 확인되지 않습니다. 채팅 상세의 프로필 렌더링, 기본 이미지, 날짜 색상, 초기 스크롤 위치 수정이 코드에서 어떻게 반영됐는지 명시하고 검증을 보강해 주세요.
Out of Scope Changes check ⚠️ Warning 멘토 채팅 이슈와 무관한 대학 검색, 홈, 로그인, 가입, 내 정보, 지원/성적 등 대규모 레이아웃 변경이 함께 포함되어 있습니다. 링크된 이슈 범위의 변경만 남기고, 나머지 데스크톱 레이아웃 개편은 별도 PR이나 추가 이슈로 분리해 주세요.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 데스크톱 최적화 레이아웃 적용이라는 핵심 변경을 간단히 잘 요약합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed 템플릿의 핵심 섹션인 관련 이슈와 작업 내용이 채워져 있고, 검증 내용도 포함되어 있어 전반적으로 요구사항을 충족합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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/desktop-mode-poc

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.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 50190331ae

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


<div className="fixed bottom-0 left-0 right-0 w-full bg-white pb-14">
<div className="mx-auto w-full max-w-app px-5">
<div className="mx-auto w-full max-w-app px-5 md:max-w-none">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep desktop footers out from under the rail

On md+ this footer still uses the full-viewport left-0 right-0 wrapper, but this change removes the 600px cap, so the CTA starts at x=0 and sits underneath the fixed 88px desktop rail (z-40). Unlike the other bottom bars in this commit that add md:left-[88px] md:w-[calc(100%-88px)], the mentor application steps will have the left side of the button obscured/misaligned on desktop; shift the wrapper to the content area before expanding it.

Useful? React with 👍 / 👎.

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

🤖 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
`@apps/university-web/src/app/university/`[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx:
- Line 23: The fallback background in UniversityDetail should be made darker to
preserve readability for the white overlay UI. Update the placeholder styling in
UniversityDetail/index.tsx where the background container is defined, replacing
the current bg-blue-100 with a dark neutral or gradient-based fallback that
matches the university background image guideline and keeps overlaid text
legible during loading/fallback states.

In `@apps/web/src/app/`(home)/_ui/PopularUniversitySection/index.tsx:
- Around line 33-34: The md skeleton in PopularUniversitySection does not match
the loaded card height, causing layout shift on desktop. Update the loading
placeholder in the same component so its md height matches the actual card
height used after load (the h-40 card), keeping the existing width and styling
consistent to reduce CLS.

In
`@apps/web/src/app/my/apply-mentor/_components/InterestCountriesScreen/index.tsx`:
- Line 133: The fixed CTA wrapper in InterestCountriesScreen is missing the
desktop offset, so on md+ it can slide under the left rail; update the
sticky/fixed container alongside the max-w change so it applies the same 88px
left offset at desktop sizes. Use the existing wrapper in
InterestCountriesScreen and the CTA container classes around the bottom action
area to keep the button region aligned with the main content instead of the
rail.

In `@apps/web/src/app/my/apply-mentor/_components/StudyStatusScreen/index.tsx`:
- Line 83: The fixed desktop bottom area in StudyStatusScreen is missing the md+
left offset, so its outer container still overlaps the left navigation rail when
the inner wrapper uses md:max-w-none. Update the fixed outer wrapper in the
StudyStatusScreen component to add the required 88px desktop offset while
keeping the current left-0/right-0 behavior on smaller screens, so the
sticky/fixed footer aligns correctly on md and above.

In `@apps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsx`:
- Line 206: The fixed bottom button container in UniversityScreen still spans
the full viewport on md+ because only the width cap was removed, so it collides
with the left rail. Update the wrapper around the fixed action area in the
UniversityScreen component to keep the md:max-w-none change but also apply the
desktop left offset/padding used by other screens, so the sticky/fixed controls
are positioned relative to the content column instead of the full viewport.

In `@apps/web/src/app/my/password/_ui/PasswordContent/index.tsx`:
- Line 110: The fixed bottom button area in PasswordContent still ignores the
desktop rail offset, so on md+ it can overlap the 88px left rail even though the
inner width expands with md:max-w-none. Update the outer fixed wrapper in
PasswordContent (the container around the button/footer area) to apply the same
md+ left offset/spacing used by other desktop rail-aligned layouts, keeping the
button aligned to the main content area without changing its mobile behavior.
🪄 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: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 95f23d43-64cb-41c5-a519-eb929b95c803

📥 Commits

Reviewing files that changed from the base of the PR and between 8ee2a03 and 5019033.

📒 Files selected for processing (39)
  • apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/_ui/TitleSection.tsx
  • apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx
  • apps/university-web/src/app/university/[homeUniversity]/_ui/RegionFilter.tsx
  • apps/university-web/src/app/university/[homeUniversity]/_ui/SearchBar.tsx
  • apps/university-web/src/app/university/[homeUniversity]/_ui/UniversityListContent.tsx
  • apps/university-web/src/app/university/[homeUniversity]/page.tsx
  • apps/university-web/src/components/layout/GlobalLayout/index.tsx
  • apps/university-web/src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx
  • apps/university-web/src/components/layout/GlobalLayout/ui/DesktopNavigation/index.tsx
  • apps/university-web/src/components/layout/PathBasedNavigation/index.tsx
  • apps/university-web/src/components/layout/TopDetailNavigation.tsx
  • apps/university-web/src/components/ui/TopLogoBar/index.tsx
  • apps/university-web/src/components/university/UniversityCards/index.tsx
  • apps/web/src/app/(home)/_ui/FindLastYearScoreBar/index.tsx
  • apps/web/src/app/(home)/_ui/HomeActionLinks/index.tsx
  • apps/web/src/app/(home)/_ui/HomeUniversitySearchSection/index.tsx
  • apps/web/src/app/(home)/_ui/NewsSection/index.tsx
  • apps/web/src/app/(home)/_ui/PopularUniversitySection/_ui/PopularUniversityCard.tsx
  • apps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsx
  • apps/web/src/app/(home)/page.tsx
  • apps/web/src/app/community/[boardCode]/PostWriteButton.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/CommentInput.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/modify/PostModifyForm.tsx
  • apps/web/src/app/my/apply-mentor/_components/InterestCountriesScreen/index.tsx
  • apps/web/src/app/my/apply-mentor/_components/StudyStatusScreen/index.tsx
  • apps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsx
  • apps/web/src/app/my/password/_ui/PasswordContent/index.tsx
  • apps/web/src/app/sign-up/email/EmailSignUpForm.tsx
  • apps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsx
  • apps/web/src/app/university/score/ScoreScreen.tsx
  • apps/web/src/app/university/score/submit/gpa/GpaSubmitForm.tsx
  • apps/web/src/app/university/score/submit/language-test/LanguageTestSubmitForm.tsx
  • apps/web/src/components/layout/GlobalLayout/index.tsx
  • apps/web/src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx
  • apps/web/src/components/layout/GlobalLayout/ui/DesktopNavigation/index.tsx
  • apps/web/src/components/layout/PathBasedNavigation/index.tsx
  • apps/web/src/components/layout/TopDetailNavigation.tsx
  • apps/web/src/components/ui/TopLogoBar/index.tsx
  • apps/web/src/components/university/UniversityCards/index.tsx

Comment thread apps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsx Outdated
Comment thread apps/web/src/app/my/apply-mentor/_components/InterestCountriesScreen/index.tsx Outdated
Comment thread apps/web/src/app/my/apply-mentor/_components/StudyStatusScreen/index.tsx Outdated
Comment thread apps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsx Outdated
Comment thread apps/web/src/app/my/password/_ui/PasswordContent/index.tsx Outdated
# Conflicts:
#	apps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsx

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

🧹 Nitpick comments (3)
apps/web/src/app/(home)/_ui/HomeDesktopView/index.tsx (1)

187-195: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

1. 뉴스 카드 이미지에는 fallbackSrc가 빠져 있어요.

같은 파일의 추천/전체 학교 카드 이미지(120, 155번째 줄)는 모두 fallbackSrc로 깨진 이미지를 막아주고 있는데, 뉴스 이미지만 홀로 안전망 없이 외부 news.imageUrl을 그대로 받고 있어요. 외부 URL이 끊기거나 404가 나면 카드 한 칸이 휑하게 비어 보일 수 있으니, 일관성과 안정성을 위해 폴백을 채워주면 좋겠습니다.

🤖 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 `@apps/web/src/app/`(home)/_ui/HomeDesktopView/index.tsx around lines 187 -
195, The news card image rendered in HomeDesktopView’s Image usage is missing a
fallbackSrc, unlike the nearby recommendation/all-school card images, so add the
same fallback handling to this Image component. Update the Image props used for
news.imageUrl to include an appropriate fallbackSrc so broken or missing
external image URLs still render a safe placeholder and stay consistent with the
other cards.
apps/web/src/app/(home)/_ui/HomeDesktopView/HomeDesktopEntryPanel.tsx (1)

85-99: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

1. 안쪽 content div의 key는 살짝 멋쩍게 남아 있어요.

리스트 항목으로 실제 렌더되는 요소는 UniversityZoneLink/Link이고, 거기에 이미 key={href}가 잘 붙어 있어요. 88번째 줄의 content div에 있는 key는 배열 컨텍스트가 아니라 아무 역할도 하지 못하니, 정리해두면 의도가 더 또렷해집니다.

♻️ 제안 diff
             const content = (
               <div
-                key={href}
                 className={clsx("flex h-full min-h-32 flex-col justify-between rounded-lg p-4", colorClassName)}
               >
🤖 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 `@apps/web/src/app/`(home)/_ui/HomeDesktopView/HomeDesktopEntryPanel.tsx around
lines 85 - 99, The inner content div in HomeDesktopEntryPanel’s actionLinks map
is carrying a redundant key even though the actual rendered list item is
UniversityZoneLink/Link and already uses key={href}. Remove the key from the
content div and keep the list key only on the component returned from the map so
the intent stays clear and the JSX structure is cleaner.
apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx (1)

18-26: 🚀 Performance & Scalability | 🔵 Trivial

1. 모바일/데스크톱 분기를 조건부 렌더링으로 바꾸기
md:hidden/hidden md:block은 화면상으로만 숨길 뿐, 두 트리 모두 마운트됩니다. 이 구조에서는 UniversityBtns, InfoSection, MapSection 같은 하위 컴포넌트가 중복 생성되므로, 뷰포트에 따라 한쪽만 렌더링하는 쪽이 낫습니다.

🤖 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
`@apps/university-web/src/app/university/`[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx
around lines 18 - 26, The UniversityDetail view currently mounts both mobile and
desktop trees using CSS visibility classes, so convert this split in
UniversityDetail/index.tsx to true conditional rendering based on viewport or
breakpoint state. Update the UniversityDetailMobile and UniversityDetailDesktop
usage so only one branch is rendered at a time, preventing duplicate creation of
shared child components like UniversityBtns, InfoSection, and MapSection. Keep
the branch selection logic close to the existing university/koreanName props
wiring so the component remains easy to locate and maintain.
🤖 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
`@apps/university-web/src/app/university/`[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx:
- Line 134: The fixed “0회 파견” label in UniversityDetail is currently being shown
for every university even though the University type/API does not provide a
dispatch count yet. Update the UniversityDetail component to stop hardcoding
this value: either remove the display entirely until real data is available or
route it through a clearly separated temporary placeholder path so it is not
mistaken for actual data. Use the UniversityDetail JSX and any related
University typing/data-mapping code to find the spot and keep the UI aligned
with the available API fields.

In `@apps/web/src/app/`(home)/page.tsx:
- Around line 117-136: The responsive split in the home page should be changed
from always-rendered hidden DOM to conditional mounting so only the active
branch exists. Update the main page component around the mobile section and
HomeDesktopView to render either the mobile or desktop branch based on viewport,
instead of keeping both with md:hidden/hidden md:block. This will prevent hidden
next/image instances, especially the priority images used by
PopularUniversitySection and HomeDesktopView, from loading unnecessarily.

---

Nitpick comments:
In
`@apps/university-web/src/app/university/`[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx:
- Around line 18-26: The UniversityDetail view currently mounts both mobile and
desktop trees using CSS visibility classes, so convert this split in
UniversityDetail/index.tsx to true conditional rendering based on viewport or
breakpoint state. Update the UniversityDetailMobile and UniversityDetailDesktop
usage so only one branch is rendered at a time, preventing duplicate creation of
shared child components like UniversityBtns, InfoSection, and MapSection. Keep
the branch selection logic close to the existing university/koreanName props
wiring so the component remains easy to locate and maintain.

In `@apps/web/src/app/`(home)/_ui/HomeDesktopView/HomeDesktopEntryPanel.tsx:
- Around line 85-99: The inner content div in HomeDesktopEntryPanel’s
actionLinks map is carrying a redundant key even though the actual rendered list
item is UniversityZoneLink/Link and already uses key={href}. Remove the key from
the content div and keep the list key only on the component returned from the
map so the intent stays clear and the JSX structure is cleaner.

In `@apps/web/src/app/`(home)/_ui/HomeDesktopView/index.tsx:
- Around line 187-195: The news card image rendered in HomeDesktopView’s Image
usage is missing a fallbackSrc, unlike the nearby recommendation/all-school card
images, so add the same fallback handling to this Image component. Update the
Image props used for news.imageUrl to include an appropriate fallbackSrc so
broken or missing external image URLs still render a safe placeholder and stay
consistent with the other cards.
🪄 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: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: d2e358f8-9cbe-41de-9297-40c83f4770b9

📥 Commits

Reviewing files that changed from the base of the PR and between 5019033 and 4b10d9e.

📒 Files selected for processing (12)
  • apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx
  • apps/university-web/src/app/university/[homeUniversity]/_ui/UniversityListContent.tsx
  • apps/web/src/app/(home)/_ui/HomeDesktopView/HomeDesktopEntryPanel.tsx
  • apps/web/src/app/(home)/_ui/HomeDesktopView/index.tsx
  • apps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsx
  • apps/web/src/app/(home)/page.tsx
  • apps/web/src/app/my/apply-mentor/_components/InterestCountriesScreen/index.tsx
  • apps/web/src/app/my/apply-mentor/_components/StudyStatusScreen/index.tsx
  • apps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsx
  • apps/web/src/app/my/password/_ui/PasswordContent/index.tsx
  • apps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsx
  • apps/web/src/app/university/score/ScoreScreen.tsx
✅ Files skipped from review due to trivial changes (5)
  • apps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsx
  • apps/web/src/app/university/score/ScoreScreen.tsx
  • apps/web/src/app/my/apply-mentor/_components/StudyStatusScreen/index.tsx
  • apps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsx
  • apps/web/src/app/my/password/_ui/PasswordContent/index.tsx
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/web/src/app/my/apply-mentor/_components/InterestCountriesScreen/index.tsx
  • apps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsx
  • apps/university-web/src/app/university/[homeUniversity]/_ui/UniversityListContent.tsx

Comment thread apps/web/src/app/(home)/page.tsx Outdated

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

🤖 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 `@apps/web/src/app/my/_ui/MyProfileContent/index.tsx`:
- Around line 392-400: `DesktopMenuItem` currently renders a button whenever
`href` is missing, even if `onClick` is undefined, which creates a
clickable-looking but inert control. Update the render logic in
`DesktopMenuItem` to branch on interactivity: keep the `Link` path for `href`,
render a `button` only when `onClick` exists, and otherwise fall back to a
non-interactive container for `content`. Use the existing `href`, `onClick`, and
`content` props to locate the conditional render block.
🪄 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: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 75689eab-512a-462a-88a3-898aab0db16e

📥 Commits

Reviewing files that changed from the base of the PR and between 4b10d9e and fcf913b.

📒 Files selected for processing (1)
  • apps/web/src/app/my/_ui/MyProfileContent/index.tsx

Comment thread apps/web/src/app/my/_ui/MyProfileContent/index.tsx

@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.

Caution

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

⚠️ Outside diff range comments (2)
apps/web/src/app/university/application/apply/GpaStep.tsx (1)

66-73: 🎯 Functional Correctness | 🟡 Minor

데이터 표시 관련 두 가지 확인 사항입니다.

안녕하세요, 코드 리뷰를 하며 발견한 두 가지 포인트를 정리해 드립니다.

  1. 학교명 하드코딩 이슈

    <ScoreCard
      name="인하대학교" // TODO: 학교명 API 에서 받아오기
      ...
    />

    현재 학교 이름이 '인하대학교'로 고정되어 있어, API 를 통해 다른 대학의 데이터를 받아오더라도 화면에는 항상 인하대학교로만 표시됩니다. 이 부분을 API 응답 데이터와 연동하여 수정해 주세요.

  2. 날짜 포맷 변경 검증 완료

    date={score.issueDate}

    날짜 포맷이 ISO 문자열에서 yyyy-MM-dd 로 변경되었는데, ScoreCard 내부의 formatDate 함수가 new Date() 생성자를 사용하므로 새 포맷도 정상적으로 파싱되어 표시됩니다. 이 부분은 추가 수정 없이 문제없음을 확인했습니다.

🤖 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 `@apps/web/src/app/university/application/apply/GpaStep.tsx` around lines 66 -
73, The ScoreCard in GpaStep is still rendering a hardcoded school name, so
update the name prop to use the university name from the API response or the
relevant score data instead of always passing “인하대학교”. Locate the current
GpaStep component and the ScoreCard usage, then thread through the fetched
school name from the existing data source so the displayed label matches the
selected university.
apps/web/src/app/university/score/ScoreCard.tsx (1)

51-82: 🎯 Functional Correctness | 🟡 Minor

ScoreScreen 호출부에서 dateLabel 명시 누락 확인

기존 로직이 status 기반 분기로 날짜 레이블을 유연하게 처리하던 것과 달리, 현재는 호출부에서 dateLabel 을 넘겨주지 않으면 무조건 "제출일"로 고정됩니다.

확인 결과, 적용 대상인 ScoreScreen 에서도 이 설정이 누락되어 다음과 같은 회귀가 발생할 수 있습니다.

  • ScoreScreen 내 만료/거절 카드: 승인되지 않은 성적(Rejected/Expired 등)이라도 dateLabel 을 넘겨주지 않아 레이블이 모두 "제출일"로 통일되어 표시됩니다.

해당 화면에서는 statusrejectedReason 를 고려하여 적절한 dateLabel 을 명시해주셔야 합니다.

🤖 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 `@apps/web/src/app/university/score/ScoreCard.tsx` around lines 51 - 82, The
ScoreCardBase component now defaults dateLabel to "제출일", so the ScoreScreen call
sites that render non-approved cards must pass the correct label explicitly.
Update the ScoreScreen usage of ScoreCard/ScoreCardBase to set dateLabel based
on status or rejectedReason for rejected/expired cases, while keeping the
approved flow unchanged, so the displayed label matches each card state.
🧹 Nitpick comments (3)
apps/web/src/app/university/application/apply/LanguageStep.tsx (1)

74-75: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

주석으로 남은 옛 date 코드, 떠나보내 주세요.

L74의 주석 처리된 변환 코드는 더 이상 쓰이지 않아 다음 사람을 헷갈리게 할 수 있어요. 의도가 정리된 김에 깔끔히 삭제하는 편이 읽기 좋습니다.

🧹 제안 diff
-                // date={new Date(score.issueDate).toISOString()}
                 date={score.issueDate}
🤖 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 `@apps/web/src/app/university/application/apply/LanguageStep.tsx` around lines
74 - 75, The LanguageStep component still contains a commented-out old date
conversion next to the score.issueDate prop, which should be removed for
clarity. In LanguageStep.tsx, delete the stale commented line in the score
rendering block and keep the active date={score.issueDate} assignment only, so
the intent is clear and the JSX stays clean.
apps/web/src/constants/university.ts (1)

11-13: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

REGIONS_SEARCHREGIONS_KO가 똑같은 값을 두 번 적고 있어요.

두 상수가 동일한 4개 지역 문자열을 그대로 복제하고 있어서, 한쪽만 수정하면 조용히 어긋날 위험이 있습니다. 한쪽을 다른 한쪽에서 파생시키면 진실의 원천(single source)이 하나로 모여 안심할 수 있어요.

♻️ 제안 diff
-export const REGIONS_KO: RegionKo[] = ["유럽권", "미주권", "아시아권", "중국권"];
+export const REGIONS_KO: RegionKo[] = [...REGIONS_SEARCH];
🤖 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 `@apps/web/src/constants/university.ts` around lines 11 - 13, `REGIONS_SEARCH`와
`REGIONS_KO`에 같은 지역 문자열을 중복 선언하고 있어 한쪽만 바뀌어도 불일치가 생길 수 있습니다. `REGIONS_KO`를
`REGIONS_SEARCH`에서 파생되도록 바꾸고, `RegionKo` 타입에 맞는지 유지하면서 `university.ts`의 두 상수가
동일한 값 목록을 공유하도록 정리하세요.
apps/web/src/app/university/application/apply/ApplyPageContent.tsx (1)

103-177: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

renderDesktopSteprenderMobileStep가 거의 쌍둥이라 한 명만 빼닮게 고칠까 걱정돼요.

두 함수의 step 분기(1~4, 99)와 props 전달이 완전히 동일하고, 차이는 Desktop*/Mobile* 컴포넌트 선택뿐입니다. 한쪽에 단계를 추가하거나 props를 바꿀 때 다른 한쪽을 깜빡하면 데스크톱·모바일이 조용히 갈라질 수 있어요.

단계별 컴포넌트 세트를 변수로 받아 단일 렌더러로 합치면 분기 한 군데만 관리하면 됩니다.

♻️ 제안 방향
const renderStep = (isDesktop: boolean) => {
  const C = isDesktop
    ? { Empty: DesktopEmptyGPA, Language: DesktopLanguageStep, Gpa: DesktopGpaStep, University: DesktopUniversityStep, Confirm: DesktopConfirmStep, Done: DesktopDoneStep }
    : { Empty: MobileEmptyGPA, Language: MobileLanguageStep, Gpa: MobileGpaStep, University: MobileUniversityStep, Confirm: MobileConfirmStep, Done: MobileDoneStep };

  if (isScoreDataEmpty) return <C.Empty />;
  // step별 분기 1회만 작성하고 C.* 사용
};
🤖 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 `@apps/web/src/app/university/application/apply/ApplyPageContent.tsx` around
lines 103 - 177, `renderDesktopStep` and `renderMobileStep` duplicate the same
step logic and props, differing only in the Desktop/Mobile component set.
Refactor them into a single `renderStep` helper that takes a component map or
flag and reuses the same step 1/2/3/4/99 branching with shared props, using the
existing `Desktop*` and `Mobile*` component names to keep the implementation
aligned and easier to maintain.
🤖 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.

Outside diff comments:
In `@apps/web/src/app/university/application/apply/GpaStep.tsx`:
- Around line 66-73: The ScoreCard in GpaStep is still rendering a hardcoded
school name, so update the name prop to use the university name from the API
response or the relevant score data instead of always passing “인하대학교”. Locate
the current GpaStep component and the ScoreCard usage, then thread through the
fetched school name from the existing data source so the displayed label matches
the selected university.

In `@apps/web/src/app/university/score/ScoreCard.tsx`:
- Around line 51-82: The ScoreCardBase component now defaults dateLabel to
"제출일", so the ScoreScreen call sites that render non-approved cards must pass
the correct label explicitly. Update the ScoreScreen usage of
ScoreCard/ScoreCardBase to set dateLabel based on status or rejectedReason for
rejected/expired cases, while keeping the approved flow unchanged, so the
displayed label matches each card state.

---

Nitpick comments:
In `@apps/web/src/app/university/application/apply/ApplyPageContent.tsx`:
- Around line 103-177: `renderDesktopStep` and `renderMobileStep` duplicate the
same step logic and props, differing only in the Desktop/Mobile component set.
Refactor them into a single `renderStep` helper that takes a component map or
flag and reuses the same step 1/2/3/4/99 branching with shared props, using the
existing `Desktop*` and `Mobile*` component names to keep the implementation
aligned and easier to maintain.

In `@apps/web/src/app/university/application/apply/LanguageStep.tsx`:
- Around line 74-75: The LanguageStep component still contains a commented-out
old date conversion next to the score.issueDate prop, which should be removed
for clarity. In LanguageStep.tsx, delete the stale commented line in the score
rendering block and keep the active date={score.issueDate} assignment only, so
the intent is clear and the JSX stays clean.

In `@apps/web/src/constants/university.ts`:
- Around line 11-13: `REGIONS_SEARCH`와 `REGIONS_KO`에 같은 지역 문자열을 중복 선언하고 있어 한쪽만
바뀌어도 불일치가 생길 수 있습니다. `REGIONS_KO`를 `REGIONS_SEARCH`에서 파생되도록 바꾸고, `RegionKo` 타입에
맞는지 유지하면서 `university.ts`의 두 상수가 동일한 값 목록을 공유하도록 정리하세요.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 6d7a928b-0754-474e-89b0-92fbe77c0aac

📥 Commits

Reviewing files that changed from the base of the PR and between fc55e76 and 7f15d0e.

📒 Files selected for processing (43)
  • apps/university-web/src/app/university/(home)/_ui/HomeUniversityCard.tsx
  • apps/university-web/src/app/university/(home)/page.tsx
  • apps/university-web/src/app/university/[homeUniversity]/search/_ui/SearchPageContent.tsx
  • apps/university-web/src/app/university/[homeUniversity]/search/page.tsx
  • apps/university-web/src/app/university/search/PageContent.tsx
  • apps/university-web/src/app/university/search/SearchBar.tsx
  • apps/university-web/src/app/university/search/SearchClientContent.tsx
  • apps/university-web/src/app/university/search/page.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/modify/PostModifyForm.tsx
  • apps/web/src/app/community/[boardCode]/create/PostForm.tsx
  • apps/web/src/app/mentor/_ui/MentorClient/_ui/MenteePage/index.tsx
  • apps/web/src/app/mentor/_ui/MentorClient/_ui/MenteePageTabs/index.tsx
  • apps/web/src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx
  • apps/web/src/app/mentor/_ui/MentorClient/_ui/MentorPage/index.tsx
  • apps/web/src/app/mentor/_ui/MentorClient/index.tsx
  • apps/web/src/app/mentor/chat/_ui/ChatPageClient/index.tsx
  • apps/web/src/app/my/apply-mentor/page.tsx
  • apps/web/src/app/my/favorite/_ui/FavoriteContent/_hooks/useSelectUniversities.ts
  • apps/web/src/app/my/favorite/_ui/FavoriteContent/index.tsx
  • apps/web/src/app/my/match/_ui/MatchContent/index.tsx
  • apps/web/src/app/terms/page.tsx
  • apps/web/src/app/university/application/ScorePageContent.tsx
  • apps/web/src/app/university/application/ScoreSheet.tsx
  • apps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsx
  • apps/web/src/app/university/application/apply/ApplyPageContent.tsx
  • apps/web/src/app/university/application/apply/ConfirmStep.tsx
  • apps/web/src/app/university/application/apply/DoneStep.tsx
  • apps/web/src/app/university/application/apply/EmptyGPA.tsx
  • apps/web/src/app/university/application/apply/GpaStep.tsx
  • apps/web/src/app/university/application/apply/LanguageStep.tsx
  • apps/web/src/app/university/application/apply/UniversityStep.tsx
  • apps/web/src/app/university/score/ScoreCard.tsx
  • apps/web/src/app/university/score/ScoreScreen.tsx
  • apps/web/src/app/university/score/example/gpa-cert/page.tsx
  • apps/web/src/app/university/score/example/lang-cert/page.tsx
  • apps/web/src/app/university/score/page.tsx
  • apps/web/src/app/university/score/submit/gpa/GpaSubmitForm.tsx
  • apps/web/src/app/university/score/submit/language-test/LanguageTestSubmitForm.tsx
  • apps/web/src/components/login/signup/SignupPolicyScreen.tsx
  • apps/web/src/components/score/SubmitLinkTab.tsx
  • apps/web/src/components/score/SubmitResult.tsx
  • apps/web/src/constants/university.ts
  • apps/web/src/types/university.ts
✅ Files skipped from review due to trivial changes (1)
  • apps/web/src/app/university/score/page.tsx
🚧 Files skipped from review as they are similar to previous changes (12)
  • apps/web/src/app/terms/page.tsx
  • apps/web/src/app/mentor/chat/_ui/ChatPageClient/index.tsx
  • apps/web/src/app/university/score/submit/gpa/GpaSubmitForm.tsx
  • apps/web/src/app/my/apply-mentor/page.tsx
  • apps/web/src/app/community/[boardCode]/create/PostForm.tsx
  • apps/web/src/app/university/score/submit/language-test/LanguageTestSubmitForm.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/modify/PostModifyForm.tsx
  • apps/web/src/app/my/match/_ui/MatchContent/index.tsx
  • apps/web/src/components/login/signup/SignupPolicyScreen.tsx
  • apps/web/src/app/university/score/ScoreScreen.tsx
  • apps/web/src/app/my/favorite/_ui/FavoriteContent/index.tsx
  • apps/web/src/app/university/application/ScorePageContent.tsx

@vercel vercel Bot temporarily deployed to Preview – solid-connect-web-admin June 25, 2026 04:30 Inactive
@vercel vercel Bot temporarily deployed to Preview – solid-connection-web June 25, 2026 04:30 Inactive
@vercel vercel Bot temporarily deployed to Preview – solid-connection-web June 25, 2026 04:53 Inactive
@vercel vercel Bot temporarily deployed to Preview – solid-connect-web-admin June 25, 2026 04:53 Inactive
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

멘토 채팅 수정

1 participant