11import { useCallback , useEffect , useMemo , useRef , useState } from 'react'
2- import { useParams } from 'react-router-dom'
2+ import { useNavigate , useParams } from 'react-router-dom'
33import type { YouTubeEvent } from 'react-youtube'
44
55import styled from 'styled-components'
@@ -34,6 +34,8 @@ const DiscoverPage = () => {
3434 const playerRef = useRef < YT . Player | null > ( null )
3535 const [ showCoachmark , setShowCoachmark ] = useState ( false )
3636 const [ isMuted , setIsMuted ] = useState < boolean | null > ( null )
37+ const [ , setCurrentIndex ] = useState ( 0 )
38+ const navigate = useNavigate ( )
3739
3840 // ์ฝ์น๋งํฌ
3941 useEffect ( ( ) => {
@@ -81,15 +83,28 @@ const DiscoverPage = () => {
8183
8284 // ์ต์ข
๋ฐฐ์ด
8385 const playlistsData = useMemo ( ( ) => {
84- if ( playlistAsInfo ) {
85- return [
86- playlistAsInfo ,
87- ...shufflePlaylists . filter ( ( p ) => p . playlistId !== playlistAsInfo . playlistId ) ,
88- ]
86+ if ( ! playlistAsInfo ) {
87+ return shufflePlaylists
8988 }
90- return shufflePlaylists
89+ // URL์์ ๊ฐ์ ธ์จ ํ๋ ์ด๋ฆฌ์คํธ๋ฅผ playlistsData ๋ฐฐ์ด์ ์ถ๊ฐ
90+ // ๊ธฐ์กด์ shufflePlaylists์ ์๋ ๊ฒฝ์ฐ, ์์๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ถ๊ฐ
91+ const existingPlaylist = shufflePlaylists . find (
92+ ( p ) => p . playlistId === playlistAsInfo . playlistId
93+ )
94+ if ( existingPlaylist ) {
95+ return shufflePlaylists
96+ }
97+ return [ playlistAsInfo , ...shufflePlaylists ]
9198 } , [ playlistAsInfo , shufflePlaylists ] )
9299
100+ // ํ๋ ์ด๋ฆฌ์คํธ ID๋ก ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ํจ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
101+ const getPlaylistIndexById = useCallback (
102+ ( id : number ) => {
103+ return playlistsData . findIndex ( ( p ) => p . playlistId === id )
104+ } ,
105+ [ playlistsData ]
106+ )
107+
93108 const videoId = currentPlaylist
94109 ? getVideoId ( currentPlaylist . songs [ currentTrackIndex ] ?. youtubeUrl )
95110 : null
@@ -98,12 +113,14 @@ const DiscoverPage = () => {
98113
99114 // ์ต์ด playlist ์ด๊ธฐํ
100115 useEffect ( ( ) => {
101- if ( ! currentPlaylist && playlistsData . length > 0 && isReady ) {
102- const initialPlaylist =
103- playlistsData . find ( ( p ) => p . playlistId === Number ( playlistId ) ) || playlistsData [ 0 ]
116+ if ( playlistsData . length > 0 && isReady ) {
117+ const initialIndex = getPlaylistIndexById ( Number ( playlistId ) )
118+ const initialPlaylist = playlistsData [ initialIndex > - 1 ? initialIndex : 0 ]
119+
120+ setCurrentIndex ( initialIndex > - 1 ? initialIndex : 0 )
104121 setPlaylist ( initialPlaylist , 0 , 0 )
105122 }
106- } , [ playlistsData , currentPlaylist , playlistId , setPlaylist ] )
123+ } , [ playlistsData , playlistId , getPlaylistIndexById , setPlaylist ] )
107124
108125 // // URL์ ํ์ฌ ์ ํ๋ ํ๋ ์ด๋ฆฌ์คํธ๋ก ๋๊ธฐํ
109126 // useEffect(() => {
@@ -155,15 +172,34 @@ const DiscoverPage = () => {
155172 // ์บ๋ฌ์
์ค์์ดํ ์ ํ์ฌ ํ๋ ์ด๋ฆฌ์คํธ ์
๋ฐ์ดํธ
156173 const handleSelectPlaylist = useCallback (
157174 ( index : number ) => {
175+ // ํ์ฌ ์ธ๋ฑ์ค ์ํ๋ฅผ ์
๋ฐ์ดํธ
176+ setCurrentIndex ( index )
177+
158178 const selectedPlaylist = playlistsData [ index ]
159179 if ( selectedPlaylist && currentPlaylist ?. playlistId !== selectedPlaylist . playlistId ) {
160180 setPlaylist ( selectedPlaylist , 0 , 0 )
181+
182+ // URL์ ๋๊ธฐํ
183+ const newId = selectedPlaylist . playlistId
184+ if ( Number ( playlistId ) !== newId ) {
185+ navigate ( `/discover/${ newId } ` , { replace : true } )
186+ }
161187 }
188+
162189 if ( index === playlistsData . length - 1 && hasNextPage && ! isFetchingNextPage ) {
163190 fetchNextPage ( )
164191 }
165192 } ,
166- [ setPlaylist , currentPlaylist , playlistsData , fetchNextPage , hasNextPage , isFetchingNextPage ]
193+ [
194+ setPlaylist ,
195+ currentPlaylist ,
196+ playlistsData ,
197+ fetchNextPage ,
198+ hasNextPage ,
199+ isFetchingNextPage ,
200+ navigate ,
201+ playlistId ,
202+ ]
167203 )
168204
169205 const handlePlayerStateChange = useCallback (
0 commit comments