diff --git a/components/Editor/ActionsDialog/index.js b/components/Editor/ActionsDialog/index.js
new file mode 100644
index 0000000..f0d8760
--- /dev/null
+++ b/components/Editor/ActionsDialog/index.js
@@ -0,0 +1,123 @@
+import React, { useState } from 'react';
+import { useRouter } from 'next/router';
+import PropTypes from 'prop-types';
+import { makeStyles } from '@material-ui/core/styles';
+import CancelIcon from '@material-ui/icons/Cancel';
+import DeleteForeverIcon from '@material-ui/icons/DeleteForever';
+import Avatar from '@material-ui/core/Avatar';
+import List from '@material-ui/core/List';
+import ListItem from '@material-ui/core/ListItem';
+import ListItemAvatar from '@material-ui/core/ListItemAvatar';
+import ListItemText from '@material-ui/core/ListItemText';
+import DialogTitle from '@material-ui/core/DialogTitle';
+import Dialog from '@material-ui/core/Dialog';
+import PauseIcon from '@material-ui/icons/Pause';
+import { blue } from '@material-ui/core/colors';
+import { Snackbar } from '@material-ui/core';
+import Alert from '@material-ui/lab/Alert';
+
+import api from '../../../utils/api';
+
+const useStyles = makeStyles({
+ avatar: {
+ backgroundColor: blue[100],
+ color: blue[600],
+ },
+});
+
+function ActionsDialog({
+ active, open, onClose, id,
+}) {
+ const [errorOpen, setErrorOpen] = useState(false);
+ const [successOpen, setSuccessOpen] = useState(false);
+ const classes = useStyles();
+ const router = useRouter();
+
+ const handleAbort = () => {
+ };
+
+ const handleActivate = async () => {
+ await api.patch(`/bridges/${id}/${active ? 'deactivate' : 'activate'}`).then(() => {
+ router.push(`/bridge/${id}`);
+ setSuccessOpen(true);
+ setTimeout(() => {
+ setSuccessOpen(false);
+ }, 2500);
+ }).catch(() => {
+ setErrorOpen(true);
+ setTimeout(() => {
+ setErrorOpen(false);
+ }, 2500);
+ });
+ };
+
+ const handleDelete = () => {
+ api.delete(`/bridges/${id}`).then(() => {
+ router.push('/dashboard');
+ }).catch(() => {
+ setErrorOpen(true);
+ setTimeout(() => {
+ setErrorOpen(false);
+ }, 2500);
+ });
+ };
+
+ return (
+
+ );
+}
+
+ActionsDialog.propTypes = {
+ active: PropTypes.bool.isRequired,
+ onClose: PropTypes.func.isRequired,
+ open: PropTypes.bool.isRequired,
+ id: PropTypes.number.isRequired,
+};
+
+export default ActionsDialog;
diff --git a/components/Editor/index.js b/components/Editor/index.js
index b98266f..c662f8a 100644
--- a/components/Editor/index.js
+++ b/components/Editor/index.js
@@ -18,6 +18,7 @@ import BridgeTestCard from './BridgeTestCard';
import PayloadCard from './PayloadCard';
import EnvironmentVariablesCard from './EnvironmentVariablesCard';
import HeadersCard from './HeadersCard';
+import ActionsDialog from './ActionsDialog';
import api from '../../utils/api';
@@ -40,11 +41,13 @@ function Editor({ bridge, isEditView }) {
const classes = useStyles();
const router = useRouter();
const [open, setOpen] = useState(false);
+ const [actionsDialogOpen, setActionsDialogOpen] = useState(false);
const [errorOpen, setErrorOpen] = useState(false);
// TODO: Custom error messages
// const [errMsg, setErrMsg] = useState('');
const {
+ active,
id,
outboundUrl,
method,
@@ -58,6 +61,7 @@ function Editor({ bridge, isEditView }) {
const delay = String(bridge.delay);
const initialValues = {
+ active,
title,
outboundUrl,
method,
@@ -94,6 +98,7 @@ function Editor({ bridge, isEditView }) {
});
const generatePayload = (values) => ({
+ active: values.active,
title: values.title,
method: values.method,
outbound_url: values.outboundUrl,
@@ -165,20 +170,14 @@ function Editor({ bridge, isEditView }) {
-
-
+ setActionsDialogOpen(false)}
+ id={id}
+ />
+
+
@@ -227,6 +226,7 @@ export default Editor;
Editor.defaultProps = {
isEditView: false,
bridge: {
+ active: true,
title: '',
outboundUrl: '',
method: '',
@@ -249,6 +249,7 @@ Editor.defaultProps = {
Editor.propTypes = {
isEditView: PropTypes.bool,
bridge: PropTypes.shape({
+ active: PropTypes.bool,
id: PropTypes.number,
title: PropTypes.string,
outboundUrl: PropTypes.string,
diff --git a/package-lock.json b/package-lock.json
index 50644a8..5e9ccb3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2475,6 +2475,15 @@
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ=="
},
+ "bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "optional": true,
+ "requires": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
"bl": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
@@ -4823,6 +4832,12 @@
}
}
},
+ "file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "optional": true
+ },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -10038,6 +10053,7 @@
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"optional": true,
"requires": {
+ "bindings": "^1.5.0",
"nan": "^2.12.1"
}
},
diff --git a/pages/bridge/[id].js b/pages/bridge/[id].js
index 123b02e..6568b92 100644
--- a/pages/bridge/[id].js
+++ b/pages/bridge/[id].js
@@ -42,6 +42,7 @@ export async function getServerSideProps(context) {
Show.propTypes = {
bridge: PropTypes.shape({
+ active: PropTypes.bool.isRequired,
id: PropTypes.number.isRequired,
outboundUrl: PropTypes.string.isRequired,
method: PropTypes.string.isRequired,