/* eslint-disable @typescript-eslint/no-explicit-any */ "use client"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useState, type ReactNode } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { useConfirm } from "@/components/confirm-modal-provider"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import useAppStore from "@/stores/use-app-store"; import { Camera, Loader } from "lucide-react"; import { checkingApi } from "@/api/checking-api"; import { toast } from "sonner"; interface UserModalProps { user?: IUser | null; onSave?: (user: IUser) => void; children?: ReactNode; trackingOpen?: boolean; } const userSchema = z.object({ name: z.string().min(1, "Tên là bắt buộc"), email: z.string().email("Email không hợp lệ"), avatar: z.string().optional(), }); type UserFormData = z.infer; export function UserModal({ user, onSave, children, trackingOpen, }: UserModalProps) { const confirm = useConfirm(); const isEditMode = !!user; const [open, setOpenChange] = useState(false); const [loading, setLoading] = useState(false); const { captureRegisterImage, setCaptureRegisterImage } = useAppStore(); const form = useForm({ resolver: zodResolver(userSchema), defaultValues: { name: "", email: "", avatar: "", }, }); useEffect(() => { if (user) { form.reset({ name: user.name, email: user.email, avatar: user.avatar ?? "", }); } else { form.reset({ name: "", email: "", avatar: "", }); } }, [user, open, form]); const handleClose = async () => { const result = await confirm({ title: "Thông báo", message: "Bạn muốn hủy đăng ký. Mọi dữ liệu bạn nhập sẽ bị mất", confirmText: "Discard", cancelText: "Hủy", variant: "warning", }); if (!result) return; setOpenChange(false); setCaptureRegisterImage(null); }; const onSubmit = async (values: UserFormData) => { try { setLoading(true); const dataToSubmit: IUser = { // eslint-disable-next-line react-hooks/purity id: user?.id || Date.now().toString(), ...values, avatar: values.avatar || null, }; const { data } = await checkingApi.register({ user: dataToSubmit, file: captureRegisterImage, }); console.log({ data }); onSave?.(dataToSubmit); setOpenChange(false); setCaptureRegisterImage(null); toast.success(data?.message || "Đăng ký thành công !"); } catch (error) { console.log({ error }); toast.error((error as any)?.message || "Internal Server Error"); } finally { setLoading(false); } }; useEffect(() => { if (trackingOpen === undefined) return; setOpenChange(trackingOpen); }, [trackingOpen]); useEffect(() => { if (!captureRegisterImage) return; return () => { URL.revokeObjectURL(captureRegisterImage); }; }, [captureRegisterImage]); return ( { if (!nextOpen) { handleClose(); return; } setOpenChange(true); // mở }} > {children} {isEditMode ? "Cập nhật thông tin" : "Tạo người dùng mới"} {isEditMode ? "Cập nhật thông tin người dùng của bạn" : "Nhập thông tin để tạo người dùng mới"}
{/* Name */} ( Tên * )} /> {/* Email */} ( Email * )} /> {/* Avatar */} ( Avatar URL )} /> {/* File */} Ảnh từ camera
); }