import React, { useEffect, useState } from 'react'; import _ from 'lodash'; import { TrashIcon } from '@heroicons/react/outline'; import { useController, useFieldArray, useForm, useFormState, useWatch } from 'react-hook-form'; import { Modal, ConfirmationModal } from 'src/components'; import { Input, Select } from 'src/components/Form'; import { User, UserRole, useUsers } from 'src/services/users'; import { useAuth } from 'src/services/auth'; import { appAccessList, initialUserForm } from './consts'; import { UserModalProps } from './types'; export const UserModal = ({ open, onClose, userId, setUserId }: UserModalProps) => { const [deleteModal, setDeleteModal] = useState(false); const [dashboardRoleEdited, setDashboardRoleEdited] = useState(false); const { user, loadUser, editUserById, createNewUser, userModalLoading, deleteUserById, clearSelectedUser } = useUsers(); const { currentUser, isAdmin } = useAuth(); const { control, reset, handleSubmit } = useForm({ defaultValues: initialUserForm, }); const { isDirty } = useFormState({ control, }); const { fields, update } = useFieldArray({ control, name: 'app_roles', }); useEffect(() => { if (userId) { loadUser(userId); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [userId, open]); useEffect(() => { if (!_.isEmpty(user)) { reset(user); } return () => { reset(initialUserForm); }; }, [user, reset, open]); const dashboardRole = useWatch({ control, name: 'app_roles.0.role', }); useEffect(() => { if (dashboardRole === UserRole.Admin && (isDirty || dashboardRoleEdited)) { fields.forEach((field, index) => update(index, { name: field.name, role: UserRole.Admin })); } if (isDirty) { setDashboardRoleEdited(true); } }, [dashboardRole]); const handleSave = async () => { try { if (userId) { await handleSubmit((data) => editUserById(data))(); } else { await handleSubmit((data) => createNewUser(data))(); } } catch (e: any) { // Continue } onClose(); clearSelectedUser(); setUserId(null); }; const handleKeyPress = (e: any) => { if (e.key === 'Enter' || e.key === 'NumpadEnter') { handleSave(); } }; const handleClose = () => { onClose(); clearSelectedUser(); setUserId(null); }; const deleteModalOpen = () => setDeleteModal(true); const deleteModalClose = () => setDeleteModal(false); const handleDelete = () => { if (userId) { deleteUserById(userId); } clearSelectedUser(); setUserId(null); handleClose(); deleteModalClose(); }; return ( <>