Skip to content

[Fix/style] 파견학교 / 멘토페이지 / 토스트 디자인 반영#530

Merged
enunsnv merged 11 commits into
mainfrom
fix/style
May 28, 2026
Merged

[Fix/style] 파견학교 / 멘토페이지 / 토스트 디자인 반영#530
enunsnv merged 11 commits into
mainfrom
fix/style

Conversation

@enunsnv
Copy link
Copy Markdown
Contributor

@enunsnv enunsnv commented May 26, 2026

작업 내용

1. 파견학교 상세 페이지 좋아요 / 공유 버튼 디자인 수정 반영

After
스크린샷 2026-05-27 15 07 26
  • 공유 버튼 수정 완료
  • 좋아요 버튼이 디자인 수정 중에 있어, 완료 후 추가 수정 예정입니다!

2. 멘토 카드 아티클 추가

After
mentor-article-card
  • 멘토 카드 아티클 추가
  • 최신 아티클 1개만 노출되는 것을 확인

3. 토스트 디자인 수정

좋아요 버튼 누르는 경우 좋아요 버튼 해지하는 경우
like-toast unlike-toast

※ 디자인 시안에는 포함되어 있지 않아 임의로 추가하였습니다.
수정이 필요한 경우 말씀해주시면 반영하겠습니다.
공유 버튼 누르는 경우 심사 중인 성적을 눌렀을 때
share-toast pending-grade-toast
게시물 좋아요 누르는 경우 게시물 좋아요 해지하는 경우
post-like-toast post-unlike-toast

※ 디자인 시안에는 포함되어 있지 않아 임의로 추가하였습니다.
수정이 필요한 경우 말씀해주시면 반영하겠습니다.
불가능한 서비스를 눌렀을 때 승인 거절된 성적을 눌렀을 때
unavailable-service-toast 테스트 계정에 승인 거절된 성적 데이터가 없어

테스트하지 못했습니다 🥲

4. 새로운 아티클 추가하기 아티클 섹션에서 가장 상단에 고정

After
image

특이 사항

3번 작업의 토스트 디자인을 전역으로 적용하였습니다. 로고는 솔커 로고로 통일하였으며, 추가적으로 수정 사항이 있다면 알려주세요🙂
또한 모든 토스트를 전부 다 확인해보지는 못 했기 때문에 혹시 적용 안된 곳이 있다면 알려주세요 !

@enunsnv enunsnv requested review from manNomi and wibaek as code owners May 26, 2026 07:52
@vercel
Copy link
Copy Markdown

vercel Bot commented May 26, 2026

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

Project Deployment Actions Updated (UTC)
solid-connection-web Ready Ready Preview, Comment May 28, 2026 4:49am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
solid-connect-web-admin Skipped Skipped May 28, 2026 4:49am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 26, 2026

Review Change Stack

Warning

Review limit reached

@enunsnv, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 43 minutes and 4 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 22eca360-ad3f-478b-a888-e9c6aab7da20

📥 Commits

Reviewing files that changed from the base of the PR and between 05a1d76 and 4dc4f9e.

📒 Files selected for processing (2)
  • apps/web/src/apis/news/getNewsList.ts
  • apps/web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx

Walkthrough

  1. 토스트 통합
    • 프로젝트 전반에서 react-hot-toast 호출을 showIconToast(icon, message)로 대체하고, showIconToast 유틸(아이콘 매핑, 중복 방지, 노출/쿨다운)을 추가했습니다.
  2. 토스트 자산 및 옵션 정리
    • 토스트 아이콘 SVG 인덱스가 추가·정리되고, 기존 토스트 옵션 일부(info/warning)가 제거되었습니다.
  3. 전역 오류·쿼리 처리 반영
    • react-query 전역 에러 처리 및 mutation onError/onSuccess 경로에서 showIconToast 호출로 교체했습니다.
  4. 대학 상세 공유 UI 개선
    • UniversityBtns의 공유 버튼을 IconShare/IconShareFilled로 교체하고 복사 성공 시 isShareActive 토글(600ms) 및 showIconToast를 호출하도록 변경했습니다.
  5. 아티클 미리보기 추가
    • ArticlePreview 컴포넌트를 추가하고 MentorCard가 확장될 때 useGetArticleList(id, { enabled })로 최신 아티클을 불러와 미리보기를 렌더링하도록 했습니다.
  6. useGetArticleList 훅 확장
    • useGetArticleList 시그니처에 options?: { enabled?: boolean }를 추가해 쿼리 활성화를 제어할 수 있게 변경했습니다.
  7. 기타 컴포넌트 변경
    • 다수의 페이지·훅(로그인, 프로필, 커뮤니티, 점수 제출 등)에서 toast 호출을 showIconToast로 교체하고 Toaster 위치(top)를 80→68로 조정했습니다.

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • wibaek
  • manNomi

