"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, } from "@/components/ui/select" // import your MultiSelect or other role selection import { MultiSelect } from "@/components/ui/multi-select" import { cn } from "@/lib/utils" import { type UserView } from "@/db/schema/users" import { updateUserSchema, type UpdateUserSchema } from "@/lib/admin-users/validations" import { modifiUser } from "@/lib/admin-users/service" import { Popover, PopoverTrigger, PopoverContent, } from "@/components/ui/popover" import { Command, CommandInput, CommandList, CommandGroup, CommandItem, CommandEmpty, } from "@/components/ui/command" import { Check, ChevronsUpDown } from "lucide-react" import { ScrollArea } from "@/components/ui/scroll-area" // i18n-iso-countries import import i18nIsoCountries from "i18n-iso-countries" import enLocale from "i18n-iso-countries/langs/en.json" import koLocale from "i18n-iso-countries/langs/ko.json" import { countryDialCodes } from "@/components/common/country-dial-codes" i18nIsoCountries.registerLocale(enLocale) i18nIsoCountries.registerLocale(koLocale) const locale = "ko" const countryMap = i18nIsoCountries.getNames(locale, { select: "official" }) const countryArray = Object.entries(countryMap).map(([code, label]) => ({ code, label, })) // Sort countries to put Korea first, then alphabetically const sortedCountryArray = [...countryArray].sort((a, b) => { if (a.code === "KR") return -1; if (b.code === "KR") return 1; return a.label.localeCompare(b.label); }); // Add English names for Korean locale const enhancedCountryArray = sortedCountryArray.map(country => ({ ...country, label: locale === "ko" && country.code === "KR" ? "대한민국 (South Korea)" : country.label })); 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{3,20}$/.test(cleanPhone); }; // Get phone placeholder const getPhonePlaceholder = (countryCode: string | undefined) => { if (!countryCode || !countryDialCodes[countryCode]) return "전화번호"; return `${countryDialCodes[countryCode]} 전화번호`; }; // Get phone description const getPhoneDescription = (): string => { return "국제 전화번호를 입력하세요. (예: +82-10-1234-5678)"; }; export function UpdateAuserSheet({ user, ...props }: UpdateAuserSheetProps) { const [isUpdatePending, startUpdateTransition] = React.useTransition() // 1) RHF 설정 const form = useForm({ resolver: zodResolver(updateUserSchema), defaultValues: { name: user?.user_name ?? "", email: user?.user_email ?? "", phone: user?.user_phone ?? "", // Add phone field companyId: user?.company_id ?? null, 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 companyId: user.company_id, roles: user.roles, language: 'en', // You might want to get this from user object }) } }, [user, form]) // 3) onSubmit async function onSubmit(input: UpdateUserSchema & { language?: string; phone?: string }) { // Phone validation is now handled by zod schema startUpdateTransition(async () => { if (!user) return const { error } = await modifiUser({ id: user.user_id, // user.userId ...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 )} /> {/* 국가 선택 */} ( Country 국가를 찾을 수 없습니다. {Object.entries(i18nIsoCountries.getNames("ko")).map(([code, name]) => ( { form.setValue("country", code); }} > {name} ))} )} /> {/* 전화번호 - 새로 추가 */} ( Phone Number {getPhoneDescription()} )} /> {/* roles */} ( Roles field.onChange(vals)} /> )} /> ( Language )} /> {/* 5) Footer: Cancel, Save */}
) }