-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLikedButton.tsx
101 lines (81 loc) · 2.54 KB
/
LikedButton.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
"use client";
import useAuthModal from "@/hooks/useAuthModal";
import { useUser } from "@/hooks/useUser";
import { useSessionContext } from "@supabase/auth-helpers-react";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";
import toast from "react-hot-toast";
import { AiFillHeart, AiOutlineHeart } from "react-icons/ai";
interface LikedButtonProps {
songId: string;
};
const LikedButton: React.FC<LikedButtonProps> = ({
songId
}) => {
const router = useRouter();
const { supabaseClient } = useSessionContext();
const authModel = useAuthModal();
const { user } = useUser();
const [isLiked, setIsLiked] = useState(false);
useEffect(() => {
if (!user?.id) return;
const fetehData = async () => {
const { data, error } = await supabaseClient
.from("liked_songs")
.select("*")
.eq("user_id", user.id)
.eq("song_id", songId)
.single();
if (error) {
console.log(error);
return;
}
if (!error && data) {
setIsLiked(true);
}
};
fetehData();
}, [songId, supabaseClient, user?.id]);
const Icon = isLiked ? AiFillHeart : AiOutlineHeart;
const handleLike = async () => {
if (!user?.id) {
return authModel.onOpen();
}
if (isLiked) {
const { error } = await supabaseClient
.from("liked_songs")
.delete()
.eq("user_id", user.id)
.eq("song_id", songId);
if (error) {
toast.error(error.message);
} else {
toast.success("Song removed from liked songs");
setIsLiked(false);
}
} else {
const { error } = await supabaseClient
.from("liked_songs")
.insert({
user_id: user.id,
song_id: songId,
});
if (error) {
toast.error(error.message);
} else {
toast.success("Song added to liked songs");
setIsLiked(true);
}
}
router.refresh();
}
return (
<button
className=" cursor-pointer hover:opacity-75 transition"
onClick={handleLike}
>
<Icon color={isLiked ? '#22c55e' : 'white'} size={25} />
</button>
);
}
export default LikedButton;