Files
shuffle-cracked/frontend/src/Webhooks.js
T
2020-05-11 19:17:35 +02:00

296 lines
7.0 KiB
JavaScript

import React, { useEffect} from 'react';
import Paper from '@material-ui/core/Paper';
import Grid from '@material-ui/core/Grid';
import ButtonBase from '@material-ui/core/ButtonBase';
import Button from '@material-ui/core/Button';
import List from '@material-ui/core/List';
import ListItem from '@material-ui/core/ListItem';
import TextField from '@material-ui/core/TextField';
import Select from '@material-ui/core/Select';
import MenuItem from '@material-ui/core/MenuItem';
import Dialog from '@material-ui/core/Dialog';
import DialogTitle from '@material-ui/core/DialogTitle';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import WebhookImage from './assets/img/webhook.png';
import KafkaImage from './assets/img/kafka.png';
const Webhooks = (props) => {
const { globalUrl, isLoaded } = props;
const validtypes = ["webhook"]
//const [hooks, setSchedules] = React.useState(hookdata);
const [hooks, setHooks] = React.useState([]);
const [modalOpen, setModalOpen] = React.useState(false);
const [newHookName, setNewHookName] = React.useState("");
const [newHookDescription, setNewHookDescription] = React.useState("");
const [newHookType, setNewHookType] = React.useState("");
const [firstrequest, setFirstrequest] = React.useState(true);
const [, setModalError] = React.useState("");
useEffect(() => {
if (firstrequest) {
setFirstrequest(false)
getAvailableHooks()
}
})
const newHook = () => {
if (newHookName.length === 0) {
setModalError("Missing name in modal")
return
}
if (!validtypes.includes(newHookType)) {
setModalError(newHookType + " is not a valid type. Try this: "+validtypes)
}
fetch(globalUrl+"/api/v1/hooks/new", {
method: "POST",
headers: {"content-type": "application/json"},
body: JSON.stringify({"name": newHookName, "description": newHookDescription, "type": newHookType}),
credentials: "include",
})
.then((response) => response.json())
.then((responseJson) => {
console.log(responseJson)
setHooks([])
})
.catch(error => {
console.log(error)
});
}
const getAvailableHooks = () => {
fetch(globalUrl+"/api/v1/hooks", {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
credentials: "include",
})
.then((response) => response.json())
.then((responseJson) => {
setHooks(responseJson)
})
.catch(error => {
console.log(error)
// window.location.pathname = "/"
});
}
const deleteHook = (id) => {
if (id === undefined) {
return
}
fetch(globalUrl+"/api/v1/hooks/"+id+"/delete", {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
credentials: "include",
})
.then((response) => response.json())
.then((responseJson) => {
setHooks([])
})
.catch(error => {
console.log(error)
});
}
const bodyDivStyle = {
marginLeft: "20px",
marginRight: "20px",
width: "1350px",
minWidth: "1350px",
maxWidth: "1350px",
}
const hookApp = (app) => {
// Might be more options, but should be webhook or MQ
const appPicture = app.type === "webhook" ?
<img
src={WebhookImage}
alt="webhook"
width="100px"
height="100px"
/>
:
<img
src={KafkaImage}
alt="MQ"
width="100px"
height="100px"
/>
return(
<Grid container spacing={2} style={{margin: "10px 10px 10px 10px"}}>
<Grid item style={{marginRight: "10px"}}>
<ButtonBase>
{appPicture}
</ButtonBase>
</Grid>
{splitter}
<Grid item xs={12} sm container style={{marginLeft: "10px"}}>
<Grid item xs container direction="column" spacing={2}>
<Grid item xs>
<div>
<h2>{app.info.name}</h2>
</div>
<div>
Desc: {app.info.description}
</div>
<div>
Status: {app.status}
</div>
</Grid>
<Grid item>
{app.action}
</Grid>
</Grid>
</Grid>
</Grid>
)
}
const splitter = <div style={{width: "1px", backgroundColor: "grey", margin:"5px 5px 5px 5px"}} />
const hrefStyle = {
color: "#385f71",
textDecoration: "none"
}
// FIXME - add Schedule modal
const hookPaper = (hook) => {
return(
<div>
<Paper style={{maxWidth: "500px", display: "flex", padding: "10px 10px 10px 10px", marginTop: "10px"}}>
<div style={{flex: "5"}}>
{hookApp(hook)}
</div>
{splitter}
<div style={{flex: "1"}}>
<List style={{backgroundColor: "#ffffff"}}>
<ListItem style={{flex: "1", textAlign: "center"}}>
<a href={"/webhooks/"+hook.id} style={hrefStyle} >
<Button
disabled={false}
color="primary"
>
Edit
</Button>
</a>
</ListItem>
<ListItem style={{flex: "1", textAlign: "center"}}>
<Button
disabled={false}
onClick={() => {deleteHook(hook.id)}}
color="primary"
>Delete</Button>
</ListItem>
</List>
</div>
</Paper>
</div>
)
}
const modalView = modalOpen ?
<Dialog modal
open={modalOpen}
onClose={() => {setModalOpen(false)}}
>
<DialogTitle>Hook configuration</DialogTitle>
<DialogContent>
<TextField
onChange={(event) => {setNewHookName(event.target.value)}}
color="primary"
placeholder="Name"
margin="dense"
fullWidth
/>
<TextField
onChange={(event) => {setNewHookDescription(event.target.value)}}
color="primary"
placeholder="Description"
margin="dense"
fullWidth
/>
<Select
value={newHookType}
onChange={(event) => {setNewHookType(event.target.value)}}
fullWidth="true"
>
{validtypes.map(data => (
<MenuItem value={data}>
{data}
</MenuItem>
))}
</Select>
</DialogContent>
<DialogActions>
<Button onClick={() => setModalOpen(false)} color="primary">
Cancel
</Button>
<Button disabled={newHookName.length === 0 || !validtypes.includes(newHookType)} onClick={() => {newHook(); setModalOpen(false)}} color="primary">
Submit
</Button>
</DialogActions>
</Dialog>
: null
const hookmap = hooks.length > 0 ?
<div>
{hooks.map(data => (
hookPaper(data)
))}
</div>
:
<div style={{marginTop: "10%", marginLeft: "50%"}} >
<Button
disabled={false}
onClick={() => {setModalOpen(true)}}
variant="outlined"
color="primary"
>CREATE NEW HOOK</Button>
</div>
const hookView =
<div style={bodyDivStyle}>
<Button
disabled={false}
onClick={() => {setModalOpen(true)}}
color="primary"
>New</Button>
{hookmap}
</div>
const loadedCheck = isLoaded ?
<div>
{modalView}
{hookView}
</div>
:
<div>
</div>
// Maybe use gridview or something, idk
return (
<div>
{loadedCheck}
</div>
)
}
export default Webhooks