246 lines
8.5 KiB
TypeScript
246 lines
8.5 KiB
TypeScript
"use client";
|
||
import {
|
||
BadgeCheck,
|
||
ChevronRight,
|
||
Clock,
|
||
MessageSquareCode,
|
||
} from "lucide-react";
|
||
import { useEffect, useMemo, useState } from "react";
|
||
|
||
import { Avatar, AvatarImage } from "@/components/ui/avatar";
|
||
import { Badge } from "@/components/ui/badge";
|
||
import { Button } from "@/components/ui/button";
|
||
import { Card } from "@/components/ui/card";
|
||
import { cn } from "@/lib/utils";
|
||
|
||
interface DataItem {
|
||
id: string;
|
||
name: string;
|
||
username: string;
|
||
date: string;
|
||
avatar: string;
|
||
content: string;
|
||
}
|
||
|
||
const DATA: DataItem[] = [
|
||
{
|
||
id: "1",
|
||
name: "امیر محمدی",
|
||
username: "amir_mohammadi",
|
||
date: "۵ مهر ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-4.webp",
|
||
content:
|
||
"این CRM کاملاً نحوه مدیریت قیف فروش را تغییر داد. لیدها، فرصتها و پیگیریها در یک جریان شفافاند و نرخ تبدیل ما بالا رفته.",
|
||
},
|
||
{
|
||
id: "2",
|
||
name: "نیلوفر حسینی",
|
||
username: "niloofar_h",
|
||
date: "۳۰ شهریور ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-1.webp",
|
||
content:
|
||
"هماهنگی فروش و بازاریابی واقعاً برجسته است؛ هر لید با زمینه کامل به نماینده میرسد. دیگر ایمیلهای پراکنده و دادههای تکراری نداریم.",
|
||
},
|
||
{
|
||
id: "3",
|
||
name: "سارا احمدی",
|
||
username: "sara_ahmadi",
|
||
date: "۲۵ شهریور ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-3.webp",
|
||
content: "داشبورد قیف فروش تحولآفرین است!",
|
||
},
|
||
{
|
||
id: "4",
|
||
name: "پارسا موسوی",
|
||
username: "parsa_mousavi",
|
||
date: "۲۰ شهریور ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-4.webp",
|
||
content:
|
||
"ادغام با ایمیل، تقویم و ابزارهای پشتیبانی آسان بود. هر هفته ساعتها از ورود دستی داده و پیگیریهای فراموششده کم شده.",
|
||
},
|
||
{
|
||
id: "5",
|
||
name: "رؤیا کاظمی",
|
||
username: "roya_kazemi",
|
||
date: "۱۵ شهریور ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-3.webp",
|
||
content:
|
||
"قالبهای پیگیری و توالی ایمیل فوقالعادهاند. کمک کردند بدون افت کیفیت، پاسخ به لیدها را سریعتر کنیم. شدیداً توصیه میکنم!",
|
||
},
|
||
{
|
||
id: "6",
|
||
name: "مهسا نوری",
|
||
username: "mahsa_nouri",
|
||
date: "۱۰ شهریور ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-7.webp",
|
||
content:
|
||
"مدیریت حسابهای کلیدی بسیار آسانتر شده. همه فعالیتها، فرصتها و تمدیدها روی یک صفحه هستند.",
|
||
},
|
||
{
|
||
id: "7",
|
||
name: "فاطمه رستمی",
|
||
username: "fateme_rastemi",
|
||
date: "۵ شهریور ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-7.webp",
|
||
content:
|
||
"اتوماسیون کمپینها یکنواختی پیام را در همه کانالها حفظ کرد؛ نرخ واجد شرایط بودن لیدها بالا رفت.",
|
||
},
|
||
{
|
||
id: "8",
|
||
name: "مهتاب شریفی",
|
||
username: "mahtab_sharifi",
|
||
date: "۳۰ مرداد ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-1.webp",
|
||
content:
|
||
"نمرهدهی لید و مسیریابی هوشمند، اولویتبندی فرصتها را برای تیم فروش شفاف کرده.",
|
||
},
|
||
{
|
||
id: "9",
|
||
name: "کاوه مرادی",
|
||
username: "kaveh_moradi",
|
||
date: "۲۵ مرداد ۱۴۲",
|
||
avatar:
|
||
"/block-media/shadcnblocks/block/avatar-4.webp",
|
||
content:
|
||
"پیشبینی درآمد از روی مراحل قیف قابل اتکاتر شده. جلسات فروش ما کوتاهتر و دادهمحورترند.",
|
||
},
|
||
];
|
||
|
||
const TestimonialCard = ({ testimonial }: { testimonial: DataItem }) => (
|
||
<Card className="relative mb-5 break-inside-avoid rounded-xl p-5 shadow-sm">
|
||
<div className="flex items-center gap-4">
|
||
<Avatar className="h-10 w-10 rounded-full ring-1 ring-muted">
|
||
<AvatarImage src={testimonial.avatar} alt={testimonial.name} />
|
||
</Avatar>
|
||
<div>
|
||
<div className="flex items-center gap-2">
|
||
<p className="text-sm font-medium">{testimonial.name}</p>
|
||
<BadgeCheck className="h-4 w-4 fill-cyan-400 stroke-white" />
|
||
</div>
|
||
<p className="mt-2 text-xs text-muted-foreground">
|
||
@{testimonial.username}
|
||
</p>
|
||
</div>
|
||
<div className="ms-auto hover:cursor-pointer">
|
||
<img
|
||
src="/block-media/shadcnblocks/block/logos/x.svg"
|
||
alt="لوگوی X"
|
||
className="h-4 w-4"
|
||
/>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="my-4 border-t border-dashed border-border" />
|
||
|
||
<div className="text-sm text-foreground">
|
||
<q>{testimonial.content}</q>
|
||
</div>
|
||
|
||
<div className="mt-4 flex items-center gap-2 text-xs text-muted-foreground">
|
||
<Clock className="h-4 w-4" />
|
||
<span>{testimonial.date}</span>
|
||
</div>
|
||
</Card>
|
||
);
|
||
|
||
interface Testimonial23Props {
|
||
className?: string;
|
||
}
|
||
|
||
const Testimonial23 = ({ className }: Testimonial23Props) => {
|
||
const [columnCount, setColumnCount] = useState(3);
|
||
|
||
useEffect(() => {
|
||
const getColumnCount = () => {
|
||
if (typeof window === "undefined") return 3;
|
||
const width = window.innerWidth;
|
||
if (width < 768) return 1;
|
||
if (width < 1024) return 2;
|
||
return 3;
|
||
};
|
||
|
||
const updateColumnCount = () => {
|
||
setColumnCount(getColumnCount());
|
||
};
|
||
|
||
updateColumnCount();
|
||
window.addEventListener("resize", updateColumnCount);
|
||
return () => window.removeEventListener("resize", updateColumnCount);
|
||
}, []);
|
||
|
||
const reorderForColumns = (items: DataItem[], columns: number) => {
|
||
const itemsPerColumn = Math.ceil(items.length / columns);
|
||
const reordered: DataItem[] = [];
|
||
|
||
for (let col = 0; col < columns; col++) {
|
||
for (let row = 0; row < itemsPerColumn; row++) {
|
||
const originalIndex = row * columns + col;
|
||
if (originalIndex < items.length) {
|
||
reordered.push(items[originalIndex]);
|
||
}
|
||
}
|
||
}
|
||
|
||
return reordered;
|
||
};
|
||
|
||
const reorderedData = useMemo(() => {
|
||
return reorderForColumns(DATA, columnCount);
|
||
}, [columnCount]);
|
||
|
||
return (
|
||
<section dir="rtl" lang="fa" className={cn("py-32", className)}>
|
||
<div className="container">
|
||
<div className="my-4 flex justify-center">
|
||
<Badge variant="outline" className="rounded-sm py-2 shadow-md">
|
||
<MessageSquareCode className="me-2 size-4 text-muted-foreground" />
|
||
<span>بازخورد مشتریان</span>
|
||
</Badge>
|
||
</div>
|
||
|
||
<div className="flex flex-col items-center gap-6 px-4 sm:px-8">
|
||
<h2 className="mb-2 text-center text-3xl font-semibold lg:text-2xll">
|
||
بشنویید تیمهای فروش <br /> چه نتایجی گزارش میکنند
|
||
</h2>
|
||
|
||
<div className="mt-4 flex flex-col items-center gap-4 sm:flex-row">
|
||
<span>
|
||
ببینید <b>ری یو آی</b> چگونه CRM، فروش و اتوماسیون بازاریابی را
|
||
یکپارچه میکند.
|
||
</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="relative mt-14 w-full px-4 after:absolute after:inset-x-0 after:-bottom-2 after:h-96 after:bg-linear-to-t after:from-background sm:px-8 md:px-16 lg:px-32">
|
||
<div className="columns-1 gap-5 md:columns-2 lg:columns-3">
|
||
{reorderedData.map((testimonial) => (
|
||
<TestimonialCard key={testimonial.id} testimonial={testimonial} />
|
||
))}
|
||
</div>
|
||
</div>
|
||
|
||
<div className="flex justify-center">
|
||
<Button className="mt-4 gap-2 rounded-lg px-5 py-3 text-sm shadow-sm transition-colors hover:bg-primary/90 focus:outline-none disabled:pointer-events-none disabled:opacity-50">
|
||
<span className="flex items-center gap-1">
|
||
<span>بیشتر ببینید</span>
|
||
<span className="text-muted/80">-</span>
|
||
<span className="text-muted/80">نظرات</span>
|
||
</span>
|
||
<ChevronRight className="h-4 w-4 text-muted-foreground/80" />
|
||
</Button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
);
|
||
};
|
||
|
||
export { Testimonial23 };
|