📋 전체 변경 사항

  1. showIconToast 유틸 추가 및 토스트 호출 일괄 교체.
  2. 토스트용 SVG 아이콘 인덱스 추가(toast icons) 및 svgs index에 공유 아이콘 등록.
  3. UniversityBtns의 공유 버튼 UI 변경 및 복사 피드백(600ms) 추가.
  4. useGetArticleList 옵션 확장 및 ArticlePreview 컴포넌트 추가, MentorCard 확장 시 최신 아티클 노출.
  5. Toaster 위치 조정과 일부 토스트 옵션 제거.

🚶 변경 요약(문장 단위, 번호로 한눈에)

  1. showIconToast 구현을 추가하고 프로젝트 전반의 react-hot-toast 호출을 대체했습니다.
  2. 토스트 아이콘 자산(toast/*)을 추가하고 인덱스를 정리했습니다.
  3. react-query 전역 에러 및 여러 훅/컴포넌트의 onSuccess/onError 토스트 호출을 showIconToast로 교체했습니다.
  4. UniversityBtns에서 공유 버튼을 IconShare / IconShareFilled로 바꾸고 복사 성공 시 600ms 시각 피드백을 적용했습니다.
  5. useGetArticleList에 options?.enabled 인자를 추가해 쿼리 활성화를 제어할 수 있게 했습니다.
  6. ArticlePreview 컴포넌트를 새로 만들고 MentorCard 확장 시 최신 아티클을 불러와 미리보기를 표시하도록 했습니다.
  7. Toaster의 containerStyle.top 값을 80에서 68로 조정했습니다.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 '파견학교 / 멘토페이지 / 토스트 디자인 반영'으로 변경사항의 핵심 영역들을 모두 포괄하며 명확하게 요약하고 있습니다.
Description check ✅ Passed PR 설명이 필수 템플릿 섹션 중 '관련 이슈' 항목을 누락했으나, '작업 내용'을 4개의 명확한 기능 단위로 상세하게 설명하고 특이 사항도 기재했습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/style

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 and usage tips.

@enunsnv enunsnv changed the title [Fix/style] 수정 중 !!!!! [Fix/style] 수정 중 입니다 !!!!! May 26, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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 (1)
apps/web/src/apis/news/getNewsList.ts (1)

20-20: 💤 Low value

타입 시그니처와 일치하도록 중복 체크를 제거하는 것이 좋겠습니다.

userId의 타입이 number로 선언되어 있어 null이 될 수 없으므로, userId !== null 체크는 중복입니다. 다음과 같이 간소화할 수 있습니다:

♻️ 제안하는 수정안
-    enabled: userId !== null && userId !== 0 && (options?.enabled ?? true),
+    enabled: userId !== 0 && (options?.enabled ?? true),
🤖 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/apis/news/getNewsList.ts` at line 20, The enabled condition
includes a redundant null check for userId; since userId is typed as number
(non-nullable), remove the userId !== null clause and simplify the expression in
the enabled assignment (the property named enabled in
apps/web/src/apis/news/getNewsList.ts) to only check userId !== 0 &&
(options?.enabled ?? true).
🤖 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/university/`[homeUniversity]/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx:
- Around line 80-95: The share button lacks a visible keyboard focus indicator;
update the button element that uses onClick={handleCopy} and the
isShareActive/IconShare/IconShareFilled visuals to include the same focus ring
classes used by the like button (e.g., add focus:ring-2 focus:ring-white/50 and
remove or replace focus:outline-none) so keyboard users see a clear focus state
while preserving the current hover/active animations and icon opacity toggles.
- Around line 54-59: handleCopy currently calls
navigator.clipboard.writeText(...).then(() => {}) without error handling and
creates a potential memory leak by using setTimeout without cleanup; update
handleCopy to await or use .then/.catch on navigator.clipboard.writeText to show
a success toast on resolve and an error toast on reject (include clear
messaging), and replace the raw setTimeout with a tracked timeoutId (e.g., store
id in a ref or state) so you can call clearTimeout during unmount; add a
useEffect cleanup that clears the timeoutId and prevents calling
setIsShareActive on an unmounted component.

---

Nitpick comments:
In `@apps/web/src/apis/news/getNewsList.ts`:
- Line 20: The enabled condition includes a redundant null check for userId;
since userId is typed as number (non-nullable), remove the userId !== null
clause and simplify the expression in the enabled assignment (the property named
enabled in apps/web/src/apis/news/getNewsList.ts) to only check userId !== 0 &&
(options?.enabled ?? true).
🪄 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: 9d0e914f-3443-4977-9d6b-efcf4c34a6ec

📥 Commits

Reviewing files that changed from the base of the PR and between 56daea0 and fec0a83.

⛔ Files ignored due to path filters (2)
  • apps/web/public/svgs/shareIcon.svg is excluded by !**/*.svg
  • apps/web/public/svgs/shareIconFilled.svg is excluded by !**/*.svg
📒 Files selected for processing (4)
  • apps/web/public/svgs/index.ts
  • apps/web/src/apis/news/getNewsList.ts
  • apps/web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx
  • apps/web/src/components/mentor/MentorCard/_ui/ArticlePreview.tsx

@enunsnv enunsnv changed the title [Fix/style] 수정 중 입니다 !!!!! [Fix/style] 파견학교 / 멘토페이지 / 토스트 디자인 반영 May 27, 2026
@vercel vercel Bot temporarily deployed to Preview – solid-connect-web-admin May 27, 2026 07:54 Inactive
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

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: 072042c070

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/web/src/lib/toast/showIconToast.tsx Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
apps/web/src/app/university/score/ScoreCard.tsx (1)

36-44: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

REJECTED 상태 배지 클릭 시 중복 토스트 발생 가능성

현재 구조에서는:

  1. REJECTED 배지 자체에 onClick 핸들러가 있어 거절 사유 토스트를 표시
  2. ScoreScreen.tsx에서 이 카드 전체를 <button>으로 감싸고 handleScoreClick을 연결

배지를 클릭하면 이벤트 버블링으로 인해 두 토스트가 연속으로 표시될 수 있습니다.

제안: 이벤트 버블링 방지
         <div
           className="flex h-5 cursor-pointer items-center gap-0.5 rounded-[20px] bg-accent-custom-red-light p-2.5"
-          onClick={() => showIconToast("logo", rejectedReason ?? "승인이 거절되었습니다.")}
+          onClick={(e) => {
+            e.stopPropagation();
+            showIconToast("logo", rejectedReason ?? "승인이 거절되었습니다.");
+          }}
         >
🤖 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 36 - 44, The
REJECTED badge's onClick in ScoreCard.tsx currently calls showIconToast(...) but
doesn't stop event propagation, causing ScoreScreen.tsx's parent <button> with
handleScoreClick to also fire and produce duplicate toasts; update the badge's
onClick handler to accept the click event, call event.stopPropagation(), then
call showIconToast(rejectedReason ?? "승인이 거절되었습니다.") so the badge toast shows
without triggering handleScoreClick in the parent.
🧹 Nitpick comments (2)
apps/web/src/app/university/score/ScoreScreen.tsx (1)

20-28: ⚡ Quick win

APPROVED 상태 클릭에 대한 사용자 피드백 누락

handleScoreClick이 REJECTED와 PENDING 상태에는 토스트를 표시하지만, APPROVED 상태의 성적을 클릭했을 때는 아무 피드백이 없습니다. 사용자 입장에서는 클릭이 동작하지 않는 것처럼 느껴질 수 있습니다.

제안: APPROVED 상태에 대한 안내 추가 또는 버튼 비활성화

옵션 1: APPROVED에도 안내 토스트 추가

   const handleScoreClick = (status: ScoreSubmitStatus) => {
     if (status === ScoreSubmitStatus.REJECTED) {
       showIconToast("cap", "승인거절된 성적은 사용할 수 없습니다");
       return;
     }
     if (status === ScoreSubmitStatus.PENDING) {
       showIconToast("cap", "심사중인 성적은 사용할 수 없습니다");
+      return;
     }
+    // APPROVED 상태는 이미 선택되어 있음을 안내
+    showIconToast("cap", "이미 사용 중인 성적입니다");
   };

옵션 2: APPROVED 카드는 버튼으로 감싸지 않기
렌더링 시 조건부로 버튼 래퍼 적용

🤖 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/ScoreScreen.tsx` around lines 20 - 28,
handleScoreClick currently only handles REJECTED and PENDING so clicking an
APPROVED score gives no feedback; update the click behavior by adding handling
for ScoreSubmitStatus.APPROVED (e.g., call showIconToast with a helpful message
like "이미 승인된 성적입니다") or remove the clickable wrapper for APPROVED items instead.
Modify handleScoreClick to include an APPROVED branch (referencing
ScoreSubmitStatus and showIconToast) or change the render logic that wraps the
card/button so it conditionally applies the click handler only when status !==
ScoreSubmitStatus.APPROVED (locate the component that renders the clickable card
and the handleScoreClick usage).
apps/web/src/components/mentor/MentorCard/index.tsx (1)

111-117: 💤 Low value

아티클 로딩 상태에 대한 피드백 부재

현재 구현은 아티클이 로드되는 동안 아무것도 표시하지 않습니다. 카드를 확장할 때 아티클 API 호출이 진행 중이면 사용자는 아티클 섹션이 나타나기까지 빈 공간을 보게 됩니다.

제안: 로딩 상태 표시 추가
+         const { data: articles, isLoading: isLoadingArticles } = useGetArticleList(id ?? 0, { enabled: isExpanded && !!id });

          {/* 멘토 아티클 */}
