like-rating-basic
stackzero/like-rating-basicFreeComponent
stackzero publishes no description for this item.
Install it
npx shadcn@latest add https://ui.stackzero.co/r/like-rating-basic.jsonSource
1import { cn } from "@/lib/utils";2import { ThumbsDown, ThumbsUp } from "lucide-react";34interface LikeRatingBasicProps {5 likes: number;6 dislikes: number;7 isLiked: boolean;8 isDisliked: boolean;9 likeIncrement?: number;10 dislikeIncrement?: number;11 onRatingChange: (newState: {12 likes: number;13 dislikes: number;14 isLiked: boolean;15 isDisliked: boolean;16 }) => void;17 className?: string;18}1920const LikeRating_Basic = ({21 className,22 dislikeIncrement = 1,23 dislikes = 0,24 isDisliked,25 isLiked,26 likeIncrement = 1,27 likes = 0,28 onRatingChange,29}: LikeRatingBasicProps) => {30 const handleLike = () => {31 if (isLiked) {32 // Undo like33 onRatingChange({34 dislikes,35 isDisliked: false,36 isLiked: false,37 likes: likes - likeIncrement,38 });39 } else {40 // Add like and remove dislike if exists41 onRatingChange({42 dislikes: isDisliked ? dislikes - dislikeIncrement : dislikes,43 isDisliked: false,44 isLiked: true,45 likes: likes + likeIncrement,46 });47 }48 };4950 const handleDislike = () => {51 if (isDisliked) {52 // Undo dislike53 onRatingChange({54 dislikes: dislikes - dislikeIncrement,55 isDisliked: false,56 isLiked: false,57 likes,58 });59 } else {60 // Add dislike and remove like if exists61 onRatingChange({62 dislikes: dislikes + dislikeIncrement,63 isDisliked: true,64 isLiked: false,65 likes: isLiked ? likes - likeIncrement : likes,66 });67 }68 };6970 const formatCount = (count: number) =>71 count >= 1000 ? `${(count / 1000).toFixed(1)}K` : count.toLocaleString();7273 return (74 <div75 className={cn(76 "inline-flex cursor-pointer -space-x-px rounded-lg shadow-xs shadow-black/5 rtl:space-x-reverse",77 className78 )}79 >80 <div81 className={cn(82 "flex min-w-[4rem] flex-row items-center justify-center rounded-none border px-2 py-1 font-mono shadow-none first:rounded-s-lg last:rounded-e-lg hover:bg-[#009e42]/20 focus-visible:z-10",83 isLiked && "bg-[#009e42]/20 text-[#009e42]"84 )}85 onClick={handleLike}86 aria-label="Like"87 aria-labelledby="like-count"88 title="Like"89 >90 <ThumbsUp91 size={16}92 strokeWidth={2}93 aria-hidden="true"94 className={cn("mr-2", isLiked && "text-[#009e42]")}95 />96 {formatCount(likes)}97 </div>98 <div99// … truncated
What it pulls in
npm packages
Files it writes
More from stackzero
All 112 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| face-rating-basicface-rating-basic | stackzero | Components | Free | 1 dep | |
| face-rating-gradientface-rating-gradient | stackzero | Components | Free | 2 deps | |
| image-carousel-basicimage-carousel-basic | stackzero | Components | Free | 5 deps | |
| image-viewer-basicimage-viewer-basic | stackzero | Components | Free | 3 deps | |
| image-viewer-basic-ex-01image-viewer-basic-ex-01 | stackzero | Components | Free | 1 dep | |
| image-viewer-basic-ex-02image-viewer-basic-ex-02 | stackzero | Components | Free | 1 dep | |
| image-viewer-motionimage-viewer-motion | stackzero | Components | Free | 4 deps | |
| image-viewer-motion-ex-01image-viewer-motion-ex-01 | stackzero | Components | Free | 1 dep |
