"use client" import { useMemo } from "react" import { Resolver, useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { z } from "zod/v4" import { type CreateAdminRolePayload } from "@/lib/api/admin" import { Button } from "@/components/ui/button" import { Drawer, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, } from "@/components/ui/drawer" import { Field, FieldContent, FieldError, FieldLabel, } from "@/components/ui/field" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { useI18n } from "@/i18n/provider" type CreateRoleDrawerProps = { open: boolean saving: boolean onOpenChange: (open: boolean) => void onSubmit: (payload: CreateAdminRolePayload) => Promise } type CreateForm = { name: string code: string remark: string } const emptyForm: CreateForm = { name: "", code: "", remark: "", } function buildEmptyForm(): CreateForm { return { ...emptyForm, } } function buildPayload(form: CreateForm): CreateAdminRolePayload { return { name: form.name.trim(), code: form.code.trim(), remark: form.remark.trim(), } } export function CreateRoleDrawer({ open, saving, onOpenChange, onSubmit, }: CreateRoleDrawerProps) { return ( {open ? ( ) : null} ) } type CreateRoleDrawerBodyProps = { saving: boolean onOpenChange: (open: boolean) => void onSubmit: (payload: CreateAdminRolePayload) => Promise } function CreateRoleDrawerBody({ saving, onOpenChange, onSubmit, }: CreateRoleDrawerBodyProps) { const t = useI18n() const createFormSchema = useMemo( () => z.object({ name: z.string().trim().min(1, t("role.nameRequired")), code: z .string() .trim() .min(1, t("role.codeRequired")) .regex(/^[A-Za-z][A-Za-z0-9:_-]*$/, t("role.codeInvalid")), remark: z.string().trim(), }), [t] ) const createFormResolver = useMemo( () => zodResolver(createFormSchema as never) as Resolver, [createFormSchema] ) const form = useForm({ resolver: createFormResolver, defaultValues: buildEmptyForm(), }) const { handleSubmit, register, reset, formState: { errors }, } = form async function onFormSubmit(values: CreateForm) { await onSubmit(buildPayload(values)) reset(buildEmptyForm()) } return ( {t("role.createTitle")} {t("role.createDescription")}
{t("role.name")} {t("role.code")} {t("role.remark")}