"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { AlertCircle, LoaderIcon, Paperclip, X } from "lucide-react"; import { useRef, 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 ticketSchema = z.object({ email: z .string() .min(1, "ایمیل الزامی است") .email("لطفاً یک ایمیل معتبر وارد کنید"), category: z.string().min(1, "لطفاً یک دسته انتخاب کنید"), priority: z.string().min(1, "لطفاً یک اولویت انتخاب کنید"), subject: z.string().min(1, "موضوع الزامی است"), description: z.string().min(10, "توضیحات باید حداقل ۱۰ کاراکتر باشد"), }); type TicketFormData = z.infer; interface Category { value: string; label: string; } interface Help4Props { title?: string; description?: string; categories?: Category[]; className?: string; onSubmit?: (data: TicketFormData & { files: File[] }) => Promise; } const Help4 = ({ title = "ثبت تیکت پشتیبانی", description = "مشکل خود را شرح دهید تا در اسرع وقت پاسخ‌گوییم.", categories = [ { value: "technical", label: "مشکل فنی" }, { value: "billing", label: "صورتحساب و پرداخت" }, { value: "account", label: "دسترسی به حساب" }, { value: "feature", label: "درخواست ویژگی" }, { value: "bug", label: "گزارش باگ" }, { value: "other", label: "سایر" }, ], className, onSubmit, }: Help4Props) => { const [files, setFiles] = useState([]); const [isSubmitted, setIsSubmitted] = useState(false); const [showSuccess, setShowSuccess] = useState(false); const fileInputRef = useRef(null); const form = useForm({ resolver: zodResolver(ticketSchema), mode: "onSubmit", reValidateMode: "onSubmit", defaultValues: { email: "", category: "", priority: "", subject: "", description: "", }, }); const handleFileChange = (e: React.ChangeEvent) => { const selectedFiles = Array.from(e.target.files || []); const maxSize = 10 * 1024 * 1024; // 10MB const validFiles = selectedFiles.filter((file) => file.size <= maxSize); setFiles((prev) => [...prev, ...validFiles].slice(0, 5)); // Max 5 files }; const removeFile = (index: number) => { setFiles((prev) => prev.filter((_, i) => i !== index)); }; const handleFormSubmit = async (data: TicketFormData) => { try { if (onSubmit) { await onSubmit({ ...data, files }); } else { console.log("Ticket submitted:", { ...data, files }); await new Promise((resolve) => setTimeout(resolve, 1000)); } setIsSubmitted(true); setShowSuccess(true); form.reset(); setFiles([]); setTimeout(() => setShowSuccess(false), 4500); setTimeout(() => setIsSubmitted(false), 5000); } catch { form.setError("root", { message: "مشکلی پیش آمد. لطفاً دوباره تلاش کنید.", }); } }; const formatFileSize = (bytes: number) => { if (bytes < 1024) return `${bytes.toLocaleString("fa-IR")} بایت`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toLocaleString("fa-IR", { maximumFractionDigits: 1 })} کیلوبایت`; return `${(bytes / (1024 * 1024)).toLocaleString("fa-IR", { maximumFractionDigits: 1 })} مگابایت`; }; return (

{title}

{description}

{isSubmitted && (

تیکت شما ثبت شد. ایمیل تأیید برایتان ارسال می‌شود.

)}
( آدرس ایمیل{" "} * {fieldState.invalid && ( )} )} />
( دسته‌بندی{" "} * {fieldState.invalid && ( )} )} /> ( اولویت * {fieldState.invalid && ( )} )} />
( موضوع * {fieldState.invalid && ( )} )} /> ( توضیحات *