Skip to content

Conversation

@maylh
Copy link
Collaborator

@maylh maylh commented Jan 31, 2026

๐Ÿ›ฐ๏ธ ๊ด€๋ จ ์ด์Šˆ

  • ์—†์Œ

โœจ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ

2026.01.31 v1.1.0 ๋ฐฐํฌ

Summary by CodeRabbit

๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

    • ์ฑ„ํŒ… ์‹œ์Šคํ…œ ๊ฐœ์„ ์œผ๋กœ ๋” ํ†ตํ•ฉ๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ œ๊ณต
    • ์ฑ„ํŒ… ๋ฐฉ์˜ ์ฐธ์—ฌ์ž ์ˆ˜ ์‹ค์‹œ๊ฐ„ ์ถ”์  ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ๊ฐœ์„  ์‚ฌํ•ญ

    • ํ”Œ๋ ˆ์ด์–ด ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ฐ•ํ™”๋กœ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ
    • ์…”ํ”Œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ API ์—”๋“œํฌ์ธํŠธ ์—…๋ฐ์ดํŠธ
  • Chores

    • ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ: 1.0.4 โ†’ 1.1.0
    • ๋‚ด๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌ์กฐ ๊ฐœ์„ 

โœ๏ธ Tip: You can customize this high-level summary in your review settings.

maylh and others added 20 commits January 21, 2026 21:01
[chore] ์ฑ„ํŒ… ์„œ๋ฒ„ ๋กœ์ง ๋ณ€๊ฒฝ ๋Œ€์‘
[chore] ๋‘˜๋Ÿฌ๋ณด๊ธฐ ์„œ๋ฒ„ ๋กœ์ง ๋ณ€๊ฒฝ ๋Œ€์‘
[refactor] ์ฑ„ํŒ… ์†Œ์ผ“ context ๊ตฌ์กฐ๋กœ ๋ฆฌํŒฉํ† ๋ง
@maylh maylh self-assigned this Jan 31, 2026
@maylh maylh added the MEDIUM ์ผ๋ฐ˜์ ์ธ ์ค‘๊ฐ„ ์šฐ์„ ์ˆœ์œ„ label Jan 31, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 31, 2026

๐Ÿ“ Walkthrough

Walkthrough

๋ฒ„์ „์„ 1.0.4์—์„œ 1.1.0์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ์ฑ„ํŒ… ์ œ๊ณต์ž ์ปจํ…์ŠคํŠธ, ์žฌ์ƒ ๋ชฉ๋ก API ํƒ€์ž… ํ†ต์ผ, ํ† ํฐ ๊ธฐ๋ฐ˜ ์ฑ„ํŒ… ์ธ์ฆ, ํ”Œ๋ ˆ์ด์–ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€ ๋ฐ ์œ„์ ฏ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ๊ป˜ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

Changes

