"use client" import * as React from "react" import { zodResolver } from "@hookform/resolvers/zod" import { Loader } from "lucide-react" import { useForm } from "react-hook-form" import { toast } from "sonner" import { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { Button } from "@/components/ui/button" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Select, SelectTrigger, SelectContent, SelectItem, SelectValue, SelectGroup, } from "@/components/ui/select" // import your MultiSelect or other role selection import { MultiSelect } from "@/components/ui/multi-select" import { cn } from "@/lib/utils" import { userRoles, type UserView } from "@/db/schema/users" import { UpdateVendorUserSchema, updateVendorUserSchema } from "../validations" import { modifiVendorUser } from "../service" export interface UpdateAuserSheetProps extends React.ComponentPropsWithRef { user: UserView | null } const languageOptions = [ { value: "ko", label: "한국어" }, { value: "en", label: "English" }, ] // Phone validation helper const validatePhoneNumber = (phone: string): boolean => { if (!phone) return true; // Optional field // Basic international phone number validation const cleanPhone = phone.replace(/[\s\-\(\)]/g, ''); return /^\+\d{10,15}$/.test(cleanPhone); }; // Get phone placeholder const getPhonePlaceholder = (): string => { return "+82 010-1234-5678"; }; // Get phone description const getPhoneDescription = (): string => { return "국제 전화번호를 입력하세요. (예: +82 010-1234-5678)"; }; export function UpdateAuserSheet({ user, ...props }: UpdateAuserSheetProps) { const [isUpdatePending, startUpdateTransition] = React.useTransition() // 1) RHF 설정 const form = useForm({ resolver: zodResolver(updateVendorUserSchema), defaultValues: { name: user?.user_name ?? "", email: user?.user_email ?? "", phone: user?.user_phone ?? "", // Add phone field roles: user?.roles ?? [], language: 'en', }, }) // 2) user prop 바뀔 때마다 form.reset React.useEffect(() => { if (user) { form.reset({ name: user.user_name, email: user.user_email, phone: user.user_phone || "", // Add phone field roles: user.roles, language: 'en', // You might want to get this from user object }) } }, [user, form]) // 3) onSubmit async function onSubmit(input: UpdateVendorUserSchema & { language?: string; phone?: string }) { // Validate phone number if provided if (input.phone && !validatePhoneNumber(input.phone)) { toast.error("올바른 국제 전화번호 형식이 아닙니다.") return } startUpdateTransition(async () => { if (!user) return const { error } = await modifiVendorUser({ id: user.user_id, ...input, }) if (error) { toast.error(error) return } // 성공 시 form.reset() props.onOpenChange?.(false) toast.success("User updated successfully!") }) } return ( Update user Update the user details and save the changes {/* 4) RHF Form */}
{/* name */} ( User Name )} /> {/* email */} ( Email )} /> {/* 전화번호 - 새로 추가 */} ( Phone Number {getPhoneDescription()} )} /> {/* roles */} ( Roles field.onChange(vals)} /> )} /> {/* language */} ( Language )} /> {/* 5) Footer: Cancel, Save */}
) }