import { useEffect } from "react"; import { Controller, useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useNavigate } from "@tanstack/react-router"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; import { Button, FormControl, Input, Modal, ModalContent } from "@app/components/v2"; import { useOrganization } from "@app/context"; import { useCreateOrgRole, useGetOrgRole, useUpdateOrgRole } from "@app/hooks/api"; import { UsePopUpState } from "@app/hooks/usePopUp"; import { slugSchema } from "@app/lib/schemas"; const schema = z .object({ name: z.string().min(1, "Name required"), description: z.string(), slug: slugSchema({ min: 1 }) }) .required(); export type FormData = z.infer; type Props = { popUp: UsePopUpState<["role"]>; handlePopUpToggle: (popUpName: keyof UsePopUpState<["role"]>, state?: boolean) => void; }; export const RoleModal = ({ popUp, handlePopUpToggle }: Props) => { const navigate = useNavigate(); const { currentOrg } = useOrganization(); const orgId = currentOrg?.id || ""; const popupData = popUp?.role?.data as { roleId: string; }; const { data: role } = useGetOrgRole(orgId, popupData?.roleId ?? ""); const { mutateAsync: createOrgRole } = useCreateOrgRole(); const { mutateAsync: updateOrgRole } = useUpdateOrgRole(); const { control, handleSubmit, reset, formState: { isSubmitting } } = useForm({ resolver: zodResolver(schema), defaultValues: { name: "", description: "" } }); useEffect(() => { if (role) { reset({ name: role.name, description: role.description, slug: role.slug }); } else { reset({ name: "", description: "", slug: "" }); } }, [role]); const onFormSubmit = async ({ name, description, slug }: FormData) => { try { if (!orgId) return; if (role) { // update await updateOrgRole({ orgId, id: role.id, name, description, slug }); handlePopUpToggle("role", false); } else { // create const newRole = await createOrgRole({ orgId, name, description, slug, permissions: [] }); handlePopUpToggle("role", false); navigate({ to: "/organization/roles/$roleId", params: { roleId: newRole.id } }); } createNotification({ text: `Successfully ${popUp?.role?.data ? "updated" : "created"} role`, type: "success" }); reset(); } catch { const text = `Failed to ${popUp?.role?.data ? "update" : "create"} role`; createNotification({ text, type: "error" }); } }; return ( { handlePopUpToggle("role", isOpen); reset(); }} >
( )} /> ( )} /> ( )} />
); };