"use client" import * as React from "react" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" // react-hook-form + shadcn/ui Form import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription, } from "@/components/ui/form" import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Role, userRoles } from "@/db/schema/users" import { type Company } from "@/db/schema/companies" import { MultiSelect } from "@/components/ui/multi-select" import { Popover, PopoverTrigger, PopoverContent, } from "@/components/ui/popover" import { Command, CommandInput, CommandList, CommandGroup, CommandItem, CommandEmpty, } from "@/components/ui/command" import { Check, ChevronsUpDown, Loader } from "lucide-react" import { cn } from "@/lib/utils" import { toast } from "sonner" import { Vendor } from "@/db/schema/vendors" import { CreateVendorUserSchema, createVendorUserSchema } from "../validations" import { createVendorUser, getAllRolesbyVendor } from "../service" const languageOptions = [ { value: "ko", label: "한국어" }, { value: "en", label: "English" }, ] // Phone validation helper const validatePhoneNumber = (phone: string): boolean => { if (!phone) return false; // Basic international phone number validation const cleanPhone = phone.replace(/[\s\-\(\)]/g, ''); return /^\+\d{10,15}$/.test(cleanPhone); }; // Get phone placeholder based on common patterns const getPhonePlaceholder = (): string => { return "+82 010-1234-5678"; // Default to Korean format }; // Get phone description const getPhoneDescription = (): string => { return "국제 전화번호를 입력하세요. (예: +82 010-1234-5678)"; }; export function AddUserDialog() { const [open, setOpen] = React.useState(false) const [roles, setRoles] = React.useState([]) const [isAddPending, startAddTransition] = React.useTransition() React.useEffect(() => { getAllRolesbyVendor().then((res) => { setRoles(res) }) }, []) // react-hook-form 세팅 const form = useForm({ resolver: zodResolver(createVendorUserSchema), defaultValues: { name: "", email: "", phone: "", // Add phone field companyId: null, language: 'en', roles: ["Vendor Admin"], domain: 'partners' }, }) async function onSubmit(data: CreateVendorUserSchema & { language?: string; phone?: string }) { data.domain = "partners" // Validate phone number if provided if (data.phone && !validatePhoneNumber(data.phone)) { toast.error("올바른 국제 전화번호 형식이 아닙니다.") return } startAddTransition(async () => { const result = await createVendorUser(data) if (result.error) { toast.error(`에러: ${result.error}`) return } form.reset() setOpen(false) toast.success("User added") }) } function handleDialogOpenChange(nextOpen: boolean) { if (!nextOpen) { form.reset() } setOpen(nextOpen) } return ( {/* 모달을 열기 위한 버튼 */} Create New User 새 User 정보를 입력하고 Create 버튼을 누르세요. {/* shadcn/ui Form을 이용해 react-hook-form과 연결 */}
{/* 사용자 이름 */} ( User Name )} /> {/* 이메일 */} ( Email )} /> {/* 전화번호 - 새로 추가 */} ( Phone Number {getPhoneDescription()} )} /> {/* Role (Vendor Admin) - 읽기 전용 */} ( Role )} /> {/* language Select */} ( Language )} />
) }