@@ -4,87 +4,71 @@ import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from "@/components/u
44import { Input } from "@/components/ui/input"
55import { Label } from "@/components/ui/label"
66import { ScrollArea } from "@/components/ui/scroll-area"
7- import { usePlayerStore } from "@/stores/playerStore"
8- import axios from "axios"
97import { motion } from "framer-motion"
108import { Check , ListMusic , Loader2 , Music , Plus , Search , X } from "lucide-react"
119import { useState } from "react"
1210import { toast } from "sonner"
11+ import { useUserPlaylistsQuery } from "@/hooks/queries/usePlaylistQueries"
12+ import {
13+ useCreatePlaylistMutation ,
14+ useAddSongToPlaylistMutation ,
15+ } from "@/hooks/mutations/usePlaylistMutations"
1316
1417const AddToPlaylist = ( { dialogOpen, setDialogOpen, song } ) => {
15- // Individual selectors
16- const userPlaylist = usePlayerStore ( ( s ) => s . userPlaylist )
17- const getPlaylists = usePlayerStore ( ( s ) => s . getPlaylists )
18+ const { data : userPlaylist = [ ] } = useUserPlaylistsQuery ( )
1819 const [ newPlaylistDialog , setNewPlaylistDialog ] = useState ( false )
1920 const [ newPlaylistName , setNewPlaylistName ] = useState ( "" )
20- const [ loading , setLoading ] = useState ( false )
21- const [ addingSong , setAddingSong ] = useState ( false )
2221 const [ searchQuery , setSearchQuery ] = useState ( "" )
2322 const [ selectedPlaylistId , setSelectedPlaylistId ] = useState ( null )
2423 const [ addingSuccess , setAddingSuccess ] = useState ( false )
2524
25+ const createMutation = useCreatePlaylistMutation ( {
26+ onSuccess : ( ) => {
27+ toast . success ( "Playlist created successfully" )
28+ setNewPlaylistDialog ( false )
29+ setNewPlaylistName ( "" )
30+ } ,
31+ onError : ( error ) => {
32+ toast . error ( error . response ?. data ?. message || "Failed to create playlist" )
33+ } ,
34+ } )
35+
36+ const addSongMutation = useAddSongToPlaylistMutation ( {
37+ onSuccess : ( ) => {
38+ setAddingSuccess ( true )
39+ setTimeout ( ( ) => {
40+ setDialogOpen ( false )
41+ setAddingSuccess ( false )
42+ setSelectedPlaylistId ( null )
43+ } , 1500 )
44+ } ,
45+ onError : ( error ) => {
46+ toast . error ( error . response ?. data ?. message || "An error occurred." )
47+ setSelectedPlaylistId ( null )
48+ } ,
49+ } )
50+
2651 const filteredPlaylists = userPlaylist ?. filter ( ( playlist ) =>
2752 playlist . name . toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) ) ,
2853 )
2954
30- const handleCreatePlaylist = async ( e ) => {
55+ const handleCreatePlaylist = ( e ) => {
3156 e . preventDefault ( )
3257 if ( ! newPlaylistName . trim ( ) ) return
33-
34- setLoading ( true )
35- try {
36- const response = await axios . post (
37- `${ import . meta. env . VITE_API_URL } /api/playlist/create` ,
38- { name : newPlaylistName } ,
39- { withCredentials : true } ,
40- )
41-
42- if ( response . status === 200 ) {
43- toast . success ( "Playlist created successfully" )
44- await getPlaylists ( )
45- setNewPlaylistDialog ( false )
46- setNewPlaylistName ( "" )
47- }
48- } catch ( error ) {
49- toast . error ( error . response ?. data ?. message || "Failed to create playlist" )
50- } finally {
51- setLoading ( false )
52- }
58+ createMutation . mutate ( { name : newPlaylistName } )
5359 }
5460
55- const handleAddToPlaylist = async ( playlistId ) => {
61+ const handleAddToPlaylist = ( playlistId ) => {
5662 if ( ! playlistId || ! song ) {
5763 return toast . error ( "An error occurred. Please try again." )
5864 }
5965
6066 setSelectedPlaylistId ( playlistId )
61- setAddingSong ( true )
62-
63- try {
64- const response = await axios . post (
65- `${ import . meta. env . VITE_API_URL } /api/playlist/add-song` ,
66- {
67- playlistId,
68- songId : song . id ,
69- songData : JSON . stringify ( song ) ,
70- } ,
71- { withCredentials : true } ,
72- )
73-
74- if ( response . status === 201 ) {
75- setAddingSuccess ( true )
76- setTimeout ( ( ) => {
77- setDialogOpen ( false )
78- setAddingSuccess ( false )
79- setSelectedPlaylistId ( null )
80- } , 1500 )
81- }
82- } catch ( error ) {
83- toast . error ( error . response ?. data ?. message || "An error occurred." )
84- setSelectedPlaylistId ( null )
85- } finally {
86- setAddingSong ( false )
87- }
67+ addSongMutation . mutate ( {
68+ playlistId,
69+ songId : song . id ,
70+ songData : song ,
71+ } )
8872 }
8973
9074 return (
@@ -123,14 +107,14 @@ const AddToPlaylist = ({ dialogOpen, setDialogOpen, song }) => {
123107 variant = "outline"
124108 className = "w-full flex items-center gap-2 h-10 text-base hover:bg-primary hover:text-primary-foreground transition-all duration-200"
125109 onClick = { ( ) => setNewPlaylistDialog ( true ) }
126- disabled = { loading }
110+ disabled = { createMutation . isPending }
127111 >
128112 < Plus className = "w-5 h-5" />
129113 Create New Playlist
130114 </ Button >
131115
132116 < ScrollArea className = "h-[400px] pr-4" >
133- { loading ? (
117+ { createMutation . isPending ? (
134118 < div className = "flex items-center h-[300px] justify-center" >
135119 < Loader2 className = "w-6 h-6 animate-spin" />
136120 </ div >
@@ -144,12 +128,12 @@ const AddToPlaylist = ({ dialogOpen, setDialogOpen, song }) => {
144128 transition-all duration-200
145129 ${ selectedPlaylistId === playlist . id ? "bg-primary/10" : "hover:bg-accent" }
146130 ${
147- addingSong && selectedPlaylistId !== playlist . id
131+ addSongMutation . isPending && selectedPlaylistId !== playlist . id
148132 ? "opacity-50 pointer-events-none"
149133 : "cursor-pointer"
150134 }
151135 ` }
152- onClick = { ( ) => ! addingSong && handleAddToPlaylist ( playlist . id ) }
136+ onClick = { ( ) => ! addSongMutation . isPending && handleAddToPlaylist ( playlist . id ) }
153137 >
154138 < Avatar className = "w-12 h-12 rounded-lg" >
155139 < AvatarImage src = { playlist . image } className = "object-cover" />
@@ -210,7 +194,7 @@ const AddToPlaylist = ({ dialogOpen, setDialogOpen, song }) => {
210194 onChange = { ( e ) => setNewPlaylistName ( e . target . value ) }
211195 placeholder = "Enter playlist name"
212196 required
213- disabled = { loading }
197+ disabled = { createMutation . isPending }
214198 className = "h-12"
215199 />
216200 </ div >
@@ -220,16 +204,16 @@ const AddToPlaylist = ({ dialogOpen, setDialogOpen, song }) => {
220204 variant = "outline"
221205 className = "flex-1 h-12"
222206 onClick = { ( ) => setNewPlaylistDialog ( false ) }
223- disabled = { loading }
207+ disabled = { createMutation . isPending }
224208 >
225209 Cancel
226210 </ Button >
227211 < Button
228212 type = "submit"
229213 className = "flex-1 h-12"
230- disabled = { loading || ! newPlaylistName . trim ( ) }
214+ disabled = { createMutation . isPending || ! newPlaylistName . trim ( ) }
231215 >
232- { loading ? (
216+ { createMutation . isPending ? (
233217 < span className = "flex items-center gap-2" >
234218 < Loader2 className = "w-4 h-4 animate-spin" />
235219 Creating...
0 commit comments