์ฝ”ํ˜ธํŠธ / ํŒŒ์ผ ์š”์•ฝ
๋ฒ„์ „ ์—…๋ฐ์ดํŠธ
package.json
๋ฃจํŠธ ๋ ˆ๋ฒจ ๋ฒ„์ „์„ 1.0.4์—์„œ 1.1.0์œผ๋กœ ๋ณ€๊ฒฝ.
์ฑ„ํŒ… ์ œ๊ณต์ž ์ธํ”„๋ผ
src/app/providers/ChatProvider.tsx, src/app/providers/index.ts
์ƒˆ๋กœ์šด ChatProvider, ChatContext, useChat ํ›…์„ ๋„์ž…ํ•˜์—ฌ ์†Œ์ผ“ ์ƒํƒœ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌ.
์ฑ„ํŒ… API ๋ฐ ํƒ€์ž…
src/features/chat/api/chat.ts, src/features/chat/types/chat.ts, src/features/chat/model/sendMessage.ts
ChatMessage ํƒ€์ž… ์žฌ๊ตฌ์„ฑ, ListenerNumResponse ์ถ”๊ฐ€, ํ† ํฐ ๊ธฐ๋ฐ˜ STOMP ์ธ์ฆ ๋„์ž…, sendMessage ์„œ๋ช… ๋‹จ์ˆœํ™”, getListenerCount API ์ถ”๊ฐ€.
์žฌ์ƒ ๋ชฉ๋ก ํƒ€์ž… ํ†ต์ผ
src/entities/playlist/types/playlist.ts, src/entities/playlist/api/playlist.ts
PlaylistDetailResponse๋ฅผ PlaylistDetail๋กœ ํ†ตํ•ฉ, PlaylistResponse.content๋ฅผ PlaylistInfo[]์—์„œ number[]๋กœ ๋ณ€๊ฒฝ, PlaylistParams ์ปค์„œ ํƒ€์ž… ๋ณ€๊ฒฝ, getMyPlaylistDetail ์ถ”๊ฐ€.
์žฌ์ƒ ๋ชฉ๋ก ํ›… ๋ฆฌํŒฉํ† ๋ง
src/entities/playlist/model/usePlaylists.ts
useMyPlaylistDetail, usePlaylistDetails ์ถ”๊ฐ€, useShufflePlaylists ํŽ˜์ด์ง€๋„ค์ด์…˜ ํƒ€์ž…์„ Cursor์—์„œ number๋กœ ๋ณ€๊ฒฝ, enabled ๊ฒŒ์ดํŒ… ์ถ”๊ฐ€.
ํ”Œ๋ ˆ์ด์–ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ
src/app/providers/PlayerProvider.tsx
handlePlayerError ์ฝœ๋ฐฑ ์ถ”๊ฐ€, currentPlaylist ํƒ€์ž…์„ PlaylistInfo์—์„œ PlaylistDetail๋กœ ๋ณ€๊ฒฝ.
์ œ๋„ˆ๋ฆญ ์นด๋กœ์…€ ์ปดํฌ๋„ŒํŠธ
src/features/swipe/ui/SwipeCarousel.tsx
SwipeCarousel์„ ์ œ๋„ˆ๋ฆญ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ playlistId ์†์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ํƒ€์ž… ์ง€์›.
๋ผ์ด๋ธŒ ์ •๋ณด ์ปดํฌ๋„ŒํŠธ ๋ฆฌํŒฉํ† ๋ง
src/shared/ui/LiveInfo.tsx
useChat ํ›… ์‚ฌ์šฉ์œผ๋กœ props ๊ธฐ๋ฐ˜ ์„ค๊ณ„์—์„œ ์ „ํ™˜, participantCount ์ž๋™ ํŒŒ์ƒ.
์žฌ์ƒ ๋ชฉ๋ก ์œ„์ ฏ ์—…๋ฐ์ดํŠธ
src/widgets/playlist/...
PlaylistLayout๊ณผ PlaylistInfo๋ฅผ PlaylistDetail ํƒ€์ž…์œผ๋กœ ์—…๋ฐ์ดํŠธ, YoutubePlayer์— onError ์†์„ฑ ์ถ”๊ฐ€, currentPlaylist๋กœ ๋ชจ๋“  ๋ Œ๋”๋ง ํ†ตํ•ฉ.
ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ ๋ฆฌํŒฉํ† ๋ง
src/pages/discover/..., src/pages/mycd/..., src/pages/home/..., src/pages/mypage/...
ChatProvider ๋ž˜ํ•‘, usePlaylistDetails๋กœ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ํ†ตํ•ฉ, ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™” ๋กœ์ง ๋‹จ์ˆœํ™”, LiveInfo ์ œ๊ฑฐ ๋ฐ ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ.
์ฑ„ํŒ… ์œ„์ ฏ ์—…๋ฐ์ดํŠธ
src/widgets/chat/ChatBottomSheet.tsx
useChatSocket(roomId)์„ useChat()์œผ๋กœ ๋ณ€๊ฒฝ, sendMessage ์„œ๋ช… ๋‹จ์ˆœํ™”.
๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”
src/widgets/layout/NavBar.tsx
firstPlaylistId ์ถ”์ถœ ๋กœ์ง ๋ณ€๊ฒฝ์œผ๋กœ content ๋ฐฐ์—ด ํ•ญ๋ชฉ ์ง์ ‘ ์‚ฌ์šฉ.

