Untitled
unknown
plain_text
2 years ago
4.3 kB
9
Indexable
"use client";
import React from "react";
import { Button, Image } from "@nextui-org/react";
import { cn } from "@utils/cn";
import { CheckCircleIcon } from "@heroicons/react/20/solid";
export type ProductItem = {
id: string;
name: string;
href: string;
price: number;
isNew?: boolean;
description?: string;
imageSrc: string;
included?: string[];
benefits?: string[];
};
export type ProductListItemProps = Omit<
React.HTMLAttributes<HTMLDivElement>,
"id"
> & {
showBenefits: boolean;
toggleShowBeneftis: () => void;
isPopular?: boolean;
removeWrapper?: boolean;
} & ProductItem;
const ProductListItem = React.forwardRef<HTMLDivElement, ProductListItemProps>(
(
{
showBenefits,
toggleShowBeneftis,
name,
price,
description,
imageSrc,
benefits,
isNew,
isPopular,
removeWrapper,
className,
...props
},
ref
) => {
return (
<div
ref={ref}
className={cn(
"relative flex w-64 max-w-full flex-none scroll-ml-6 flex-col gap-3 rounded-large bg-content1 p-4 shadow-medium",
{
"rounded-none bg-transparent shadow-none": removeWrapper,
},
className
)}
{...props}>
<div
className={cn(
"relative flex max-h-full h-auto justify-start w-auto flex-col items-center overflow-hidden rounded-medium bg-content2"
)}>
<div className="overflow-hidden rounded-large w-full">
<Image
removeWrapper
loading="lazy"
alt={name}
className={cn(
"z-0 h-56 max-h-full w-full overflow-hidden object-cover object-center hover:scale-110 flex items-center"
// "z-0 h-full max-h-full w-full overflow-hidden object-cover object-center hover:scale-110",
// {
// "flex h-56 items-center": isPopular,
// }
)}
src={imageSrc}
/>
</div>
<div
className={cn("flex flex-col gap-2 px-4 pb-4 mr-auto pt-4", {
hidden: !isPopular,
})}>
<h3 className="text-xl font-semibold tracking-tight text-default-800">
{name}
</h3>
</div>
</div>
<div className="flex flex-col gap-3 px-1">
<div
className={cn("flex items-center justify-between", {
hidden: isPopular,
})}>
<h3 className="text-medium font-medium text-default-700">{name}</h3>
<p className="text-medium font-medium text-default-500">${price}</p>
</div>
{description && !isPopular ? (
<p className="text-small text-default-500">{description}</p>
) : null}
<div className="flex gap-2 flex-col min-[400px]:flex-row">
<Button
fullWidth
className="bg-default-300/20 font-medium text-default-700"
radius="lg"
variant="flat"
onClick={toggleShowBeneftis}>
Learn More
</Button>
<Button
fullWidth
className="font-medium bg-[#eb731a] hover:!bg-[#cf4a00] hover:!opacity-100 text-white"
color="primary"
radius="lg"
variant={isPopular ? "flat" : "solid"}>
Check Eligibility
</Button>
</div>
{showBenefits && (
<div className="">
<div className="mb-3 font-medium">Benefits:</div>
<div className="flex flex-col gap-2 dark:text-default-500">
{benefits?.map((benefit, index) => (
<div key={index} className="flex gap-2 mb-1 items-start">
<CheckCircleIcon
aria-hidden
className="w-5 h-5 shrink-0 text-success mt-1"
/>
<div className="text-block-72 m-0">{benefit}</div>
</div>
))}
</div>
</div>
)}
</div>
</div>
);
}
);
ProductListItem.displayName = "ProductListItem";
export default ProductListItem;Editor is loading...
Leave a Comment