import { Box, Button, chakra, Checkbox, FormControl, FormLabel, HStack, Modal, ModalBody, ModalCloseButton, ModalContent, ModalOverlay, Switch, Tooltip, useToast, VStack, IconButton, Spacer } from '@chakra-ui/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { getNodeCreateDefaultValues, NodeCreate, NodeCreateSchema, useNodes, } from 'stores'; import { FC, useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import 'slick-carousel/slick/slick-theme.css'; import 'slick-carousel/slick/slick.css'; import { DialogModalHeader, DeleteIcon, AddIcon, EditIcon } from 'components/dialog'; import { Input } from 'components/input'; const CustomInput = chakra(Input, { baseStyle: { bg: 'white', _dark: { bg: 'gray.700', }, }, }); export const NodesDialog: FC = () => { const { editingNode, isEditingNode, onEditingNode, isAddingNode, refetchNodes, updateNode, addNode, onAddingNode, onDeletingNode } = useNodes(); const [loading, setLoading] = useState(false); const [, setError] = useState(''); const { t } = useTranslation(); const toast = useToast(); const defaultValueNode: NodeCreate = (isEditingNode === true && editingNode !== null && editingNode !== undefined) ? editingNode : getNodeCreateDefaultValues(); const form = useForm({ resolver: zodResolver(NodeCreateSchema), defaultValues: defaultValueNode, }); const isOpen = isEditingNode || isAddingNode; const onClose = () => { onAddingNode(false); onEditingNode(undefined); }; useEffect(() => { if (isOpen) { refetchNodes(); form.reset(defaultValueNode); } }, [isOpen]); const submit = async (values: NodeCreate) => { setLoading(true); const methods = { edited: updateNode, created: addNode }; const method = isEditingNode ? 'edited' : 'created'; const { name, port, id, address, usage_coefficient } = values; setError(null); let body: NodeCreate = { id, name, address, port, status: values.status, usage_coefficient, add_as_new_host: values.add_as_new_host, }; await methods[method](body) .then(() => { toast({ title: t( isEditingNode ? 'nodeDialog.editNode' : 'nodeDialog.createNewNode', { name: values.name } ), status: 'success', isClosable: true, position: 'top', duration: 3000, }); refetchNodes(); onClose(); }) .catch((err) => { if (err?.response?.status === 409 || err?.response?.status === 400) setError(err?.response?._data?.detail); if (err?.response?.status === 422) { Object.keys(err.response._data.detail).forEach((key) => { setError(err?.response._data.detail[key] as string); form.setError( key as 'address' | 'port' | 'name' | 'status', { type: 'custom', message: err.response._data.detail[key], } ); }); } }) .finally(() => { setLoading(false); }); }; return ( <> {loading && 'loading...'}
submit(v))}> { return ( { if (e.target.checked) { field.onChange('none'); } else { field.onChange('disabled'); } }} /> ); }} /> {!editingNode && ( {t('nodeDialog.addHostForEveryInbound')} )} { if (editingNode !== null) { console.log('deleting') onDeletingNode(editingNode); onClose(); } }} >
); }