Skip to content

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

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

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

Conversation

@manNomi

@manNomi manNomi commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

관련 이슈

작업 내용

  • CodeRabbit 최신 unresolved 리뷰를 반영했습니다.
    • 커뮤니티 글 작성/수정 textarea 자동 높이 effect가 viewport 판별 이후 다시 붙도록 수정
    • 멘토 채팅 링크를 절대 경로로 정리하고, 내 정보/채팅방 로딩 전 잘못된 empty state가 보이지 않도록 가드 추가
    • 멘토 신청 데스크톱 단계에서 이전 컨트롤 추가
    • 관심학교 삭제 confirm 취소 시 편집/선택 상태가 유지되도록 삭제 성공 시점에만 edit mode 종료
    • 매칭된 멘토 카드의 detail id를 채팅방 id가 아닌 partnerId로 수정
    • 약관 목차 앵커 id 안정화 및 잘못된 text-k-902 토큰 교체
    • 지원/성적 화면의 타입/라벨/여백/hex 토큰 지적 반영
  • university-web 데스크톱 뷰를 보강했습니다.
    • /university: 모바일 카드와 분리된 DesktopHomeUniversityCard 추가, 데스크톱 선택 화면을 catalog + 안내 aside 구조로 구성
    • /university/search: 모바일 검색 흐름과 분리된 SearchDesktopContent, DesktopSearchBar, DesktopSchoolSearchForm, 데스크톱 소속 학교 selector 구성
    • /university/[homeUniversity]/search: 모바일 검색 흐름과 분리된 DesktopSearchPageContent를 데스크톱 조건 패널 안에서 렌더링
  • 멘토 홈의 데스크톱 뷰를 모바일 variant 구조에서 분리했습니다.
    • MenteeDesktopPage / MenteeMobilePage, MentorDesktopPage / MentorMobilePage로 진입 컴포넌트 분리
    • 멘티 멘토링 현황과 멘토 찾기 영역을 DesktopPanel / MobileSection 단위로 분리
    • 동일 컴포넌트에 variant만 넘기는 상위 구조를 제거하고 데스크톱 전용 page/panel 조합으로 렌더링
  • 대학 지원/성적 플로우의 데스크톱 뷰를 모바일 variant 구조에서 분리했습니다.
    • /university/application: DesktopScoreSheet / MobileScoreSheet로 지원자 현황 카드 분리
    • /university/application/apply: DesktopLanguageStep, DesktopGpaStep, DesktopUniversityStep, DesktopConfirmStep, DesktopDoneStep, DesktopEmptyGPA 진입점 추가
    • /university/score: DesktopScoreCard, desktop score list/empty state를 모바일 목록과 분리
    • /university/score/submit/*: DesktopSubmitLinkTab, DesktopSubmitResult를 모바일 제출 탭/결과 화면과 분리
    • apps/web/src/app/universityapps/web/src/components/score의 mobile/desktop variant 기반 호출을 제거
  • 기존 데스크톱 전환 작업 범위는 유지하면서, 모바일 컴포넌트에 variant만 얹는 형태를 줄이고 데스크톱 전용 컴포넌트 이름/구조로 분리했습니다.

검증

  • pnpm --filter @solid-connect/web run ci:check 통과
  • pnpm --filter @solid-connect/university-web run ci:check 통과
  • UNIVERSITY_WEB_DOMAIN=http://localhost:3001 pnpm --filter @solid-connect/web run build 통과
  • pre-commit hook 통과
  • 브라우저 확인
    • http://localhost:3001: /university, /university/search, /university/inha/search
    • http://localhost:3002/mentor: desktop 1440x900, mobile 390x844
    • http://localhost:3002: /university/application, /university/application/apply, /university/score, /university/score/submit/language-test, /university/score/submit/gpa
    • 가로 overflow 없음, 콘솔 error 없음
    • /mentor는 인증 보호 상태라 실제 멘토 홈 콘텐츠 대신 auth/guard 경로 로딩 상태 기준으로 route 안정성만 확인
    • 대학 지원/성적 client 본문은 현재 in-app browser 세션에서 auth/client guard 영향으로 실제 콘텐츠 노출까지는 제한적으로 확인
  • pnpm --filter @solid-connect/university-web run build는 컴파일 이후 page data 수집 단계에서 외부 SSG API 500(executeWithLock)로 실패합니다. 기존 GitHub/Vercel 실패와 동일한 /university/[homeUniversity]/[id] SSG 데이터 수집 문제입니다.

참고

  • 로컬 Node 버전은 v23.10.0이라 repository engines의 Node 22.x 경고가 출력됩니다.
  • CodeRabbit active unresolved review thread는 0개입니다.

@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 1:29am
solid-connection-web Ready Ready Preview, Comment Jun 25, 2026 1:29am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
solid-connect-web-admin Skipped Skipped Jun 25, 2026 1:29am

@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 제목이 데스크톱 최적화 레이아웃 적용이라는 핵심 변경을 간단히 잘 요약합니다.
Description check ✅ Passed 관련 이슈, 작업 내용, 검증이 포함되어 있어 템플릿을 대체로 충족합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ 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.

Actionable comments posted: 14

🧹 Nitpick comments (9)
apps/web/src/utils/useIsDesktopViewport.ts (1)

7-21: 📐 Maintainability & Code Quality | 🔵 Trivial

지금 구현도 매체 쿼리 변경 감지와 정리 로직이 훌륭하게 동작하지만, React 19 시대에 맞춰 더 견고하고 의미 있는 패턴으로 다듬어 보면 어떨까요?

  1. useSyncExternalStore로 구독 패턴 업데이트: 외부 상태인 matchMedia 를 React 의 표준 구독 패턴으로 관리하면, 초기 렌더링 성능과 SSR(서버 사이드 렌더링) 호환성 측면에서 더 유리합니다.
  2. 안정적인 구독 함수 활용: useCallback 으로 구독 함수를 메모이제이션하여 불필요한 구독/해제 낭비를 방지하고, getServerSnapshot 을 정의하여 서버와 클라이언트 간의 렌더 불일치를 자연스럽게 해결할 수 있습니다.

기존 코드도 큰 문제는 없으니, 코드의 일관성과 유지보수성을 조금 더 높이고 싶으실 때 참고해 주세요.

🤖 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/utils/useIsDesktopViewport.ts` around lines 7 - 21, Update
useIsDesktopViewport to use React 19’s useSyncExternalStore pattern instead of
useEffect state syncing for matchMedia. In useIsDesktopViewport, add a stable
subscribe function with useCallback around the media query change listener,
provide getSnapshot and getServerSnapshot so SSR can resolve consistently, and
return the store value directly rather than managing local isDesktop state.
apps/web/src/app/university/application/apply/GpaStep.tsx (1)

35-70: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

1. 거의 똑같은 레이아웃 형제, LanguageStep과 헤어지지 못한 모습이에요.

GpaStepLanguageStep은 래퍼 클래스(clsx({ "my-5 px-5": !isDesktop })), Tab 래퍼, 그리고 그리드 클래스(clsx("my-[14px] grid gap-3", isDesktop ? "mb-0 lg:grid-cols-2" : "mb-40 grid-cols-1"))까지 사실상 판박이입니다. 지금 당장 문제가 되는 건 아니지만, 한쪽 레이아웃을 손보면 다른 쪽도 같이 손봐야 하는 숨은 비용이 생깁니다. 공통 셸(예: ScoreSelectStep)로 추출하면 두 단계가 같은 규칙을 자연스럽게 공유하게 됩니다. 부담스러우면 지금은 그냥 넘어가셔도 괜찮아요.

🤖 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 35 -
70, `GpaStep` is duplicating the same layout shell used by `LanguageStep`,
including the outer `clsx({ "my-5 px-5": !isDesktop })` wrapper, the `Tab`
container, and the score grid classes. Extract that shared structure into a
reusable step shell component such as `ScoreSelectStep` and have both `GpaStep`
and `LanguageStep` compose it, keeping only the step-specific card rendering and
handlers inside each step.
apps/web/src/app/university/score/submit/gpa/GpaSubmitForm.tsx (1)

167-214: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

데스크톱 레이아웃 셸이 LanguageTestSubmitForm과 거의 똑같습니다.

헤더("성적 입력하기") + grid xl:grid-cols-[minmax(460px,600px)_minmax(300px,360px)] + 스티키 aside 구조가 어학 제출 폼과 사실상 동일하고, 차이는 안내 문구 3줄과 탭의 isActiveGpa 정도뿐입니다. 지금 동작에는 문제가 없으니 급하진 않습니다.

여유가 될 때 공용 ScoreSubmitDesktopShell(헤더 문구 + 사이드 안내 항목을 props로 받는) 컴포넌트로 추출하면, 향후 한쪽만 수정되어 두 화면이 어긋나는 일을 막을 수 있습니다.

🤖 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/submit/gpa/GpaSubmitForm.tsx` around lines
167 - 214, The desktop layout in GpaSubmitForm is duplicated from
LanguageTestSubmitForm, including the header, grid shell, and sticky aside
structure. Extract the shared desktop wrapper into a reusable
ScoreSubmitDesktopShell component that owns the common layout and accepts props
for the title, subtitle, and aside guidance items, then use it from
GpaSubmitForm and the language test form. Keep the GPA-specific content and
isActiveGpa tab state as props so both screens stay consistent while preserving
their distinct copy.
apps/web/src/app/mentor/chat/[chatId]/_ui/ChatContent/index.tsx (1)

102-103: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

연결 상태 메시지 영역에 bg-white/패딩/정렬이 겹쳐 있어요.

바깥 div(bg-white px-4 text-center)와 바로 안쪽 div(rounded bg-white px-4 py-2 text-center)가 같은 배경·정렬을 두 번 칠하고 있습니다. 둘 중 하나만 남겨도 보이는 결과는 동일하니, 한 단계 덜어내면 마크업이 한결 가벼워집니다. 급한 문제는 아니니 여유 있을 때 정리하셔도 좋습니다.

🤖 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/mentor/chat/`[chatId]/_ui/ChatContent/index.tsx around lines
102 - 103, The connection status message area in ChatContent has duplicated
styling because both the outer and inner div apply the same bg-white, padding,
and text-center classes. Simplify the markup by removing the redundant wrapper
or consolidating the shared styling into a single container, keeping the
existing structure in the ChatContent component and its isDesktop conditional
behavior intact.
apps/web/src/app/mentor/chat/_ui/ChatPageClient/index.tsx (2)

26-32: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

빈 상태 분기 두 개는 한 줄로 합칠 수 있어요.

지금은 isMentee 여부만 다른 두 개의 return <ChatEmptyState ... />가 나란히 있습니다. isMentee 값을 그대로 넘기면 한 번의 반환으로 같은 동작을 만들 수 있어 읽기가 더 편해집니다. 선택 사항이니 부담 없이 보셔도 됩니다.

♻️ 제안 다이프
-  if (chatRooms.length === 0 && isMentee) {
-    return <ChatEmptyState isDesktop={isDesktop} isMentee />;
-  }
-
-  if (chatRooms.length === 0) {
-    return <ChatEmptyState isDesktop={isDesktop} isMentee={false} />;
-  }
+  if (chatRooms.length === 0) {
+    return <ChatEmptyState isDesktop={isDesktop} isMentee={isMentee} />;
+  }
🤖 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/mentor/chat/_ui/ChatPageClient/index.tsx` around lines 26 -
32, Combine the two empty-state branches in ChatPageClient by returning
ChatEmptyState once when chatRooms.length === 0 and passing isMentee directly
instead of splitting into separate isMentee and false returns; keep the existing
behavior in the ChatPageClient component while simplifying the conditional logic
around ChatEmptyState.

34-60: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

데스크톱 셸 마크업이 여러 화면에서 반복되고 있어요.

min-h-screen bg-k-50 px-8 py-8 lg:px-10 컨테이너와 Mentor 이름표 + typo-bold-1 헤더 조합이 이 파일뿐 아니라 WaitingContent, ModifyContent, ChatNavBar에서도 거의 그대로 반복됩니다. 공통 DesktopPageShell(header 슬롯 포함) 정도로 추출해 두면 이후 데스크톱 화면이 늘어날 때 한 곳에서 톤을 맞출 수 있습니다. 범위가 넓으니 이번 PR에서 무리해서 하실 필요는 없고, 후속 정리 후보로만 기억해 두셔도 충분합니다.

🤖 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/mentor/chat/_ui/ChatPageClient/index.tsx` around lines 34 -
60, The desktop page shell markup is duplicated across ChatPageClient and the
related desktop views like WaitingContent, ModifyContent, and ChatNavBar.
Extract the shared container and header pattern into a reusable DesktopPageShell
component with a header slot, then update ChatPageClient to compose with it so
the min-h-screen/bg-k-50 layout and Mentor heading live in one place. Keep the
existing inner content and quick links as children, and use the new shell
anywhere the same desktop scaffold is repeated.
apps/web/src/app/mentor/modify/_ui/ModifyContent/index.tsx (1)

62-95: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

introduction/passTip 입력+에러 블록이 데스크톱과 모바일에 거의 똑같이 두 벌 있어요.

register("introduction")/register("passTip") textarea와 그 아래 에러 메시지 표시 로직이 데스크톱 분기(62-95)와 모바일 분기(160-186)에서 문구·클래스만 살짝 다를 뿐 사실상 동일합니다. 라벨/높이/className을 props로 받는 작은 MentorTextField 컴포넌트로 묶으면 향후 검증 메시지나 maxLength를 바꿀 때 한 군데만 손대면 됩니다. 분량이 있는 작업이라 선택 사항으로 남겨 둡니다.

🤖 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/mentor/modify/_ui/ModifyContent/index.tsx` around lines 62 -
95, The introduction/passTip textarea and error rendering logic is duplicated
between the desktop and mobile branches in ModifyContent. Extract the repeated
`register("introduction")`/`register("passTip")` textarea plus error message
block into a reusable `MentorTextField` component that accepts label, id, field
name, placeholder, className/height, and error text props, then use it in both
branches to keep validation and maxLength changes centralized.
apps/web/src/app/my/apply-mentor/page.tsx (1)

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

useIsDesktopViewport(false)는 초기값을 false로 넘겨서 null을 반환할 일이 없으니, 71번 줄의 Boolean(isDesktop)은 사실상 항상 boolean을 다시 감싸는 형태입니다. 동작에는 문제가 없으니 그대로 두셔도 되고, 깔끔함을 원하시면 그냥 isDesktop만 넘기셔도 됩니다.

🤖 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/my/apply-mentor/page.tsx` at line 24,
`useIsDesktopViewport(false)` always returns a boolean here, so the
`Boolean(isDesktop)` wrapper in the `page.tsx` component is redundant. In the
`apply-mentor` page, either keep the current behavior as-is or simplify the
prop/condition usage by passing `isDesktop` directly where `Boolean(isDesktop)`
is used, so the code is cleaner without changing behavior.
apps/web/src/app/my/modify/_ui/ModifyContent/index.tsx (1)

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

데스크톱에서 첫 프레임에 모바일 레이아웃이 잠깐 스쳐 지나갑니다.

useIsDesktopViewport(false)는 마운트 직후 한 프레임 동안 false(모바일)로 그려진 뒤 useEffect에서 데스크톱으로 전환되므로, 데스크톱 사용자는 단일 컬럼 → 2컬럼으로 바뀌는 깜빡임을 보게 됩니다. 같은 PR의 FavoriteContent/MatchContent처럼 기본값을 null로 두고 isDesktop === null일 때 placeholder를 반환하면 깜빡임 없이 일관된 패턴이 됩니다.

같은 지적이 PasswordContentSchoolEmailVerificationContent에도 동일하게 적용됩니다.

🤖 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/my/modify/_ui/ModifyContent/index.tsx` at line 16, The
desktop viewport state is being initialized with a false default in
ModifyContent, which causes a brief mobile layout flash before the desktop
layout is applied. Update the viewport handling in the same pattern used by
FavoriteContent and MatchContent: use a null initial state in
useIsDesktopViewport, return a placeholder while isDesktop is null, and only
render the real layout once the viewport is resolved. Apply the same change
consistently to PasswordContent and SchoolEmailVerificationContent as well.
🤖 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/community/`[boardCode]/[postId]/modify/PostModifyForm.tsx:
- Around line 127-130: The title auto-resize effect in PostModifyForm is only
running on the initial mount, so it misses the real textarea/title refs when the
desktop/mobile gate delays rendering. Update the useEffect that wires
adjustHeight and the input listener so it reruns after the viewport check
settles by adding isDesktop to its dependency array, ensuring the effect
attaches to textareaRef and titleRef once the editor is actually rendered.

In `@apps/web/src/app/community/`[boardCode]/create/PostForm.tsx:
- Around line 83-85: The loading gate in PostForm is now delaying the editor
mount until isDesktop is known, which prevents the title auto-resize effect from
attaching on the first render. Update the height-adjustment useEffect that reads
textareaRef/titleRef and mirrors the PostModifyForm behavior by including
isDesktop in its dependency list so it reruns once the editor actually renders.
Keep the existing gate logic, but ensure the effect is re-triggered when
isDesktop changes from null to a real value.

In `@apps/web/src/app/mentor/_ui/MentorClient/_ui/MenteePageTabs/index.tsx`:
- Around line 67-76: The mentor chat card link in the MenteePageTabs component
is using a relative path instead of the project’s consistent absolute routing
style. Update the Link href inside the mentoList.map render to use an absolute
path for mentor/chat, matching viewAllHref and the rest of the app’s navigation
patterns. Keep the change localized to the Link around MentorChatCard so all
mentor chat links resolve consistently.

In `@apps/web/src/app/mentor/chat/_ui/ChatPageClient/index.tsx`:
- Around line 20-22: The role checks in ChatPageClient are treating missing
myInfo as non-mentee, which can briefly show the wrong empty state before
profile data loads. Update the logic around isMentee, isPartnerMentor, and
listTitle to account for isLoading or unset myInfo, and keep the UI in a
loading/placeholder state until the user role is resolved.

In `@apps/web/src/app/my/apply-mentor/page.tsx`:
- Around line 74-114: 데스크톱 분기에서 이전 단계로 돌아갈 수 있는 컨트롤이 없어 2·3단계 수정 흐름이 막혀 있습니다.
apply-mentor/page.tsx의 데스크톱 렌더링 영역에서 goPrevStep을 연결한 “이전” 버튼이나 링크를 추가하고, step/3
진행 UI 또는 헤더 근처에서 현재 단계에 맞게 노출되도록 하세요. StudyStatusScreen,
InterestCountriesScreen, UniversityScreen와 함께 step 상태를 사용하는 구조에 맞춰 뒤로가기 동작이 모바일의
TopDetailNavigation handleBack과 동일한 역할을 하게 연결하면 됩니다.

In `@apps/web/src/app/my/favorite/_ui/FavoriteContent/index.tsx`:
- Around line 28-31: `handleDeleteSelected` is clearing edit mode before the
delete confirmation in `handleDeleteAll` runs, so canceling the confirm still
exits selection. Move the `setIsEditMode(false)` behavior to the successful
delete path instead of the pre-confirm path, ideally by letting
`useSelectUniversities`/`handleDeleteAll` accept a callback that closes edit
mode only after deletion completes. Keep the fix centered around
`handleDeleteSelected`, `handleDeleteAll`, and the `useSelectUniversities`
delete flow so cancel preserves the current selection state.

In `@apps/web/src/app/my/match/_ui/MatchContent/index.tsx`:
- Around line 152-163: toMentorPreview is mapping the wrong identifier into the
mentor preview object, which breaks mentor detail navigation and application
flows. Update the id assignment inside toMentorPreview in MatchContent so it
uses room.partner.partnerId instead of room.id, since the /mentor/[id] route
expects the actual mentor/user ID. Keep the rest of the preview mapping
unchanged and verify any callers of mentor preview still receive the expected
identifier.

In `@apps/web/src/app/terms/page.tsx`:
- Line 194: `TermsPage`에서 사용 중인 `text-k-902`는 Tailwind `k` 팔레트에 정의되지 않은 토큰이므로,
`section.title`을 렌더링하는 해당 `<p>`의 클래스명을 `text-k-800` 또는 실제 존재하는 인접 토큰으로 바꿔 주세요.
`apps/web/tailwind.config.ts`의 `k` 색상 정의와 화면 내 다른 텍스트 스타일을 참고해 유효한 `text-k-*`
값으로 맞추고, `page.tsx`의 일관된 타이포그래피도 함께 확인해 주세요.
- Around line 170-201: The Terms page anchor links are using section.title
directly for both href and id in TermsSectionList and the nav map, which is
unstable because titles contain spaces/parentheses. Update the anchor generation
to use a safe deterministic id (for example based on the section index or a slug
field) and make both the <a> href and the matching <section> id use the same
value so the table of contents scrolls reliably.

In `@apps/web/src/app/university/application/apply/ApplyPageContent.tsx`:
- Around line 93-102: `isDataExist` is misleading because it becomes true when
GPA or language test data is missing, not when data exists. Rename the boolean
in ApplyPageContent to something that matches the condition and the `renderStep`
branch, such as a missing/empty-data name, and update its usages in the shared
mobile/desktop rendering path so the intent stays clear and future condition
changes are less error-prone.

In `@apps/web/src/app/university/application/ScorePageContent.tsx`:
- Around line 20-34: Update the region typing so `RegionKo` in `university.ts`
includes `중국권`, keeping it aligned with `REGIONS_KO` in the constants. After
that type mismatch is resolved, remove the unnecessary `as RegionKo` casts in
`ScorePageContent` (including the desktop/mobile region handlers and related
selection logic) so the component relies on the now-correct type definitions
instead of forced assertions.

In `@apps/web/src/app/university/score/page.tsx`:
- Line 16: `ScoreMobileView`와 감싸는 래퍼의 여백이 중복되어 모바일에서 좌우 간격이 과도해집니다. `page.tsx`의
래퍼 클래스와 `ScoreMobileView`의 `mx-5` 중 한쪽에서만 모바일 여백을 적용하도록 정리하고, 데스크톱은 기존 `md:px-0`
동작을 유지하세요. 특히 `ScoreMobileView`와 해당 wrapper `<div className="w-full px-5
md:px-0">`를 기준으로 중복 여백이 생기지 않게 조정하면 됩니다.

In `@apps/web/src/app/university/score/ScoreScreen.tsx`:
- Around line 220-228: `ScoreCard` is receiving `score.issueDate` for approved
entries, which makes the approved card render the submission date as if it were
an expiration date. Update the `ScoreScreen` usages of `ScoreCard` so that the
approved-state `date` prop uses the actual expiration-date field if one exists,
and if not, change the `ScoreCard` date label/formatting to clearly show it as
제출일 instead of 만료일. Make the same adjustment in both `ScoreCard` render sites
and keep the `verifyStatus === "APPROVED"` logic aligned with the chosen date
source.

In `@apps/web/src/components/login/signup/SignupPolicyScreen.tsx`:
- Line 20: The mobile border color in SignupPolicyScreen is using an invalid hex
value in the non-desktop branch, so Tailwind cannot generate the intended border
color. Update the `isDesktop ? ... : ...` className in `SignupPolicyScreen` to
replace the malformed `border-[`#bgbgbg`]` with a valid gray hex color that
matches the design, keeping the desktop branch unchanged.

---

Nitpick comments:
In `@apps/web/src/app/mentor/chat/_ui/ChatPageClient/index.tsx`:
- Around line 26-32: Combine the two empty-state branches in ChatPageClient by
returning ChatEmptyState once when chatRooms.length === 0 and passing isMentee
directly instead of splitting into separate isMentee and false returns; keep the
existing behavior in the ChatPageClient component while simplifying the
conditional logic around ChatEmptyState.
- Around line 34-60: The desktop page shell markup is duplicated across
ChatPageClient and the related desktop views like WaitingContent, ModifyContent,
and ChatNavBar. Extract the shared container and header pattern into a reusable
DesktopPageShell component with a header slot, then update ChatPageClient to
compose with it so the min-h-screen/bg-k-50 layout and Mentor heading live in
one place. Keep the existing inner content and quick links as children, and use
the new shell anywhere the same desktop scaffold is repeated.

In `@apps/web/src/app/mentor/chat/`[chatId]/_ui/ChatContent/index.tsx:
- Around line 102-103: The connection status message area in ChatContent has
duplicated styling because both the outer and inner div apply the same bg-white,
padding, and text-center classes. Simplify the markup by removing the redundant
wrapper or consolidating the shared styling into a single container, keeping the
existing structure in the ChatContent component and its isDesktop conditional
behavior intact.

In `@apps/web/src/app/mentor/modify/_ui/ModifyContent/index.tsx`:
- Around line 62-95: The introduction/passTip textarea and error rendering logic
is duplicated between the desktop and mobile branches in ModifyContent. Extract
the repeated `register("introduction")`/`register("passTip")` textarea plus
error message block into a reusable `MentorTextField` component that accepts
label, id, field name, placeholder, className/height, and error text props, then
use it in both branches to keep validation and maxLength changes centralized.

In `@apps/web/src/app/my/apply-mentor/page.tsx`:
- Line 24: `useIsDesktopViewport(false)` always returns a boolean here, so the
`Boolean(isDesktop)` wrapper in the `page.tsx` component is redundant. In the
`apply-mentor` page, either keep the current behavior as-is or simplify the
prop/condition usage by passing `isDesktop` directly where `Boolean(isDesktop)`
is used, so the code is cleaner without changing behavior.

In `@apps/web/src/app/my/modify/_ui/ModifyContent/index.tsx`:
- Line 16: The desktop viewport state is being initialized with a false default
in ModifyContent, which causes a brief mobile layout flash before the desktop
layout is applied. Update the viewport handling in the same pattern used by
FavoriteContent and MatchContent: use a null initial state in
useIsDesktopViewport, return a placeholder while isDesktop is null, and only
render the real layout once the viewport is resolved. Apply the same change
consistently to PasswordContent and SchoolEmailVerificationContent as well.

In `@apps/web/src/app/university/application/apply/GpaStep.tsx`:
- Around line 35-70: `GpaStep` is duplicating the same layout shell used by
`LanguageStep`, including the outer `clsx({ "my-5 px-5": !isDesktop })` wrapper,
the `Tab` container, and the score grid classes. Extract that shared structure
into a reusable step shell component such as `ScoreSelectStep` and have both
`GpaStep` and `LanguageStep` compose it, keeping only the step-specific card
rendering and handlers inside each step.

In `@apps/web/src/app/university/score/submit/gpa/GpaSubmitForm.tsx`:
- Around line 167-214: The desktop layout in GpaSubmitForm is duplicated from
LanguageTestSubmitForm, including the header, grid shell, and sticky aside
structure. Extract the shared desktop wrapper into a reusable
ScoreSubmitDesktopShell component that owns the common layout and accepts props
for the title, subtitle, and aside guidance items, then use it from
GpaSubmitForm and the language test form. Keep the GPA-specific content and
isActiveGpa tab state as props so both screens stay consistent while preserving
their distinct copy.

In `@apps/web/src/utils/useIsDesktopViewport.ts`:
- Around line 7-21: Update useIsDesktopViewport to use React 19’s
useSyncExternalStore pattern instead of useEffect state syncing for matchMedia.
In useIsDesktopViewport, add a stable subscribe function with useCallback around
the media query change listener, provide getSnapshot and getServerSnapshot so
SSR can resolve consistently, and return the store value directly rather than
managing local isDesktop state.
🪄 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: a4d59cb1-82fc-4d69-bd93-d9f492ee8f1e

📥 Commits

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

📒 Files selected for processing (79)
  • apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx
  • apps/web/src/app/(home)/_ui/HomeDesktopView/index.tsx
  • apps/web/src/app/(home)/_ui/HomeResponsiveContent/index.tsx
  • apps/web/src/app/(home)/page.tsx
  • apps/web/src/app/community/[boardCode]/CommunityPageContent.tsx
  • apps/web/src/app/community/[boardCode]/PostCards.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/CommentInput.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/CommentSection.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/Content.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/PostPageContent.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/modify/PostModifyForm.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/modify/page.tsx
  • apps/web/src/app/community/[boardCode]/create/PostForm.tsx
  • apps/web/src/app/login/LoginContent.tsx
  • apps/web/src/app/login/apple/callback/page.tsx
  • apps/web/src/app/login/kakao/callback/page.tsx
  • apps/web/src/app/login/page.tsx
  • apps/web/src/app/mentor/[id]/_ui/MentorDetialContent/index.tsx
  • apps/web/src/app/mentor/[id]/page.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/[chatId]/_ui/ChatContent/index.tsx
  • apps/web/src/app/mentor/chat/[chatId]/_ui/ChatNavBar/index.tsx
  • apps/web/src/app/mentor/chat/[chatId]/page.tsx
  • apps/web/src/app/mentor/chat/_ui/ChatPageClient/index.tsx
  • apps/web/src/app/mentor/chat/page.tsx
  • apps/web/src/app/mentor/loading.tsx
  • apps/web/src/app/mentor/modify/_ui/ModifyContent/index.tsx
  • apps/web/src/app/mentor/modify/page.tsx
  • apps/web/src/app/mentor/page.tsx
  • apps/web/src/app/mentor/waiting/_ui/WaitingContent/index.tsx
  • apps/web/src/app/my/_ui/MyProfileContent/index.tsx
  • apps/web/src/app/my/apply-mentor/_components/CompletionScreen/index.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/apply-mentor/page.tsx
  • apps/web/src/app/my/favorite/_ui/FavoriteContent/index.tsx
  • apps/web/src/app/my/favorite/page.tsx
  • apps/web/src/app/my/match/_ui/MatchContent/index.tsx
  • apps/web/src/app/my/match/page.tsx
  • apps/web/src/app/my/modify/_ui/ModifyContent/index.tsx
  • apps/web/src/app/my/modify/page.tsx
  • apps/web/src/app/my/page.tsx
  • apps/web/src/app/my/password/_ui/PasswordContent/index.tsx
  • apps/web/src/app/my/password/page.tsx
  • apps/web/src/app/my/school-email/_ui/SchoolEmailVerificationContent/index.tsx
  • apps/web/src/app/sign-up/email/EmailSignUpForm.tsx
  • apps/web/src/app/sign-up/email/page.tsx
  • apps/web/src/app/sign-up/page.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/page.tsx
  • apps/web/src/app/university/score/submit/gpa/GpaSubmitForm.tsx
  • apps/web/src/app/university/score/submit/gpa/page.tsx
  • apps/web/src/app/university/score/submit/language-test/LanguageTestSubmitForm.tsx
  • apps/web/src/app/university/score/submit/language-test/page.tsx
  • apps/web/src/components/login/signup/SignupPolicyScreen.tsx
  • apps/web/src/components/login/signup/SignupPrepareScreen.tsx
  • apps/web/src/components/login/signup/SignupProfileScreen.tsx
  • apps/web/src/components/login/signup/SignupRegionScreen.tsx
  • apps/web/src/components/login/signup/SignupSurvey.tsx
  • apps/web/src/components/score/SubmitLinkTab.tsx
  • apps/web/src/components/score/SubmitResult.tsx
  • apps/web/src/utils/useIsDesktopViewport.ts
💤 Files with no reviewable changes (1)
  • apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx
✅ Files skipped from review due to trivial changes (16)
  • apps/web/src/app/mentor/modify/page.tsx
  • apps/web/src/app/mentor/[id]/page.tsx
  • apps/web/src/app/login/page.tsx
  • apps/web/src/app/my/modify/page.tsx
  • apps/web/src/app/login/kakao/callback/page.tsx
  • apps/web/src/app/sign-up/page.tsx
  • apps/web/src/app/university/score/submit/language-test/page.tsx
  • apps/web/src/app/mentor/page.tsx
  • apps/web/src/app/my/page.tsx
  • apps/web/src/app/my/favorite/page.tsx
  • apps/web/src/app/my/password/page.tsx
  • apps/web/src/app/sign-up/email/page.tsx
  • apps/web/src/app/university/score/submit/gpa/page.tsx
  • apps/web/src/app/mentor/loading.tsx
  • apps/web/src/app/mentor/chat/page.tsx
  • apps/web/src/app/my/match/page.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/web/src/app/(home)/_ui/HomeDesktopView/index.tsx
  • apps/web/src/app/my/_ui/MyProfileContent/index.tsx

Comment thread apps/web/src/app/community/[boardCode]/create/PostForm.tsx
Comment thread apps/web/src/app/mentor/chat/_ui/ChatPageClient/index.tsx
Comment thread apps/web/src/app/my/apply-mentor/page.tsx
Comment thread apps/web/src/app/university/application/apply/ApplyPageContent.tsx Outdated
Comment thread apps/web/src/app/university/application/ScorePageContent.tsx
Comment thread apps/web/src/app/university/score/page.tsx Outdated
Comment thread apps/web/src/app/university/score/ScoreScreen.tsx Outdated
Comment thread apps/web/src/components/login/signup/SignupPolicyScreen.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.

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

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