Estimated code review effort

๐ŸŽฏ 4 (Complex) | โฑ๏ธ ~60 minutes

Poem

๐Ÿฐ ์ฑ„ํŒ… ์ œ๊ณต์ž๊ฐ€ ๋“ค์–ด์™€์„œ, ํƒ€์ž…๋“ค์ด ์ •๋ ฌ๋˜๊ณ ,
ํ”Œ๋ ˆ์ด์–ด ์˜ค๋ฅ˜๋Š” ์ด์ œ ์ฒ˜๋ฆฌ๋˜๊ณ , ์žฌ์ƒ ๋ชฉ๋ก์€ ํ†ตํ•ฉ๋˜๋„ค!
์ œ๋„ˆ๋ฆญ ์นด๋กœ์…€์ด ์ถค์„ ์ถ”๊ณ , ๋ผ์ด๋ธŒ ์ •๋ณด๋Š” ํ๋ฅด๋“ฏ์ด,
๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ์šด ๊ตฌ์กฐ๋กœ ํ•จ๊ป˜ ์›€์ง์—ฌ์š”. ๐ŸŽตโœจ

๐Ÿšฅ Pre-merge checks | โœ… 2 | โŒ 1
โŒ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Description check โ“ Inconclusive PR ์„ค๋ช…์€ ํ…œํ”Œ๋ฆฟ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด์ง€๋งŒ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์„น์…˜์ด '2026.01.31 v1.1.0 ๋ฐฐํฌ'๋กœ๋งŒ ๊ธฐ์ˆ ๋˜์–ด ์žˆ์–ด ์‹ค์ œ ๊ตฌํ˜„๋œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ(ChatProvider, ํƒ€์ž… ํ†ต์ผ, API ๋ณ€๊ฒฝ ๋“ฑ)์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์„น์…˜์—์„œ Chat ๊ธฐ๋Šฅ, ํƒ€์ž… ํ†ต์ผ, API ์—”๋“œํฌ์ธํŠธ ๋ณ€๊ฒฝ ๋“ฑ ์ฃผ์š” ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๊ณผ ๋ฆฌ๋ทฐ ํฌ์ธํŠธ๋„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.
โœ… Passed checks (2 passed)
Check name Status Explanation
Title check โœ… Passed PR ์ œ๋ชฉ์€ '[deploy] release v1.1.0'์œผ๋กœ package.json์˜ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ(1.0.4 โ†’ 1.1.0)์™€ ๋ชจ๋“  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•œ ๋ฐฐํฌ ๋ฒ„์ „์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
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 develop

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.

@gemini-code-assist
Copy link

Summary of Changes

Hello @maylh, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request marks the release of version 1.1.0, bringing significant improvements to the application's playlist and chat functionalities. It includes a comprehensive refactoring of playlist data structures and API calls, streamlining how playlist information is fetched and managed. A new ChatProvider has been introduced to centralize chat socket logic, making real-time chat features more robust and easier to integrate. Additionally, the YouTube player now includes error handling, improving playback reliability. These changes aim to enhance the overall stability, performance, and user experience of the application.

Highlights

  • Version Update: The application version has been updated to "v1.1.0" in package.json, signifying a new release.
  • Playlist Data Refactoring: Significant refactoring of playlist data types and API interactions has been implemented, standardizing "PlaylistDetail" across the application and simplifying "PlaylistResponse" to return playlist IDs for improved efficiency.
  • Centralized Chat Management: A new "ChatProvider" and "useChat" hook have been introduced to centralize chat socket logic, making real-time chat features more robust and accessible throughout the application.
  • YouTube Player Error Handling: The "YoutubePlayer" component now includes an "onError" prop and "handlePlayerError" callback in "PlayerProvider", which automatically advances to the next track upon encountering a playback error.
  • Simplified Playlist Pagination: The pagination logic for shuffled playlists has been updated to use a simpler numerical "cursorId" instead of complex "cursorPosition" and "cursorCardId" parameters.