-         {latestArticle && (
+         {(latestArticle || (isExpanded && isLoadingArticles)) && (
            <div className="mb-4">
              <h4 className="mb-2 text-blue-600 typo-sb-5">멘토 아티클</h4>
-             <ArticlePreview article={latestArticle} />
+             {isLoadingArticles ? (
+               <div className="text-k-400 typo-regular-4">아티클을 불러오는 중...</div>
+             ) : latestArticle ? (
+               <ArticlePreview article={latestArticle} />
+             ) : null}
            </div>
          )}
🤖 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/components/mentor/MentorCard/index.tsx` around lines 111 - 117,
The MentorCard renders nothing while the article API is loading (only checks
latestArticle), causing blank space; add an explicit loading state (e.g.,
isLoadingArticle) used alongside latestArticle so the render shows a loading
indicator or skeleton where ArticlePreview would be while the fetch is in
progress, set isLoadingArticle=true before the API call that populates
latestArticle and false on success/error, and update the JSX around
latestArticle/ArticlePreview to render spinner/skeleton when isLoadingArticle is
true and ArticlePreview only when latestArticle is available.
🤖 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/university/score/ScoreScreen.tsx`:
- Around line 47-65: The ScoreCard is wrapped in an interactive <button> while
the REJECTED badge inside ScoreCard also has its own click handler, causing
nested interactive elements and double toasts; fix by removing the external
<button> wrapper and either (A) make the whole card clickable by passing an
onClick prop from where ScoreCard is used (e.g., pass onClick={() =>
handleScoreClick(score.verifyStatus)} into ScoreCard and remove the badge's
internal onClick), or (B) keep the badge interactive and render the outer
container as a non-interactive element (div) with proper keyboard handling/role
if needed; apply the same change for the other occurrence around lines
referenced (70-85). Ensure you update ScoreCard props and its internal badge
handler accordingly (remove or conditionally disable badge onClick when
card-level onClick is provided).

---

Outside diff comments:
In `@apps/web/src/app/university/score/ScoreCard.tsx`:
- Around line 36-44: The REJECTED badge's onClick in ScoreCard.tsx currently
calls showIconToast(...) but doesn't stop event propagation, causing
ScoreScreen.tsx's parent <button> with handleScoreClick to also fire and produce
duplicate toasts; update the badge's onClick handler to accept the click event,
call event.stopPropagation(), then call showIconToast(rejectedReason ?? "승인이
거절되었습니다.") so the badge toast shows without triggering handleScoreClick in the
parent.

---

Nitpick comments:
In `@apps/web/src/app/university/score/ScoreScreen.tsx`:
- Around line 20-28: handleScoreClick currently only handles REJECTED and
PENDING so clicking an APPROVED score gives no feedback; update the click
behavior by adding handling for ScoreSubmitStatus.APPROVED (e.g., call
showIconToast with a helpful message like "이미 승인된 성적입니다") or remove the
clickable wrapper for APPROVED items instead. Modify handleScoreClick to include
an APPROVED branch (referencing ScoreSubmitStatus and showIconToast) or change
the render logic that wraps the card/button so it conditionally applies the
click handler only when status !== ScoreSubmitStatus.APPROVED (locate the
component that renders the clickable card and the handleScoreClick usage).

In `@apps/web/src/components/mentor/MentorCard/index.tsx`:
- Around line 111-117: The MentorCard renders nothing while the article API is
loading (only checks latestArticle), causing blank space; add an explicit
loading state (e.g., isLoadingArticle) used alongside latestArticle so the
render shows a loading indicator or skeleton where ArticlePreview would be while
the fetch is in progress, set isLoadingArticle=true before the API call that
populates latestArticle and false on success/error, and update the JSX around
latestArticle/ArticlePreview to render spinner/skeleton when isLoadingArticle is
true and ArticlePreview only when latestArticle is available.
🪄 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: dfb9e483-7ca2-4d20-89ff-11e721737210

📥 Commits

Reviewing files that changed from the base of the PR and between fec0a83 and 072042c.

⛔ Files ignored due to path filters (5)
  • apps/web/public/svgs/toast/cap.svg is excluded by !**/*.svg
  • apps/web/public/svgs/toast/like.svg is excluded by !**/*.svg
  • apps/web/public/svgs/toast/link.svg is excluded by !**/*.svg
  • apps/web/public/svgs/toast/logo.svg is excluded by !**/*.svg
  • apps/web/public/svgs/toast/univ.svg is excluded by !**/*.svg
📒 Files selected for processing (45)
  • apps/web/public/svgs/toast/index.ts
  • apps/web/src/apis/Auth/postAppleAuth.ts
  • apps/web/src/apis/Auth/postEmailLogin.ts
  • apps/web/src/apis/Auth/postKakaoAuth.ts
  • apps/web/src/apis/MyPage/patchPassword.ts
  • apps/web/src/apis/MyPage/patchProfile.ts
  • apps/web/src/apis/Scores/postCreateGpa.ts
  • apps/web/src/apis/Scores/postCreateLanguageTest.ts
  • apps/web/src/apis/community/deleteComment.ts
  • apps/web/src/apis/community/deletePost.ts
  • apps/web/src/apis/community/patchUpdatePost.ts
  • apps/web/src/apis/community/postCreateComment.ts
  • apps/web/src/apis/community/postCreatePost.ts
  • apps/web/src/apis/reports/postReport.ts
  • apps/web/src/app/(home)/_ui/FindLastYearScoreBar/index.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/Content.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/KebabMenu.tsx
  • apps/web/src/app/community/[boardCode]/[postId]/modify/PostModifyForm.tsx
  • apps/web/src/app/community/[boardCode]/create/PostForm.tsx
  • apps/web/src/app/community/_hooks/useCommunityImageUpload.ts
  • apps/web/src/app/layout.tsx
  • apps/web/src/app/mentor/chat/[chatId]/_ui/ChatContent/index.tsx
  • apps/web/src/app/my/_ui/MyProfileContent/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/_hooks/useSelectUniversities.ts
  • apps/web/src/app/sign-up/email/EmailSignUpForm.tsx
  • apps/web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx
  • apps/web/src/app/university/application/apply/ApplyPageContent.tsx
  • apps/web/src/app/university/application/apply/GpaStep.tsx
  • apps/web/src/app/university/application/apply/LanguageStep.tsx
  • apps/web/src/app/university/score/ScoreCard.tsx
  • apps/web/src/app/university/score/ScoreScreen.tsx
  • apps/web/src/components/layout/GlobalLayout/ui/AIInspectorFab/index.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/mentor/MentorCard/index.tsx
  • apps/web/src/components/modal/SurveyModal.tsx
  • apps/web/src/lib/react-query/queryClient.ts
  • apps/web/src/lib/toast/options.ts
  • apps/web/src/lib/toast/showIconToast.tsx
  • apps/web/src/utils/authUtils.ts
  • apps/web/src/utils/axiosInstance.ts
💤 Files with no reviewable changes (1)
  • apps/web/src/lib/toast/options.ts
✅ Files skipped from review due to trivial changes (9)
  • apps/web/public/svgs/toast/index.ts
  • apps/web/src/apis/reports/postReport.ts
  • apps/web/src/apis/MyPage/patchProfile.ts
  • apps/web/src/apis/Scores/postCreateLanguageTest.ts
  • apps/web/src/lib/toast/showIconToast.tsx
  • apps/web/src/components/login/signup/SignupSurvey.tsx
  • apps/web/src/apis/MyPage/patchPassword.ts
  • apps/web/src/components/modal/SurveyModal.tsx
  • apps/web/src/apis/Auth/postAppleAuth.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx

Comment thread apps/web/src/app/university/score/ScoreScreen.tsx
@manNomi
Copy link
Copy Markdown
Contributor

manNomi commented May 27, 2026

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

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

ℹ️ 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".


const isDetail = mentor && "passTip" in mentor;

const { data: articles } = useGetArticleList(id ?? 0, { enabled: isExpanded && !!id });
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 Avoid fetching articles with chat room IDs

When this shared card is used in apps/web/src/app/my/match/_ui/MatchContent/index.tsx, the mentor prop is synthesized with id: room.id because the chat-room API does not provide a mentor id. After this change, expanding that matched-mentor card calls the news query with the chat room id (/news?author-id=<room.id>), which can either show an unrelated author's latest article or surface an error toast instead of the matched mentor's article. Gate this fetch to real mentor records or pass a separate author/mentor id for article lookup.

Useful? React with 👍 / 👎.

@manNomi
Copy link
Copy Markdown
Contributor

manNomi commented May 27, 2026

@enunsnv 님 코드래빗이랑 코덱스 리뷰만 반영해주시고 머지 가시죵 !

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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 (1)
apps/web/src/app/university/score/ScoreScreen.tsx (1)

60-61: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

임시 하드코딩된 날짜 값

  1. 60-61번 줄: 공인어학 성적의 발급일
  2. 79-80번 줄: 학점 성적의 발급일

모두 "2026-01-01" 고정값을 사용하고 있습니다. 주석으로 TODO가 표시되어 있어 인지하고 계신 것으로 보이나, 실제 issueDate를 사용하도록 후속 작업이 필요합니다.

Also applies to: 79-80

🤖 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/ScoreScreen.tsx` around lines 60 - 61,
Replace the temporary hardcoded date strings in ScoreScreen.tsx with the actual
issueDate values: where the date prop currently uses "2026-01-01" for the
language test entry, pass new Date(score.issueDate).toISOString() (or the
equivalent safe conversion) and for the transcript/grade entry do the same using
that item's issueDate (e.g., new Date(grade.issueDate).toISOString()); ensure
you null-check or fallback to undefined/omit the prop when issueDate is missing
to avoid runtime errors.
🧹 Nitpick comments (1)
apps/web/src/app/university/score/ScoreScreen.tsx (1)

46-84: ⚖️ Poor tradeoff

반복되는 버튼 래퍼 패턴 (선택적 개선 사항)

  1. 46-64번 줄: 공인어학 성적 목록 렌더링
  2. 69-84번 줄: 학점 성적 목록 렌더링

두 탭에서 유사한 버튼 래퍼 구조가 반복됩니다. 현재 코드도 충분히 명확하지만, 향후 확장을 고려한다면 공통 컴포넌트로 추출하는 것도 검토해볼 수 있습니다.

♻️ 선택적 리팩토링 예시 (참고용)
const ScoreButton = ({ score, onClick, children }: { 
  score: { verifyStatus: ScoreSubmitStatus; rejectedReason?: string | null }, 
  onClick: (status: ScoreSubmitStatus, reason?: string | null) => void,
  children: React.ReactNode 
}) => (
  <button
    type="button"
    className="text-left"
    onClick={() => onClick(score.verifyStatus, score.rejectedReason)}
  >
    {children}
  </button>
);

다만 현재 두 케이스만 존재하고 각각의 데이터 매핑이 다르므로, 지금 단계에서는 현재 구조를 유지하는 것이 더 나을 수 있습니다.

🤖 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/ScoreScreen.tsx` around lines 46 - 84, The
two map blocks rendering buttons around ScoreCard (languageTestScoreList ->
ScoreCard and gpaScoreList -> ScoreCard) repeat the same wrapper logic; extract
that into a small reusable component (e.g., ScoreButton) that accepts the score
object (or verifyStatus/rejectedReason) and onClick handler (handleScoreClick)
and wraps children, then replace both button wrappers in the
languageTestScoreList and gpaScoreList maps with the new ScoreButton to remove
duplication while preserving props passed to ScoreCard (name, score, status,
date, isFocused).
🤖 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/score/ScoreScreen.tsx`:
- Around line 60-61: Replace the temporary hardcoded date strings in
ScoreScreen.tsx with the actual issueDate values: where the date prop currently
uses "2026-01-01" for the language test entry, pass new
Date(score.issueDate).toISOString() (or the equivalent safe conversion) and for
the transcript/grade entry do the same using that item's issueDate (e.g., new
Date(grade.issueDate).toISOString()); ensure you null-check or fallback to
undefined/omit the prop when issueDate is missing to avoid runtime errors.

---

Nitpick comments:
In `@apps/web/src/app/university/score/ScoreScreen.tsx`:
- Around line 46-84: The two map blocks rendering buttons around ScoreCard
(languageTestScoreList -> ScoreCard and gpaScoreList -> ScoreCard) repeat the
same wrapper logic; extract that into a small reusable component (e.g.,
ScoreButton) that accepts the score object (or verifyStatus/rejectedReason) and
onClick handler (handleScoreClick) and wraps children, then replace both button
wrappers in the languageTestScoreList and gpaScoreList maps with the new
ScoreButton to remove duplication while preserving props passed to ScoreCard
(name, score, status, date, isFocused).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 805f10b0-1341-4912-8055-19ab4eb52365

📥 Commits

Reviewing files that changed from the base of the PR and between a7b2930 and 05a1d76.

📒 Files selected for processing (4)
  • apps/web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx
  • apps/web/src/app/university/score/ScoreCard.tsx
  • apps/web/src/app/university/score/ScoreScreen.tsx
  • apps/web/src/lib/toast/showIconToast.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx
  • apps/web/src/lib/toast/showIconToast.tsx

@vercel vercel Bot temporarily deployed to Preview – solid-connect-web-admin May 28, 2026 04:47 Inactive
@enunsnv enunsnv merged commit 63e5a9a into main May 28, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants