diff --git a/app/dashboard/public/locales/en.json b/app/dashboard/public/locales/en.json
index 22616c4..b73a0b4 100644
--- a/app/dashboard/public/locales/en.json
+++ b/app/dashboard/public/locales/en.json
@@ -196,6 +196,9 @@
"deleteNode.title": "Delete Node",
"deleteNode.prompt": "Are you sure you want to delete the {{name}} node?",
"deleteNode.deleteSuccess": "Node {{name}} removed successfully",
+ "deleteService.title": "Delete Service",
+ "deleteService.prompt": "Are you sure you want to delete the {{name}} node?",
+ "deleteService.deleteSuccess": "Service {{name}} removed successfully",
"users": "Users",
"active": "active",
"disabled": "disabled",
diff --git a/app/dashboard/src/components/DeleteServiceModal.tsx b/app/dashboard/src/components/DeleteServiceModal.tsx
new file mode 100644
index 0000000..3932e15
--- /dev/null
+++ b/app/dashboard/src/components/DeleteServiceModal.tsx
@@ -0,0 +1,92 @@
+import {
+ Button,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Spinner,
+ Text,
+ useToast,
+} from '@chakra-ui/react';
+import { useServices } from 'contexts/ServicesContext';
+import { FC, useState } from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+import { DeleteIcon } from './Dialog/Icons';
+import { Icon } from './Icon';
+
+export const DeleteServiceModal: FC = () => {
+ const { deleteService, refetchServices, deletingService, onDeletingService } = useServices();
+ const { t } = useTranslation();
+ const toast = useToast();
+ const [loading, setLoading] = useState(false);
+ const onClose = () => {
+ onDeletingService(null);
+ };
+
+ const onDelete = () => {
+ if (deletingService) {
+ setLoading(true);
+ deleteService(deletingService)
+ .then(() => {
+ refetchServices();
+ toast({
+ title: t('deleteService.deleteSuccess', { name: deletingService.name }),
+ status: 'success',
+ isClosable: true,
+ position: 'top',
+ duration: 3000,
+ });
+ })
+ .then(onClose)
+ .finally(setLoading.bind(null, false));
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ {t('deleteService.title')}
+
+ {deletingService && (
+
+ }}>
+ {t('deleteService.prompt', { name: deletingService.name })}
+
+
+ )}
+
+
+
+
+
+
+
+ );
+};
diff --git a/app/dashboard/src/components/NodesModal.tsx b/app/dashboard/src/components/NodesModal.tsx
index 7ddf46c..0ecbcf5 100644
--- a/app/dashboard/src/components/NodesModal.tsx
+++ b/app/dashboard/src/components/NodesModal.tsx
@@ -31,7 +31,6 @@ import 'slick-carousel/slick/slick.css';
import { DeleteIcon, AddIcon, EditIcon } from './Dialog/Icons';
import { Input } from './Input';
import { DialogModalHeader } from './Dialog/ModalHeader';
-import { DevTool } from '@hookform/devtools';
const CustomInput = chakra(Input, {
baseStyle: {
@@ -235,7 +234,6 @@ export const NodesDialog: FC = () => {
-
diff --git a/app/dashboard/src/components/ServiceDialog/NameField.tsx b/app/dashboard/src/components/ServiceDialog/NameField.tsx
index cbfbf26..240d677 100644
--- a/app/dashboard/src/components/ServiceDialog/NameField.tsx
+++ b/app/dashboard/src/components/ServiceDialog/NameField.tsx
@@ -4,10 +4,10 @@ import { TFunction } from 'i18next';
import { Controller } from 'react-hook-form';
interface NameFieldProps {
- form: any;
- isEditing: boolean;
- t: TFunction<'translation', undefined, 'translation'>;
- disabled: boolean;
+ form: any;
+ isEditing: boolean;
+ t: TFunction<'translation', undefined, 'translation'>;
+ disabled: boolean;
}
export const NameField = ({ form, isEditing, t, disabled }: NameFieldProps) => {
@@ -20,7 +20,7 @@ export const NameField = ({ form, isEditing, t, disabled }: NameFieldProps) => {
type="text"
borderRadius="6px"
error={form.formState.errors.name?.message}
- disabled={disabled || isEditing}
+ disabled={disabled}
{...form.register('name')}
/>
{isEditing && (
@@ -40,7 +40,7 @@ export const NameField = ({ form, isEditing, t, disabled }: NameFieldProps) => {
colorScheme="primary"
disabled={
field.value !== 'active' &&
- field.value !== 'disabled'
+ field.value !== 'disabled'
}
isChecked={field.value === 'active'}
onChange={(e) => {
diff --git a/app/dashboard/src/components/ServiceDialog/index.tsx b/app/dashboard/src/components/ServiceDialog/index.tsx
index 54cef44..4a79cf3 100644
--- a/app/dashboard/src/components/ServiceDialog/index.tsx
+++ b/app/dashboard/src/components/ServiceDialog/index.tsx
@@ -73,6 +73,7 @@ export const ServiceDialog: FC = () => {
useEffect(() => {
if (isOpen) {
refetchInbounds();
+ form.reset();
}
}, [isOpen]);
diff --git a/app/dashboard/src/pages/Services.tsx b/app/dashboard/src/pages/Services.tsx
index 281b3aa..2c1fd28 100644
--- a/app/dashboard/src/pages/Services.tsx
+++ b/app/dashboard/src/pages/Services.tsx
@@ -6,6 +6,7 @@ import { pages } from 'constants/Pages';
import { ServiceDialog } from 'components/ServiceDialog';
import { useServices } from 'contexts/ServicesContext';
import { useDashboard } from 'contexts/DashboardContext';
+import { DeleteServiceModal } from 'components/DeleteServiceModal';
export const ServicesPage: FC = () => {
@@ -17,7 +18,7 @@ export const ServicesPage: FC = () => {
- {/* */}
+