feat: 데스크톱 최적화 레이아웃 적용#576
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
2 Skipped Deployments
|
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughEstimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 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"> |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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
📒 Files selected for processing (39)
apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/_ui/TitleSection.tsxapps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsxapps/university-web/src/app/university/[homeUniversity]/_ui/RegionFilter.tsxapps/university-web/src/app/university/[homeUniversity]/_ui/SearchBar.tsxapps/university-web/src/app/university/[homeUniversity]/_ui/UniversityListContent.tsxapps/university-web/src/app/university/[homeUniversity]/page.tsxapps/university-web/src/components/layout/GlobalLayout/index.tsxapps/university-web/src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsxapps/university-web/src/components/layout/GlobalLayout/ui/DesktopNavigation/index.tsxapps/university-web/src/components/layout/PathBasedNavigation/index.tsxapps/university-web/src/components/layout/TopDetailNavigation.tsxapps/university-web/src/components/ui/TopLogoBar/index.tsxapps/university-web/src/components/university/UniversityCards/index.tsxapps/web/src/app/(home)/_ui/FindLastYearScoreBar/index.tsxapps/web/src/app/(home)/_ui/HomeActionLinks/index.tsxapps/web/src/app/(home)/_ui/HomeUniversitySearchSection/index.tsxapps/web/src/app/(home)/_ui/NewsSection/index.tsxapps/web/src/app/(home)/_ui/PopularUniversitySection/_ui/PopularUniversityCard.tsxapps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsxapps/web/src/app/(home)/page.tsxapps/web/src/app/community/[boardCode]/PostWriteButton.tsxapps/web/src/app/community/[boardCode]/[postId]/CommentInput.tsxapps/web/src/app/community/[boardCode]/[postId]/modify/PostModifyForm.tsxapps/web/src/app/my/apply-mentor/_components/InterestCountriesScreen/index.tsxapps/web/src/app/my/apply-mentor/_components/StudyStatusScreen/index.tsxapps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsxapps/web/src/app/my/password/_ui/PasswordContent/index.tsxapps/web/src/app/sign-up/email/EmailSignUpForm.tsxapps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsxapps/web/src/app/university/score/ScoreScreen.tsxapps/web/src/app/university/score/submit/gpa/GpaSubmitForm.tsxapps/web/src/app/university/score/submit/language-test/LanguageTestSubmitForm.tsxapps/web/src/components/layout/GlobalLayout/index.tsxapps/web/src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsxapps/web/src/components/layout/GlobalLayout/ui/DesktopNavigation/index.tsxapps/web/src/components/layout/PathBasedNavigation/index.tsxapps/web/src/components/layout/TopDetailNavigation.tsxapps/web/src/components/ui/TopLogoBar/index.tsxapps/web/src/components/university/UniversityCards/index.tsx
# Conflicts: # apps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsx
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (3)
apps/web/src/app/(home)/_ui/HomeDesktopView/index.tsx (1)
187-195: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win1. 뉴스 카드 이미지에는
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 value1. 안쪽
contentdiv의key는 살짝 멋쩍게 남아 있어요.리스트 항목으로 실제 렌더되는 요소는
UniversityZoneLink/Link이고, 거기에 이미key={href}가 잘 붙어 있어요. 88번째 줄의contentdiv에 있는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 | 🔵 Trivial1. 모바일/데스크톱 분기를 조건부 렌더링으로 바꾸기
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
📒 Files selected for processing (12)
apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsxapps/university-web/src/app/university/[homeUniversity]/_ui/UniversityListContent.tsxapps/web/src/app/(home)/_ui/HomeDesktopView/HomeDesktopEntryPanel.tsxapps/web/src/app/(home)/_ui/HomeDesktopView/index.tsxapps/web/src/app/(home)/_ui/PopularUniversitySection/index.tsxapps/web/src/app/(home)/page.tsxapps/web/src/app/my/apply-mentor/_components/InterestCountriesScreen/index.tsxapps/web/src/app/my/apply-mentor/_components/StudyStatusScreen/index.tsxapps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsxapps/web/src/app/my/password/_ui/PasswordContent/index.tsxapps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsxapps/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
There was a problem hiding this comment.
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
📒 Files selected for processing (1)
apps/web/src/app/my/_ui/MyProfileContent/index.tsx
There was a problem hiding this comment.
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데이터 표시 관련 두 가지 확인 사항입니다.
안녕하세요, 코드 리뷰를 하며 발견한 두 가지 포인트를 정리해 드립니다.
학교명 하드코딩 이슈
<ScoreCard name="인하대학교" // TODO: 학교명 API 에서 받아오기 ... />현재 학교 이름이 '인하대학교'로 고정되어 있어, API 를 통해 다른 대학의 데이터를 받아오더라도 화면에는 항상 인하대학교로만 표시됩니다. 이 부분을 API 응답 데이터와 연동하여 수정해 주세요.
날짜 포맷 변경 검증 완료
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을 넘겨주지 않아 레이블이 모두 "제출일"로 통일되어 표시됩니다.해당 화면에서는
status나rejectedReason를 고려하여 적절한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_SEARCH와REGIONS_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
renderDesktopStep와renderMobileStep가 거의 쌍둥이라 한 명만 빼닮게 고칠까 걱정돼요.두 함수의 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
📒 Files selected for processing (43)
apps/university-web/src/app/university/(home)/_ui/HomeUniversityCard.tsxapps/university-web/src/app/university/(home)/page.tsxapps/university-web/src/app/university/[homeUniversity]/search/_ui/SearchPageContent.tsxapps/university-web/src/app/university/[homeUniversity]/search/page.tsxapps/university-web/src/app/university/search/PageContent.tsxapps/university-web/src/app/university/search/SearchBar.tsxapps/university-web/src/app/university/search/SearchClientContent.tsxapps/university-web/src/app/university/search/page.tsxapps/web/src/app/community/[boardCode]/[postId]/modify/PostModifyForm.tsxapps/web/src/app/community/[boardCode]/create/PostForm.tsxapps/web/src/app/mentor/_ui/MentorClient/_ui/MenteePage/index.tsxapps/web/src/app/mentor/_ui/MentorClient/_ui/MenteePageTabs/index.tsxapps/web/src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsxapps/web/src/app/mentor/_ui/MentorClient/_ui/MentorPage/index.tsxapps/web/src/app/mentor/_ui/MentorClient/index.tsxapps/web/src/app/mentor/chat/_ui/ChatPageClient/index.tsxapps/web/src/app/my/apply-mentor/page.tsxapps/web/src/app/my/favorite/_ui/FavoriteContent/_hooks/useSelectUniversities.tsapps/web/src/app/my/favorite/_ui/FavoriteContent/index.tsxapps/web/src/app/my/match/_ui/MatchContent/index.tsxapps/web/src/app/terms/page.tsxapps/web/src/app/university/application/ScorePageContent.tsxapps/web/src/app/university/application/ScoreSheet.tsxapps/web/src/app/university/application/_components/ApplicationBottomActionBar.tsxapps/web/src/app/university/application/apply/ApplyPageContent.tsxapps/web/src/app/university/application/apply/ConfirmStep.tsxapps/web/src/app/university/application/apply/DoneStep.tsxapps/web/src/app/university/application/apply/EmptyGPA.tsxapps/web/src/app/university/application/apply/GpaStep.tsxapps/web/src/app/university/application/apply/LanguageStep.tsxapps/web/src/app/university/application/apply/UniversityStep.tsxapps/web/src/app/university/score/ScoreCard.tsxapps/web/src/app/university/score/ScoreScreen.tsxapps/web/src/app/university/score/example/gpa-cert/page.tsxapps/web/src/app/university/score/example/lang-cert/page.tsxapps/web/src/app/university/score/page.tsxapps/web/src/app/university/score/submit/gpa/GpaSubmitForm.tsxapps/web/src/app/university/score/submit/language-test/LanguageTestSubmitForm.tsxapps/web/src/components/login/signup/SignupPolicyScreen.tsxapps/web/src/components/score/SubmitLinkTab.tsxapps/web/src/components/score/SubmitResult.tsxapps/web/src/constants/university.tsapps/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
관련 이슈
작업 내용
/university/[homeUniversity]/[id]는dynamicParams = false로 유지해 생성된 정적 상세 경로만 제공합니다./university,/university/search,/university/[homeUniversity],/university/[homeUniversity]/search의 데스크톱 카드/검색/필터 화면을 모바일 흐름과 분리했습니다./university/[homeUniversity]/[id]상세 페이지를 데스크톱 전용 hero, 본문, sticky 요약 패널 구조로 제작했습니다.5로 낮췄습니다.Desktop*/Mobile*view entrypoint로 분리검증
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통과pnpm --filter @solid-connect/university-web run build는 기본 환경에서 전체 대학 목록 API 500(executeWithLock) 때문에/university/[homeUniversity]/[id]SSG page data 수집 단계에서 실패하는 것을 확인했습니다.http://localhost:3001/universityhttp://localhost:3001/university/searchUNIVERSITY_TERM_ID=1dev 환경에서http://localhost:3001/university/inha/1432zoom=5적용 확인pnpm --filter @solid-connect/web run ci:check통과UNIVERSITY_WEB_DOMAIN=http://localhost:3001 pnpm --filter @solid-connect/web run build통과참고