|
| 1 | +import { AiFillHeart } from "react-icons/ai" |
| 2 | +import { FaShare, FaCommentDots } from "react-icons/fa" |
| 3 | +import { useEffect, useState } from "react" |
| 4 | +import { useUser } from "../context/user" |
| 5 | +import { BiLoaderCircle } from "react-icons/bi" |
| 6 | +import { useGeneralStore } from "../stores/general" |
| 7 | +import { useRouter } from "next/navigation" |
| 8 | +import { Comment, Like, PostMainLikesCompTypes } from "../types" |
| 9 | +import useGetCommentsByPostId from "../hooks/useGetCommentsByPostId" |
| 10 | +import useGetLikesByPostId from "../hooks/useGetLikesByPostId" |
| 11 | +import useIsLiked from "../hooks/useIsLiked" |
| 12 | +import useCreateLike from "../hooks/useCreateLike" |
| 13 | +import useDeleteLike from "../hooks/useDeleteLike" |
| 14 | + |
| 15 | +export default function PostMainLikes({ post }: PostMainLikesCompTypes) { |
| 16 | + |
| 17 | + let { setIsLoginOpen } = useGeneralStore(); |
| 18 | + |
| 19 | + const router = useRouter() |
| 20 | + const contextUser = useUser() |
| 21 | + const [hasClickedLike, setHasClickedLike] = useState<boolean>(false) |
| 22 | + const [userLiked, setUserLiked] = useState<boolean>(false) |
| 23 | + const [comments, setComments] = useState<Comment[]>([]) |
| 24 | + const [likes, setLikes] = useState<Like[]>([]) |
| 25 | + |
| 26 | + useEffect(() => { |
| 27 | + getAllLikesByPost() |
| 28 | + getAllCommentsByPost() |
| 29 | + }, [post]) |
| 30 | + |
| 31 | + useEffect(() => { hasUserLikedPost() }, [likes, contextUser]) |
| 32 | + |
| 33 | + const getAllCommentsByPost = async () => { |
| 34 | + let result = await useGetCommentsByPostId(post?.id) |
| 35 | + setComments(result) |
| 36 | + } |
| 37 | + |
| 38 | + const getAllLikesByPost = async () => { |
| 39 | + let result = await useGetLikesByPostId(post?.id) |
| 40 | + setLikes(result) |
| 41 | + } |
| 42 | + |
| 43 | + const hasUserLikedPost = () => { |
| 44 | + if (!contextUser) return |
| 45 | + |
| 46 | + if (likes?.length < 1 || !contextUser?.user?.id) { |
| 47 | + setUserLiked(false) |
| 48 | + return |
| 49 | + } |
| 50 | + let res = useIsLiked(contextUser?.user?.id, post?.id, likes) |
| 51 | + setUserLiked(res ? true : false) |
| 52 | + } |
| 53 | + |
| 54 | + const like = async () => { |
| 55 | + setHasClickedLike(true) |
| 56 | + await useCreateLike(contextUser?.user?.id || '', post?.id) |
| 57 | + await getAllLikesByPost() |
| 58 | + hasUserLikedPost() |
| 59 | + setHasClickedLike(false) |
| 60 | + } |
| 61 | + |
| 62 | + const unlike = async (id: string) => { |
| 63 | + setHasClickedLike(true) |
| 64 | + await useDeleteLike(id) |
| 65 | + await getAllLikesByPost() |
| 66 | + hasUserLikedPost() |
| 67 | + setHasClickedLike(false) |
| 68 | + } |
| 69 | + |
| 70 | + const likeOrUnlike = () => { |
| 71 | + if (!contextUser?.user?.id) { |
| 72 | + setIsLoginOpen(true) |
| 73 | + return |
| 74 | + } |
| 75 | + |
| 76 | + let res = useIsLiked(contextUser?.user?.id, post?.id, likes) |
| 77 | + |
| 78 | + if (!res) { |
| 79 | + like() |
| 80 | + } else { |
| 81 | + likes.forEach((like: Like) => { |
| 82 | + if (contextUser?.user?.id == like?.user_id && like?.post_id == post?.id) { |
| 83 | + unlike(like?.id) |
| 84 | + } |
| 85 | + }) |
| 86 | + } |
| 87 | + } |
| 88 | + |
| 89 | + return ( |
| 90 | + <> |
| 91 | + <div id={`PostMainLikes-${post?.id}`} className="relative mr-[75px]"> |
| 92 | + <div className="absolute bottom-0 pl-2"> |
| 93 | + <div className="pb-4 text-center"> |
| 94 | + <button |
| 95 | + disabled={hasClickedLike} |
| 96 | + onClick={() => likeOrUnlike()} |
| 97 | + className="rounded-full bg-gray-200 p-2 cursor-pointer" |
| 98 | + > |
| 99 | + {!hasClickedLike ? ( |
| 100 | + <AiFillHeart color={likes?.length > 0 && userLiked ? '#ff2626' : ''} size="25"/> |
| 101 | + ) : ( |
| 102 | + <BiLoaderCircle className="animate-spin" size="25"/> |
| 103 | + )} |
| 104 | + |
| 105 | + </button> |
| 106 | + <span className="text-xs text-gray-800 font-semibold"> |
| 107 | + {likes?.length} |
| 108 | + </span> |
| 109 | + </div> |
| 110 | + |
| 111 | + <button |
| 112 | + onClick={() => router.push(`/post/${post?.id}/${post?.profile?.user_id}`)} |
| 113 | + className="pb-4 text-center" |
| 114 | + > |
| 115 | + <div className="rounded-full bg-gray-200 p-2 cursor-pointer"> |
| 116 | + <FaCommentDots size="25"/> |
| 117 | + </div> |
| 118 | + <span className="text-xs text-gray-800 font-semibold">{comments?.length}</span> |
| 119 | + </button> |
| 120 | + |
| 121 | + <button className="text-center"> |
| 122 | + <div className="rounded-full bg-gray-200 p-2 cursor-pointer"> |
| 123 | + <FaShare size="25"/> |
| 124 | + </div> |
| 125 | + <span className="text-xs text-gray-800 font-semibold">55</span> |
| 126 | + </button> |
| 127 | + </div> |
| 128 | + </div> |
| 129 | + </> |
| 130 | + ) |
| 131 | +} |
0 commit comments