Skip to content

๐Ÿ› ์ตœ๊ทผ 5๊ฐœ ์ด์Šˆ ์ˆ˜์ • (#405-#409)#411

Open
manNomi wants to merge 7 commits intomainfrom
fix/issues-405-409
Open

๐Ÿ› ์ตœ๊ทผ 5๊ฐœ ์ด์Šˆ ์ˆ˜์ • (#405-#409)#411
manNomi wants to merge 7 commits intomainfrom
fix/issues-405-409

Conversation

@manNomi
Copy link
Contributor

@manNomi manNomi commented Feb 2, 2026

์š”์•ฝ

์ตœ๊ทผ ์ œ๊ธฐ๋œ 5๊ฐœ์˜ ๋ฒ„๊ทธ ์ด์Šˆ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ , ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ˜์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ • ๋‚ด์—ญ

โœจ #409: ๋ฉ˜ํ‹ฐ ์‹ ์ฒญํ•˜๊ธฐ โ†’ ๋ฉ˜ํ† ๋ง ์‹ ์ฒญํ•˜๊ธฐ ํ…์ŠคํŠธ ๋ณ€๊ฒฝ

  • ๋ฉ˜ํ†  ์นด๋“œ์˜ ์‹ ์ฒญ ๋ฒ„ํŠผ ํ…์ŠคํŠธ๋ฅผ "๋ฉ˜ํ‹ฐ ์‹ ์ฒญํ•˜๊ธฐ"์—์„œ "๋ฉ˜ํ† ๋ง ์‹ ์ฒญํ•˜๊ธฐ"๋กœ ๋ณ€๊ฒฝ
  • ํŒŒ์ผ: apps/web/src/components/mentor/MentorCard/index.tsx

๐ŸŽจ #408: ํ•ฉ๊ฒฉ ๋ ˆ์‹œํ”ผ ์ €์žฅ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ํ…์ŠคํŠธ ์ƒ‰์ƒ ๊ฐœ์„ 

  • ํ•ฉ๊ฒฉ ๋ ˆ์‹œํ”ผ ์ดˆ๊ธฐ๊ฐ’์ด ๋นˆ ๋ฌธ์ž์—ด๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์ €์žฅ๋˜์ง€ ์•Š๋˜ ๋ฒ„๊ทธ ์ˆ˜์ •
  • passTip ํ•„๋“œ๋ฅผ myMentorProfile์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œํ•˜๋„๋ก ์ˆ˜์ •
  • ํ…์ŠคํŠธ ์ž…๋ ฅ ์‹œ ์ƒ‰์ƒ์ด ํšŒ์ƒ‰์—์„œ ๊ฒ€์ •์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋„๋ก ๊ฐœ์„ 
  • ํŒŒ์ผ:
    • apps/web/src/types/mentor.ts
    • apps/web/src/app/mentor/modify/_ui/ModifyContent/_hooks/useModifyHookForm.ts
    • apps/web/src/app/mentor/modify/_ui/ModifyContent/index.tsx

๐Ÿ’พ #407: ๋ฉ˜ํ†  ์•„ํ‹ฐํด ์ €์žฅ ๊ฐœ์„ 

  • ์•„ํ‹ฐํด ์ €์žฅ ์‹œ mutation ์„ฑ๊ณต ํ›„์—๋งŒ ๋ชจ๋‹ฌ์ด ๋‹ซํžˆ๋„๋ก ์ˆ˜์ •
  • URL ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์Šคํ‚ค๋งˆ ๊ฐœ์„  (z.union ์‚ฌ์šฉ)
  • ์ €์žฅ ์‹คํŒจ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ 
  • ํŒŒ์ผ:
    • apps/web/src/components/mentor/ArticleBottomSheetModal/hooks/useArticleSchema.ts
    • apps/web/src/components/mentor/ArticleBottomSheetModal/lib/schema.ts

๐Ÿ’„ #406: ๋ฉ˜ํ†  ๋Œ€๊ธฐ ํŽ˜์ด์ง€ UI ๊ฐœ์„ 

  • ๊ณผ๋„ํ•œ ํŒจ๋”ฉ ์ œ๊ฑฐ (p-4 โ†’ ์ œ๊ฑฐ)
  • ํ…์ŠคํŠธ ํ‘œํ˜„ ๋ณ€๊ฒฝ: "{nickname} ๋‹˜" โ†’ "{nickname} ๋ฉ˜ํ† "
  • ํŒŒ์ผ: apps/web/src/app/mentor/waiting/_ui/WaitingContent/index.tsx

๐Ÿ”„ #405: ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€ ISR Revalidate ์ถ”๊ฐ€

  • ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ ์™ธ์— ์ˆ˜์ • ๋ฐ ์‚ญ์ œ ์‹œ์—๋„ ISR revalidate ํŠธ๋ฆฌ๊ฑฐ ์ถ”๊ฐ€
  • ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€๊ฐ€ ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜๋„๋ก ๊ฐœ์„ 
  • ํŒŒ์ผ:
    • apps/web/src/apis/community/patchUpdatePost.ts
    • apps/web/src/apis/community/deletePost.ts
    • apps/web/src/app/community/[boardCode]/[postId]/modify/PostModifyForm.tsx
    • apps/web/src/app/community/[boardCode]/[postId]/KebabMenu.tsx

์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ์‚ฌํ•ญ

๐Ÿ“‹ ํผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ฐœ์„ 

  • ์ž…๋ ฅ ํ•„๋“œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง ๊ฐ•ํ™”
  • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ช…ํ™•ํ™”

๐Ÿ”˜ ์งˆ๋ฌธ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๊ฐœ์„ 

  • ํ† ๊ธ€ ์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์ ํ™”
  • ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ๊ฐœ์„ 

โณ ๋Œ€๊ธฐ UI ํ…์ŠคํŠธ ๋ฐ ์นด์šดํŠธ ๊ฐœ์„ 

  • ๋Œ€๊ธฐ ์ƒํƒœ ๋ฉ”์‹œ์ง€ ๋ช…ํ™•ํ™”
  • ์นด์šดํŠธ ํ‘œ์‹œ ์ •ํ™•์„ฑ ํ–ฅ์ƒ

๐Ÿ–ฑ๏ธ ์ž…๋ ฅ ์ค‘ ์™ธ๋ถ€ ํด๋ฆญ ์ฒ˜๋ฆฌ

  • ์ž…๋ ฅ ํ•„๋“œ ํฌ์ปค์Šค ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐœ์„ 
  • ์™ธ๋ถ€ ํด๋ฆญ ์‹œ ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€

๐Ÿ“ maxLength ์†์„ฑ ์ถ”๊ฐ€

  • ์ž…๋ ฅ ํ•„๋“œ์— ์ ์ ˆํ•œ ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ ์ ์šฉ
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฒ”์œ„ ๋ช…ํ™•ํ™”

๐ŸŽฃ Hook ๋ฐ˜ํ™˜๊ฐ’ ์ตœ์ ํ™”

  • ์ปค์Šคํ…€ ํ›…์˜ ๋ฐ˜ํ™˜๊ฐ’ ๊ตฌ์กฐ ๊ฐœ์„ 
  • ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ ์ œ๊ฑฐ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”

๊ฒ€์ฆ

  • โœ… ํƒ€์ž… ์ฒดํฌ ํ†ต๊ณผ
  • โœ… ๊ฐ ์ด์Šˆ๋ณ„๋กœ ์›์ž์  ์ปค๋ฐ‹ ์ƒ์„ฑ
  • โœ… ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ด๋ชจ์ง€ ๊ทœ์น™ ์ค€์ˆ˜
  • โœ… ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ ์™„๋ฃŒ

๊ด€๋ จ ์ด์Šˆ

Closes #405, Closes #406, Closes #407, Closes #408, Closes #409

@vercel
Copy link

vercel bot commented Feb 2, 2026

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

Project Deployment Actions Updated (UTC)
solid-connect-web-admin Error Error Feb 8, 2026 3:33pm
solid-connection-web Ready Ready Preview, Comment Feb 8, 2026 3:33pm

@coderabbitai
Copy link

coderabbitai bot commented Feb 2, 2026

Walkthrough

  1. ๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ/์ˆ˜์ •์— ISR ์žฌ๊ฒ€์ฆ ์ถ”๊ฐ€.
  2. \tdeletePost์˜ ์ž…๋ ฅ ํ˜•ํƒœ๋ฅผ postId์—์„œ { postId, boardCode } ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ.
  3. \t์‚ญ์ œ ์„ฑ๊ณต ์‹œ posts ์ฟผ๋ฆฌ ๋ฌดํšจํ™”์™€ boardCodeยทaccessToken ์กด์žฌํ•˜๋ฉด /api/revalidate ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ณ€๊ฒฝ.
  4. \t์ˆ˜์ • ํ›…๋„ boardCode๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์„ฑ๊ณต ์‹œ post ๊ด€๋ จ ์ฟผ๋ฆฌ ๋ฌดํšจํ™”์™€ ์„ ํƒ์  ISR ์žฌ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ณ€๊ฒฝ.
  5. \tKebabMenu์˜ ์™ธ๋ถ€ ํด๋ฆญ ํ›…์— RefObject ํƒ€์ž…๊ณผ touchstart ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œ ํ˜ธ์ถœ์— ์ƒˆ ํŽ˜์ด๋กœ๋“œ ํ˜•์‹์„ ๋ฐ˜์˜.
  6. \t๊ฒŒ์‹œ๋ฌผ ์ˆ˜์ • ํผ์— ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ, isQuestion ํ† ๊ธ€, boardCode ํฌํ•จ ์ „์†ก ๋ฐ ํ† ์ŠคํŠธ ์•Œ๋ฆผ์„ ์ถ”๊ฐ€.
  7. \t๋ฉ˜ํ†  ๊ด€๋ จ ํƒ€์ž…ยทUIยทํผ ์ฒ˜๋ฆฌ ์ •๋ฆฌ, ์•„ํ‹ฐํด ๋ชจ๋‹ฌ ์„ฑ๊ณต ์ฝœ๋ฐฑยท์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ, useCallback ๋„์ž… ๋ฐ ํŒจํ‚ค์ง€ ์˜์กด์„ฑ ์ถ”๊ฐ€ ๋“ฑ ์†Œ๊ทœ๋ชจ ์ˆ˜์ •๋“ค ํฌํ•จ.

Estimated code review effort

๐ŸŽฏ 3 (Moderate) | โฑ๏ธ ~30 minutes

Suggested reviewers

  • wibaek
  • enunsnv
  • khwww
๐Ÿšฅ Pre-merge checks | โœ… 4 | โŒ 1
โŒ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Out of Scope Changes check โ“ Inconclusive ๋Œ€๋ถ€๋ถ„์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋งํฌ๋œ ๋‹ค์„ฏ ์ด์Šˆ์™€ ์ง์ ‘ ๊ด€๋ จ์ด ์žˆ์œผ๋‚˜, package.json์˜ @vercel/speed-insights ์˜์กด์„ฑ ์ถ”๊ฐ€์™€ FloatingUpBtn์˜ useCallback ์ตœ์ ํ™”, UniversityCard์˜ aria-label ์ œ๊ฑฐ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋งํฌ๋œ ์ด์Šˆ์—์„œ ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. package.json, useFloatingUpHandler.ts, UniversityCard/index.tsx์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์–ด๋А ์ด์Šˆ์™€ ๊ด€๋ จ๋˜๋Š”์ง€ ๋˜๋Š” ๋…๋ฆฝ์  ๊ฐœ์„ ์‚ฌํ•ญ์ธ์ง€ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์„ธ์š”.
โœ… Passed checks (4 passed)
Check name Status Explanation
Title check โœ… Passed PR ์ œ๋ชฉ์ด ๋‹ค์„ฏ ๊ฐœ์˜ ์ด์Šˆ(#405-#409)๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฐธ์กฐํ•˜๋ฉฐ ์ˆ˜์ • ์‚ฌํ•ญ์˜ ํ•ต์‹ฌ(์ตœ๊ทผ ์ด์Šˆ ์ˆ˜์ •)์„ ์ž˜ ์š”์•ฝํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Description check โœ… Passed PR ์„ค๋ช…์ด ์ƒ์„ธํ•˜๊ณ  ์ฒด๊ณ„์ ์ด๋ฉฐ, ๊ฐ ์ด์Šˆ๋ณ„ ์ˆ˜์ • ๋‚ด์—ญ๊ณผ ์˜ํ–ฅ๋ฐ›์€ ํŒŒ์ผ์„ ๋ช…์‹œํ•˜๊ณ  ์žˆ์œผ๋‚˜ ์ €์žฅ์†Œ์˜ ํ•„์ˆ˜ ํ…œํ”Œ๋ฆฟ ๊ตฌ์กฐ(๊ด€๋ จ ์ด์Šˆ, ์ž‘์—… ๋‚ด์šฉ, ํŠน์ด ์‚ฌํ•ญ)๋ฅผ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.
Linked Issues check โœ… Passed ๋ชจ๋“  ๋‹ค์„ฏ ์ด์Šˆ(#405-#409)์˜ ์ฃผ์š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ์ถฉ์กฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: ISR ์žฌ๊ฒ€์ฆ ์ถ”๊ฐ€, ํŒจ๋”ฉ ์ œ๊ฑฐ ๋ฐ ํ…์ŠคํŠธ ๋ณ€๊ฒฝ, ์•„ํ‹ฐํด ์ €์žฅ ํ๋ฆ„ ๊ฐœ์„ , ํ•ฉ๊ฒฉ ๋ ˆ์‹œํ”ผ ๋ฒ„๊ทธ ์ˆ˜์ •, ์‹ ์ฒญ ๋ฒ„ํŠผ ํ…์ŠคํŠธ ๋ณ€๊ฒฝ ๋“ฑ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
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
๐Ÿงช Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/issues-405-409

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.

Copy link

@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

๐Ÿค– Fix all issues with AI agents
In `@apps/web/src/apis/community/deletePost.ts`:
- Around line 20-34: The revalidation call in revalidateCommunityPage currently
awaits fetch but doesn't check HTTP status, so 4xx/5xx responses silently
succeed; update revalidateCommunityPage to capture the fetch response, check
response.ok, and if false log or throw an error including response.status and
response.statusText (or response.text()) so failed ISR revalidations are
visible; ensure this handling occurs after the fetch and before returning from
revalidateCommunityPage.

In `@apps/web/src/apis/community/patchUpdatePost.ts`:
- Around line 19-33: The fetch in revalidateCommunityPage currently treats all
HTTP responses as success; update the function to check the Response.ok after
the await fetch (in revalidateCommunityPage) and handle non-ok responses by
throwing or logging a descriptive error (include response.status and response
text) so the existing try/catch can surface failures; ensure the
Authorization/header/body logic remains unchanged and that failures end up
logged or rethrown for callers to observe.
๐Ÿงน Nitpick comments (2)
apps/web/src/components/mentor/ArticleBottomSheetModal/hooks/useArticleSchema.ts (2)

109-113: 2. handleModalClose์—์„œ์˜ ์ค‘๋ณต ์ดˆ๊ธฐํ™”

handleModalClose ํ•จ์ˆ˜์—์„œ reset()๊ณผ setImagePreview(null)์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Line 66-69์˜ useEffect๊ฐ€ isOpen์ด false๊ฐ€ ๋  ๋•Œ ์ด๋ฏธ ๋™์ผํ•œ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

handleClose()๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ isOpen์„ false๋กœ ์„ค์ •ํ•œ๋‹ค๋ฉด, ์—ฌ๊ธฐ์„œ์˜ reset()๊ณผ setImagePreview(null) ํ˜ธ์ถœ์€ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์ •๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.

โ™ป๏ธ ๊ฐ„์†Œํ™” ์ œ์•ˆ
  const handleModalClose = () => {
    handleClose();
-   reset();
-   setImagePreview(null);
  };

88-106: โœ… ์ข‹์€ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ mutation ํ›…์— ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

usePostAddArticle๊ณผ usePutModifyArticle ํ›…์„ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, ๋‘ ํ›… ๋ชจ๋‘ onError ์ฝœ๋ฐฑ์—์„œ toast๋ฅผ ํ†ตํ•œ ์—๋Ÿฌ ํ”ผ๋“œ๋ฐฑ์„ ์ด๋ฏธ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Mutation ์„ฑ๊ณต ์‹œ์—๋งŒ ๋ชจ๋‹ฌ์„ ๋‹ซ๊ณ  ํผ์„ ๋ฆฌ์…‹ํ•˜๋„๋ก ๊ฐœ์„ ํ•˜์‹  ๋ถ€๋ถ„๋„ PR ๋ชฉํ‘œ์— ๋งž๊ฒŒ ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ํ•˜๋‚˜์˜ ์ตœ์ ํ™” ์ ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค:

  1. ์ค‘๋ณต reset() ์ œ๊ฑฐ ์ œ์•ˆ
    • onSuccess์—์„œ reset() ํ˜ธ์ถœ ํ›„ handleClose()๊ฐ€ isOpen์„ false๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด, useEffect (line 52-69)๊ฐ€ ๋‹ค์‹œ reset()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    • ๋™์ž‘์—๋Š” ๋ฌธ์ œ์—†์œผ๋‚˜, useEffect๊ฐ€ ์ด๋ฏธ ๋ชจ๋‹ฌ ๋‹ซํž ๋•Œ ์ƒํƒœ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต์ž…๋‹ˆ๋‹ค.
โ™ป๏ธ ๊ฐœ์„  ๋ฐฉ์•ˆ
      putModifyArticle(
        { body: data, articleId },
        {
          onSuccess: () => {
            handleClose();
-           reset();
          },
        }
      );
    } else {
      postAddArticle(data, {
        onSuccess: () => {
          handleClose();
-         reset();
        },
      });
    }

Comment on lines +20 to +34
const revalidateCommunityPage = async (boardCode: string, accessToken: string) => {
try {
if (!accessToken) {
console.warn("Revalidation skipped: No access token available");
return;
}

await fetch("/api/revalidate", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`,
},
body: JSON.stringify({ boardCode }),
});
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸ  Major

ISR revalidate๊ฐ€ โ€˜์กฐ์šฉํžˆ ์‹คํŒจโ€™ํ•  ์ˆ˜ ์žˆ์–ด์š”.
fetch๋Š” 4xx/5xx์—์„œ๋„ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š์•„์„œ, ํ˜„์žฌ๋Š” ์‹คํŒจ๊ฐ€ ๋กœ๊ทธ ์—†์ด ํ†ต๊ณผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ok ์ฒดํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.

๐Ÿ”ง ์ˆ˜์ • ์ œ์•ˆ
-    await fetch("/api/revalidate", {
+    const response = await fetch("/api/revalidate", {
       method: "POST",
       headers: {
         "Content-Type": "application/json",
         Authorization: `Bearer ${accessToken}`,
       },
       body: JSON.stringify({ boardCode }),
     });
+    if (!response.ok) {
+      throw new Error(`Revalidate failed: ${response.status}`);
+    }
๐Ÿค– Prompt for AI Agents
In `@apps/web/src/apis/community/deletePost.ts` around lines 20 - 34, The
revalidation call in revalidateCommunityPage currently awaits fetch but doesn't
check HTTP status, so 4xx/5xx responses silently succeed; update
revalidateCommunityPage to capture the fetch response, check response.ok, and if
false log or throw an error including response.status and response.statusText
(or response.text()) so failed ISR revalidations are visible; ensure this
handling occurs after the fetch and before returning from
revalidateCommunityPage.

Comment on lines +19 to +33
const revalidateCommunityPage = async (boardCode: string, accessToken: string) => {
try {
if (!accessToken) {
console.warn("Revalidation skipped: No access token available");
return;
}

await fetch("/api/revalidate", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`,
},
body: JSON.stringify({ boardCode }),
});
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸ  Major

์—ฌ๊ธฐ๋„ revalidate ์‹คํŒจ๊ฐ€ ์ˆจ๊ฒจ์งˆ ์ˆ˜ ์žˆ์–ด์š”.
fetch๋Š” 4xx/5xx์—์„œ๋„ ์„ฑ๊ณต์œผ๋กœ resolve๋˜๋ฏ€๋กœ, ์‘๋‹ต ok ์ฒดํฌ๋กœ ์‹คํŒจ๋ฅผ ๋ช…์‹œํ•ด ์ฃผ์„ธ์š”.

๐Ÿ”ง ์ˆ˜์ • ์ œ์•ˆ
-    await fetch("/api/revalidate", {
+    const response = await fetch("/api/revalidate", {
       method: "POST",
       headers: {
         "Content-Type": "application/json",
         Authorization: `Bearer ${accessToken}`,
       },
       body: JSON.stringify({ boardCode }),
     });
+    if (!response.ok) {
+      throw new Error(`Revalidate failed: ${response.status}`);
+    }
๐Ÿ“ Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const revalidateCommunityPage = async (boardCode: string, accessToken: string) => {
try {
if (!accessToken) {
console.warn("Revalidation skipped: No access token available");
return;
}
await fetch("/api/revalidate", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`,
},
body: JSON.stringify({ boardCode }),
});
const revalidateCommunityPage = async (boardCode: string, accessToken: string) => {
try {
if (!accessToken) {
console.warn("Revalidation skipped: No access token available");
return;
}
const response = await fetch("/api/revalidate", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`,
},
body: JSON.stringify({ boardCode }),
});
if (!response.ok) {
throw new Error(`Revalidate failed: ${response.status}`);
}
๐Ÿค– Prompt for AI Agents
In `@apps/web/src/apis/community/patchUpdatePost.ts` around lines 19 - 33, The
fetch in revalidateCommunityPage currently treats all HTTP responses as success;
update the function to check the Response.ok after the await fetch (in
revalidateCommunityPage) and handle non-ok responses by throwing or logging a
descriptive error (include response.status and response text) so the existing
try/catch can surface failures; ensure the Authorization/header/body logic
remains unchanged and that failures end up logged or rethrown for callers to
observe.

Copy link

@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

๐Ÿค– Fix all issues with AI agents
In `@apps/web/package.json`:
- Line 29: The package.json currently includes an unused dependency
"@vercel/speed-insights"; remove the "@vercel/speed-insights": "^1.3.1" entry
from apps/web package.json if there is no planned usage in this PR, or
alternatively add a brief note in the PR/commit message explaining why
"@vercel/speed-insights" is being introduced and where it will be used; update
package.json accordingly and run dependency install/lockfile update to keep
package-lock/yarn.lock consistent.
๐Ÿงน Nitpick comments (4)
apps/web/src/app/university/application/ScoreSheet.tsx (1)

42-48: ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ๊ฐ€ ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ PR์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์•„๋‹ˆ์ง€๋งŒ, isMine ๊ด€๋ จ ๋กœ์ง์ด ์ฃผ์„์œผ๋กœ ๋‚จ์•„์žˆ๋„ค์š”. ํ–ฅํ›„ ์‚ฌ์šฉ ๊ณ„ํš์ด ์—†๋‹ค๋ฉด ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ฝ”๋“œ ์ •๋ฆฌ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ‰ํ•˜์ง€ ์•Š์œผ๋‹ˆ ํŽธํ•˜์‹ค ๋•Œ ์ •๋ฆฌํ•ด ์ฃผ์„ธ์š”. ๐Ÿ˜Š

apps/web/src/app/community/[boardCode]/[postId]/KebabMenu.tsx (3)

10-26: handler๊ฐ€ ๋งค ๋ Œ๋”๋งˆ๋‹ค ์ƒˆ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋ฐ˜๋ณต ๋“ฑ๋ก/ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

  1. ํ˜ธ์ถœ๋ถ€(Line 58-60)์—์„œ ์ธ๋ผ์ธ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ handler๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์–ด, ๋งค ๋ Œ๋”๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ฐธ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
  2. useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์— handler๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋ Œ๋”๋งˆ๋‹ค ๋ฆฌ์Šค๋„ˆ๊ฐ€ cleanup โ†’ ์žฌ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

useRef๋กœ ์ตœ์‹  handler๋ฅผ ์บก์ฒ˜ํ•˜๋ฉด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์žฌ๋“ฑ๋ก์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ™ป๏ธ useRef๋ฅผ ํ™œ์šฉํ•œ ์•ˆ์ •์ ์ธ handler ์ฐธ์กฐ ์˜ˆ์‹œ
-const useClickOutside = (ref: RefObject<HTMLDivElement | null>, handler: (event: MouseEvent | TouchEvent) => void) => {
+const useClickOutside = (ref: RefObject<HTMLDivElement | null>, handler: (event: MouseEvent | TouchEvent) => void) => {
+  const handlerRef = useRef(handler);
+  handlerRef.current = handler;
+
   useEffect(() => {
     const listener = (event: MouseEvent | TouchEvent) => {
       const current = ref.current;
       if (!current) return;
       if (!(event.target instanceof Node)) return;
       if (current.contains(event.target)) return;
-      handler(event);
+      handlerRef.current(event);
     };
     document.addEventListener("mousedown", listener);
     document.addEventListener("touchstart", listener);
     return () => {
       document.removeEventListener("mousedown", listener);
       document.removeEventListener("touchstart", listener);
     };
-  }, [ref, handler]);
+  }, [ref]);
 };

36-38: SVG ์†์„ฑ์— kebab-case ๋Œ€์‹  camelCase ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. stroke-width โ†’ strokeWidth
  2. stroke-linecap โ†’ strokeLinecap
  3. stroke-linejoin โ†’ strokeLinejoin

React JSX์—์„œ๋Š” camelCase๊ฐ€ ๊ด€๋ก€์ด๋ฉฐ, kebab-case๋Š” ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


28-28: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„์ž…๋‹ˆ๋‹ค.

useClickOutside ํ›…์ด ๋ฐ”๋กœ ์œ„์— ์™„์ „ํžˆ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, "(๊ฐ€์ •)"์ด๋ผ๋Š” ํ‘œํ˜„์ด ์˜คํ•ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ด ์ฃผ์„ธ์š”.

"@tanstack/react-query": "^5.84.1",
"@tanstack/react-query-devtools": "^5.84.1",
"@tanstack/react-virtual": "^3.13.12",
"@vercel/speed-insights": "^1.3.1",
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸก Minor

๐Ÿงฉ Analysis chain

๐Ÿ Script executed:

#!/bin/bash
# Search for `@vercel/speed-insights` usage in the codebase
echo "=== Searching for `@vercel/speed-insights` imports ==="
rg "@vercel/speed-insights" --type-list | head -20
rg "speed-insights|SpeedInsights" -i --type ts --type tsx --type js --type jsx 2>/dev/null || echo "No matches found in ts/tsx/js/jsx"

# Check the actual apps/web structure
echo ""
echo "=== Checking apps/web structure ==="
find apps/web -maxdepth 2 -type f -name "*.ts" -o -name "*.tsx" | head -20

Repository: solid-connection/solid-connect-web

Length of output: 827


๐Ÿ Script executed:

#!/bin/bash
# Check for imports in the main app files
echo "=== Searching in apps/web directory ==="
rg -i "vercel|speed.insights|speed-insights" apps/web --type ts --type tsx -A 2 2>/dev/null | head -50

# Also check if there's any configuration or setup
echo ""
echo "=== Checking package.json context ==="
cat apps/web/package.json | grep -A 10 -B 10 "@vercel/speed-insights" || echo "Not in grep output"

Repository: solid-connection/solid-connect-web

Length of output: 890


๐Ÿ Script executed:

#!/bin/bash
# Get file listing to understand the structure
echo "=== Apps/web main files ==="
ls -la apps/web/*.json 2>/dev/null | head -20
ls -la apps/web/src/ 2>/dev/null | head -20

# Search more broadly for any vercel imports
echo ""
echo "=== All vercel related imports ==="
rg "@vercel" apps/web --type ts --type tsx --type json 2>/dev/null

Repository: solid-connection/solid-connect-web

Length of output: 1128


@vercel/speed-insights ์˜์กด์„ฑ์ด ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฝ”๋“œ์—์„œ ์ž„ํฌํŠธ/์‚ฌ์šฉ ์—†์Œ: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ, @vercel/speed-insights๋Š” package.json์—๋งŒ ์ถ”๊ฐ€๋˜์–ด ์žˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์–ด๋–ค ํŒŒ์ผ์—์„œ๋„ ์‹ค์ œ๋กœ ์ž„ํฌํŠธ๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. PR ๋ฒ”์œ„ ์™ธ ๋ณ€๊ฒฝ: ์ด PR์˜ ๋ชฉ์ ์ธ #405โ€“๋ฉ˜ํ‹ฐ ์‹ ์ฒญํ•˜๊ธฐ -> ๋ฉ˜ํ† ๋ง ์‹ ์ฒญํ•˜๊ธฐย #409 ๋ฒ„๊ทธ ์ˆ˜์ •๊ณผ๋Š” ๋ฌด๊ด€ํ•œ ์˜์กด์„ฑ ์ถ”๊ฐ€์ž…๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ์€ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜, ์‹ค์ œ ์‚ฌ์šฉ ๊ณ„ํš์ด ์žˆ๋‹ค๋ฉด ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋‚˜ PR ์„ค๋ช…์— ์ด์œ ๋ฅผ ๋ช…์‹œํ•ด์ฃผ์„ธ์š”.

๐Ÿค– Prompt for AI Agents
In `@apps/web/package.json` at line 29, The package.json currently includes an
unused dependency "@vercel/speed-insights"; remove the "@vercel/speed-insights":
"^1.3.1" entry from apps/web package.json if there is no planned usage in this
PR, or alternatively add a brief note in the PR/commit message explaining why
"@vercel/speed-insights" is being introduced and where it will be used; update
package.json accordingly and run dependency install/lockfile update to keep
package-lock/yarn.lock consistent.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

1 participant