Files
reui-blocks/blocks/contact17.tsx
T

389 lines
16 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import { zodResolver } from "@hookform/resolvers/zod";
import { Check, LoaderIcon } from "lucide-react";
import { useState } from "react";
import { Controller, useForm } from "react-hook-form";
import { z } from "zod";
import { Button } from "@/components/ui/button";
import {
Field,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Textarea } from "@/components/ui/textarea";
import { cn } from "@/lib/utils";
const contactFormSchema = z.object({
firstName: z.string().min(1, "نام الزامی است"),
lastName: z.string().min(1, "نام خانوادگی الزامی است"),
email: z
.string()
.min(1, "ایمیل الزامی است")
.email("آدرس ایمیل نامعتبر است"),
companySize: z.string().optional(),
message: z.string().min(1, "پیام الزامی است"),
referrer: z.string().optional(),
});
type ContactFormData = z.infer<typeof contactFormSchema>;
interface Contact17Props {
className?: string;
onSubmit?: (data: ContactFormData) => Promise<void>;
}
const Contact17 = ({ className, onSubmit }: Contact17Props) => {
const [isSubmitted, setIsSubmitted] = useState(false);
const [showSuccess, setShowSuccess] = useState(false);
const form = useForm<ContactFormData>({
resolver: zodResolver(contactFormSchema),
mode: "onSubmit",
reValidateMode: "onSubmit",
defaultValues: {
firstName: "",
lastName: "",
email: "",
companySize: "",
message: "",
referrer: "",
},
});
const handleFormSubmit = async (data: ContactFormData) => {
try {
if (onSubmit) {
await onSubmit(data);
} else {
console.log("Form submitted:", data);
await new Promise((resolve) => setTimeout(resolve, 1000));
}
setIsSubmitted(true);
setShowSuccess(true);
form.reset();
setTimeout(() => setShowSuccess(false), 4500);
setTimeout(() => setIsSubmitted(false), 5000);
} catch {
form.setError("root", {
message: "ارسال ناموفق بود. لطفاً دوباره تلاش کنید.",
});
}
};
return (
<section dir="rtl" lang="fa" className={cn("bg-muted/50 py-32", className)}>
<div className="container">
<span className="text-xs text-muted-foreground">شروع با CRM /</span>
<div className="mt-8 grid grid-cols-1 gap-8 md:gap-10 lg:grid-cols-2 lg:grid-rows-[min-content_1fr]">
<h2 className="order-1 text-xl font-medium tracking-tight md:order-none md:text-2xll">
درخواست دمو و مشاوره فروش
</h2>
<div className="order-2 md:order-none md:row-span-2">
<div className="rounded-lg border border-border bg-background p-6">
{isSubmitted && (
<div
className={cn(
"mb-6 rounded-lg border border-green-500/20 bg-green-500/10 p-4 text-center transition-opacity duration-500",
showSuccess ? "opacity-100" : "opacity-0",
)}
>
<p className="text-sm font-medium text-green-600 dark:text-green-400">
درخواست شما ثبت شد. کارشناس Customer Success ظرف یک روز کاری تماس می‌گیرد.
</p>
</div>
)}
<form onSubmit={form.handleSubmit(handleFormSubmit)}>
<FieldGroup className="grid gap-6 sm:grid-cols-2">
<Controller
control={form.control}
name="firstName"
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid}>
<FieldLabel htmlFor={field.name}>
نام <span className="text-destructive">*</span>
</FieldLabel>
<Input
{...field}
id={field.name}
aria-invalid={fieldState.invalid}
placeholder="علی"
/>
{fieldState.invalid && (
<FieldError errors={[fieldState.error]} />
)}
</Field>
)}
/>
<Controller
control={form.control}
name="lastName"
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid}>
<FieldLabel htmlFor={field.name}>
نام خانوادگی{" "}
<span className="text-destructive">*</span>
</FieldLabel>
<Input
{...field}
id={field.name}
aria-invalid={fieldState.invalid}
placeholder="محمدی"
/>
{fieldState.invalid && (
<FieldError errors={[fieldState.error]} />
)}
</Field>
)}
/>
<Controller
control={form.control}
name="email"
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid}>
<FieldLabel htmlFor={field.name}>
ایمیل کاری <span className="text-destructive">*</span>
</FieldLabel>
<Input
{...field}
id={field.name}
type="email"
aria-invalid={fieldState.invalid}
placeholder="example@email.com"
dir="rtl"
className="text-start"
/>
{fieldState.invalid && (
<FieldError errors={[fieldState.error]} />
)}
</Field>
)}
/>
<Controller
control={form.control}
name="companySize"
render={({ field }) => (
<Field>
<FieldLabel htmlFor={field.name}>
اندازه تیم فروش
</FieldLabel>
<Select
onValueChange={field.onChange}
value={field.value}
>
<SelectTrigger id={field.name} className="w-full">
<SelectValue placeholder="تعداد کاربران CRM" />
</SelectTrigger>
<SelectContent>
<SelectItem value="5k-15k">
۱ تا ۱۰ کاربر
</SelectItem>
<SelectItem value="15k-30k">
۱۱ تا ۲۵ کاربر
</SelectItem>
<SelectItem value="30k-50k">
۲۶ تا ۵۰ کاربر
</SelectItem>
<SelectItem value="50k-100k">
۵۱ تا ۱۰۰ کاربر
</SelectItem>
<SelectItem value="100k-250k">
۱۰۱ تا ۲۵۰ کاربر
</SelectItem>
<SelectItem value="250k+">
بیش از ۲۵۰ کاربر
</SelectItem>
</SelectContent>
</Select>
</Field>
)}
/>
<Controller
control={form.control}
name="message"
render={({ field, fieldState }) => (
<Field
data-invalid={fieldState.invalid}
className="sm:col-span-2"
>
<FieldLabel htmlFor={field.name}>
هدف شما از CRM <span className="text-destructive">*</span>
</FieldLabel>
<Textarea
{...field}
id={field.name}
aria-invalid={fieldState.invalid}
placeholder="مثلاً پیپ‌لاین فروش، اتوماسیون lead یا گزارش‌دهی تیم."
/>
{fieldState.invalid && (
<FieldError errors={[fieldState.error]} />
)}
</Field>
)}
/>
<Controller
control={form.control}
name="referrer"
render={({ field }) => (
<Field className="sm:col-span-2">
<FieldLabel htmlFor={field.name}>
چطور با محصول آشنا شدید؟
</FieldLabel>
<Input
{...field}
id={field.name}
placeholder="جستجوی گوگل، معرفی همکار، وبینار یا LinkedIn"
/>
</Field>
)}
/>
{form.formState.errors.root && (
<p className="text-sm text-destructive sm:col-span-2">
{form.formState.errors.root.message}
</p>
)}
<Button
type="submit"
className="gap-2 sm:col-span-2"
disabled={form.formState.isSubmitting}
>
{form.formState.isSubmitting ? (
<>
<LoaderIcon className="size-4 animate-spin" />
در حال ارسال...
</>
) : (
"ارسال درخواست دمو"
)}
</Button>
<p className="text-xs text-muted-foreground sm:col-span-2">
با ارسال این فرم، تأیید می‌کنید که{" "}
<a href="#" className="text-primary hover:underline">
سیاست حفظ حریم خصوصی
</a>{" "}
و{" "}
<a href="#" className="text-primary hover:underline">
شرایط استفاده از سرویس
</a>{" "}
ما را مطالعه کرده و پذیرفته‌اید.
</p>
</FieldGroup>
</form>
</div>
</div>
<div className="order-3 my-6 md:order-none">
<ul className="space-y-2 font-medium">
<li className="flex items-center gap-2">
<span className="flex size-6 shrink-0 items-center justify-center rounded-full bg-background">
<Check className="size-4" />
</span>
نیازهای فروش و اهداف تیم خود را با ما مطرح کنید.
</li>
<li className="flex items-center gap-2">
<span className="flex size-6 shrink-0 items-center justify-center rounded-full bg-background">
<Check className="size-4" />
</span>
پیشنهاد استقرار و پلن متناسب با اندازه تیم بگیرید.
</li>
<li className="flex items-center gap-2">
<span className="flex size-6 shrink-0 items-center justify-center rounded-full bg-background">
<Check className="size-4" />
</span>
دموی اختصاصی محصول را با کارشناس فروش رزرو کنید.
</li>
</ul>
<p className="my-6 font-bold">
بیش از ۳۰۰۰ تیم فروش، CRM ما را برای مدیریت lead و پیپ‌لاین به‌کار می‌برند.
</p>
<div className="grid grid-cols-2 place-items-center gap-8 md:grid-cols-4">
<img
src="/block-media/shadcnblocks/block/logos/company/fictional-company-logo-1.svg"
alt="لوگوی مشتری سازمانی"
className="max-w-24 dark:invert"
/>
<img
src="/block-media/shadcnblocks/block/logos/company/fictional-company-logo-2.svg"
alt="لوگوی مشتری سازمانی"
className="max-w-24 dark:invert"
/>
<img
src="/block-media/shadcnblocks/block/logos/company/fictional-company-logo-3.svg"
alt="لوگوی مشتری سازمانی"
className="max-w-24 dark:invert"
/>
<img
src="/block-media/shadcnblocks/block/logos/company/fictional-company-logo-4.svg"
alt="لوگوی مشتری سازمانی"
className="max-w-24 dark:invert"
/>
<img
src="/block-media/shadcnblocks/block/logos/company/fictional-company-logo-5.svg"
alt="لوگوی مشتری سازمانی"
className="max-w-24 dark:invert"
/>
<img
src="/block-media/shadcnblocks/block/logos/company/fictional-company-logo-6.svg"
alt="لوگوی مشتری سازمانی"
className="max-w-24 dark:invert"
/>
<img
src="/block-media/shadcnblocks/block/logos/company/fictional-company-logo-7.svg"
alt="لوگوی مشتری سازمانی"
className="max-w-24 dark:invert"
/>
<img
src="/block-media/shadcnblocks/block/logos/company/fictional-company-logo-8.svg"
alt="لوگوی مشتری سازمانی"
className="max-w-24 dark:invert"
/>
</div>
</div>
</div>
<div className="mt-16 grid gap-8 md:gap-12 lg:w-1/2 lg:grid-cols-2">
<div>
<h3 className="mb-1.5 font-bold">سوالات متداول</h3>
<p className="text-sm text-muted-foreground">
درباره onboarding، پلن‌ها و یکپارچه‌سازی در{" "}
<a href="#" className="text-primary underline hover:underline">
مرکز راهنما
</a>{" "}
بخوانید و سریع‌تر تصمیم بگیرید.
</p>
</div>
<div>
<h3 className="mb-1.5 font-bold">منابع محصول</h3>
<p className="text-sm text-muted-foreground">
راهنماهای استقرار، گزارش‌های موفقیت و مستندات API را در{" "}
<a href="#" className="text-primary underline hover:underline">
مرکز منابع
</a>{" "}
ببینید و تیم فروش را زودتر آماده کنید.
</p>
</div>
</div>
</div>
</section>
);
};
export { Contact17 };