"use client"; import React, { useState, useEffect } from "react"; import { motion, AnimatePresence } from "motion/react"; import { Upload, CheckCircle2, X, Send, Stethoscope, Plus, Dog, Cat, Phone, FileText } from "lucide-react"; import { toast } from "sonner"; import { useUserStore } from "../lib/store/userStore"; import { usePetStore } from "../lib/store/usePetStore"; interface PrescriptionUploadModalProps { isOpen: boolean; onClose: () => void; } export default function PrescriptionUploadModal({ isOpen, onClose }: PrescriptionUploadModalProps) { const { isLoggedIn, profile } = useUserStore(); const { pets, activePetId, addPet } = usePetStore(); const [file, setFile] = useState(null); const [phone, setPhone] = useState(""); const [notes, setNotes] = useState(""); const [selectedPetOption, setSelectedPetOption] = useState("active"); // petId or 'new' const [newPetName, setNewPetName] = useState(""); const [newPetType, setNewPetType] = useState<"سگ" | "گربه">("سگ"); const [newPetBreed, setNewPetBreed] = useState(""); const [newPetAge, setNewPetAge] = useState(""); const [newPetWeight, setNewPetWeight] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [isSuccess, setIsSuccess] = useState(false); useEffect(() => { if (isOpen) { if (isLoggedIn && profile?.mobile) { setPhone(profile.mobile); } if (pets.length > 0) { setSelectedPetOption(activePetId || pets[0].id); } else { setSelectedPetOption("new"); } } }, [isOpen, isLoggedIn, profile?.mobile, pets, activePetId]); if (!isOpen) return null; const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files[0]) { setFile(e.target.files[0]); } }; const resetForm = () => { setFile(null); setNotes(""); setNewPetName(""); setNewPetBreed(""); setNewPetAge(""); setNewPetWeight(""); setIsSubmitting(false); setIsSuccess(false); }; const handleClose = () => { resetForm(); onClose(); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!file) { toast.error("لطفاً تصویر یا فایل نسخه پزشکی را انتخاب کنید."); return; } const cleanPhone = phone.trim(); if (!/^09\d{9}$/.test(cleanPhone)) { toast.error("شماره همراه معتبر نیست. (مثال: ۰۹۱۲۳۴۵۶۷۸۹)"); return; } let finalPetId: string | undefined = undefined; let finalPetName: string | undefined = undefined; if (selectedPetOption !== "new") { finalPetId = selectedPetOption; const found = pets.find(p => p.id === selectedPetOption); if (found) finalPetName = found.name; } else { if (!newPetName.trim()) { toast.error("لطفاً نام همدم (پت) را وارد کنید."); return; } finalPetName = newPetName.trim(); } setIsSubmitting(true); try { const api = (await import("../lib/services/api")).default; const formData = new FormData(); formData.append("file", file); const uploadRes = await api.post("/admin/media/upload", formData, { headers: { "Content-Type": "multipart/form-data" } }); const fileUrl = uploadRes.data?.data?.url || uploadRes.data?.url || uploadRes.data?.filename || file.name; const payload: Record = { fileUrl, phone: cleanPhone, notes: notes.trim() || undefined, }; if (finalPetId) { payload.petId = finalPetId; payload.petName = finalPetName; } else { payload.petName = finalPetName; payload.petType = newPetType; payload.petBreed = newPetBreed.trim() || undefined; payload.petAge = newPetAge ? parseFloat(newPetAge) : 0; payload.petWeight = newPetWeight ? parseFloat(newPetWeight) : 0; } await api.post("/prescriptions", payload); if (selectedPetOption === "new" && finalPetName) { addPet({ name: finalPetName, type: newPetType, breed: newPetBreed.trim() || "نامشخص", age: newPetAge ? parseFloat(newPetAge) : 0, weight: newPetWeight ? parseFloat(newPetWeight) : 0, activityLevel: "متوسط", medicalConditions: [], reminders: [], logs: [], consumptions: [] }); } setIsSubmitting(false); setIsSuccess(true); toast.success("نسخه پزشکی شما با موفقیت ثبت شد."); } catch (error) { console.error("[PrescriptionUpload] Submission error:", error); setIsSubmitting(false); toast.error("خطا در ارسال نسخه پزشکی. لطفاً مجدداً تلاش کنید."); } }; return (
{ if (e.target === e.currentTarget) { handleClose(); } }} > {/* Header */}

بررسی تخصصی نسخه دامپزشک

آپلود نسخه جهت تامین فوری دارو و مکمل‌های اورجینال آلمان

{/* Body */}
{isSuccess ? (

نسخه با موفقیت ثبت شد

تیم پزشکی و کارشناسان کنینا نسخه شما را بررسی کرده و اقلام تجویزی را به پرونده شما اضافه می‌کنند. به محض آماده‌سازی، پیامک اطلاع‌رسانی برای شما ارسال خواهد شد.

) : (
{/* Upload Zone */}
{file ? (
{file.type.startsWith('image/') ? ( پیش‌نمایش نسخه ) : (
)}
{file.name}
برای تغییر فایل دوباره کلیک کنید
) : ( <>

برای انتخاب فایل یا عکس نسخه کلیک کنید

فرمت‌های مجاز: JPG, PNG, PDF (حداکثر ۱۰ مگابایت) )}
{/* Pet Selection or Inline Creation */}
{pets.length > 0 && (
{pets.map((p) => ( ))}
)} {/* Inline Pet Info Form if "new" or no pets */} {(selectedPetOption === "new" || pets.length === 0) && (
مشخصات همدم جدید:
setNewPetName(e.target.value)} className="w-full bg-white border border-medical-gray-200 rounded-xl px-3 py-2 text-xs font-bold focus:outline-none focus:ring-2 focus:ring-canina-blue/20" /> setNewPetBreed(e.target.value)} className="w-full bg-white border border-medical-gray-200 rounded-xl px-3 py-2 text-xs font-bold focus:outline-none focus:ring-2 focus:ring-canina-blue/20" />
setNewPetAge(e.target.value)} className="w-full bg-white border border-medical-gray-200 rounded-xl px-3 py-2 text-xs font-bold focus:outline-none focus:ring-2 focus:ring-canina-blue/20" /> setNewPetWeight(e.target.value)} className="w-full bg-white border border-medical-gray-200 rounded-xl px-3 py-2 text-xs font-bold focus:outline-none focus:ring-2 focus:ring-canina-blue/20" />
)}
{/* Phone Number */}
setPhone(e.target.value)} className="w-full bg-white border border-medical-gray-200 rounded-xl py-2.5 pr-3 pl-11 text-xs font-mono font-bold text-medical-gray-900 focus:outline-none focus:ring-2 focus:ring-canina-blue/20" />
{/* Additional Notes */}