Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import { RiThumbUpLine } from "react-icons/ri" | |
import { RiThumbUpFill } from "react-icons/ri" | |
import { RiThumbDownLine } from "react-icons/ri" | |
import { RiThumbDownFill } from "react-icons/ri" | |
import { cn } from "@/lib/utils/cn" | |
import { formatLargeNumber } from "@/lib/formatters/formatLargeNumber" | |
export const likeButtonClassName = cn( | |
`flex flex-row`, | |
`items-center justify-center text-center`, | |
`h-8 lg:h-9`, | |
`rounded-2xl`, | |
`text-xs lg:text-sm font-medium`, | |
`bg-neutral-700/50 text-zinc-100`, | |
) | |
export function GenericLikeButton({ | |
className, | |
onLike, | |
onDislike, | |
isLikedByUser = false, | |
isDislikedByUser = false, | |
numberOfLikes = 0, | |
numberOfDislikes = 0, | |
}: { | |
className?: string | |
onLike?: () => void | |
onDislike?: () => void | |
isLikedByUser?: boolean | |
isDislikedByUser?: boolean | |
numberOfLikes?: number | |
numberOfDislikes?: number | |
}) { | |
const classNames = cn( | |
likeButtonClassName, | |
className, | |
) | |
const nbLikes = Math.max(0, numberOfLikes) | |
const nbDislikes = Math.max(0, numberOfDislikes) | |
return ( | |
<div className={classNames}> | |
<div className={cn( | |
`flex flex-row items-center justify-center`, | |
`cursor-pointer rounded-l-full overflow-hidden`, | |
`hover:bg-neutral-700/90`, | |
`space-x-1.5 lg:space-x-2 pl-2 lg:pl-3 pr-1 lg:pr-1 h-8 lg:h-9` | |
)} | |
onClick={() => { | |
try { | |
if (!isLikedByUser) onLike?.() | |
} catch (err) { | |
}}} | |
> | |
<div>{ | |
isLikedByUser | |
? <RiThumbUpFill className="w-5 h-5" /> | |
: <RiThumbUpLine className="w-5 h-5" /> | |
}</div> | |
<div>{nbLikes > 0 ? formatLargeNumber(nbLikes) : ""}</div> | |
</div> | |
<div className={cn( | |
`flex flex-row items-center justify-center`, | |
`cursor-pointer rounded-r-full overflow-hidden`, | |
`hover:bg-neutral-700/90`, | |
`space-x-1.5 lg:space-x-2 pl-2 lg:pl-3 pr-2 lg:pr-3 h-8 lg:h-9` | |
)} | |
onClick={() => { | |
try { | |
if (!isDislikedByUser) onDislike?.() | |
} catch (err) { | |
}}} | |
> | |
<div className="border-l border-l-zinc-600 h-[70%]"> </div> | |
<div>{ | |
isDislikedByUser | |
? <RiThumbDownFill className="w-5 h-5" /> | |
: <RiThumbDownLine className="w-5 h-5" /> | |
}</div> | |
<div>{nbDislikes > 0 ? formatLargeNumber(numberOfDislikes) : ""}</div> | |
</div> | |
</div> | |
) | |
} |