"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { LoaderIcon, Search } from "lucide-react"; import { useMemo, useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { z } from "zod"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Button } from "@/components/ui/button"; import { Field, FieldError, FieldGroup, FieldLabel, } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { cn } from "@/lib/utils"; const contactFormSchema = z.object({ email: z .string() .min(1, "ایمیل الزامی است") .email("لطفاً یک ایمیل معتبر وارد کنید"), subject: z.string().min(1, "موضوع الزامی است"), message: z.string().min(1, "پیام الزامی است"), }); type ContactFormData = z.infer; interface FAQ { question: string; answer: string; category?: string; } interface Help3Props { title?: string; description?: string; faqs?: FAQ[]; formTitle?: string; formDescription?: string; className?: string; onSubmit?: (data: ContactFormData) => Promise; } const Help3 = ({ title = "راهنمای کاربران", description = "در پایگاه دانش جستجو کنید یا درخواست خود را در پایین ثبت کنید.", faqs = [ { question: "چطور رمز عبورم را بازنشانی کنم؟", answer: "روی لینک «فراموشی رمز عبور» در صفحه ورود کلیک کنید. ایمیل خود را وارد کنید تا لینک بازنشانی برایتان ارسال شود. این لینک پس از ۲۴ ساعت منقضی می‌شود.", category: "حساب کاربری", }, { question: "چطور پلن خود را ارتقا بدهم؟", answer: "به تنظیمات > صورتحساب > تغییر پلن بروید. پلن جدید را انتخاب و تأیید کنید. مابه‌التفاوت به‌صورت تناسبی بلافاصله از کارت شما کسر می‌شود.", category: "صورتحساب", }, { question: "آیا می‌توانم داده‌هایم را خروجی بگیرم؟", answer: "بله، به تنظیمات > داده‌ها > خروجی بروید. می‌توانید همه داده‌ها را در قالب CSV یا JSON دریافت کنید. خروجی‌های حجیم ممکن است چند دقیقه زمان ببرند.", category: "حساب کاربری", }, { question: "چه روش‌های پرداختی را قبول می‌کنید؟", answer: "کارت‌های اعتباری اصلی (Visa، Mastercard، American Express)، PayPal و برای پلن‌های سالانه بالای ۱٬۰۰۰ دلار، انتقال بانکی را می‌پذیریم.", category: "صورتحساب", }, { question: "چطور اشتراکم را لغو کنم؟", answer: "به تنظیمات > صورتحساب > لغو اشتراک بروید. دسترسی شما تا پایان دوره فعلی صورتحساب ادامه دارد و هر زمان می‌توانید دوباره فعال کنید.", category: "صورتحساب", }, { question: "آیا داده‌های من امن است؟", answer: "بله، از رمزنگاری استاندارد صنعتی (AES-256) برای داده‌های ذخیره‌شده و TLS 1.3 برای داده‌های در حال انتقال استفاده می‌کنیم. گواهی SOC 2 Type II داریم.", category: "امنیت", }, ], formTitle = "پاسخ خود را پیدا نکردید؟", formDescription = "درخواست خود را ثبت کنید؛ تیم ما ظرف ۲۴ ساعت پاسخ می‌دهد.", className, onSubmit, }: Help3Props) => { const [searchQuery, setSearchQuery] = useState(""); const [isSubmitted, setIsSubmitted] = useState(false); const [showSuccess, setShowSuccess] = useState(false); const filteredFaqs = useMemo(() => { if (!searchQuery.trim()) return faqs; const query = searchQuery.toLowerCase(); return faqs.filter( (faq) => faq.question.toLowerCase().includes(query) || faq.answer.toLowerCase().includes(query), ); }, [faqs, searchQuery]); const form = useForm({ resolver: zodResolver(contactFormSchema), mode: "onSubmit", reValidateMode: "onSubmit", defaultValues: { email: "", subject: "", message: "", }, }); 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 (

{title}

{description}

setSearchQuery(e.target.value)} className="ps-10" />
{filteredFaqs.length > 0 ? ( filteredFaqs.map((faq, index) => (
{faq.category && ( {faq.category} )} {faq.question}
{faq.answer}
)) ) : (

نتیجه‌ای برای «{searchQuery}» یافت نشد.

)}

{formTitle}

{formDescription}

{isSubmitted && (

درخواست شما ثبت شد. به‌زودی با شما تماس می‌گیریم!

)}
( ایمیل * {fieldState.invalid && ( )} )} /> ( موضوع * {fieldState.invalid && ( )} )} />
( پیام *