mirror of
https://github.com/openziti/zrok.git
synced 2025-02-13 08:50:57 +01:00
component model refactoring (#221)
This commit is contained in:
parent
b40e69227c
commit
ba34f472bb
@ -5,38 +5,31 @@ import {useEffect, useState} from "react";
|
|||||||
import {AgentApi, ApiClient} from "./api/src/index.js";
|
import {AgentApi, ApiClient} from "./api/src/index.js";
|
||||||
import buildOverview from "./model/overview.js";
|
import buildOverview from "./model/overview.js";
|
||||||
import NavBar from "./NavBar.jsx";
|
import NavBar from "./NavBar.jsx";
|
||||||
import {Box, Button, MenuItem, Modal, TextField} from "@mui/material";
|
import NewShareModal from "./NewShareModal.jsx";
|
||||||
import {useFormik} from "formik";
|
import NewAccessModal from "./NewAccessModal.jsx";
|
||||||
|
import {accessHandler, releaseAccess, releaseShare, shareHandler} from "./model/handler.js";
|
||||||
|
|
||||||
const AgentUi = () => {
|
const AgentUi = () => {
|
||||||
const [version, setVersion] = useState("");
|
const [version, setVersion] = useState("");
|
||||||
const [overview, setOverview] = useState(new Map());
|
const [overview, setOverview] = useState(new Map());
|
||||||
const [newShare, setNewShare] = useState(false);
|
|
||||||
const [newAccess, setNewAccess] = useState(false);
|
|
||||||
|
|
||||||
let api = new AgentApi(new ApiClient(window.location.protocol+'//'+window.location.host));
|
const [newShare, setNewShare] = useState(false);
|
||||||
const openNewShare = () => {
|
const openNewShare = () => {
|
||||||
setNewShare(true);
|
setNewShare(true);
|
||||||
}
|
}
|
||||||
const closeNewShare = () => {
|
const closeNewShare = () => {
|
||||||
setNewShare(false);
|
setNewShare(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const [newAccess, setNewAccess] = useState(false);
|
||||||
const openNewAccess = () => {
|
const openNewAccess = () => {
|
||||||
setNewAccess(true);
|
setNewAccess(true);
|
||||||
}
|
}
|
||||||
const closeNewAccess = () => {
|
const closeNewAccess = () => {
|
||||||
setNewAccess(false);
|
setNewAccess(false);
|
||||||
}
|
}
|
||||||
const modalStyle = {
|
|
||||||
position: 'absolute',
|
let api = new AgentApi(new ApiClient(window.location.protocol+'//'+window.location.host));
|
||||||
top: '25%',
|
|
||||||
left: '50%',
|
|
||||||
transform: 'translate(-50%, -50%)',
|
|
||||||
width: 600,
|
|
||||||
bgcolor: 'background.paper',
|
|
||||||
boxShadow: 24,
|
|
||||||
p: 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let mounted = true;
|
let mounted = true;
|
||||||
@ -49,6 +42,11 @@ const AgentUi = () => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let mounted = true;
|
let mounted = true;
|
||||||
|
api.agentStatus((err, data) => {
|
||||||
|
if(mounted) {
|
||||||
|
setOverview(buildOverview(data));
|
||||||
|
}
|
||||||
|
});
|
||||||
let interval = setInterval(() => {
|
let interval = setInterval(() => {
|
||||||
api.agentStatus((err, data) => {
|
api.agentStatus((err, data) => {
|
||||||
if(mounted) {
|
if(mounted) {
|
||||||
@ -62,18 +60,6 @@ const AgentUi = () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const releaseShare = (opts) => {
|
|
||||||
api.agentReleaseShare(opts, (err, data) => {
|
|
||||||
console.log(data);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const releaseAccess = (opts) => {
|
|
||||||
api.agentReleaseAccess(opts, (err, data) => {
|
|
||||||
console.log(data);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const router = createBrowserRouter([
|
const router = createBrowserRouter([
|
||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
@ -92,138 +78,12 @@ const AgentUi = () => {
|
|||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const shareHandler = (values) => {
|
|
||||||
switch(values.shareMode) {
|
|
||||||
case "public":
|
|
||||||
api.agentSharePublic({
|
|
||||||
target: values.target,
|
|
||||||
backendMode: values.backendMode,
|
|
||||||
}, (err, data) => {
|
|
||||||
closeNewShare();
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "private":
|
|
||||||
api.agentSharePrivate({
|
|
||||||
target: values.target,
|
|
||||||
backendMode: values.backendMode,
|
|
||||||
}, (err, data) => {
|
|
||||||
closeNewShare();
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const accessHandler = (values) => {
|
|
||||||
api.agentAccessPrivate({
|
|
||||||
token: values.token,
|
|
||||||
bindAddress: values.bindAddress,
|
|
||||||
}, (err, data) => {
|
|
||||||
closeNewAccess();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const newShareForm = useFormik({
|
|
||||||
initialValues: {
|
|
||||||
shareMode: "public",
|
|
||||||
backendMode: "proxy",
|
|
||||||
target: "",
|
|
||||||
},
|
|
||||||
onSubmit: shareHandler,
|
|
||||||
});
|
|
||||||
|
|
||||||
const newAccessForm = useFormik({
|
|
||||||
initialValues: {
|
|
||||||
token: "",
|
|
||||||
bindAddress: "",
|
|
||||||
},
|
|
||||||
onSubmit: accessHandler,
|
|
||||||
})
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<NavBar version={version} shareClick={openNewShare} accessClick={openNewAccess} />
|
<NavBar version={version} shareClick={openNewShare} accessClick={openNewAccess} />
|
||||||
<RouterProvider router={router} />
|
<RouterProvider router={router} />
|
||||||
|
<NewShareModal show={newShare} close={closeNewShare} handler={shareHandler} />
|
||||||
<Modal
|
<NewAccessModal show={newAccess} close={closeNewAccess} handler={accessHandler} />
|
||||||
open={newShare}
|
|
||||||
onClose={closeNewShare}
|
|
||||||
>
|
|
||||||
<Box sx={{ ...modalStyle }}>
|
|
||||||
<h2>Share...</h2>
|
|
||||||
<form onSubmit={newShareForm.handleSubmit}>
|
|
||||||
<TextField
|
|
||||||
fullWidth
|
|
||||||
select
|
|
||||||
id="shareMode"
|
|
||||||
name="shareMode"
|
|
||||||
label="Share Mode"
|
|
||||||
value={newShareForm.values.shareMode}
|
|
||||||
onChange={newShareForm.handleChange}
|
|
||||||
onBlur={newShareForm.handleBlur}
|
|
||||||
sx={{ mt: 2 }}
|
|
||||||
>
|
|
||||||
<MenuItem value="public">public</MenuItem>
|
|
||||||
<MenuItem value="private">private</MenuItem>
|
|
||||||
</TextField>
|
|
||||||
<TextField
|
|
||||||
fullWidth select
|
|
||||||
id="backendMode"
|
|
||||||
name="backendMode"
|
|
||||||
label="Backend Mode"
|
|
||||||
value={newShareForm.values.backendMode}
|
|
||||||
onChange={newShareForm.handleChange}
|
|
||||||
onBlur={newShareForm.handleBlur}
|
|
||||||
sx={{ mt: 2 }}
|
|
||||||
>
|
|
||||||
<MenuItem value="proxy">proxy</MenuItem>
|
|
||||||
<MenuItem value="web">web</MenuItem>
|
|
||||||
</TextField>
|
|
||||||
<TextField
|
|
||||||
fullWidth
|
|
||||||
id="target"
|
|
||||||
name="target"
|
|
||||||
label="Target"
|
|
||||||
value={newShareForm.values.target}
|
|
||||||
onChange={newShareForm.handleChange}
|
|
||||||
onBlur={newShareForm.handleBlur}
|
|
||||||
sx={{ mt: 2 }}
|
|
||||||
/>
|
|
||||||
<Button color="primary" variant="contained" type="submit" sx={{ mt: 2 }}>Create Share</Button>
|
|
||||||
</form>
|
|
||||||
</Box>
|
|
||||||
</Modal>
|
|
||||||
<Modal
|
|
||||||
open={newAccess}
|
|
||||||
onClose={closeNewAccess}
|
|
||||||
>
|
|
||||||
<Box sx={{...modalStyle}}>
|
|
||||||
<h2>Access...</h2>
|
|
||||||
<form onSubmit={newAccessForm.handleSubmit}>
|
|
||||||
<TextField
|
|
||||||
fullWidth
|
|
||||||
id="token"
|
|
||||||
name="token"
|
|
||||||
label="Share Token"
|
|
||||||
value={newAccessForm.values.token}
|
|
||||||
onChange={newAccessForm.handleChange}
|
|
||||||
onBlur={newAccessForm.handleBlur}
|
|
||||||
sx={{ mt: 2 }}
|
|
||||||
/>
|
|
||||||
<TextField
|
|
||||||
fullWidth
|
|
||||||
id="bindAddress"
|
|
||||||
name="bindAddress"
|
|
||||||
label="Bind Address"
|
|
||||||
value={newAccessForm.values.bindAddress}
|
|
||||||
onChange={newAccessForm.handleChange}
|
|
||||||
onBlur={newAccessForm.handleBlur}
|
|
||||||
sx={{ mt: 2 }}
|
|
||||||
/>
|
|
||||||
<Button color="primary" variant="contained" type="submit" sx={{ mt: 2 }}>Create Access</Button>
|
|
||||||
</form>
|
|
||||||
</Box>
|
|
||||||
</Modal>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
52
agent/agentUi/src/NewAccessModal.jsx
Normal file
52
agent/agentUi/src/NewAccessModal.jsx
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import {Box, Button, Modal, TextField} from "@mui/material";
|
||||||
|
import {useFormik} from "formik";
|
||||||
|
import {modalStyle} from "./model/theme.js";
|
||||||
|
|
||||||
|
const NewAccessModal = (props) => {
|
||||||
|
const newAccessForm = useFormik({
|
||||||
|
initialValues: {
|
||||||
|
token: "",
|
||||||
|
bindAddress: "",
|
||||||
|
},
|
||||||
|
onSubmit: (v) => {
|
||||||
|
props.handler(v);
|
||||||
|
props.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
open={props.show}
|
||||||
|
onClose={props.close}
|
||||||
|
>
|
||||||
|
<Box sx={{ ...modalStyle }}>
|
||||||
|
<h2>Access...</h2>
|
||||||
|
<form onSubmit={newAccessForm.handleSubmit}>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
id="token"
|
||||||
|
name="token"
|
||||||
|
label="Share Token"
|
||||||
|
value={newAccessForm.values.token}
|
||||||
|
onChange={newAccessForm.handleChange}
|
||||||
|
onBlur={newAccessForm.handleBlur}
|
||||||
|
sx={{ mt: 2 }}
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
id="bindAddress"
|
||||||
|
name="bindAddress"
|
||||||
|
label="Bind Address"
|
||||||
|
value={newAccessForm.values.bindAddress}
|
||||||
|
onChange={newAccessForm.handleChange}
|
||||||
|
onBlur={newAccessForm.handleBlur}
|
||||||
|
sx={{ mt: 2 }}
|
||||||
|
/>
|
||||||
|
<Button color="primary" variant="contained" type="submit" sx={{ mt: 2 }}>Create Access</Button>
|
||||||
|
</form>
|
||||||
|
</Box>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NewAccessModal;
|
70
agent/agentUi/src/NewShareModal.jsx
Normal file
70
agent/agentUi/src/NewShareModal.jsx
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
import {Box, Button, MenuItem, Modal, TextField} from "@mui/material";
|
||||||
|
import {useFormik} from "formik";
|
||||||
|
import {modalStyle} from "./model/theme.js";
|
||||||
|
|
||||||
|
const NewShareModal = (props) => {
|
||||||
|
const newShareForm = useFormik({
|
||||||
|
initialValues: {
|
||||||
|
shareMode: "public",
|
||||||
|
backendMode: "proxy",
|
||||||
|
target: "",
|
||||||
|
},
|
||||||
|
onSubmit: (v) => {
|
||||||
|
props.handler(v);
|
||||||
|
props.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
open={props.show}
|
||||||
|
onClose={props.close}
|
||||||
|
>
|
||||||
|
<Box sx={{ ...modalStyle }}>
|
||||||
|
<h2>Share...</h2>
|
||||||
|
<form onSubmit={newShareForm.handleSubmit}>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
select
|
||||||
|
id="shareMode"
|
||||||
|
name="shareMode"
|
||||||
|
label="Share Mode"
|
||||||
|
value={newShareForm.values.shareMode}
|
||||||
|
onChange={newShareForm.handleChange}
|
||||||
|
onBlur={newShareForm.handleBlur}
|
||||||
|
sx={{ mt: 2 }}
|
||||||
|
>
|
||||||
|
<MenuItem value="public">public</MenuItem>
|
||||||
|
<MenuItem value="private">private</MenuItem>
|
||||||
|
</TextField>
|
||||||
|
<TextField
|
||||||
|
fullWidth select
|
||||||
|
id="backendMode"
|
||||||
|
name="backendMode"
|
||||||
|
label="Backend Mode"
|
||||||
|
value={newShareForm.values.backendMode}
|
||||||
|
onChange={newShareForm.handleChange}
|
||||||
|
onBlur={newShareForm.handleBlur}
|
||||||
|
sx={{ mt: 2 }}
|
||||||
|
>
|
||||||
|
<MenuItem value="proxy">proxy</MenuItem>
|
||||||
|
<MenuItem value="web">web</MenuItem>
|
||||||
|
</TextField>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
id="target"
|
||||||
|
name="target"
|
||||||
|
label="Target"
|
||||||
|
value={newShareForm.values.target}
|
||||||
|
onChange={newShareForm.handleChange}
|
||||||
|
onBlur={newShareForm.handleBlur}
|
||||||
|
sx={{ mt: 2 }}
|
||||||
|
/>
|
||||||
|
<Button color="primary" variant="contained" type="submit" sx={{ mt: 2 }}>Create Share</Button>
|
||||||
|
</form>
|
||||||
|
</Box>
|
||||||
|
</Modal>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NewShareModal;
|
@ -11,11 +11,11 @@ const Overview = (props) => {
|
|||||||
props.overview.forEach((row) => {
|
props.overview.forEach((row) => {
|
||||||
switch(row.type) {
|
switch(row.type) {
|
||||||
case "share":
|
case "share":
|
||||||
cards.push(<ShareCard key={row.v.token} releaseShare={props.releaseShare} share={row.v} />);
|
cards.push(<ShareCard releaseShare={props.releaseShare} share={row.v} />);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "access":
|
case "access":
|
||||||
cards.push(<AccessCard key={row.v.frontendToken} releaseAccess={props.releaseAccess} access={row.v} />);
|
cards.push(<AccessCard releaseAccess={props.releaseAccess} access={row.v} />);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -3,40 +3,7 @@ import {StrictMode} from "react";
|
|||||||
import {createRoot} from "react-dom/client";
|
import {createRoot} from "react-dom/client";
|
||||||
import AgentUi from "./AgentUi.jsx";
|
import AgentUi from "./AgentUi.jsx";
|
||||||
import {createTheme, ThemeProvider} from "@mui/material";
|
import {createTheme, ThemeProvider} from "@mui/material";
|
||||||
|
import {themeOptions} from "./model/theme.js";
|
||||||
export const themeOptions = {
|
|
||||||
components: {
|
|
||||||
MuiCard: {
|
|
||||||
styleOverrides: {
|
|
||||||
root: ({theme}) => theme.unstable_sx({
|
|
||||||
mt: 5,
|
|
||||||
p: 2.5,
|
|
||||||
pt: 3.25,
|
|
||||||
borderRadius: 2,
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
MuiAppBar: {
|
|
||||||
styleOverrides: {
|
|
||||||
root : ({theme}) => theme.unstable_sx({
|
|
||||||
borderRadius: 2,
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
palette: {
|
|
||||||
mode: 'light',
|
|
||||||
primary: {
|
|
||||||
main: '#241775',
|
|
||||||
},
|
|
||||||
secondary: {
|
|
||||||
main: '#9bf316',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
typography: {
|
|
||||||
fontFamily: 'Poppins',
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
createRoot(document.getElementById('root')).render(
|
createRoot(document.getElementById('root')).render(
|
||||||
<StrictMode>
|
<StrictMode>
|
||||||
@ -44,4 +11,4 @@ createRoot(document.getElementById('root')).render(
|
|||||||
<AgentUi />
|
<AgentUi />
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
</StrictMode>,
|
</StrictMode>,
|
||||||
)
|
);
|
||||||
|
46
agent/agentUi/src/model/handler.js
Normal file
46
agent/agentUi/src/model/handler.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import {AgentApi, ApiClient} from "../api/src/index.js";
|
||||||
|
|
||||||
|
let api = new AgentApi(new ApiClient(window.location.protocol+'//'+window.location.host));
|
||||||
|
|
||||||
|
export const shareHandler = (values) => {
|
||||||
|
switch(values.shareMode) {
|
||||||
|
case "public":
|
||||||
|
api.agentSharePublic({
|
||||||
|
target: values.target,
|
||||||
|
backendMode: values.backendMode,
|
||||||
|
}, (err, data) => {
|
||||||
|
console.log(err, data);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "private":
|
||||||
|
api.agentSharePrivate({
|
||||||
|
target: values.target,
|
||||||
|
backendMode: values.backendMode,
|
||||||
|
}, (err, data) => {
|
||||||
|
console.log(err, data);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const accessHandler = (values) => {
|
||||||
|
api.agentAccessPrivate({
|
||||||
|
token: values.token,
|
||||||
|
bindAddress: values.bindAddress,
|
||||||
|
}, (err, data) => {
|
||||||
|
console.log(err, data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export const releaseShare = (opts) => {
|
||||||
|
api.agentReleaseShare(opts, (err, data) => {
|
||||||
|
console.log(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export const releaseAccess = (opts) => {
|
||||||
|
api.agentReleaseAccess(opts, (err, data) => {
|
||||||
|
console.log(data);
|
||||||
|
});
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
const buildOverview = (status) => {
|
const buildOverview = (status) => {
|
||||||
let overview = new Map();
|
let overview = new Map();
|
||||||
|
if(status) {
|
||||||
status.accesses.map(acc => {
|
status.accesses.map(acc => {
|
||||||
overview.set(acc.frontendToken, {
|
overview.set(acc.frontendToken, {
|
||||||
type: "access",
|
type: "access",
|
||||||
@ -12,6 +13,7 @@ const buildOverview = (status) => {
|
|||||||
v: shr
|
v: shr
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
}
|
||||||
return overview;
|
return overview;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
46
agent/agentUi/src/model/theme.js
Normal file
46
agent/agentUi/src/model/theme.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
const componentOptions = {
|
||||||
|
MuiCard: {
|
||||||
|
styleOverrides: {
|
||||||
|
root: ({theme}) => theme.unstable_sx({
|
||||||
|
mt: 5,
|
||||||
|
p: 2.5,
|
||||||
|
pt: 3.25,
|
||||||
|
borderRadius: 2,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
MuiAppBar: {
|
||||||
|
styleOverrides: {
|
||||||
|
root : ({theme}) => theme.unstable_sx({
|
||||||
|
borderRadius: 2,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const themeOptions = {
|
||||||
|
components: componentOptions,
|
||||||
|
palette: {
|
||||||
|
mode: 'light',
|
||||||
|
primary: {
|
||||||
|
main: '#241775',
|
||||||
|
},
|
||||||
|
secondary: {
|
||||||
|
main: '#9bf316',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
typography: {
|
||||||
|
fontFamily: 'Poppins',
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const modalStyle = {
|
||||||
|
position: 'absolute',
|
||||||
|
top: '25%',
|
||||||
|
left: '50%',
|
||||||
|
transform: 'translate(-50%, -50%)',
|
||||||
|
width: 600,
|
||||||
|
bgcolor: 'background.paper',
|
||||||
|
boxShadow: 24,
|
||||||
|
p: 4,
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user