Skip to content

Commit 6d8eb3e

Browse files
committed
add review component
1 parent a4b0f6e commit 6d8eb3e

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
"use client";
2+
3+
import React from "react";
4+
import { User } from "@nextui-org/react";
5+
import { Icon } from "@iconify/react";
6+
7+
import { cn } from "~/lib/utils";
8+
9+
export type ReviewType = {
10+
user: {
11+
name: string;
12+
avatar: string;
13+
};
14+
createdAt: string;
15+
rating: number;
16+
title: string;
17+
content: string;
18+
};
19+
20+
export type ReviewProps = React.HTMLAttributes<HTMLDivElement> & ReviewType;
21+
22+
const Review = React.forwardRef<HTMLDivElement, ReviewProps>(
23+
({ children, user, title, content, rating, createdAt, ...props }, ref) => (
24+
<div ref={ref} {...props}>
25+
<div className="flex items-center justify-between">
26+
<div className="flex items-center gap-2">
27+
<User
28+
avatarProps={{
29+
src: user.avatar,
30+
}}
31+
classNames={{
32+
name: "font-medium",
33+
description: "text-small",
34+
}}
35+
description={new Intl.DateTimeFormat("en-US", {
36+
month: "long",
37+
day: "numeric",
38+
year: "numeric",
39+
}).format(new Date(createdAt))}
40+
name={user.name}
41+
/>
42+
</div>
43+
<div className="flex items-center gap-1">
44+
{Array.from({ length: 5 }, (_, i) => {
45+
const isSelected = i + 1 <= rating;
46+
47+
return (
48+
<Icon
49+
key={`${rating}-${i}`}
50+
className={cn(
51+
"text-lg sm:text-xl",
52+
isSelected ? "text-warning" : "text-default-200",
53+
)}
54+
icon="solar:star-bold"
55+
/>
56+
);
57+
})}
58+
</div>
59+
</div>
60+
<div className="mt-4 w-full">
61+
<p className="font-medium text-default-900">{title}</p>
62+
<p className="mt-2 text-default-500">{content || children}</p>
63+
</div>
64+
</div>
65+
),
66+
);
67+
68+
Review.displayName = "Review";
69+
70+
export default Review;

0 commit comments

Comments
 (0)