๐Ÿง  New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with ๐Ÿ‘ and ๐Ÿ‘Ž on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. โ†ฉ

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

v1.1.0 ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์œ„ํ•œ ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ PR์ด๋„ค์š”. ๊ณ ์ƒ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค! ์ „๋ฐ˜์ ์œผ๋กœ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฐฉ์‹์„ ์ตœ์ ํ™”ํ•˜๊ณ , ChatProvider๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฑ„ํŒ… ๊ด€๋ จ ๋กœ์ง์„ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ ์ ์ด ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ฐœ์„ ์ ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์•„๋ž˜ ์ฝ”๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒผ์œผ๋‹ˆ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

Caution

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

โš ๏ธ Outside diff range comments (2)
src/widgets/playlist/YoutubePlayer.tsx (1)

74-79: โš ๏ธ Potential issue | ๐ŸŸก Minor

onError๊ฐ€ useEffect ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋ˆ„๋ฝ๋จ

onError ์ฝœ๋ฐฑ์ด ํ”Œ๋ ˆ์ด์–ด ์ƒ์„ฑ ์‹œ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. onError ์ฝœ๋ฐฑ์ด ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ฝœ๋ฐฑ์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง ์˜์กด์„ฑ ๋ฐฐ์—ด์— onError ์ถ”๊ฐ€ ์ œ์•ˆ
-  }, [apiReady, videoId, isMobile, onReady, onStateChange, setIsMuted])
+  }, [apiReady, videoId, isMobile, onReady, onStateChange, onError, setIsMuted])
src/widgets/chat/ChatBottomSheet.tsx (1)

76-81: โš ๏ธ Potential issue | ๐Ÿ”ด Critical

sendMessage ํ˜ธ์ถœ์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

useChatSocket์˜ sendMessage๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค(void ๋ฐ˜ํ™˜). ๋”ฐ๋ผ์„œ await๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์•„๋ฌด ํšจ๊ณผ๊ฐ€ ์—†์œผ๋ฉฐ, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ๋กค๋ฐฑ์„ ์œ„ํ•œ try-catch ๋ธ”๋ก๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ sendMessage๋Š” ์—ฐ๊ฒฐ์ด ๋Š๊ฒผ๊ฑฐ๋‚˜ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์„ ๋•Œ ์—๋Ÿฌ๋ฅผ ๋˜์ง€์ง€ ์•Š๊ณ  ์กฐ์šฉํžˆ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ์‹ค์ œ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก์ด ์‹คํŒจํ•ด๋„ catch ๋ธ”๋ก์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚™๊ด€์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚จ chat-count๊ฐ€ ์›๋ž˜๋Œ€๋กœ ๋กค๋ฐฑ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์„ ์•ˆ:

  • sendMessage๋ฅผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹ค์ œ ์ „์†ก ๊ฒฐ๊ณผ(์„ฑ๊ณต/์‹คํŒจ)๋ฅผ Promise๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜
  • sendMessage ํ˜ธ์ถœ ์ „์— connected ์ƒํƒœ๋ฅผ ๋จผ์ € ๊ฒ€์ฆํ•œ ํ›„ proceedํ•˜๊ฑฐ๋‚˜
  • Promise ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€ ์ „์†ก API ์‚ฌ์šฉ ๊ฒ€ํ† 
๐Ÿค– Fix all issues with AI agents
In `@src/features/chat/model/sendMessage.ts`:
- Line 41: Replace the inline debug logger that currently uses console.log in
the sendMessage.ts STOMP client config (the debug: (str) =>
console.log('[STOMP]', str) entry) with a call to console.warn or a
conditional/no-op logger for production; update the debug function to use
console.warn('[STOMP]', str) or gate logging by an environment flag so static
analysis rules are satisfied and production logging can be disabled.

