|
1 | | -import { useEffect, useCallback, useState, useMemo, useRef } from 'react' |
2 | | -import { useNavigate, useParams } from 'react-router-dom' |
| 1 | +import { FeedCarousel } from '@/pages/feed/ui' |
3 | 2 |
|
4 | | -import { usePlaylistDetail } from '@/entities/playlist' |
5 | | -import { useMyLikedCdList } from '@/entities/playlist/model/useMyCd' |
6 | | -import { CdViewerLayout } from '@/pages/feed/ui' |
7 | | -import { Loading } from '@/shared/ui' |
8 | | - |
9 | | -const Likes = () => { |
10 | | - const navigate = useNavigate() |
11 | | - const { id: routePlaylistId } = useParams<{ id?: string }>() |
12 | | - |
13 | | - const likedCdPlaylist = useMyLikedCdList('RECENT') |
14 | | - |
15 | | - const playlistData = useMemo(() => { |
16 | | - return likedCdPlaylist.data ?? [] |
17 | | - }, [likedCdPlaylist.data]) |
18 | | - |
19 | | - const isLoading = likedCdPlaylist.isLoading |
20 | | - const isError = likedCdPlaylist.isError |
21 | | - |
22 | | - const [centerItem, setCenterItem] = useState<{ |
23 | | - playlistId: number | null |
24 | | - playlistName: string |
25 | | - }>({ playlistId: null, playlistName: '' }) |
26 | | - |
27 | | - const lastIndexRef = useRef<number>(0) |
28 | | - useEffect(() => { |
29 | | - if (likedCdPlaylist.isLoading || !playlistData.length) return |
30 | | - |
31 | | - const routeId = routePlaylistId ? Number(routePlaylistId) : null |
32 | | - const currentIndex = playlistData.findIndex((p) => p.playlistId === routeId) |
33 | | - |
34 | | - if (currentIndex !== -1) { |
35 | | - lastIndexRef.current = currentIndex |
36 | | - setCenterItem({ |
37 | | - playlistId: playlistData[currentIndex].playlistId, |
38 | | - playlistName: playlistData[currentIndex].playlistName, |
39 | | - }) |
40 | | - } else { |
41 | | - const nextItem = playlistData[lastIndexRef.current] || playlistData.at(-1) |
42 | | - |
43 | | - if (nextItem) { |
44 | | - setCenterItem({ |
45 | | - playlistId: nextItem.playlistId, |
46 | | - playlistName: nextItem.playlistName, |
47 | | - }) |
48 | | - |
49 | | - navigate(`../${nextItem.playlistId}`, { replace: true }) |
50 | | - } |
51 | | - } |
52 | | - }, [playlistData, likedCdPlaylist.isLoading, routePlaylistId, navigate]) |
53 | | - |
54 | | - const handleCenterChange = useCallback( |
55 | | - (playlist: { playlistId: number; playlistName: string }) => { |
56 | | - setCenterItem(playlist) |
57 | | - |
58 | | - const path = `../${playlist.playlistId}` |
59 | | - |
60 | | - navigate(path, { replace: true }) |
61 | | - }, |
62 | | - [navigate] |
63 | | - ) |
64 | | - |
65 | | - const likedCdDetail = usePlaylistDetail(centerItem.playlistId, { |
66 | | - enabled: !!centerItem.playlistId, |
67 | | - }) |
68 | | - const playlistDetail = likedCdDetail.data |
69 | | - |
70 | | - if (isLoading) return <Loading isLoading /> |
71 | | - |
72 | | - if (isError) { |
73 | | - navigate('/error') |
74 | | - return null |
75 | | - } |
76 | | - |
77 | | - return ( |
78 | | - <> |
79 | | - <CdViewerLayout |
80 | | - playlistData={playlistData} |
81 | | - playlistDetail={playlistDetail} |
82 | | - centerItem={centerItem} |
83 | | - onCenterChange={handleCenterChange} |
84 | | - pageType="LIKE" |
85 | | - isOwner // TODO: ์ค์ ๊ฐ์ผ๋ก ์์ ํ์ |
86 | | - /> |
87 | | - </> |
88 | | - ) |
89 | | -} |
| 3 | +const Likes = () => <FeedCarousel type="likes" pageType="LIKE" /> |
90 | 4 |
|
91 | 5 | export default Likes |
0 commit comments