"use client"; import { Credenza, CredenzaBody, CredenzaClose, CredenzaContent, CredenzaDescription, CredenzaFooter, CredenzaHeader, CredenzaTitle } from "@app/components/Credenza"; import { Button } from "@app/components/ui/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@app/components/ui/form"; import { Input } from "@app/components/ui/input"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { usePaidStatus } from "@app/hooks/usePaidStatus"; import { toast } from "@app/hooks/useToast"; import { createApiClient, formatAxiosError } from "@app/lib/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { build } from "@server/build"; import type { Role } from "@server/db"; import type { CreateRoleBody, CreateRoleResponse, UpdateRoleBody, UpdateRoleResponse } from "@server/routers/role"; import { AxiosResponse } from "axios"; import { useTranslations } from "next-intl"; import { useTransition } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { PaidFeaturesAlert } from "./PaidFeaturesAlert"; import { CheckboxWithLabel } from "./ui/checkbox"; type CreateRoleFormProps = { role: Role; open: boolean; setOpen: (open: boolean) => void; onSuccess?: (res: CreateRoleResponse) => void; }; export default function EditRoleForm({ open, role, setOpen, onSuccess }: CreateRoleFormProps) { const { org } = useOrgContext(); const t = useTranslations(); const { isPaidUser } = usePaidStatus(); const formSchema = z.object({ name: z .string({ message: t("nameRequired") }) .min(1) .max(32), description: z.string().max(255).optional(), requireDeviceApproval: z.boolean().optional() }); const api = createApiClient(useEnvContext()); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { name: role.name, description: role.description ?? "", requireDeviceApproval: role.requireDeviceApproval ?? false } }); const [loading, startTransition] = useTransition(); async function onSubmit(values: z.infer) { const res = await api .post< AxiosResponse >(`/role/${role.roleId}`, values satisfies UpdateRoleBody) .catch((e) => { toast({ variant: "destructive", title: t("accessRoleErrorUpdate"), description: formatAxiosError( e, t("accessRoleErrorUpdateDescription") ) }); }); if (res && res.status === 200) { toast({ variant: "default", title: t("accessRoleUpdated"), description: t("accessRoleUpdatedDescription") }); if (open) { setOpen(false); } onSuccess?.(res.data.data); } } return ( <> { setOpen(val); form.reset(); }} > {t("accessRoleEdit")} {t("accessRoleEditDescription")}
startTransition(() => onSubmit(values)) )} className="space-y-4" id="create-role-form" > ( {t("accessRoleName")} )} /> ( {t("description")} )} /> {build !== "oss" && (
( { if ( checked !== "indeterminate" ) { form.setValue( "requireDeviceApproval", checked ); } }} label={t( "requireDeviceApproval" )} /> {t( "requireDeviceApprovalDescription" )} )} />
)}
); }