In `@src/pages/discover/index.tsx`:
- Around line 36-49: The bug is that urlPlaylistId is stored in urlIdRef
(useRef) so route changes don't update startId, and shufflePlaylistIds is
re-created every render causing unnecessary useMemo invalidation; fix by
memoizing shufflePlaylistIds from data using useMemo (e.g., compute
shufflePlaylistIds = useMemo(() => data?.pages.flatMap(p => p.content) ?? [],
[data])), remove urlIdRef and compute startId inside the finalPlaylistIds
useMemo from Number(urlPlaylistId) (guarding against NaN), and make
finalPlaylistIds useMemo depend on [urlPlaylistId, shufflePlaylistIds] to return
either shufflePlaylistIds or [startId, ...filtered].

In `@src/shared/ui/LiveInfo.tsx`:
- Around line 6-14: The Storybook story still uses the old props interface
(isOnAir, listenerCount) but LiveInfo now reads participantCount from useChat
and must be rendered inside ChatProvider; update the LiveInfo story
(LiveInfo.stories.tsx) to wrap LiveInfo with ChatProvider or mock the useChat
context so participantCount is provided, and remove/replace the prop-based
knobs/examples with a context-based variant (or a decorator that injects
participantCount) so the story reflects the current LiveInfo implementation and
shows ON AIR when participantCount > 0.

In `@src/widgets/playlist/PlaylistInfo.tsx`:
- Line 10: Imported UI "Error" component in PlaylistInfo.tsx conflicts with the
global Error type; alias the import (e.g., import { Error as UiError, Header,
Link, Loading, SvgButton } from '@/shared/ui') and then rename all usages of the
component inside the PlaylistInfo React component (replace Error โ†’ UiError) so
the global Error type is not shadowed and TypeScript/Biome linting errors are
resolved.

In `@src/widgets/playlist/PlaylistLayout.tsx`:
- Around line 80-86: ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ currentPlaylist๊ฐ€ ์—†์„ ๋•Œ playlistId์— 0์„ ๋„˜๊ธฐ๊ณ  ์žˆ์–ด ๋กœ๋”ฉ ์ค‘ ํด๋ฆญ
์‹œ ์ž˜๋ชป๋œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ActionBarContainer/ActionBar๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— currentPlaylist
์กด์žฌ์—ฌ๋ถ€๋กœ ๊ฐ€๋“œํ•˜๊ฑฐ๋‚˜ ActionBar์— playlistId๋ฅผ optional๋กœ ์ „๋‹ฌํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์„ธ์š” (์ฆ‰, PlaylistLayout์—์„œ
currentPlaylist๊ฐ€ falsy๋ฉด ActionBarContainer/ActionBar๋ฅผ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ disabled ์ƒํƒœ๋กœ ๋ Œ๋”๋งํ•˜๊ณ ,
ActionBar ์ปดํฌ๋„ŒํŠธ๋Š” playlistId?: number ํ˜•ํƒœ๋ฅผ ๋ฐ›์•„ null/undefined๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •).
Ensure you reference the ActionBarContainer/ActionBar render block and the props
playlistId, creatorId, stickers, and type when applying the guard.
๐Ÿงน Nitpick comments (5)
src/entities/playlist/api/playlist.ts (1)

44-46: getTracklist์™€ ๋™์ผ ๊ฒฝ๋กœ๋ผ๋ฉด ์žฌ์‚ฌ์šฉ์œผ๋กœ ์ค‘๋ณต ์ œ๊ฑฐ ๊ณ ๋ ค ๊ฐ€๋Šฅ.
์œ ์ง€๋ณด์ˆ˜ ๋ชฉ์ ์˜ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

โ™ป๏ธ ๊ฐ„๋‹จํ•œ ์ค‘๋ณต ์ œ๊ฑฐ ์˜ˆ์‹œ
-export const getMyPlaylistDetail = (cdId: number) => {
-  return api.get<PlaylistDetail>(`/main/playlist/mypage/me/${cdId}`)
-}
+export const getMyPlaylistDetail = getTracklist
src/app/providers/ChatProvider.tsx (1)

10-22: Context์™€ Hook์„ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ Fast Refresh ์ตœ์ ํ™”๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”.

