import { Button, Checkbox, Flex, FormControl, FormErrorMessage, FormLabel, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, } from "@chakra-ui/react" import { useForm, type SubmitHandler } from "react-hook-form" import { useMutation, useQueryClient } from "react-query" import { UsersService, type ApiError, type UserOut, type UserUpdate, } from "../../client" import useCustomToast from "../../hooks/useCustomToast" import { emailPattern } from "../../utils" interface EditUserProps { user: UserOut isOpen: boolean onClose: () => void } interface UserUpdateForm extends UserUpdate { confirm_password: string } const EditUser = ({ user, isOpen, onClose }: EditUserProps) => { const queryClient = useQueryClient() const showToast = useCustomToast() const { register, handleSubmit, reset, getValues, formState: { errors, isSubmitting, isDirty }, } = useForm({ mode: "onBlur", criteriaMode: "all", defaultValues: user, }) const updateUser = async (data: UserUpdateForm) => { await UsersService.updateUser({ userId: user.id, requestBody: data }) } const mutation = useMutation(updateUser, { onSuccess: () => { showToast("Success!", "User updated successfully.", "success") onClose() }, onError: (err: ApiError) => { const errDetail = err.body?.detail showToast("Something went wrong.", `${errDetail}`, "error") }, onSettled: () => { queryClient.invalidateQueries("users") }, }) const onSubmit: SubmitHandler = async (data) => { if (data.password === "") { data.password = undefined } mutation.mutate(data) } const onCancel = () => { reset() onClose() } return ( <> Edit User Email {errors.email && ( {errors.email.message} )} Full name Set Password {errors.password && ( {errors.password.message} )} Confirm Password value === getValues().password || "The passwords do not match", })} placeholder="Password" type="password" /> {errors.confirm_password && ( {errors.confirm_password.message} )} Is superuser? Is active? ) } export default EditUser