ํ”„๋กœ์ ํŠธ์˜ react-refresh/only-export-components ESLint ๊ทœ์น™์— ๋”ฐ๋ฅด๋ฉด, ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์€ React ์ปดํฌ๋„ŒํŠธ๋งŒ exportํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ChatProvider.tsx์—์„œ ChatContext, ChatProvider, useChat์„ ํ•จ๊ป˜ exportํ•˜๋Š” ํŒจํ„ด์€ Fast Refresh ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๊ถŒ์žฅ ๊ตฌ์กฐ:

  • chat.context.ts: ChatContext export
  • use-chat.ts: useChat hook export
  • ChatProvider.tsx: ChatProvider ์ปดํฌ๋„ŒํŠธ๋งŒ export
src/app/providers/PlayerProvider.tsx (1)

81-89: nextTrack ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋ถˆํ•„์š”ํ•œ isMuted ํฌํ•จ

nextTrack ์ฝœ๋ฐฑ์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์— isMuted๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง ์˜์กด์„ฑ ๋ฐฐ์—ด์—์„œ isMuted ์ œ๊ฑฐ ์ œ์•ˆ
   const nextTrack = useCallback(() => {
     if (currentPlaylist && currentTrackIndex < currentPlaylist.songs.length - 1) {
       setCurrentTrackIndex((prev) => prev + 1)
       setCurrentTime(0)
       if (playerRef.current) {
         playerRef.current.seekTo(0, true)
       }
     }
-  }, [currentPlaylist, currentTrackIndex, isMuted])
+  }, [currentPlaylist, currentTrackIndex])
src/pages/mycd/index.tsx (1)

131-137: useEffect ์˜์กด์„ฑ ๋ฐฐ์—ด์— isMobile ๋ˆ„๋ฝ

isMobile ๊ฐ’์ด setPlaylist ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””๋ฐ”์ด์Šค ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ์ž๋™ ์žฌ์ƒ ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง ์˜์กด์„ฑ ๋ฐฐ์—ด์— isMobile ์ถ”๊ฐ€
   useEffect(() => {
     if (playlistDetail && userInfo) {
       if (currentPlaylist?.playlistId === playlistDetail.playlistId) return

       setPlaylist(playlistDetail, 0, 0, !isMobile) // ๋ชจ๋ฐ”์ผ์ด๋ฉด ์ž๋™์žฌ์ƒ off
     }
-  }, [playlistDetail, userInfo, setPlaylist, currentPlaylist])
+  }, [playlistDetail, userInfo, setPlaylist, currentPlaylist, isMobile])
src/pages/home/ui/FirstSection.tsx (1)

8-28: RandomCdData๋ฅผ camelCase๋กœ ์ •๋ฆฌํ•˜์„ธ์š”.
๋ณ€์ˆ˜/ํ›… ๊ฒฐ๊ณผ๋Š” camelCase๊ฐ€ ์ปจ๋ฒค์…˜์ž…๋‹ˆ๋‹ค. RandomCdData โ†’ randomCdData๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‚ฌ์šฉ์ฒ˜๋„ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

๐Ÿ”ง ์ œ์•ˆ ์ˆ˜์ •
-  const { data: RandomCdData } = usePlaylistDetails(playlistIds)
+  const { data: randomCdData } = usePlaylistDetails(playlistIds)
-          <HomeCarousel
-            data={isLogin ? (MyCdData ?? RandomCdData) : RandomCdData}
-            isLogin={isLogin}
-          />
+          <HomeCarousel
+            data={isLogin ? (MyCdData ?? randomCdData) : randomCdData}
+            isLogin={isLogin}
+          />

As per coding guidelines: '์œ ํ‹ธ๋ฆฌํ‹ฐ/ํ›…/๋ณ€์ˆ˜: camelCase (์˜ˆ: getUserData, useUserInfo)'.

@maylh maylh merged commit 08b9d5a into main Jan 31, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

MEDIUM ์ผ๋ฐ˜์ ์ธ ์ค‘๊ฐ„ ์šฐ์„ ์ˆœ์œ„

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant